API reference
Rate limits
DunOps rate-limits API requests to ensure fair use across all workspaces. Limits vary by plan.
Limits by plan
| Plan | Requests / minute | Burst |
|---|---|---|
| Hobby | No API access | — |
| Pro | 60 req/min | 120 |
| Pro 10× | 300 req/min | 600 |
Limits apply per workspace. Playbook runs triggered via API count against run quotas (set per plan), not the API rate limit.
Handling 429 Too Many Requests
429 response body
{
"error": "rate_limit_exceeded",
"message": "You have exceeded 60 requests per minute.",
"retry_after": 12
}The retry_after value is in seconds. The response also includes a Retry-After HTTP header with the same value. Back off for that duration before retrying.
Simple retry-after handler
async function fetchWithRetry(url: string, opts: RequestInit, retries = 3) {
const res = await fetch(url, opts);
if (res.status === 429 && retries > 0) {
const wait = Number(res.headers.get("Retry-After") ?? 5) * 1000;
await new Promise((r) => setTimeout(r, wait));
return fetchWithRetry(url, opts, retries - 1);
}
return res;
}Best practices
Cache list responses
Endpoints like
GET /providers and GET /playbooks don't change often. Cache them locally for 60 seconds instead of fetching on every request.If you need higher limits for an automation use case (e.g. a CI/CD pipeline that runs 50 deploys a minute), contact support — we can discuss enterprise limits.