IETF RateLimit-Policy draft vs Sume's ratelimit-* headers
The IETF RateLimit draft defines structured RateLimit-Policy and RateLimit fields. Sume sends plain ratelimit-limit, -remaining, -reset and retry-after.

Sume's docs do not list the draft's RateLimit-Policy or RateLimit fields. They list separate numeric headers, ratelimit-limit, ratelimit-remaining and ratelimit-reset, plus retry-after on a 429. So a client written to the draft's structured syntax will not find those fields; read the plain numbers instead.
Draft facts are from the Internet-Draft page (it says it expires on 24 November 2026); Sume facts from Errors, read 2026-10-01.
What does the draft define?
Its abstract: it defines the RateLimit-Policy and RateLimit header fields so servers can advertise quota policies and current limits. Its examples look like RateLimit-Policy: "burst";q=100;w=60, a named policy with quota and window. If a response carries both RateLimit and Retry-After, Retry-After takes precedence.
What does Sume send today?
| Draft concept | Sume equivalent |
|---|---|
Named policy with quota q and window w | No policy field; one numeric limit |
| Current remaining quota | ratelimit-remaining |
| Time until reset | ratelimit-reset, in seconds |
Retry-After precedence | retry-after, sent on 429 |
How should a client read both?
Use retry-after first on a 429, which matches the draft's precedence rule. Otherwise pace on ratelimit-remaining and ratelimit-reset. A 429 names its budget in error.details.scope, either read or write; see 429 scope.
What does a dual-format parser look like?
Draft-style quota strings carry q (quota) and w (window) parameters; Sume's headers are bare integers. A client can accept either by checking for the plain header first.
function readLimits(headers) {
const remaining = Number(headers.get("ratelimit-remaining"));
const reset = Number(headers.get("ratelimit-reset"));
const retry = headers.get("retry-after");
if (retry !== null) return { waitSeconds: Number(retry) };
if (Number.isFinite(remaining) && remaining <= 0) {
return { waitSeconds: Number.isFinite(reset) ? reset : 1 };
}
return { waitSeconds: 0 };
}Is request rate the same as generation capacity?
No. The docs say how many generations run at once is governed by the plan's concurrency limit, a separate thing from these headers.
Sources
Related posts
More in Developers
- Inngest retries a failed step four times: key the Sume submit
Inngest's default is four retries after the first attempt, five in all, and side effects are not exactly-once. Give the Sume submit an Idempotency-Key.
- Inngest NonRetriableError and RetryAfterError for Sume errors
Map Sume HTTP errors to Inngest: NonRetriableError for 400, 401, 402 and 404, and RetryAfterError with the retry-after header on a 429.
- Instagram API 100 posts per 24 hours: size your bulk queue
Instagram limits API-published posts to 100 in a moving 24-hour period, checked at content_publishing_limit. A Sume bulk queue also tops out at 100 items.
- Instagram API error: Maximum number of sponsors exceeded (2)
Instagram's publishing error table lists 'Maximum number of sponsors exceeded. Limit is 2 per post.' and 'Cannot tag yourself as sponsor.' How to prevent both.
Written by Sume