| name | documenso-rate-limits |
| description | Implement Documenso rate limiting, backoff, and request throttling patterns.
Use when handling rate limit errors, implementing retry logic,
or optimizing API request throughput for Documenso.
Trigger with phrases like "documenso rate limit", "documenso throttling",
"documenso 429", "documenso retry", "documenso backoff".
|
| allowed-tools | Read, Write, Edit |
| version | 1.13.0 |
| license | MIT |
| author | Jeremy Longshore <jeremy@intentsolutions.io> |
| tags | ["saas","documenso","api"] |
| compatibility | Designed for Claude Code, also compatible with Codex and OpenClaw |
Documenso Rate Limits
Overview
Documenso uses a fair-use rate limiting model. There are no published per-minute request quotas -- instead, limits are based on your plan's document allowance and general API fair use. The paid plans (Individual and Team) include unlimited signing and API volume. The free plan has a document limit. If you hit a 429, implement exponential backoff and request queuing.
Prerequisites
- Documenso SDK installed
- Understanding of async/await patterns
- Completed
documenso-install-auth setup
Documenso Fair Use Model
| Plan | Documents | API Volume | Signing Volume |
|---|
| Free | Limited (per plan) | Fair use | Fair use |
| Individual ($30/mo) | Unlimited | Unlimited | Unlimited |
| Team | Unlimited | Unlimited | Unlimited |
| Enterprise | Unlimited | Unlimited | Unlimited |
| Self-Hosted | Unlimited | No limits | No limits |
Documenso explicitly does not price API usage -- they want developers to build on the platform without API cost concerns. The practical limit is abusive traffic patterns (thousands of requests per second).
Instructions
Step 1: Exponential Backoff with Jitter
interface RetryConfig {
maxRetries: number;
baseDelayMs: number;
maxDelayMs: number;
}
const DEFAULTS: RetryConfig = { maxRetries: 5, baseDelayMs: 1000, maxDelayMs: 60000 };
export async withRetry<T>(
: <T>,
: <> = {}
): <T> {
{ maxRetries, baseDelayMs, maxDelayMs } = { ..., ...config };
: | ;
( attempt = ; attempt <= maxRetries; attempt++) {
{
();
} (: ) {
lastError = err;
status = err. ?? err.;
(status && status >= && status < && status !== ) {
err;
}
(attempt === maxRetries) ;
delay = .(baseDelayMs * ** attempt, maxDelayMs);
jitter = delay * ( + .() * );
.();
( (r, jitter));
}
}
lastError!;
}