Rate Limits
Rate Limits
ZipZign enforces rate limits to protect service stability. These are separate from your monthly document quota.
Rate limit table
Endpoint | Limit | Window |
|---|---|---|
| 100 requests | per hour, per user |
| 10 requests | per hour, per IP |
| 10 requests | per 5 minutes, per IP |
All other endpoints are not rate-limited under normal usage.
Rate limit response
When a rate limit is hit, ZipZign returns 429 Too Many Requests:
{
"error": "RateLimitExceeded",
"message": "Too many requests. Retry after 60 seconds.",
"retryAfter": 60
}
Response headers
Rate-limited endpoints include headers to help you track usage:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 7
X-RateLimit-Reset: 1744900800
Retry-After: 60
Header | Description |
|---|---|
| Max requests allowed in window |
| Requests left in current window |
| Unix timestamp when window resets |
| Seconds to wait before retrying (on 429) |
Handling 429s in code
async function createDocument(payload, retries = 3) {
const response = await fetch('https://zipzign.com/api/documents', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.ZIPZIGN_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
});
if (response.status === 429 && retries > 0) {
const err = await response.json();
const wait = (err.retryAfter ?? 60) * 1000;
console.log(`Rate limited. Retrying in ${wait / 1000}s...`);
await new Promise(resolve => setTimeout(resolve, wait));
return createDocument(payload, retries - 1);
}
return response.json();
}
Batch document creation
If you need to create many documents programmatically (e.g., bulk sending), stay under the 100/hour limit by adding a delay:
const delay = ms => new Promise(r => setTimeout(r, ms));
for (const payload of documents) {
await createDocument(payload);
await delay(40); // ~90 docs/minute, safely under 100/hour
}
Quota vs. rate limits
| Rate limit | Quota |
|---|---|---|
Scope | Requests per time window | Documents per month |
Error | | |
Resets | Every hour / 5 minutes | 1st of each month |
Affected by sandbox | No | No (sandbox is free) |
Updated on: 16/04/2026
Thank you!