2026 API client checklist from three open specs, and where Sume stands
Three public specs shape a 2026 API client: RateLimit headers, Idempotency-Key, Standard Webhooks. What each says, and what Sume's API does instead.

A 2026 API client needs three habits that three public specs describe: read rate-limit headers instead of guessing, send an idempotency key on every unsafe retry, and verify signed webhooks against the raw body. Sume supports the intent of all three but not the exact wire formats, so write the client against Sume's documented headers.
None of the three specs is a finished standard this week. The RateLimit header draft is still an Internet-Draft, the Idempotency-Key draft has expired, and Standard Webhooks is a community specification, so copying a header name from one of them into a Sume client will not work.
What each spec says, and what Sume does
The first three columns come from the vendor pages linked in the sources (read 2026-10-03). The last column is from Sume's errors and rate limits and webhooks pages.
| Topic | What the spec defines | What Sume does |
|---|---|---|
| Rate limits | RateLimit-Policy carries a quota q and optional window w; RateLimit carries remaining r and optional reset t. Draft 11 is dated May 23, 2026 | Responses can carry ratelimit-limit, ratelimit-remaining, ratelimit-reset and, on a 429, retry-after |
| Idempotency | An Idempotency-Key header; a missing key is a 400, a reused key with a different payload a 422, a concurrent duplicate a 409. The draft expired April 18, 2026 | Idempotency-Key on submits; the same key on a different payload is 409 idempotency_conflict |
| Webhook headers | webhook-id, webhook-timestamp and webhook-signature, signed over id, timestamp and payload | x-sume-webhook-timestamp and x-sume-webhook-signature, signed over timestamp and raw body, plus a secret fingerprint |
| Signature format | v1 is HMAC-SHA256 as base64 with a whsec_ secret prefix; v1a is Ed25519 | sume-v1= followed by a hex HMAC-SHA256, with several comma-separated entries during rotation |
| Dedupe | Use the webhook-id header | Use job_id for job events and request_id (equal to run_id) for run events |
What this means in code
Rate limits: read ratelimit-remaining instead of counting requests, back off on retry-after, and note that a 429 names its bucket in error.details.scope, either read or write. Reads and writes have separate budgets, so a poll loop cannot 429 your submits; the numbers are in the per-plan table.
Idempotency: generate the key once per business intent, persist it before the first attempt and reuse it for every retry. Reuse a key only for the same payload, because a changed body is a conflict, not a replay. Deriving the key from a business key and a payload hash shows one way.
Webhooks: verify the HMAC over <timestamp>.<raw_body>, reject stale timestamps, accept any one entry of the signature header, and dedupe on the id field named above. If you later add a Standard Webhooks provider, keep the verifiers separate, because the header names, the signed string and the encoding all differ.
Sources
Related posts
More in Developers
- App Store app preview audio: stereo AAC 256 kbps, check the track
Apple wants stereo AAC at 256 kbps and 44.1 or 48 kHz in an app preview. Use Sume audio detach to read channels and rate, and trim to keep the AAC track.
- App Store screenshots reject alpha: flatten a Sume PNG first
App Store Connect screenshots cannot include alpha or transparency. A PNG with an alpha channel from an image API needs flattening; here is a Pillow check.
- Are Claude Code mods safe with a Sume API key in your env?
Claude Code mods run unsandboxed and can read env vars and settings files. What that means for a Sume API key, the CLI config file and an OAuth session.
- arun_ run ids: Format run or Action run? Store the family
A Sume arun_ id shows up under both /v1/format-runs and /v1/action-runs, and waitForRun requires a family. Store the surface next to the id and route reads.
Written by Sume