GET /v1/jobs thread_id filter: why a teammate's job still 404s
The thread_id filter on the Sume jobs list narrows results and never widens what an API key can read. Teammates' jobs stay 404, and only the creator can cancel.

On the Sume jobs list, a thread_id filter only narrows the result. It never widens what an API key can read: a key still sees only the jobs its own member created in the key's workspace, so passing a teammate's thread id does not reveal their jobs. Jobs outside that scope answer 404 not_found.
The rule is in Jobs and results. This page covers the two places people trip over it: filtering a list by thread, and cancelling a job someone else created.
What does the thread_id filter actually do?
It reduces the list returned by GET /v1/jobs to jobs tied to that thread. That is all. The authorization check runs first and the filter is applied inside whatever the credential is allowed to see.
So with an API key, a filter for a thread that mixes your jobs and a teammate's returns only yours. With a Studio Agent turn the visible set is larger, because a turn reads every job in the thread it runs on, whoever created it, but that is a property of the turn and not of the filter.
Why does a teammate's job return 404 and not 403?
The docs list the 404 cases together: jobs in other workspaces, other members' jobs in other threads, and for an API key any job its member did not create. Returning 404 for all of them means a key cannot probe whether a job id exists elsewhere.
That matches how Formats handle run reads, where a run you cannot see reads the same as one that does not exist. Treat a 404 not_found on a job id you were handed as an access question first and a typo second.
| Action | Allowed for | Otherwise |
|---|---|---|
| GET /v1/jobs/:id, /status, /result, /events | The key's own member's jobs in the key's workspace | 404 not_found |
| GET /v1/jobs with thread_id | Same set, narrowed to the thread | Filter never adds rows |
| POST /v1/jobs/:id/cancel | Only the member who created the job | See below |
| Usage recorded against | The creating member | Not the reader |
Who can cancel a job?
The docs say usage is recorded against the creating member and only that member can cancel the job. Cancellation also has a timing limit: it succeeds only before generation work starts. After that the API returns 409 job_generation_already_started with details.cancelable: false and the job runs to completion.
Cancelling a job that is already canceled is idempotent and returns the same canceled job, so a retry after a network error is safe.
The docs do not say what a non-creator's cancel call returns. Since a key cannot read another member's job at all, assume it is indistinguishable from an unknown job and do not build logic on a specific status.
How do I list my own jobs for one thread?
Call the list with your key and the filter. The response contains only jobs your key's member created:
curl -sS "https://api.sume.com/v1/jobs?thread_id=$THREAD_ID" \
-H "Authorization: Bearer $SUME_API_KEY"What should a team do instead of sharing one key?
Keep each automation on a key owned by the member or service that should own the spend, and store job ids with the key that created them. If a teammate needs to see results, the supported path is the thread: a Studio Agent turn on that thread reads every job there. The Generation admission page notes that queue counts are per workspace, so a shared workspace queue still sees everyone's jobs even though reads are per member.
Record the job id the moment you submit, because there is no way for a different key to rediscover it by listing.
Sources
Related posts
More in Developers
- jobs_result batch: read a wave when some jobs are still running
Sume's batch jobs_result returns one entry per id in request order. Read ok per entry, treat job_not_completed as running, and re-read only failed_job_ids.
- jobs_wait wait_for any: other Sume jobs keep running and billing
jobs_wait takes up to 20 job_ids and wait_for all or any. With any it returns on the first finish, but the other jobs keep running and billing.
- A kill switch for paid Sume submits: stop new jobs, cancel queued
Add an off switch to code that spends on the Sume API: check a flag before each submit, then cancel queued jobs; a 409 job_generation_already_started will bill.
- kling-3 on Sume: generate_audio true or false, and what changes
kling-3 has an audio toggle; MiniMax H3 and Omni audio is always on. The catalog lists separate audio-on and audio-off list rates.
Written by Sume