One Sume API key per service: what it isolates and what it does not
Sume request budgets are per key and reads and writes are already separate. A key per service isolates revocation and scope, not generation capacity.

Teams often split one Sume API key into one per service on the theory that a busy poller will starve the submitter. The rate limit docs say each key gets its own per-minute budget, set by the workspace plan, and that reads and writes have separate budgets, so a tight status-poll loop cannot cause a 429 on your own submits. Separate keys are still worth having, for different reasons.
Generation capacity is a different limit. The plan's concurrency and queue size do not grow when you add keys, so a second key does not buy more parallel images.
What a separate key does
| Concern | Isolated by its own key? | Why |
|---|---|---|
| Request budget per minute | Yes | The budget is per key |
| Poller starving submits | Not needed | Reads and writes are separate buckets |
| Revoking one service | Yes | Revoke one key, others keep working |
| Scopes | Yes | Scopes are fixed when a key is created |
| Concurrent generations and queue | No | Set by the plan, not the key |
Check each key in one loop
Each response carries ratelimit-limit and ratelimit-remaining, so one GET /v1/me per key shows its budget. The loop reads each key from an environment variable, never from the command line.
for name in SUME_KEY_SUBMITTER SUME_KEY_POLLER SUME_KEY_WEBHOOKS; do
echo "== $name"
curl -sS -o /dev/null -D - https://api.sume.com/v1/me \
-H "x-api-key: ${!name}" | grep -iE '^(HTTP|ratelimit-limit|ratelimit-remaining)'
doneSuggested split
- A submitter key for your worker that creates jobs and runs.
- A poller or reconciler key, with only the access it needs.
- A webhook-admin key used for secret reads and rotation, since those need
account:readandaccount:write. - A monitor key for uptime probes, so alert traffic never shares a budget with production.
Rotation stays simple
Per-service keys make rotation small: create the replacement, verify it with GET /v1/me, deploy it to that service, then revoke the old key. Keys stay on servers; do not put any of them in browser or mobile code.
Sources
Related posts
More in Developers
- OpenAI images.generate to Sume /v1/images: field by field map
Move a gpt-image-1 images.generate call to Sume POST /v1/images: which fields carry over, which return 400, and why size becomes image_size. Python mapper.
- opencode remote MCP entry for Sume: env syntax and a longer timeout
The hosted Sume server in opencode.json: type remote, a bearer header from an env variable, a timeout above jobs_wait's 55 s cap. Checked by a script.
- Fade out the end of a Short: Timeline fade_out_seconds limits
Sume Timeline fades video and audio at the ends with output.fade_in_seconds and fade_out_seconds, 0 to 5 each, summing to at most the length. Setup for Shorts.
- Pin the image model id on the queue row so a swap can't break old jobs
Store the Sume model id on each queued render row at enqueue time, then re-point only rows still carrying a retired id. Python sqlite3 sample for gpt-image-1.
Written by Sume