Skip to main content
Requests are rate limited per API key and per source IP — whichever limit is reached first applies. Exceeding either returns 429.

The limits

Published as concrete numbers so you can pace a loop rather than discovering the cap as a 429. Each route carries its own counter, so a swap quote does not spend a send quote’s budget. Anything not listed falls back to the default.
The quote routes are tight because each one fans out to a paid third-party routing API. The transaction write is tighter still: 10 a minute is 600 an hour, which is far above any real integration and low enough to blunt a runaway loop.
POST /v1/transaction is one shared budget across Send and Swap — it is the same endpoint for both — so a run that does both has to pace against the pair, not against each separately. There is no batch endpoint: a batch payout is your own loop over quote → sign → record, so sleep between iterations rather than firing them all at once.
Re-quoting before every signature costs a quote each time. You should re-quote: a stale swap quote fails on chain once the market moves past its slippage tolerance, and you still pay the network fee for the attempt. So budget the quote route for one call per transaction rather than one per batch.

Why two limits

A per-key limit protects the account from one runaway integration. A per-IP limit protects the API from a host running many keys.
Sharing one outbound IP across several keys means the IP limit can bite before any individual key’s limit does. If you run multiple integrations from one host, budget against the IP.

Handling 429

The code is the string "429". Branch on the HTTP status. Back off exponentially with jitter, and cap the number of attempts.
Retrying immediately on 429 makes it worse. Every rejected request still counts.

Staying under the limit

GET /v1/payment-link and GET /v1/transaction are for reconciliation, not for watching one item. Polling a single id in a tight loop is the fastest way to a 429.Poll on a sensible interval — seconds, not milliseconds — and back off when nothing has changed.
Every quote reports an executionDuration in seconds. A same-chain swap or send settles in seconds; a cross-chain bridge can take minutes.Use that number as your first wait rather than polling from the moment you broadcast. A processing bridge is not a failure — it is a bridge.
There is no batch endpoint. A run of 50 payouts is your own loop over POST /v1/transaction, which allows 10 a minute — so sleep between iterations rather than firing them all and collecting 429s.Every rejected request still counts against the limit, so a loop that meets the cap and retries immediately makes itself slower.
Separate keys give each integration its own budget, and let you revoke one without taking down the rest.
A created link’s id and url never change. Store them rather than re-reading them.

Next

Errors

Which codes retry.

Pagination

Paging without hammering.

Moove Swap

Quoting, signing and recording.