Endpoints: jobs
On this page
GET /jobs/{id}, follow the event stream, or register a webhook for job.done and job.failed.
Steps of an article job #
| Step | What it does | Optional | Typical time |
|---|---|---|---|
find | |||
group | |||
read | |||
check | |||
write | |||
seo | |||
qa | |||
illustrate | |||
sources |
Steps of a language version #
write-es. They are all optional: a person can skip one, and a job skips one on its own instead of failing.
| Language step | What it does | Skipping it | Typical time |
|---|---|---|---|
write-<code> | |||
seo-<code> | |||
qa-<code> |
When a step fails #
reason: provider_gave_up.
GET/api/v1/jobs/{id}
- Scoperead
- Credits free
Path
| Name | Type | Description |
|---|---|---|
id | string | jobId from starting an article or a read. |
Response
200
{
"id": "C8A41E07-52B9-4D36-8F1A-0B7E9D3C6A25",
"kind": "article",
"status": "running",
"step": "check",
"stepIndex": 3,
"steps": [
{
"id": "find",
"name": "Searching your domains",
"status": "done",
"optional": false
},
{
"id": "group",
"name": "Grouping by origin",
"status": "done",
"optional": false
},
{
"id": "read",
"name": "Reading one page per origin",
"status": "done",
"optional": false
},
{
"id": "check",
"name": "Checking claims across origins",
"status": "running",
"optional": false
},
{
"id": "write",
"name": "Writing",
"status": "todo",
"optional": false
},
{
"id": "seo",
"name": "Writing the SEO fields",
"status": "todo",
"optional": true
},
{
"id": "qa",
"name": "Reading the finished text back",
"status": "todo",
"optional": false
}
],
"startedAt": "2026-10-06T12:00:03Z",
"articleId": "9F3B1C2A-6D4E-4B7A-8C15-2E0A7D91B3F4"
}Errors
| Status | Code | When |
|---|---|---|
| 404 | not_found |
statusisqueued,running,paused,done,failedorcancelled. A job is finished when it isdone,failedorcancelled;pausedmeans a step failed and the job waits to be steered.stepis absent once the job has finished.errorcarries the cause when a job failed or was cancelled.Polling every 3 to 5 seconds is enough: a job takes minutes. The route counts against the 60 requests a minute of the credential.
curl "$BRENZURI_URL/api/v1/jobs/$JOB_ID" \
-H "Authorization: Bearer $BRENZURI_KEY"GET/api/v1/jobs/{id}/events
- Scoperead
- Credits free
done, or after a refunded that ends a failed or cancelled job.
Path
| Name | Type | Description |
|---|---|---|
id | string | jobId from starting an article or a read. |
Response
200 text/event-streamid: <sequence> and data: <Job event JSON>. A comment line : brenzuri job <id> opens the stream.
: brenzuri job C8A41E07-52B9-4D36-8F1A-0B7E9D3C6A25
id: 1
data: {"details":[{"tag":"ok","text":"3 domains searched"}],"kind":"step","ms":14210,"status":"done","stepId":"find","summary":"8 results"}
id: 2
data: {"details":[{"tag":"ok","text":"2 independent origins"}],"kind":"step","ms":6120,"status":"done","stepId":"group","summary":"5 results · 2 origins"}
: ping is sent as data: {"kind":"ping"} every 20 s, and every 5 s with "queued" while waiting
id: 9
data: {"articleId":"9F3B1C2A-6D4E-4B7A-8C15-2E0A7D91B3F4","kind":"done"}Errors
| Status | Code | When |
|---|---|---|
| 404 | not_found |
Send Last-Event-IDwith the last sequence you saw to resume without replaying.An article job opens with one todoevent for each step of its plan, language version steps included, so a client can draw the whole list before the first step runs.A refundedevent withreason: "unused"comes just beforedone. It carries the credits of the language versions that were skipped, failed or came back empty, and does not close the stream. Arefundedwithout that reason means the job failed or was cancelled.pingevents keep the connection alive: every 20 seconds, and every 5 seconds withqueued(the position) while the job waits. They carry no sequence number.A failed step does not close the stream. The job pauses and the stream stays open until the step is steered, or until the job is failed and refunded. For a snapshot instead of a stream, read the job status, or use a webhook.
POST/api/v1/jobs/{id}/steps/{stepId}/retry
- Scopeedit
- Credits free
- Role edit
Path
| Name | Type | Description |
|---|---|---|
id | string | jobId from starting an article or a read. |
stepId | string | find, group, read, check, write, seo, qa or illustrate; sources for a job that adds languages; or a language step such as write-es. |
Response
204
Errors
| Status | Code | When |
|---|---|---|
| 409 | job_not_paused | |
| 409 | step_mismatch | |
| 409 | job_settled |
curl -X POST "$BRENZURI_URL/api/v1/jobs/$JOB_ID/steps/$STEP_ID/retry" \
-H "Authorization: Bearer $BRENZURI_KEY"POST/api/v1/jobs/{id}/steps/{stepId}/skip
- Scopeedit
- Credits free
- Role edit
seo, illustrate, or a language version step such as write-es) and let the job carry on. Steps that affect what the article claims about its sources cannot be skipped.
Path
| Name | Type | Description |
|---|---|---|
id | string | jobId from starting an article or a read. |
stepId | string |
Response
204
Errors
| Status | Code | When |
|---|---|---|
| 400 | step_not_optional | |
| 409 | job_not_paused | |
| 409 | step_mismatch | |
| 409 | job_settled |
Skipping the write-orqa-step of a language leaves that language out: its other steps are skipped with it, no article is made for it, and its credit is released when the job finishes. Skipping itsseo-step keeps the version and leaves its SEO fields out.
curl -X POST "$BRENZURI_URL/api/v1/jobs/$JOB_ID/steps/$STEP_ID/skip" \
-H "Authorization: Bearer $BRENZURI_KEY"POST/api/v1/jobs/{id}/cancel
- Scopeedit
- Credits releases the hold
- Role edit
job.failed is raised with failure: "cancelled".
Path
| Name | Type | Description |
|---|---|---|
id | string | jobId from starting an article or a read. |
Response
204
Errors
| Status | Code | When |
|---|---|---|
| 409 | job_settled |
curl -X POST "$BRENZURI_URL/api/v1/jobs/$JOB_ID/cancel" \
-H "Authorization: Bearer $BRENZURI_KEY"