stream_job_events
curl --request GET \
--url https://ndi-api.nace.ai/v1/jobs/{job_id}/events \
--header 'X-API-Key: <api-key>'{
"error": {
"code": "invalid_request",
"detail": null,
"message": "Request body has extra fields that this operation does not accept.",
"request_id": "req-01j9k2n3p4q5r6s7t8v9",
"retryable": false
}
}{
"error": {
"code": "invalid_request",
"detail": null,
"message": "Request body has extra fields that this operation does not accept.",
"request_id": "req-01j9k2n3p4q5r6s7t8v9",
"retryable": false
}
}stream_job_events
Stream job progress as Server-Sent Events. Cost class: fast.
Each frame is a :class:~ndi_service.app.platform_api.results.JobEvent
serialised as data: <json>\n\n with a monotonic id: <sequence>.
Frames are emitted by polling the job row — the row is the event source,
so a frame appears whenever status or progress changes and the
stream closes once the job is terminal (or after the same ceiling as the
inline wait, for a job nothing is advancing).
REST and CLI only. MCP has no streaming shape; an MCP agent polls
get_job instead.
Last-Event-ID offsets the sequence numbering so a reconnecting client
keeps a monotonic id; the current state is always re-emitted as the
first frame, because there is no event log to replay from.
GET
/
v1
/
jobs
/
{job_id}
/
events
stream_job_events
curl --request GET \
--url https://ndi-api.nace.ai/v1/jobs/{job_id}/events \
--header 'X-API-Key: <api-key>'{
"error": {
"code": "invalid_request",
"detail": null,
"message": "Request body has extra fields that this operation does not accept.",
"request_id": "req-01j9k2n3p4q5r6s7t8v9",
"retryable": false
}
}{
"error": {
"code": "invalid_request",
"detail": null,
"message": "Request body has extra fields that this operation does not accept.",
"request_id": "req-01j9k2n3p4q5r6s7t8v9",
"retryable": false
}
}