Tokens
Your project's tokens, their routes, and bringing a token already on pump.fun.
A token joins your project when its launch or import is confirmed. Its route lists every shareholder of its creator fee as pump.fun locked it, in basis points of the whole fee: the token's AI vault first, relayfor.si second.
List tokens
Send the project's secret key as Authorization: Bearer rf_sk_..., from a server.
curl https://relayfor.si/api/project/v1/tokens \ -H "Authorization: Bearer $RELAYFOR_SECRET_KEY"Query
limitinteger1 to 100; default 20.
cursorstringnext_cursor from the page before.
Answer
Answers 200 with TokenList.
{ "data": [ { "mint": "MASi45ub7Qe4ZE36UT5G6cU4ud8Fhhe4deS4F3cw9KTA", "kind": "wallet", "quote_mint": "So11111111111111111111111111111111111111112", "name": "Nova", "symbol": "NOVA", "metadata_uri": "https://ipfs.io/ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku", "image": "https://ipfs.io/ipfs/bafkreiexgjbqcz4ahcgo6cf3xsnihhjbfy2v4bwy2hwz4tn63qsr7gnvve", "creator": "b8dLcukC7edhDQ7cn5d4gEYkbUrMWeWQLGsCmrG6dLaY", "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" }, "sharing_config": "tcSSSS7XhS4D5EVB8Nf471dAb7Qg25xEgRAhHPfQX88w", "bonding_curve": "YWXXL6A7pNpHXvmBa2EaQAmb2qaLix6mwHaQBPrFbbrZ", "launch_id": "lch_qrjvWeRkipW8wXmW", "signature": "8SVM5jGU5EjLs8zrAnijQAHy9WFp7SyYBjvFBnUZSNTDPM6oQ2NcWVn2RNagKZ58sFy76HJ3zrCJq9uUwkuHSAbZ", "created_at": "2026-10-07T09:12:31.000Z" } ], "next_cursor": null}Its fields
dataobject[]RequiredThe items, newest first.
mintstringRequiredThe token's mint address.
kind"wallet" | "import"RequiredHow it came to relayfor.
quote_mintstringRequiredWhat it trades against and pays its fees in: wrapped SOL for SOL.
namestringRequiredThe token's name.
symbolstringRequiredThe token's ticker.
metadata_uristringRequiredThe token's metadata on IPFS, as pump.fun names it.
imagestring | nullRequiredThe token's image; null for a token brought from pump.fun.
creatorstringRequiredIts creator on pump.fun before the route took its place.
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.
sharing_configstringRequiredpump.fun's account holding the route.
bonding_curvestringRequiredThe token's bonding curve account on pump.fun.
launch_idstring | nullRequiredThe launch or import that brought it: lch_...
signaturestringRequiredThe transaction that locked its route.
created_atstringRequiredWhen it was made, in UTC.
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.
Get a token
Send the project's secret key as Authorization: Bearer rf_sk_..., from a server.
curl https://relayfor.si/api/project/v1/tokens/MASi45ub7Qe4ZE36UT5G6cU4ud8Fhhe4deS4F3cw9KTA \ -H "Authorization: Bearer $RELAYFOR_SECRET_KEY"Path
mintstringRequiredThe token's mint address.
Answer
Answers 200 with TokenDetail.
{ "mint": "MASi45ub7Qe4ZE36UT5G6cU4ud8Fhhe4deS4F3cw9KTA", "kind": "wallet", "quote_mint": "So11111111111111111111111111111111111111112", "name": "Nova", "symbol": "NOVA", "metadata_uri": "https://ipfs.io/ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku", "image": "https://ipfs.io/ipfs/bafkreiexgjbqcz4ahcgo6cf3xsnihhjbfy2v4bwy2hwz4tn63qsr7gnvve", "creator": "b8dLcukC7edhDQ7cn5d4gEYkbUrMWeWQLGsCmrG6dLaY", "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" }, "sharing_config": "tcSSSS7XhS4D5EVB8Nf471dAb7Qg25xEgRAhHPfQX88w", "bonding_curve": "YWXXL6A7pNpHXvmBa2EaQAmb2qaLix6mwHaQBPrFbbrZ", "launch_id": "lch_qrjvWeRkipW8wXmW", "signature": "8SVM5jGU5EjLs8zrAnijQAHy9WFp7SyYBjvFBnUZSNTDPM6oQ2NcWVn2RNagKZ58sFy76HJ3zrCJq9uUwkuHSAbZ", "created_at": "2026-10-07T09:12:31.000Z", "market": { "graduated": false, "curve_progress_bps": 3120 }}Its fields
mintstringRequiredThe token's mint address.
kind"wallet" | "import"RequiredHow it came to relayfor.
quote_mintstringRequiredWhat it trades against and pays its fees in: wrapped SOL for SOL.
namestringRequiredThe token's name.
symbolstringRequiredThe token's ticker.
metadata_uristringRequiredThe token's metadata on IPFS, as pump.fun names it.
imagestring | nullRequiredThe token's image; null for a token brought from pump.fun.
creatorstringRequiredIts creator on pump.fun before the route took its place.
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.
sharing_configstringRequiredpump.fun's account holding the route.
bonding_curvestringRequiredThe token's bonding curve account on pump.fun.
launch_idstring | nullRequiredThe launch or import that brought it: lch_...
signaturestringRequiredThe transaction that locked its route.
created_atstringRequiredWhen it was made, in UTC.
marketobject | nullRequiredRead from the chain now; null when it could not be read.
graduatedbooleanRequiredIts curve completed: it trades on PumpSwap.
curve_progress_bpsnumberRequiredHow much of its curve sold, in basis points (10000 once graduated).
Errors
A 429 or 503 answer carries Retry-After: wait that many seconds, then send the same request again.
Bring a token
Reads who may set the token's route from the chain and builds pump.fun's fee-sharing transaction with relayfor's 1 SOL fee, checked by simulation, for that wallet to sign. Then as a wallet launch: send it yourself or post it to /launches/{id}/submit, and poll GET /launches/{id}. Refused when the route is locked already or the token has no creator fee to route.
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/tokens/import \ -H "Authorization: Bearer $RELAYFOR_SECRET_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{ "mint": "MASi45ub7Qe4ZE36UT5G6cU4ud8Fhhe4deS4F3cw9KTA", "creator": "b8dLcukC7edhDQ7cn5d4gEYkbUrMWeWQLGsCmrG6dLaY" }'Body
mintstringRequiredThe existing pump.fun token.
creatorstringRequiredThe wallet that signs: the token's creator on pump.fun (its open route's admin, if it has one).
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.
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": "import", "state": "prepared", "mint": "MASi45ub7Qe4ZE36UT5G6cU4ud8Fhhe4deS4F3cw9KTA", "creator": "b8dLcukC7edhDQ7cn5d4gEYkbUrMWeWQLGsCmrG6dLaY", "name": "Nova", "symbol": "NOVA", "metadata_uri": "https://ipfs.io/ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku", "image": null, "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": "1000000000", "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
- 422import_refused
- 422insufficient_funds
- 422launch_refused
- 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.