429 with a retry-after value.
The Two Layers
The tier budget is the ceiling for your whole integration. The per-endpoint limits sit underneath it and stop any single user from consuming that budget on their own.
Tier Budget
Your app gets a fixed number of requests per minute across all Partner API endpoints combined.
Exceeding it returns a
429 naming your tier.
Per-Endpoint Limits
These are keyed on the access token, so one user cannot exhaust them for everybody.
Writes are capped lower than reads because each one builds, signs, and submits a Solana transaction.
On the Basic tier these ceilings are mostly theoretical, since the 120 per minute tier budget is tighter than any of them. They matter once you are on the Partner tier, where they stop a single user from spending your whole allowance.
OAuth Endpoints
OAuth limits are keyed on the caller’s IP address rather than on a token, since there is no token yet.Failed Authentication
Separately from the rate limit, twenty failed authentication attempts against oneclient_id within five minutes lock that app out for the remainder of the window.
429 with a retry-after header. In practice it means a stale or mistyped API key in a retry loop will lock out your working traffic too, so treat a 401 invalid_client as a configuration problem to fix rather than something to retry.
Response Headers
Every response carries the state of the per-endpoint bucket.x-ratelimit-limit: requests allowed in the windowx-ratelimit-remaining: requests remainingx-ratelimit-reset: seconds until the window resetsretry-after: sent on429responses only
These headers describe the per-endpoint bucket, not your tier budget. A tier
429 carries retry-after and a retryAfterSeconds field in the body, so watch for the rate_limit_exceeded code rather than trying to predict it from the headers.Monitoring Usage
Request Size
The only Partner API endpoint that accepts a file is
POST /partner/v1/governance/proposals/update-content, which takes at most one image.
Handling 429 Responses
Back off and retry after the interval given inretry-after. A 429 is rejected before it reaches the transaction builder, so nothing was submitted on-chain and the retry is safe.