Rate limits and API keys
Limits per class and tier, self-serve keys by wallet signature, partner keys.
API keys
Keys are optional for everything except webhooks. A key raises your limits and attributes the swaps and launches you build to you. Send it as Authorization: Bearer jf_live_... or X-API-Key. An invalid or revoked key is a 401; it never quietly falls back to anonymous.
Get a free key
Sign this exact message with any Solana wallet (ed25519, for example Phantom's signMessage), then send the base58 signature within 5 minutes. One active free key per wallet. The key is shown once.
justi.fun api key
wallet: <wallet>
label: <label>
time: <unix seconds>Partner keys
Building something with real volume (a terminal, a wallet, a bot with many users)? Ask for a partner key on X at @justifun. Partner keys have the limits below and per-key usage reports.
Rate limits
A token bucket per identity (key, else IP) per rate class: burst, then a steady refill. Every response carries RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset (seconds until full) and RateLimit-Policy; a 429 adds Retry-After. Each endpoint shows its class.
| Class | anon (per IP) | free key | partner key |
|---|---|---|---|
| read | 120 burst, 300/min | 200, 600/min | 600, 3000/min |
| quote | 40, 120/min | 100, 300/min | 300, 1200/min |
| build (POST /v1/swap) | 10, 30/min | 20, 60/min | 120, 600/min |
| submit | 10, 30/min | 20, 60/min | 120, 600/min |
| launch (POST /v1/launches) | 3, 6 per 10 min | 5, 2/min | 20, 12/min |
| manage (webhooks, revoke) | not allowed | 20, 30/min | 60, 120/min |
| keys (self-serve create) | 3, 5/hour | ||
| asset (meta, image, banner) | 600, 3000/min | 1000, 6000/min | 3000, 20000/min |
| stream (new SSE/WS connections) | 10, 20/min | 20, 60/min | 100, 300/min |
Reference
#Self-serve: a wallet signs a message and gets a free-tier key
Sign the UTF-8 message "justi.fun api key\nwallet: <wallet>\nlabel: <label>\ntime: <ts>" with the wallet (ed25519, e.g. signMessage), send the base58 signature. ts within 5 minutes. One active free key per wallet. The key is shown once.
Body
| Field | Type | About |
|---|---|---|
| walletrequired | address | |
| labelrequired | string | max 40 chars |
| tsrequired | integer | Unix seconds used in the message. |
| signaturerequired | string | Base58 ed25519 signature of the message. max 100 chars |
Response KeyCreated
| Field | Type | About |
|---|---|---|
| keyrequired | string | jf_live_... Store it now; only its hash is kept. |
| recordrequired | ApiKey | |
| idrequired | string | UUID. |
| prefixrequired | string | |
| labelrequired | string | |
| ownerWalletrequired | address | null | |
| tierrequired | "free" | "partner" | "internal" | |
| limitsrequired | object | null | |
| createdAtrequired | integer | Unix time in seconds. |
| lastUsedAtrequired | integer | null | Unix time in seconds. |
| revokedAtrequired | integer | null | Unix time in seconds. |
| messagerequired | string |
curl -X POST "https://api.justi.fun/v1/keys" \
-H "Content-Type: application/json" \
-d '{"wallet":"<wallet>","label":"my-bot","ts":1793110000,"signature":"<signature>"}'#The calling key, its tier and limits
Response object
| Field | Type | About |
|---|---|---|
| keyrequired | ApiKey | |
| idrequired | string | UUID. |
| prefixrequired | string | |
| labelrequired | string | |
| ownerWalletrequired | address | null | |
| tierrequired | "free" | "partner" | "internal" | |
| limitsrequired | object | null | |
| createdAtrequired | integer | Unix time in seconds. |
| lastUsedAtrequired | integer | null | Unix time in seconds. |
| revokedAtrequired | integer | null | Unix time in seconds. |
| limitsrequired | object | |
| maxStreamConnectionsrequired | integer |
curl "https://api.justi.fun/v1/keys/me" \
-H "Authorization: Bearer $JUSTI_API_KEY"#Revoke the calling key (its webhooks stop)
Response object
| Field | Type | About |
|---|---|---|
| revokedrequired | boolean |
curl -X DELETE "https://api.justi.fun/v1/keys/me" \
-H "Authorization: Bearer $JUSTI_API_KEY"