May 7, 2026 · Developer Guide
E-Signature API Rate Limits: What Every Developer Should Know
Hit a 429 and your contract never arrives. Here's how to build retry logic that never drops a document — with rate limits from 6 providers compared side-by-side.
Founder, Signbee
TL;DR
Rate limits vary wildly across e-signature APIs. DocuSign allows 1,000 calls/hour (~17/min). Signbee allows 1,000/min on paid plans. Without proper retry logic, a single 429 means a contract never reaches the signer. We compared 6 providers and built a retry pattern that handles 429s, 500s, and network failures.
Why rate limits matter for e-signatures
Unlike a failed search query or a broken analytics event, a failed e-signature API call means a real document never reaches a real person. An NDA that doesn't arrive delays a deal. An offer letter that silently fails means a candidate hears nothing. A HIPAA consent form that drops means a patient can't be treated.
Rate limits are the most common cause of silent e-signature failures in production. Your code looks fine. Your tests pass. But under load — during a batch send, a quarterly invoice run, or a busy enrollment period — you exceed the limit and documents start dropping.
Rate limits by provider
| Provider | Send limit | Status check limit |
|---|---|---|
| Signbee (free) | 100/min | 200/min |
| Signbee (paid) | 1,000/min | 5,000/min |
| DocuSign | 1,000/hour | 1,000/hour |
| HelloSign | 100/min | 150/min |
| PandaDoc | 300/min | 600/min |
| BoldSign | 300/min | 500/min |
For a deeper comparison of integration complexity and pricing, see our full comparison of the 6 best e-signature APIs.
The retry pattern that never drops a document
async function sendWithRetry(url, options, maxRetries = 3) {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
const res = await fetch(url, options);
if (res.ok) return res.json();
if (res.status === 429) {
// Rate limited — respect Retry-After header
const retryAfter = parseInt(
res.headers.get("Retry-After") || "5", 10
);
console.warn(`Rate limited. Waiting ${retryAfter}s...`);
await new Promise((r) => setTimeout(r, retryAfter * 1000));
continue;
}
if (res.status >= 500 && attempt < maxRetries) {
// Server error — exponential backoff
const delay = Math.pow(2, attempt) * 1000;
console.warn(`Server error ${res.status}. Retry in ${delay}ms`);
await new Promise((r) => setTimeout(r, delay));
continue;
}
// Client error (4xx) — don't retry
throw new Error(`${res.status}: ${await res.text()}`);
}
throw new Error("Max retries exceeded");
}
// Usage
const result = await sendWithRetry(
"https://signb.ee/api/v1/send",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_KEY",
},
body: JSON.stringify({
markdown: "# NDA\n\nTerms here...",
recipient_name: "Jane Smith",
recipient_email: "jane@example.com",
}),
}
);Common rate limit mistakes
| Mistake | Consequence |
|---|---|
| No retry logic | Documents silently fail |
| Ignoring Retry-After | Hammering the API → IP ban |
| Promise.all for batches | One 429 aborts all docs |
| No concurrency limit | 500 simultaneous requests |
| No monitoring | Don't know docs are failing |
Monitoring rate limit health
Track three metrics in production:
Frequently Asked Questions
What are e-signature API rate limits?
Rate limits define how many API calls you can make in a given time window. Exceeding them returns a 429 status code. Without retry logic, the document send silently fails.
What happens when you hit a rate limit?
You receive a 429 Too Many Requests response, usually with a Retry-After header. Your code should pause for the specified duration and retry. Without handling, the document never reaches the signer.
Which provider has the highest rate limit?
Signbee offers 1,000/min on paid plans — roughly 60x more throughput than DocuSign's 1,000/hour. See our full provider comparison.
Never drop a document — 5 free docs/month, 100 req/min.
Last updated: May 7, 2026 · Michael Beckett is the founder of Signbee and B2bee Ltd.