Replace the step snapshot for an in-flight job
POST/api/jobs/{job_id}/steps
upsertJobSteps
Runner-protocol route (same lease-bearer auth as the log chunk POST). The posted list is the full truth for the job's steps: rows are upserted by `(job_id, step_index)` and rows absent from the snapshot are deleted — posting the same snapshot twice is a no-op.
Requires authentication using a bearer token — see tokens and scopes.
curl
curl -X POST 'https://neosource.dev/api/jobs/JOB_ID/steps' \
-H 'Authorization: Bearer $NEOSOURCE_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"steps":[]}'fetch
fetch("https://neosource.dev/api/jobs/JOB_ID/steps", {
method: "POST",
headers: {
Authorization: "Bearer $NEOSOURCE_TOKEN",
"Content-Type": "application/json",
},
body: JSON.stringify({"steps":[]}),
});Path parameters
job_idrequired
Request bodyrequired
application/json
Responses
204Snapshot stored
Standard errors
Bodies documented once for the whole API — see standard errors.
- 400Bad Request — one of: invalid_input
- 401Authentication required
- 403Forbidden — one of: forbidden
- 404Not Found — one of: not_found
- 409Conflict — one of: conflict
- 429Rate limited — retry after the `Retry-After` header
- 500Internal server error
- 503Service temporarily unavailable / at capacity — retry after the `Retry-After` header
- 504Gateway timeout — the request exceeded the server's handling budget
Schemas
Referenced above. Listed here rather than expanded inline, so the same definition is not repeated at every level.
StepCacheReportDto
What a step's cache RESTORE got back. `null` on the step it belongs to means "this step said nothing about caching" — never "miss". Every step that predates the feature, and every step that is not a cache restore, reads null, so a reader that renders absence as a miss libels most of the platform's history.
bytesCompressed size of the restored entry, when the transport knew one.
matched_keyThe key that MATCHED — the primary key on an exact hit, the restore-key-matched entry's key on a partial one. `null` on a miss.
outcomerequired
WorkflowRunStepStatus
Lifecycle of one step inside a job. Written by the runner (it knows the boundaries exactly) via an idempotent full-snapshot upsert; never derived server-side from log parsing.
"queued""running""succeeded""failed""skipped"