Gemini thin webhook payload vs Sume: artifact URLs in the body

Gemini webhooks send a snapshot with pointers to results. A Sume job.completed webhook already carries the media.sume.com artifact URL, so no second fetch.

4 min readSume
All posts

Gemini webhooks are thin: the delivery is a snapshot with status details and pointers to results, not the output file itself. A Sume job.completed webhook is different in one respect that matters here: its payload.artifacts array already holds the media.sume.com URL, so a receiver can use it without a follow-up call.

Sources: the Gemini Webhooks page and Sume's Webhooks docs, read 2026-10-01.

What does a Sume webhook body contain?

The documented job.completed body has event, request_id, job_id, status: "OK" and a payload.artifacts list. Each artifact has an id, a url of the form https://media.sume.com/artifacts/..., a type and a content_type. Failed and canceled deliveries use status: "ERROR" and include an error object.

Delivery contents, Gemini page vs Sume docs, read 2026-10-01.
AspectGemini webhookSume webhook
Result in bodyPointer, not the output fileArtifact url in payload.artifacts
EventsSeveral event types, including interaction eventsTerminal only: job.completed, job.failed, job.canceled
Duplicate handlingAt-least-once; a header is provided for duplicatesAt-least-once retries; dedupe on job_id

Does Sume send progress events?

No. Sume sends terminal job events only, with no progress or partial deliveries. For progress, a polling client reads the job's events or status.

When do I still need to fetch the result?

Polling clients use GET /v1/jobs/:id/result, which is only for completed jobs. A receiver on the webhook path normally does not. If you want the full record anyway, fetch it by job_id after you have stored the event; see this note on large payloads.

How do I avoid processing a delivery twice?

Non-2xx responses are retried until attempts are exhausted, so the same event can arrive more than once. Return a 2xx after durably storing the event and use job_id as your idempotency key.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume