Errors
Every failure is{ "ok": false, "error": "…", "code": "…", "retryable": … } with a matching HTTP status. error is a short reason for people. code is a fixed word for your script. Branch on code; the message may change.
A 429 from the per-minute limiter and the paused 503 also carry retryAfterSeconds, the same figure as the Retry-After header. Other 429s (hourly budgets, creator-authority cooldowns) say how long in the message.
Your own Helius key
Three calls read Solana on demand rather than from our own records:GET /transactions/{signature}, GET /redirects/{mint} and POST /pumpfun/fees. They run on your Helius key, not ours, so send it as a header:
401 with code helius_key_required; a value that isn’t shaped like a Helius key is a 400; a key Helius refuses is a 401 with code helius_key_rejected. Every other call needs no key. Your key is used for that request only and is never stored or logged.
Rate limits
Limits are per address (IPv6: per /64 block) and per endpoint, in one-minute windows. Reading data well says how to stay under them without trying. Every answer from the API itself says what the limit is (the503 while paused and the 410 on old v1 addresses carry no limit headers):
prepare and submit, every refusal) also say where you stand:
Hourly budgets sit on top of the per-minute limits, and their
429 says so in the message. Launch builds: 8 an hour per wallet, 20 an hour per address, 240 an hour site-wide, on purps.lol and on pump.fun each; a new fee level on purps.lol needs its own on-chain setup and is allowed 2 an hour per address and 6 an hour site-wide. Fetching a logo by imageUrl: 20 an hour per address, 200 an hour site-wide; when that runs out the build asks for image as a data URL instead, which is never budgeted. Pons: 10 launch builds and 20 registrations an hour per wallet. Creator authority: 60 actions, 30 strategy changes, 10 requests and 20 handovers an hour per address, plus a per-coin count of position actions a day and a cooldown after each change; the limit and the running cooldowns are on GET /coins/{mint}/authority.