Teammate continues a thread: why webhook_delivery.url reads null
A Sume Agent turn reading a teammate's job sees delivery state, but webhook_delivery.url and last_error are null. Who reads which jobs, explained.

When a Sume Agent turn reads a job that another member created, it can see the job's webhook delivery state, but webhook_delivery.url and webhook_delivery.last_error come back null. The turn sees whether delivery happened, not where the owner's callback points.
This follows from one read rule in Jobs and results: a job belongs to its workspace and to the member whose key or Agent turn created it. This page spells out that rule, because the null is easy to mistake for a missing webhook.
Who can read a job?
The docs give one rule for GET /v1/jobs/:id, /status, /result, /events and GET /v1/jobs. Usage is recorded against the creating member, and only that member can cancel the job.
| Reader | Jobs it can read |
|---|---|
| An API key | The jobs its own member created in the key's workspace. |
| A Studio Agent turn | Every job in the thread it runs on, whoever created it, including jobs an API-fired Format run made in that thread. |
| An interactive Agent turn | Also its own member's jobs in sibling threads. |
| An unattended run | Stays on its own thread. |
| Anyone else | 404 not_found: other workspaces, other members' jobs in other threads, and any job a key's member did not create. |
Why is webhook_delivery.url null for a teammate's job?
The turn is allowed to read the job because it is in the thread, but the callback URL belongs to whoever submitted the job. The docs say the turn sees the delivery state and not the owner's callback endpoint, so url and last_error are null. The docs do not give a further reason, so treat it as a privacy boundary between members.
What you can still read is the rest of the delivery block: whether delivery is pending, delivering, delivered, retrying, failed or exhausted. The status vocabulary in Errors and rate limits lists those six values.
If you see null for the URL, do not conclude that no webhook was configured. Check the delivery status first. A delivered status with a null URL is the normal shape for a teammate's job read from a continued thread.
When does this show up in practice?
The docs name the scenario: an API-fired Format run made jobs in a thread, and a teammate who continues that thread can read the run's results, such as the voice and model of each narration job. That is deliberate, so a colleague can pick up work without asking for the original key.
It also explains the opposite surprise. A script using your own API key cannot read a teammate's job at all; for the key the rule is strictly the jobs its own member created, and everything else is 404 not_found. A thread_id filter on a list narrows the result and never widens what a key can read.
How do I check delivery from the receiver's side?
If you own the job, you can read the full delivery block with your own key. This request returns the job record, including webhook_delivery:
curl -sS https://api.sume.com/v1/jobs/job_123 \
-H "Authorization: Bearer $SUME_API_KEY"
# then read .webhook_delivery.status, .webhook_delivery.url
# and .webhook_delivery.last_error from the responseWhat should I do when delivery looks stuck?
Use the owner's credentials for any action that touches delivery. The webhooks page documents POST /v1/jobs/{job_id}/webhook/redeliver with the jobs:write scope, which re-posts the real terminal event with a fresh timestamp and signature. Only the member who created the job can cancel it, and the same ownership logic means a teammate's turn is not the right place to fix their endpoint.
Keep polling status_url as the recovery path either way. The docs call a webhook a delivery optimization, not your only way to learn the outcome.
Sources
Related posts
More in Developers
- AI image API timeouts in Python: httpx above 30 s, 200 or 202
Sume's image endpoint holds a request up to 30 seconds, then returns 202 with a job. A runnable httpx example with a 40 second client timeout.
- AI video person swap rejects long takes: find shots over 15 s
H3 Max Recast on Sume needs 5 to 30 seconds with no single shot over 15. Find the long takes with ffmpeg scene detection, then cut them before you pay.
- AI voice reads Spanish with an English accent: two causes to check
Spanish read with an English accent usually means the language field was omitted or the voice is tagged for another language. How Sume's TTS 409 works.
- Animate a picture with Kling 3 via API: Python first-frame request
To animate one picture with Kling 3 on Sume, send it as a first_frame in frame_images to POST /v1/videos with model kling-3. Full Python script included.
Written by Sume