Launches
Launches built by relayfor.si and signed last by the creator's own wallet.
A launch creates a pump.fun token with its fee route locked in the same transaction. Your server prepares it with the secret key; the creator's wallet signs it last and pays for it. relayfor.si never holds the creator's keys or money. See Launch a token for the whole flow.
An import is a launch too (kind: "import"): bringing a token already on pump.fun answers a launch, and you follow it here the same way.
Prepare a launch
Builds the token's launch transaction (its route locked in the same transaction), checks it by simulation and signs it with the new mint. The user's wallet signs it last; send it yourself, or post it to /launches/{id}/submit.
Send the project's secret key as Authorization: Bearer rf_sk_..., from a server.
Send an Idempotency-Key (any unique string, a UUID): a retry with the same key and body gets the first answer back for 24 hours, a secret it carried included.
curl -X POST https://relayfor.si/api/project/v1/launches/prepare \ -H "Authorization: Bearer $RELAYFOR_SECRET_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{ "creator": "b8dLcukC7edhDQ7cn5d4gEYkbUrMWeWQLGsCmrG6dLaY", "name": "Nova", "symbol": "NOVA", "description": "The agent that reads Solana for you.", "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...", "split": { "ai_share": 7000, "creator_share": 1000 } }'Body
creatorstringRequiredThe user's wallet: the token's creator, which pays and signs the transaction last.
namestringRequiredThe token's name, up to 32 bytes.
symbolstringRequiredIts ticker, up to 13 bytes, such as NOVA.
descriptionstringA few words about it, shown on pump.fun; up to 1,000 characters.
imagestringRequiredA base64 data URI: data:image/png;base64,... PNG, JPEG, GIF or WebP, up to 2 MB.
websitestringIts site, an https:// link shown on pump.fun.
twitterstringIts X account, an https:// link shown on pump.fun.
telegramstringIts Telegram, an https:// link shown on pump.fun.
presetstringThe fee preset (fps_...) that splits the project's part of the token's creator fee; the project's default when absent.
splitobjectThe creator's choice of the AI and creator parts, in basis points of the project's part: either alone, or both adding up to the preset's creator_choice.budget; the AI at least the preset's floor. The preset's own split when absent.
ai_shareintegerBasis points of the project's part: 10,000 is all of it, the 80% of a token's creator fee relayfor's 20% leaves.
creator_shareintegerBasis points of the project's part: 10,000 is all of it, the 80% of a token's creator fee relayfor's 20% leaves.
creator_fees_tostringWhere the creator's part goes; the creator's own wallet when absent. When it is one of the preset's wallets, that wallet holds both shares. Ignored when the creator's share is 0.
opening_buy_lamportsstring | integerFor a token quoted in SOL: SOL to buy the token with in the launch itself, fees included.
quote_mintstringWhat the token trades against and pays its creator fees in: a token pump.fun takes as a quote (USDC, or one on its quote-control list). SOL when absent. The token's AI share then arrives in that token.
opening_buy_amountstring | integerFor a token quoted in another token: its base units to buy the token with in the launch itself, fees included (5000000 is 5 USDC), from the creator's own account for it. Base units as on chain: a Token-2022 quote with a scaled UI amount (an xStock) or interest reads differently in wallets, and Token-2022's UiAmountToAmount turns a wallet's amount into them.
tokens_tostringWho gets the opening buy's tokens; the creator when absent.
transaction_version0 | 11 (the default) for wallets that sign v1 transactions; 0 for one that doesn't yet: a v0 transaction of at most 1232 bytes, its shared accounts loaded from relayfor's lookup table. A v0 launch carries no opening buy and fits the creator and about 2 funded project wallets in its route.
Answer
Answers 201 with Launch.
{ "id": "lch_qrjvWeRkipW8wXmW", "kind": "wallet", "state": "prepared", "mint": "MASi45ub7Qe4ZE36UT5G6cU4ud8Fhhe4deS4F3cw9KTA", "creator": "b8dLcukC7edhDQ7cn5d4gEYkbUrMWeWQLGsCmrG6dLaY", "name": "Nova", "symbol": "NOVA", "metadata_uri": "https://ipfs.io/ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku", "image": "https://ipfs.io/ipfs/bafkreiexgjbqcz4ahcgo6cf3xsnihhjbfy2v4bwy2hwz4tn63qsr7gnvve", "route": [ { "address": "yNoVKf58ZTBqNAYT3j5qcdsyuMNmPfYetW5v6JXmj54o", "bps": 5600, "roles": [ "ai" ] }, { "address": "mLidkuVKnRyjP2WPBg8Y4ErK9pGSSxY6BVScJy9uUxcJ", "bps": 2000, "roles": [ "platform" ] }, { "address": "b8dLcukC7edhDQ7cn5d4gEYkbUrMWeWQLGsCmrG6dLaY", "bps": 800, "roles": [ "creator" ] }, { "address": "nTPkyRFA6CAFjF1YveCHK1ATbQgdM9mwZgikp4Wzxrxk", "bps": 1600, "roles": [ "project" ] } ], "preset": { "id": "fps_Hh6iDhVIjXITTTn7", "name": "Standard" }, "fee_lamports": "20000000", "quote_mint": "So11111111111111111111111111111111111111112", "opening_buy": null, "transaction": { "version": 1, "base64": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...", "last_valid_block_height": "376012345" }, "signature": null, "error": null, "created_at": "2026-10-07T09:12:04.000Z", "confirmed_at": null}Its fields
idstringRequiredlch_ and 16 characters.
kind"wallet" | "import"Requiredwallet: launched from the creator's wallet; import: brought from pump.fun.
state"prepared" | "sent" | "confirmed" | "failed" | "expired"Requiredprepared: waits for the wallet; confirmed: the chain shows the token as prepared.
mintstringRequiredThe token's mint address.
creatorstringRequiredThe creator's wallet: it signs and pays for the launch or import.
namestringRequiredThe token's name.
symbolstringRequiredThe token's ticker.
metadata_uristringRequiredThe token's metadata on IPFS, as pump.fun names it.
imagestring | nullRequiredNull for an import: we fetch no link a token names.
routeobject[]RequiredThe token's shareholders as locked on chain: the AI first, relayfor second.
addressstringRequiredA shareholder's wallet.
bpsintegerRequiredBasis points of the whole creator fee, as pump.fun pays it.
roles"ai" | "platform" | "creator" | "project"[]Requiredai: the token's vault, its AI credit; platform: relayfor's 20%; creator: the creator's part; project: one of the project's wallets. A creator who is one of the project's wallets holds both shares in one shareholder.
presetobject | nullRequiredThe fee preset it was made with, named as it was then.
idstringRequiredfps_...
namestringRequiredIts name when the token was made.
fee_lamportsstringRequiredrelayfor's fee in this transaction, in lamports: 0.02 SOL a launch, 1 SOL an import.
quote_mintstringRequiredWhat the token trades against: wrapped SOL for SOL.
opening_buyobject | nullRequiredThe creator's first buy, in the launch itself; null for none.
amountstringRequiredThe quote's base units spent, fees included.
lamportsstring | nullRequiredThe same in lamports, for a token quoted in SOL.
tokensstringRequiredThe tokens it gets, in base units.
tokens_tostring | nullRequiredWho gets them; null for the creator.
transactionobject | nullRequiredWhile prepared: the transaction for the creator's wallet to sign last (a wallet launch or an import).
version0 | 1RequiredIts format: 1, or 0 for a wallet that can't sign version 1.
base64stringRequiredThe transaction, base64, signed by the new mint.
last_valid_block_heightstringRequiredPast this block height it can no longer land: prepare a new launch.
signaturestring | nullRequiredThe transaction on Solana; null until it was sent.
errorstring | nullRequiredWhy it failed or expired; null unless it did.
created_atstringRequiredWhen it was made, in UTC.
confirmed_atstring | nullRequiredWhen the chain confirmed it; null until then.
Errors
- 400invalid_request
- 400missing_idempotency_key
- 401unauthorized
- 409idempotency_in_progress
- 413payload_too_large
- 415unsupported_media_type
- 422idempotency_mismatch
- 422launch_refused
- 422insufficient_funds
- 429rate_limited
- 500internal
- 503unavailable
- 503launches_closed
A 409, 429, or 503 answer carries Retry-After: wait that many seconds, then send the same request again.
Send a signed launch
Send the project's secret key as Authorization: Bearer rf_sk_..., from a server.
Send an Idempotency-Key (any unique string, a UUID): a retry with the same key and body gets the first answer back for 24 hours, a secret it carried included.
curl -X POST https://relayfor.si/api/project/v1/launches/lch_qrjvWeRkipW8wXmW/submit \ -H "Authorization: Bearer $RELAYFOR_SECRET_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{ "transaction": "AQABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4f..." }'Path
idstringRequiredThe launch's id: lch_...
Body
transactionstringRequiredThe prepared transaction with the wallet's signature added, base64.
Answer
Answers 200 with Launch.
{ "id": "lch_qrjvWeRkipW8wXmW", "kind": "wallet", "state": "sent", "mint": "MASi45ub7Qe4ZE36UT5G6cU4ud8Fhhe4deS4F3cw9KTA", "creator": "b8dLcukC7edhDQ7cn5d4gEYkbUrMWeWQLGsCmrG6dLaY", "name": "Nova", "symbol": "NOVA", "metadata_uri": "https://ipfs.io/ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku", "image": "https://ipfs.io/ipfs/bafkreiexgjbqcz4ahcgo6cf3xsnihhjbfy2v4bwy2hwz4tn63qsr7gnvve", "route": [ { "address": "yNoVKf58ZTBqNAYT3j5qcdsyuMNmPfYetW5v6JXmj54o", "bps": 5600, "roles": [ "ai" ] }, { "address": "mLidkuVKnRyjP2WPBg8Y4ErK9pGSSxY6BVScJy9uUxcJ", "bps": 2000, "roles": [ "platform" ] }, { "address": "b8dLcukC7edhDQ7cn5d4gEYkbUrMWeWQLGsCmrG6dLaY", "bps": 800, "roles": [ "creator" ] }, { "address": "nTPkyRFA6CAFjF1YveCHK1ATbQgdM9mwZgikp4Wzxrxk", "bps": 1600, "roles": [ "project" ] } ], "preset": { "id": "fps_Hh6iDhVIjXITTTn7", "name": "Standard" }, "fee_lamports": "20000000", "quote_mint": "So11111111111111111111111111111111111111112", "opening_buy": null, "transaction": null, "signature": "8SVM5jGU5EjLs8zrAnijQAHy9WFp7SyYBjvFBnUZSNTDPM6oQ2NcWVn2RNagKZ58sFy76HJ3zrCJq9uUwkuHSAbZ", "error": null, "created_at": "2026-10-07T09:12:04.000Z", "confirmed_at": null}Its fields
idstringRequiredlch_ and 16 characters.
kind"wallet" | "import"Requiredwallet: launched from the creator's wallet; import: brought from pump.fun.
state"prepared" | "sent" | "confirmed" | "failed" | "expired"Requiredprepared: waits for the wallet; confirmed: the chain shows the token as prepared.
mintstringRequiredThe token's mint address.
creatorstringRequiredThe creator's wallet: it signs and pays for the launch or import.
namestringRequiredThe token's name.
symbolstringRequiredThe token's ticker.
metadata_uristringRequiredThe token's metadata on IPFS, as pump.fun names it.
imagestring | nullRequiredNull for an import: we fetch no link a token names.
routeobject[]RequiredThe token's shareholders as locked on chain: the AI first, relayfor second.
addressstringRequiredA shareholder's wallet.
bpsintegerRequiredBasis points of the whole creator fee, as pump.fun pays it.
roles"ai" | "platform" | "creator" | "project"[]Requiredai: the token's vault, its AI credit; platform: relayfor's 20%; creator: the creator's part; project: one of the project's wallets. A creator who is one of the project's wallets holds both shares in one shareholder.
presetobject | nullRequiredThe fee preset it was made with, named as it was then.
idstringRequiredfps_...
namestringRequiredIts name when the token was made.
fee_lamportsstringRequiredrelayfor's fee in this transaction, in lamports: 0.02 SOL a launch, 1 SOL an import.
quote_mintstringRequiredWhat the token trades against: wrapped SOL for SOL.
opening_buyobject | nullRequiredThe creator's first buy, in the launch itself; null for none.
amountstringRequiredThe quote's base units spent, fees included.
lamportsstring | nullRequiredThe same in lamports, for a token quoted in SOL.
tokensstringRequiredThe tokens it gets, in base units.
tokens_tostring | nullRequiredWho gets them; null for the creator.
transactionobject | nullRequiredWhile prepared: the transaction for the creator's wallet to sign last (a wallet launch or an import).
version0 | 1RequiredIts format: 1, or 0 for a wallet that can't sign version 1.
base64stringRequiredThe transaction, base64, signed by the new mint.
last_valid_block_heightstringRequiredPast this block height it can no longer land: prepare a new launch.
signaturestring | nullRequiredThe transaction on Solana; null until it was sent.
errorstring | nullRequiredWhy it failed or expired; null unless it did.
created_atstringRequiredWhen it was made, in UTC.
confirmed_atstring | nullRequiredWhen the chain confirmed it; null until then.
Errors
- 400invalid_request
- 400missing_idempotency_key
- 401unauthorized
- 404not_found
- 409idempotency_in_progress
- 413payload_too_large
- 415unsupported_media_type
- 422idempotency_mismatch
- 422launch_refused
- 422insufficient_funds
- 429rate_limited
- 500internal
- 503unavailable
- 503launches_closed
A 409, 429, or 503 answer carries Retry-After: wait that many seconds, then send the same request again.
Get a launch
Send the project's secret key as Authorization: Bearer rf_sk_..., from a server.
curl https://relayfor.si/api/project/v1/launches/lch_qrjvWeRkipW8wXmW \ -H "Authorization: Bearer $RELAYFOR_SECRET_KEY"Path
idstringRequiredThe launch's id: lch_...
Answer
Answers 200 with Launch.
{ "id": "lch_qrjvWeRkipW8wXmW", "kind": "wallet", "state": "confirmed", "mint": "MASi45ub7Qe4ZE36UT5G6cU4ud8Fhhe4deS4F3cw9KTA", "creator": "b8dLcukC7edhDQ7cn5d4gEYkbUrMWeWQLGsCmrG6dLaY", "name": "Nova", "symbol": "NOVA", "metadata_uri": "https://ipfs.io/ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku", "image": "https://ipfs.io/ipfs/bafkreiexgjbqcz4ahcgo6cf3xsnihhjbfy2v4bwy2hwz4tn63qsr7gnvve", "route": [ { "address": "yNoVKf58ZTBqNAYT3j5qcdsyuMNmPfYetW5v6JXmj54o", "bps": 5600, "roles": [ "ai" ] }, { "address": "mLidkuVKnRyjP2WPBg8Y4ErK9pGSSxY6BVScJy9uUxcJ", "bps": 2000, "roles": [ "platform" ] }, { "address": "b8dLcukC7edhDQ7cn5d4gEYkbUrMWeWQLGsCmrG6dLaY", "bps": 800, "roles": [ "creator" ] }, { "address": "nTPkyRFA6CAFjF1YveCHK1ATbQgdM9mwZgikp4Wzxrxk", "bps": 1600, "roles": [ "project" ] } ], "preset": { "id": "fps_Hh6iDhVIjXITTTn7", "name": "Standard" }, "fee_lamports": "20000000", "quote_mint": "So11111111111111111111111111111111111111112", "opening_buy": null, "transaction": null, "signature": "8SVM5jGU5EjLs8zrAnijQAHy9WFp7SyYBjvFBnUZSNTDPM6oQ2NcWVn2RNagKZ58sFy76HJ3zrCJq9uUwkuHSAbZ", "error": null, "created_at": "2026-10-07T09:12:04.000Z", "confirmed_at": "2026-10-07T09:12:31.000Z"}Its fields
idstringRequiredlch_ and 16 characters.
kind"wallet" | "import"Requiredwallet: launched from the creator's wallet; import: brought from pump.fun.
state"prepared" | "sent" | "confirmed" | "failed" | "expired"Requiredprepared: waits for the wallet; confirmed: the chain shows the token as prepared.
mintstringRequiredThe token's mint address.
creatorstringRequiredThe creator's wallet: it signs and pays for the launch or import.
namestringRequiredThe token's name.
symbolstringRequiredThe token's ticker.
metadata_uristringRequiredThe token's metadata on IPFS, as pump.fun names it.
imagestring | nullRequiredNull for an import: we fetch no link a token names.
routeobject[]RequiredThe token's shareholders as locked on chain: the AI first, relayfor second.
addressstringRequiredA shareholder's wallet.
bpsintegerRequiredBasis points of the whole creator fee, as pump.fun pays it.
roles"ai" | "platform" | "creator" | "project"[]Requiredai: the token's vault, its AI credit; platform: relayfor's 20%; creator: the creator's part; project: one of the project's wallets. A creator who is one of the project's wallets holds both shares in one shareholder.
presetobject | nullRequiredThe fee preset it was made with, named as it was then.
idstringRequiredfps_...
namestringRequiredIts name when the token was made.
fee_lamportsstringRequiredrelayfor's fee in this transaction, in lamports: 0.02 SOL a launch, 1 SOL an import.
quote_mintstringRequiredWhat the token trades against: wrapped SOL for SOL.
opening_buyobject | nullRequiredThe creator's first buy, in the launch itself; null for none.
amountstringRequiredThe quote's base units spent, fees included.
lamportsstring | nullRequiredThe same in lamports, for a token quoted in SOL.
tokensstringRequiredThe tokens it gets, in base units.
tokens_tostring | nullRequiredWho gets them; null for the creator.
transactionobject | nullRequiredWhile prepared: the transaction for the creator's wallet to sign last (a wallet launch or an import).
version0 | 1RequiredIts format: 1, or 0 for a wallet that can't sign version 1.
base64stringRequiredThe transaction, base64, signed by the new mint.
last_valid_block_heightstringRequiredPast this block height it can no longer land: prepare a new launch.
signaturestring | nullRequiredThe transaction on Solana; null until it was sent.
errorstring | nullRequiredWhy it failed or expired; null unless it did.
created_atstringRequiredWhen it was made, in UTC.
confirmed_atstring | nullRequiredWhen the chain confirmed it; null until then.
Errors
A 429 or 503 answer carries Retry-After: wait that many seconds, then send the same request again.
List launches
Send the project's secret key as Authorization: Bearer rf_sk_..., from a server.
curl https://relayfor.si/api/project/v1/launches \ -H "Authorization: Bearer $RELAYFOR_SECRET_KEY"Query
limitinteger1 to 100; default 20.
cursorstringnext_cursor from the page before.
Answer
Answers 200 with LaunchList.
{ "data": [ { "id": "lch_qrjvWeRkipW8wXmW", "kind": "wallet", "state": "confirmed", "mint": "MASi45ub7Qe4ZE36UT5G6cU4ud8Fhhe4deS4F3cw9KTA", "creator": "b8dLcukC7edhDQ7cn5d4gEYkbUrMWeWQLGsCmrG6dLaY", "name": "Nova", "symbol": "NOVA", "metadata_uri": "https://ipfs.io/ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku", "image": "https://ipfs.io/ipfs/bafkreiexgjbqcz4ahcgo6cf3xsnihhjbfy2v4bwy2hwz4tn63qsr7gnvve", "route": [ { "address": "yNoVKf58ZTBqNAYT3j5qcdsyuMNmPfYetW5v6JXmj54o", "bps": 5600, "roles": [ "ai" ] }, { "address": "mLidkuVKnRyjP2WPBg8Y4ErK9pGSSxY6BVScJy9uUxcJ", "bps": 2000, "roles": [ "platform" ] }, { "address": "b8dLcukC7edhDQ7cn5d4gEYkbUrMWeWQLGsCmrG6dLaY", "bps": 800, "roles": [ "creator" ] }, { "address": "nTPkyRFA6CAFjF1YveCHK1ATbQgdM9mwZgikp4Wzxrxk", "bps": 1600, "roles": [ "project" ] } ], "preset": { "id": "fps_Hh6iDhVIjXITTTn7", "name": "Standard" }, "fee_lamports": "20000000", "quote_mint": "So11111111111111111111111111111111111111112", "opening_buy": null, "transaction": null, "signature": "8SVM5jGU5EjLs8zrAnijQAHy9WFp7SyYBjvFBnUZSNTDPM6oQ2NcWVn2RNagKZ58sFy76HJ3zrCJq9uUwkuHSAbZ", "error": null, "created_at": "2026-10-07T09:12:04.000Z", "confirmed_at": "2026-10-07T09:12:31.000Z" } ], "next_cursor": null}Its fields
dataobject[]RequiredThe items, newest first.
idstringRequiredlch_ and 16 characters.
kind"wallet" | "import"Requiredwallet: launched from the creator's wallet; import: brought from pump.fun.
state"prepared" | "sent" | "confirmed" | "failed" | "expired"Requiredprepared: waits for the wallet; confirmed: the chain shows the token as prepared.
mintstringRequiredThe token's mint address.
creatorstringRequiredThe creator's wallet: it signs and pays for the launch or import.
namestringRequiredThe token's name.
symbolstringRequiredThe token's ticker.
metadata_uristringRequiredThe token's metadata on IPFS, as pump.fun names it.
imagestring | nullRequiredNull for an import: we fetch no link a token names.
routeobject[]RequiredThe token's shareholders as locked on chain: the AI first, relayfor second.
addressstringRequiredA shareholder's wallet.
bpsintegerRequiredBasis points of the whole creator fee, as pump.fun pays it.
roles"ai" | "platform" | "creator" | "project"[]Requiredai: the token's vault, its AI credit; platform: relayfor's 20%; creator: the creator's part; project: one of the project's wallets. A creator who is one of the project's wallets holds both shares in one shareholder.
presetobject | nullRequiredThe fee preset it was made with, named as it was then.
idstringRequiredfps_...
namestringRequiredIts name when the token was made.
fee_lamportsstringRequiredrelayfor's fee in this transaction, in lamports: 0.02 SOL a launch, 1 SOL an import.
quote_mintstringRequiredWhat the token trades against: wrapped SOL for SOL.
opening_buyobject | nullRequiredThe creator's first buy, in the launch itself; null for none.
amountstringRequiredThe quote's base units spent, fees included.
lamportsstring | nullRequiredThe same in lamports, for a token quoted in SOL.
tokensstringRequiredThe tokens it gets, in base units.
tokens_tostring | nullRequiredWho gets them; null for the creator.
transactionobject | nullRequiredWhile prepared: the transaction for the creator's wallet to sign last (a wallet launch or an import).
version0 | 1RequiredIts format: 1, or 0 for a wallet that can't sign version 1.
base64stringRequiredThe transaction, base64, signed by the new mint.
last_valid_block_heightstringRequiredPast this block height it can no longer land: prepare a new launch.
signaturestring | nullRequiredThe transaction on Solana; null until it was sent.
errorstring | nullRequiredWhy it failed or expired; null unless it did.
created_atstringRequiredWhen it was made, in UTC.
confirmed_atstring | nullRequiredWhen the chain confirmed it; null until then.
next_cursorstring | nullRequiredPass it as cursor for the next page; null on the last page.
Errors
A 429 or 503 answer carries Retry-After: wait that many seconds, then send the same request again.