Publish official token information with an owner wallet signature.
Request and reference
A project publishes its own links, description, logo and banner here, and every reader of this API picks them up within seconds. Publishing is part of Garp: $200 unlocks one coin for 30 days, paid in ETH on Robinhood Chain or SOL on Solana, and the coin can be updated as often as you like while it is unlocked. Every publish is signed by the coin's owner wallet, so nobody can put words in a project's mouth.
The simplest way is the coin's page on Garp: open My tokens, pick the coin, and the Token info row walks you through unlock, fill in, sign. The same thing over the API, for a bot or a script:
1. Check the coin is unlocked
GET/api/v1/token/{address}/access
{ "address": "0x…", "chainId": "robinhood", "paid": false, "until": null, "daysLeft": 0, "priceUsd": 200, "days": 30, "unlock": "https://www.usegarp.com/board#t/0x…" }
Not unlocked? Ask for a quote and send exactly that amount. The last digits of the amount are how the payment is matched to the coin, so it works from any wallet, including an exchange withdrawal, with no memo. The grant lands within a minute of the transfer confirming; poll /api/pay/intent?id= to watch it.
POST/api/pay/intent{ "token": "0x…", "chain": "robinhood", "asset": "ETH" }
{ "id": "pi_…", "to": "0x…", "amount": "0.07937107", "asset": "ETH", "chain": "robinhood", "usd": 200, "expiresAt": "…", "poll": "/api/pay/intent?id=pi_…" }
One purchase per token, shared by its community. Anyone may pay for a CA. The public token response includes access, also available at /api/v1/token/{address}/access. scope: "token" means access belongs to the CA, not the payer. purchased records whether a confirmed purchase has ever unlocked it; paid means its grant is active now. lastPurchase contains the purchase time, payer wallet, transaction and chain. Renewals update this receipt and extend the token’s grant. communityAccess can also be true while payment enforcement is disabled, even if no purchase occurred. A purchase does not change the profile; the owner separately signs a metadata update.
2. Prepare: get the exact message to sign
Send the fields you want to publish. The server cleans them (handles become handles, links get their scheme, the order is fixed) and hands back the cleaned profile, a timestamp, and the message. Sign that message as-is.
POST/api/v1/token/{address}/profile/prepare
curl -X POST https://www.usegarp.com/api/v1/token/0x…/profile/prepare \
-H 'content-type: application/json' \
-d '{ "profile": { "description": "X Link links on-chain fees to X Money.", "website": "xl.money", "twitter": "@xLinkMoney", "telegram": "t.me/xlinkmoney", "links": [ { "label": "Docs", "url": "docs.xl.money" } ] } }'
{
"at": "2026-09-13T23:22:13.792Z",
"profile": { "description": "X Link links on-chain fees to X Money.", "website": "https://xl.money", "twitter": "xLinkMoney", "telegram": "xlinkmoney", "links": [ { "label": "Docs", "url": "https://docs.xl.money" } ] },
"message": "Garp: update token info for 0x…\n2026-09-13T23:22:13.792Z\n{\"description\":\"X Link links on-chain fees to X Money.\",\"website\":\"https://xl.money\",…}",
"expiresInSeconds": 600
}
The message is three lines: Garp: update token info for {address}, the timestamp, and the cleaned profile as compact JSON in the field order below. On Robinhood Chain sign it as a personal message (EIP-191, what personal_sign and ethers' signMessage produce). On Solana sign the UTF-8 bytes with the wallet's ed25519 key and base58-encode the signature, which is what signMessage in Phantom, Solflare and Backpack does.
3. Publish
POST/api/v1/token/{address}/profile
curl -X POST https://www.usegarp.com/api/v1/token/0x…/profile \
-H 'content-type: application/json' \
-d '{ "signer": "0x2af4…e449", "signature": "0x…", "at": "2026-09-13T23:22:13.792Z", "profile": { …exactly what prepare returned… } }'
{ "ok": true, "revision": 1, "updatedAt": "2026-09-13T23:23:26.000Z", "ownerVerified": true, "token": { …the full token document, as everyone now reads it… } }
Who can sign. The coin's deployer, its fee recipient, or the wallet it was handed to in a community takeover on Garp. If ownership cannot be verified, publishing is rejected. Paying for a token does not grant permission to edit its official information. A publish replaces the whole profile; leave a field out to fall back to the token's on-chain metadata, or send an empty string to explicitly remove it. The timestamp has to be inside ten minutes and newer than the last revision, so a signed body cannot be replayed.