Webhooks
Endpoints that receive signed events, their deliveries and their secrets.
Add an endpoint and relayfor.si posts each event to it, signed. See Webhooks for every event, how to check a signature and how retries work.
List endpoints
Send the project's secret key as Authorization: Bearer rf_sk_..., from a server.
curl https://relayfor.si/api/project/v1/webhooks \ -H "Authorization: Bearer $RELAYFOR_SECRET_KEY"Answer
Answers 200 with WebhookList.
{ "data": [ { "id": "whk_X4llUGp4sGFkmDEl", "url": "https://api.example.com/relayfor/events", "events": [ "launch.confirmed", "payout.credited", "account.low_balance" ], "created_at": "2026-10-07T09:01:00.000Z", "rotated_at": null } ]}Its fields
dataobject[]RequiredThe items, newest first.
idstringRequiredThe endpoint's id: whk_ and 16 characters.
urlstringRequiredWhere events are sent.
events"launch.confirmed" | "launch.failed" | "token.imported" | "token.graduated" | "payout.credited" | "account.low_balance" | "key.limit_reached" | "route.changed"[]RequiredThe event types it receives; empty for all of them.
created_atstringRequiredWhen it was made, in UTC.
rotated_atstring | nullRequiredWhen its secret was last replaced.
Errors
A 429 or 503 answer carries Retry-After: wait that many seconds, then send the same request again.
Add an endpoint
The answer carries the endpoint's signing secret, and gives it again to a retry with the same Idempotency-Key. Events: launch.confirmed, launch.failed, token.imported, token.graduated, payout.credited, account.low_balance (spendable credit under $5, once until topped up), key.limit_reached (once a period) and route.changed. Up to 5 endpoints per project.
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/webhooks \ -H "Authorization: Bearer $RELAYFOR_SECRET_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{ "url": "https://api.example.com/relayfor/events", "events": [ "launch.confirmed", "payout.credited", "account.low_balance" ] }'Body
urlstringRequiredA public https:// URL, without credentials in it.
events"launch.confirmed" | "launch.failed" | "token.imported" | "token.graduated" | "payout.credited" | "account.low_balance" | "key.limit_reached" | "route.changed"[]The event types it receives; left out or empty for all of them.
Answer
Answers 201 with NewWebhook.
{ "id": "whk_X4llUGp4sGFkmDEl", "url": "https://api.example.com/relayfor/events", "events": [ "launch.confirmed", "payout.credited", "account.low_balance" ], "created_at": "2026-10-07T09:01:00.000Z", "rotated_at": null, "secret": "whsec_3J9mKq2Vx7Lp4Rt8Nc1Hd6Ys5Bz0Fw2Ga"}Its fields
idstringRequiredThe endpoint's id: whk_ and 16 characters.
urlstringRequiredWhere events are sent.
events"launch.confirmed" | "launch.failed" | "token.imported" | "token.graduated" | "payout.credited" | "account.low_balance" | "key.limit_reached" | "route.changed"[]RequiredThe event types it receives; empty for all of them.
created_atstringRequiredWhen it was made, in UTC.
rotated_atstring | nullRequiredWhen its secret was last replaced.
secretstring | nullRequiredThe signing secret, whsec_...: shown in this answer, and again to a retry with the same Idempotency-Key within 24 hours. Null only if it can't be given back: then rotate it.
Errors
- 400invalid_request
- 400missing_idempotency_key
- 401unauthorized
- 409idempotency_in_progress
- 413payload_too_large
- 415unsupported_media_type
- 422idempotency_mismatch
- 422too_many_webhooks
- 429rate_limited
- 500internal
- 503unavailable
- 503webhooks_closed
A 409, 429, or 503 answer carries Retry-After: wait that many seconds, then send the same request again.
Get an endpoint
Send the project's secret key as Authorization: Bearer rf_sk_..., from a server.
curl https://relayfor.si/api/project/v1/webhooks/whk_X4llUGp4sGFkmDEl \ -H "Authorization: Bearer $RELAYFOR_SECRET_KEY"Path
idstringRequiredThe endpoint's id: whk_...
Answer
Answers 200 with Webhook.
{ "id": "whk_X4llUGp4sGFkmDEl", "url": "https://api.example.com/relayfor/events", "events": [ "launch.confirmed", "payout.credited", "account.low_balance" ], "created_at": "2026-10-07T09:01:00.000Z", "rotated_at": null}Its fields
idstringRequiredThe endpoint's id: whk_ and 16 characters.
urlstringRequiredWhere events are sent.
events"launch.confirmed" | "launch.failed" | "token.imported" | "token.graduated" | "payout.credited" | "account.low_balance" | "key.limit_reached" | "route.changed"[]RequiredThe event types it receives; empty for all of them.
created_atstringRequiredWhen it was made, in UTC.
rotated_atstring | nullRequiredWhen its secret was last replaced.
Errors
A 429 or 503 answer carries Retry-After: wait that many seconds, then send the same request again.
Delete an endpoint
Deleting an endpoint already deleted answers it again, so a retry after a lost answer is safe.
Send the project's secret key as Authorization: Bearer rf_sk_..., from a server.
curl -X DELETE https://relayfor.si/api/project/v1/webhooks/whk_X4llUGp4sGFkmDEl \ -H "Authorization: Bearer $RELAYFOR_SECRET_KEY"Path
idstringRequiredThe endpoint's id: whk_...
Answer
Answers 200 with Webhook.
{ "id": "whk_X4llUGp4sGFkmDEl", "url": "https://api.example.com/relayfor/events", "events": [ "launch.confirmed", "payout.credited", "account.low_balance" ], "created_at": "2026-10-07T09:01:00.000Z", "rotated_at": null}Its fields
idstringRequiredThe endpoint's id: whk_ and 16 characters.
urlstringRequiredWhere events are sent.
events"launch.confirmed" | "launch.failed" | "token.imported" | "token.graduated" | "payout.credited" | "account.low_balance" | "key.limit_reached" | "route.changed"[]RequiredThe event types it receives; empty for all of them.
created_atstringRequiredWhen it was made, in UTC.
rotated_atstring | nullRequiredWhen its secret was last replaced.
Errors
A 429 or 503 answer carries Retry-After: wait that many seconds, then send the same request again.
Rotate the signing secret
The answer carries the new secret, and gives it again to a retry with the same Idempotency-Key. For 24 hours deliveries carry a signature under each secret, so the receiver can switch without missing one.
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/webhooks/whk_X4llUGp4sGFkmDEl/rotate \ -H "Authorization: Bearer $RELAYFOR_SECRET_KEY" \ -H "Idempotency-Key: $(uuidgen)"Path
idstringRequiredThe endpoint's id: whk_...
Answer
Answers 200 with NewWebhook.
{ "id": "whk_X4llUGp4sGFkmDEl", "url": "https://api.example.com/relayfor/events", "events": [ "launch.confirmed", "payout.credited", "account.low_balance" ], "created_at": "2026-10-07T09:01:00.000Z", "rotated_at": "2026-10-07T15:30:00.000Z", "secret": "whsec_8Pk1Lm5Qx9Ws2Vt7Nd4Hc3Yr6Bz0Fg1Ja"}Its fields
idstringRequiredThe endpoint's id: whk_ and 16 characters.
urlstringRequiredWhere events are sent.
events"launch.confirmed" | "launch.failed" | "token.imported" | "token.graduated" | "payout.credited" | "account.low_balance" | "key.limit_reached" | "route.changed"[]RequiredThe event types it receives; empty for all of them.
created_atstringRequiredWhen it was made, in UTC.
rotated_atstring | nullRequiredWhen its secret was last replaced.
secretstring | nullRequiredThe signing secret, whsec_...: shown in this answer, and again to a retry with the same Idempotency-Key within 24 hours. Null only if it can't be given back: then rotate it.
Errors
- 400invalid_request
- 400missing_idempotency_key
- 401unauthorized
- 404not_found
- 409idempotency_in_progress
- 413payload_too_large
- 415unsupported_media_type
- 422idempotency_mismatch
- 429rate_limited
- 500internal
- 503unavailable
- 503webhooks_closed
A 409, 429, or 503 answer carries Retry-After: wait that many seconds, then send the same request again.
Send a test event
Answers once the attempt is made, with how it went.
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/webhooks/whk_X4llUGp4sGFkmDEl/test \ -H "Authorization: Bearer $RELAYFOR_SECRET_KEY" \ -H "Idempotency-Key: $(uuidgen)"Path
idstringRequiredThe endpoint's id: whk_...
Answer
Answers 201 with Delivery.
{ "id": "dlv_fTVsO4UwhIn2defC", "webhook": "whk_X4llUGp4sGFkmDEl", "event": { "id": "evt_4c9LGfliJda80U3V", "type": "payout.credited" }, "status": "delivered", "attempts": 1, "next_attempt_at": null, "last_attempt_at": "2026-10-07T13:40:02.000Z", "last_status": 200, "last_error": null, "delivered_at": "2026-10-07T13:40:02.000Z", "created_at": "2026-10-07T13:40:01.000Z"}Its fields
idstringRequiredThe delivery's id: dlv_ and 16 characters.
webhookstringRequiredThe endpoint: whk_...
eventobjectRequiredThe event it carries.
idstringRequiredThe event's id, evt_..., as its body names it.
typestringRequiredThe event's type, such as payout.credited.
status"pending" | "delivered" | "failed"Requiredpending: sent again later; delivered: answered 2xx; failed: given up.
attemptsintegerRequiredHow many times it was sent.
next_attempt_atstring | nullRequiredWhen it is sent again; null once delivered or given up.
last_attempt_atstring | nullRequiredWhen it was last sent; null before the first try.
last_statusinteger | nullRequiredThe HTTP status it last answered.
last_errorstring | nullRequiredWhy the last try failed, such as "answered 500".
delivered_atstring | nullRequiredWhen the endpoint answered 2xx; null until then.
created_atstringRequiredWhen it was made, in UTC.
Errors
- 400invalid_request
- 400missing_idempotency_key
- 401unauthorized
- 404not_found
- 409idempotency_in_progress
- 413payload_too_large
- 415unsupported_media_type
- 422idempotency_mismatch
- 429rate_limited
- 500internal
- 503unavailable
- 503webhooks_closed
A 409, 429, or 503 answer carries Retry-After: wait that many seconds, then send the same request again.
List deliveries
Send the project's secret key as Authorization: Bearer rf_sk_..., from a server.
curl https://relayfor.si/api/project/v1/webhooks/deliveries \ -H "Authorization: Bearer $RELAYFOR_SECRET_KEY"Query
webhookstringOnly this endpoint's deliveries: whk_...
limitinteger1 to 100; default 20.
cursorstringnext_cursor from the page before.
Answer
Answers 200 with DeliveryList.
{ "data": [ { "id": "dlv_fTVsO4UwhIn2defC", "webhook": "whk_X4llUGp4sGFkmDEl", "event": { "id": "evt_4c9LGfliJda80U3V", "type": "payout.credited" }, "status": "delivered", "attempts": 1, "next_attempt_at": null, "last_attempt_at": "2026-10-07T13:40:02.000Z", "last_status": 200, "last_error": null, "delivered_at": "2026-10-07T13:40:02.000Z", "created_at": "2026-10-07T13:40:01.000Z" } ], "next_cursor": null}Its fields
dataobject[]RequiredThe items, newest first.
idstringRequiredThe delivery's id: dlv_ and 16 characters.
webhookstringRequiredThe endpoint: whk_...
eventobjectRequiredThe event it carries.
idstringRequiredThe event's id, evt_..., as its body names it.
typestringRequiredThe event's type, such as payout.credited.
status"pending" | "delivered" | "failed"Requiredpending: sent again later; delivered: answered 2xx; failed: given up.
attemptsintegerRequiredHow many times it was sent.
next_attempt_atstring | nullRequiredWhen it is sent again; null once delivered or given up.
last_attempt_atstring | nullRequiredWhen it was last sent; null before the first try.
last_statusinteger | nullRequiredThe HTTP status it last answered.
last_errorstring | nullRequiredWhy the last try failed, such as "answered 500".
delivered_atstring | nullRequiredWhen the endpoint answered 2xx; null until then.
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.
Send a delivery again
Due now, with 24 hours of retries from now. The event keeps its id, so a receiver that handled it already can tell.
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/webhooks/deliveries/dlv_fTVsO4UwhIn2defC/replay \ -H "Authorization: Bearer $RELAYFOR_SECRET_KEY" \ -H "Idempotency-Key: $(uuidgen)"Path
idstringRequiredThe delivery's id: dlv_...
Answer
Answers 200 with Delivery.
{ "id": "dlv_fTVsO4UwhIn2defC", "webhook": "whk_X4llUGp4sGFkmDEl", "event": { "id": "evt_4c9LGfliJda80U3V", "type": "payout.credited" }, "status": "delivered", "attempts": 1, "next_attempt_at": null, "last_attempt_at": "2026-10-07T13:40:02.000Z", "last_status": 200, "last_error": null, "delivered_at": "2026-10-07T13:40:02.000Z", "created_at": "2026-10-07T13:40:01.000Z"}Its fields
idstringRequiredThe delivery's id: dlv_ and 16 characters.
webhookstringRequiredThe endpoint: whk_...
eventobjectRequiredThe event it carries.
idstringRequiredThe event's id, evt_..., as its body names it.
typestringRequiredThe event's type, such as payout.credited.
status"pending" | "delivered" | "failed"Requiredpending: sent again later; delivered: answered 2xx; failed: given up.
attemptsintegerRequiredHow many times it was sent.
next_attempt_atstring | nullRequiredWhen it is sent again; null once delivered or given up.
last_attempt_atstring | nullRequiredWhen it was last sent; null before the first try.
last_statusinteger | nullRequiredThe HTTP status it last answered.
last_errorstring | nullRequiredWhy the last try failed, such as "answered 500".
delivered_atstring | nullRequiredWhen the endpoint answered 2xx; null until then.
created_atstringRequiredWhen it was made, in UTC.
Errors
- 400invalid_request
- 400missing_idempotency_key
- 401unauthorized
- 404not_found
- 409idempotency_in_progress
- 413payload_too_large
- 415unsupported_media_type
- 422idempotency_mismatch
- 429rate_limited
- 500internal
- 503unavailable
- 503webhooks_closed
A 409, 429, or 503 answer carries Retry-After: wait that many seconds, then send the same request again.
Events
Every event relayfor.si posts, and what its data holds. Deliveries are signed: see checking a signature.
Every event
Each delivery is a POST of this envelope. data holds what the event is about, as the entries below show.
idstringRequiredThe event's id: evt_ and 16 characters. The same event may arrive twice.
typestringRequiredThe event's type.
created_atstringRequiredWhen it happened, in UTC.
projectstringRequiredThe project's id: prj_...
launch.confirmed
A launch the chain confirmed: its token is on its route.
data holdslaunch
launchobjectRequiredThe launch or import, as GET /launches/{id} answers it.
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.
launch.failed
A launch the chain refused, or whose route came out other than prepared.
data holdslaunch
launchobjectRequiredThe launch or import, as GET /launches/{id} answers it.
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.
token.imported
An import the chain confirmed: the existing token is on its route.
data holdslaunch
launchobjectRequiredThe launch or import, as GET /launches/{id} answers it.
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.
token.graduated
A token's curve completed: it trades on PumpSwap, its fees still on its route.
data holdstokengraduated_at
tokenobjectRequiredThe token that graduated.
mintstringRequiredThe token's mint address.
namestringRequiredThe token's name.
symbolstringRequiredThe token's ticker.
graduated_atstringRequiredWhen its curve completed, in UTC.
payout.credited
A payout of a token's creator fees became AI credit.
data holdspayout
payoutobjectRequiredThe payout, and the credit it became.
tokenstringRequiredThe token's mint.
accountstringRequiredThe credit account it was credited to: acc_...
signaturestringRequiredThe payout's transaction.
eventstringRequiredWhich of the transaction's payout events: a transaction may carry several.
slotstringRequiredThe slot the payout landed in.
quote_mintstringRequiredWhat it was paid in: wrapped SOL for SOL, else the token's quote.
distributed_lamportsstringRequiredWhat the payout shared among every shareholder, in the quote's base units.
ai_bpsintegerRequiredThe AI's share of the route, in basis points.
ai_lamportsstringRequiredWhat reached the token's vault, in the quote's base units.
sol_usdobject | nullRequiredPyth's SOL/USD price the payout was valued at, credited at the price less its confidence; null for a payout in a token.
pricestringRequiredDollars per SOL.
confidencestringRequiredPyth's stated uncertainty, in dollars.
published_atstringRequiredWhen Pyth published the price.
credited_usdstring | nullRequiredThe credit it became, in dollars; null while a token payout waits to be sold for USDC.
created_atstringRequiredWhen it was made, in UTC.
account.low_balance
An account's spendable credit fell under the threshold: once, until a credit lifts it back.
data holdsaccountthreshold_usd
accountobjectRequiredThe account as it stands now.
idstringRequiredThe account's id: acc_ and 16 characters.
tokenobject | nullRequiredThe token whose AI share lands here.
mintstringRequiredThe token's mint address.
namestringRequiredThe token's name.
symbolstringRequiredThe token's ticker.
spendable_usdstringRequiredWhat new calls can reserve now: the balance less what is reserved.
balance_usdstringRequiredCredit left, what running calls reserved included.
reserved_usdstringRequiredHeld by calls still running or waiting on their cost.
credited_usdstringRequiredEvery credit the account ever received.
spent_usdstringRequiredEverything its calls were charged.
running_callsintegerRequiredCalls running on it now: it allows 8 at once.
created_atstringRequiredWhen it was made, in UTC.
threshold_usdstringRequiredThe threshold: $5.
key.limit_reached
A router key's call was refused for its spending limit: once in each of the limit's periods.
data holdskey
keyobjectRequiredThe key refused, with its limit.
idstringRequiredThe key's id: key_ and 16 characters.
namestringRequiredWhat uses it, such as the agent's name.
hintstringRequiredThe key's first characters: enough to tell keys apart.
accountstringRequiredThe account it spends: acc_...
limitobject | nullRequiredIts spending limit and what this period used of it; null for none.
limit_usdstringRequiredDollars it may spend each period.
reset"daily" | "weekly" | "monthly"RequiredWhen the limit starts over, at 00:00 UTC.
spent_usdstringRequiredCharged to its calls that started this period.
reserved_usdstringRequiredHeld by its calls of this period still open.
remaining_usdstringRequiredWhat it may still start this period.
resets_atstringRequired00:00 UTC; a week starts on Monday.
created_atstringRequiredWhen it was made, in UTC.
last_used_atstring | nullRequiredWhen it last started a call; null if never.
revoked_atstring | nullRequiredWhen it was revoked; null while it works.
route.changed
A token's creator fees no longer follow the route relayfor locked (a takeover on pump.fun): its payouts stop.
data holdstokenreasondetected_at
tokenobjectRequiredThe token whose fees moved.
mintstringRequiredThe token's mint address.
namestringRequiredThe token's name.
symbolstringRequiredThe token's ticker.
reasonstringRequiredWhat the chain shows instead.
detected_atstringRequiredWhen relayfor saw it, in UTC.
ping
A test event, sent only to the endpoint tested (POST /webhooks/{id}/test).
data holdsmessage
messagestringRequiredA line saying it is a test.