The numbers
A principal is whoever authenticated: a given API key and a browser
session count separately, but all keys of one account share its account-level
protections.
The two Aro Mail claim endpoints have their own budgets
because a claim code is a bearer secret: the public preview is limited per IP,
and the claim itself is limited per principal and IP instead of the general
write budget, so a recipient’s few attempts never compete with an integration’s
other writes, and a code cannot be brute-forced through either door. The
operator-only
POST /transfer/letter/sweep is authenticated by a shared secret
and has no per-user limit.
When you exceed a limit
The API returns429 with the standard envelope:
Staying well under the limits
- Poll gas, not balances.
GET /gasis designed for polling;/balancesdoes FHE work. See Balances. - Poll transactions at 3–10 s intervals; faster adds no information (Ethereum blocks land every ~12 s) and burns read budget. See Track transactions.
- Batch-poll in-flight rows. If you have several transactions in flight,
one
GET /transactions?status=QUEUED(and likewisePENDING,SETTLING) per interval replaces oneGET /transactions/{id}per row; each list call costs a single read regardless ofpageSize. - Paginate deliberately.
pageSizegoes up to 100; one big page beats five small ones. - Money movement returns immediately with a
QUEUEDtransaction; a successful201is final for the write budget, so don’t retry it. Switch to polling the transaction (reads) until it reachesCONFIRMED,SETTLED, orFAILED. - Poll letters, not the claim preview.
GET /transfer/letter/{id}is the owner’s polling target for Aro Mail (10 s intervals are plenty; mailed letters refresh Lob status at most every 15 minutes anyway). The public preview is for the recipient’s claim page, not for tracking.