daily_limit_exceeded
The workspace made more requests in one UTC day than its plan allows. A circuit breaker against runaway client loops — distinct from the per-minute limiter and the monthly quota.
When it fires
Your workspace made more requests in one UTC day than your plan's daily cap allows. This is a circuit breaker, not a billing limit — it exists to stop a client-side loop before it spends a month of quota in an afternoon.
In practice it means one of:
- A retry that has no backoff and no give-up condition.
- A replay, poll, or reconciliation loop with no exit condition.
- A scheduler firing far more often than intended (every second rather than every hour).
- Genuine growth — real traffic that has simply outgrown the plan's daily cap.
The first three are bugs on your side and retrying will not help. The fourth is a conversation with us. The top_operation field on the error tells you which you are looking at.
Response shape
Every Repull error follows the same envelope. The code is stable and safe to switch on.
{
"error": {
"code": "daily_limit_exceeded",
"message": "<human-readable explanation of what went wrong>",
"docs_url": "https://repull.dev/docs/errors/daily_limit_exceeded"
}
}How to fix
- Read `top_operation` in the error body. It names the single operation that produced the most of your traffic today, with its request count and its share of your day. If one operation is 60%+ of your traffic, that is almost certainly your loop.
- Find that call site and check it for a missing exit condition, a missing backoff, or a schedule that is firing far more often than you meant.
- Do NOT simply wait for `Retry-After` and re-run the same code — the window resets at the next UTC midnight and an unfixed loop will exhaust it again.
- Call `GET /v1/usage/summary` to see the per-operation breakdown for the last 30 days. Comparing today against a normal day usually makes the runaway obvious.
- Watch `X-RateLimit-Remaining-Daily` on every response from now on. It is the early-warning signal — you will see it fall long before it reaches zero.
- If the traffic is genuine and you expect it to continue, contact support to raise the daily cap for your account. Upgrading your plan does not by itself change the daily cap.
Common gotchas
- This is not your monthly quota. A
daily_limit_exceededdoes not mean you are out of plan requests for the month — only for today. The monthly quota returnsrate_limit_exceededwithscope: "monthly". See Rate Limits for how to tell the three 429s apart. - It is not the per-minute limiter either. A loop can run comfortably inside the per-key burst limit all day long — that is exactly why the daily cap exists.
- The window is the UTC calendar day, not a rolling 24 hours and not your local midnight.
resets_atandRetry-Afteralways tell you the truth; do not compute it yourself. - You get a heads-up before this fires. At 80% of the daily cap Repull emits a
usage.quota.warningwebhook, once per day, carrying the sametopOperationdiagnosis. Subscribe to it and you will normally never see this error. - Requests refused by the breaker still count as requests in your logs, but they do not reach a handler and never produce side effects.
Examples
curl
# A 429 from the daily circuit breaker
HTTP/1.1 429 Too Many Requests
Retry-After: 21600
X-RateLimit-Limit-Daily: 25000
X-RateLimit-Remaining-Daily: 0
X-RateLimit-Reset-Daily: 2026-05-02T00:00:00.000Z
{
"error": {
"code": "daily_limit_exceeded",
"message": "Daily request cap reached: 25,000 of 25,000 requests for the 'starter' tier, counted over the current UTC day. The counter resets at 2026-05-02T00:00:00.000Z (about 6h).",
"fix": "This cap is not your monthly quota and not the per-minute rate limit ...",
"docs_url": "https://repull.dev/docs/errors/daily_limit_exceeded",
"request_id": "req_01HX5XPQ2K",
"retry_after": 21600,
"tier": "starter",
"limit": 25000,
"used": 25000,
"scope": "daily",
"window": "utc_day",
"resets_at": "2026-05-02T00:00:00.000Z",
"top_operation": {
"operation_id": "replay_webhook_delivery",
"request_count": 21250,
"share_percent": 85
}
}
}
# Where did the day go? Ask, instead of guessing.
curl "https://api.repull.dev/v1/usage/summary?range=7d" \
-H "Authorization: Bearer sk_live_YOUR_KEY"
# How much of today is left, right now?
curl https://api.repull.dev/v1/usage/tier \
-H "Authorization: Bearer sk_live_YOUR_KEY"TypeScript
import { Repull } from '@repull/sdk'
const repull = new Repull({ apiKey: process.env.REPULL_API_KEY! })
// Treat the daily cap as a BUG SIGNAL, not a backoff signal. Retrying the same
// loop after Retry-After just burns tomorrow's allowance too.
try {
await repull.reservations.list()
} catch (err: any) {
if (err?.code === 'daily_limit_exceeded') {
const top = err.top_operation
console.error(
`Daily cap hit: ${err.used}/${err.limit}, resets ${err.resets_at}.` +
(top
? ` Biggest driver: ${top.operation_id} — ${top.request_count} requests (${top.share_percent}% of today).`
: ''),
)
// Stop the worker. Do not reschedule it until the call site is fixed.
process.exit(1)
}
throw err
}
// Better: watch the window and slow down before anything breaks.
const res = await fetch('https://api.repull.dev/v1/listings', {
headers: { Authorization: `Bearer ${process.env.REPULL_API_KEY}` },
})
const remaining = Number(res.headers.get('X-RateLimit-Remaining-Daily') ?? Infinity)
const limit = Number(res.headers.get('X-RateLimit-Limit-Daily') ?? Infinity)
if (remaining < limit * 0.2) {
console.warn(`Only ${remaining} requests left today — pausing non-urgent work.`)
}If you're an AI agent
You have exhausted the workspace's DAILY request cap. Do NOT retry, and do NOT wait out Retry-After and resume the same loop — the cause is almost always a client-side loop, and repeating it will exhaust tomorrow as well. Read error.top_operation: it names the operation responsible for most of today's traffic. Stop that loop, report it to the human, and only then resume. This is not the monthly quota and upgrading the plan will not clear it.
Related
- Error reference — the full table of error codes
- Using Repull from AI agents — patterns for handling errors in agent loops
- Rate Limits
- rate_limited
- Credits and Usage
Hit an error that isn't covered? Email hello@repull.dev with the request id from the response headers.