Rate limits
Per-key limits per minute, separate for reads and writes, reported in RateLimit headers.
Each API key has two budgets per one-minute window: one for reads (GET) and one for writes (everything else).
| Mode | Reads per minute | Writes per minute |
|---|---|---|
Live (zp_live_…) | 1500 | 300 |
Test (zp_test_…) | 600 | 120 |
Every response reports the budget of its kind:
RateLimit-Limit: 1500
RateLimit-Remaining: 1487
RateLimit-Reset: 42
RateLimit-Policy: 1500;w=60;comment="reads per API key"| Header | Meaning |
|---|---|
RateLimit-Limit | Requests allowed in the current window. |
RateLimit-Remaining | Requests left in the window. |
RateLimit-Reset | Seconds until the window resets. |
RateLimit-Policy | The limit and the window length in seconds. |
Over the limit, the API answers 429 with type: "rate_limit_error" and a Retry-After header (seconds). Wait that long, then retry.
Staying under the limits
- Use webhooks instead of polling. A webhook costs you nothing against the limit.
- Page with
limit=100for bulk reads. - Back off exponentially with jitter on
429and5xx. The Node SDK does this and honoursRetry-After. - Spread batch jobs. A reconciliation job that walks a day of payments uses a few requests per thousand payments.
Precision
Limits are counted per API server. ZyloPay runs more than one, so in rare cases a burst can pass slightly above the stated limit before it is refused. Do not rely on that headroom. A separate, higher per-IP ceiling protects the service as a whole.
Need higher limits? Contact support.