Vercel Queues for Sume job webhooks: dedupe on job_id
Vercel Queues delivers at least once and bills keyed sends at 2x. To relay Sume webhooks through it, use job_id as the key and ack fast on the 10s limit.

If you put Vercel Queues behind a Sume webhook receiver, make the receiver store the event, enqueue it, and return 2xx quickly, and use the Sume job_id as the idempotency key on both sides. Vercel says delivery is at-least-once, so your consumer must tolerate duplicates; Sume's webhook docs give the same advice about job_id.
Vercel facts are from its Queues concepts and pricing pages, read 2026-09-30. Sume facts are from Webhooks. Neither page gives a total price for your workload, so this post covers behavior, not a bill.
What does Sume require from the receiver?
Return any 2xx after durably storing the event, and use job_id as your idempotency key. Sume tries up to 10 times, with a fixed delay between attempts (30s by default), and each attempt times out after 10s. A slow endpoint burns that budget and gets retried. So the HTTP handler should only verify, publish to the queue, and answer; do the real work in the consumer.
What does Vercel Queues add?
Retention is configurable per message from 60 seconds to 7 days, default 24 hours. You can include an idempotency key when publishing so Vercel deduplicates, and the dedupe window lasts for the message's lifetime (up to its TTL). The pricing page says sends with an idempotency key are billed at 2x units for that operation.
| Concern | Vercel Queues | Sume webhooks |
|---|---|---|
| Delivery guarantee | At-least-once | Up to 10 attempts |
| Dedupe key | Optional key on publish, billed 2x | job_id on your side |
| Time limit | Lease and visibility timeout (default 60s) | 10s per attempt |
| Default retention | 24 hours | Not applicable |
Is a queue enough to never lose a result?
No. The Sume docs call delivery an optimization, never the only recovery path: ten refused attempts leave a failed delivery and a job that still reached its terminal state. Keep status_url polling available for events that never arrive. A 24-hour default queue retention is also a limit if your consumer is down longer. See also Cloudflare Workers Queues for video webhooks.
Should I pay for keyed sends?
Only if you want Vercel to drop duplicates before they reach the consumer. Since your consumer must be idempotent anyway, a database unique constraint on job_id gives the same protection without the 2x operation. Which you choose is a cost judgment for your own volume.
Sources
Related posts
More in Integrations
- Zapier Catch Raw Hook: verify a Sume webhook signature
Zapier's Catch Raw Hook returns unparsed data plus headers, which a Sume HMAC check needs. Here is what to verify and the size limits to know.
- Zed MCP OAuth scopes: what Sume asks for (mcp:read, mcp:write)
Zed 1.18.0 fixed OAuth for MCP servers with non-default scopes. Sume has two scopes, mcp:read (required) and mcp:write (opt-in on the consent page).
- How to add an MCP server to ChatGPT with developer mode
Turn on ChatGPT developer mode, create an app for the server's URL, and sign in with OAuth. The steps, with Sume's hosted MCP server as the example.
- How to add subtitles to a video in Python
Add subtitles to a video in Python with Requests: POST the video URL to Sume's /v1/video-captions, poll the job, then read the captioned video_url.
Written by Sume