Polling for Status
After submitting a job, poll GET /ordo/jobs/:id until the job reaches a terminal state.
Job status machine
pending → running → success
→ failed
→ partialpending— job created, no steps have startedrunning— at least one step is running or completesuccess— all steps completed successfullyfailed— no step succeeded (the first step failed, so everything after it was skipped)partial— some steps succeeded and at least one failed or was skipped. Outputs of the steps that succeeded are not delivered; readjob.errorfor which steps failed and why
Step status machine
pending → running → success
→ failed
→ skippedskipped means the step could not run because a step it depends on failed (after its retries) or was itself skipped. The step's error names that upstream step. Steps that don't depend on the failure keep running, and the job ends as partial once no step is left to run.
Polling example (JavaScript)
js
async function pollJob(id, token, onUpdate) {
const res = await fetch(`/ordo/jobs/${id}`, {
headers: { Authorization: `Bearer ${token}` },
});
const data = await res.json();
// Progress based on completed steps
const done = data.steps.filter(s =>
['success', 'failed', 'skipped'].includes(s.status)
).length;
const pct = data.steps.length > 0 ? done / data.steps.length : 0;
onUpdate({
status: data.job.status, // 'pending' | 'running' | 'success' | 'failed'
progress: pct, // 0.0 – 1.0
steps: data.steps,
});
const terminal = ['success', 'failed', 'partial'];
if (!terminal.includes(data.job.status)) {
setTimeout(() => pollJob(id, token, onUpdate), 3000);
}
}Response structure summary
json
{
"job": {
"id": 3,
"status": "success",
"created_at": "...",
"started_at": "...",
"finished_at": "...",
"error": null
},
"progress": {
"percentage": 1,
"completed_steps": 2,
"total_steps": 2
},
"duration_ms": 135401,
"steps": [
{
"step_id": "reproject",
"step_type": "REPROJECT_LAS",
"status": "success",
"started_at": "...",
"finished_at": "...",
"error": null
}
],
"outputs": [
{
"artifact_name": "step:build_ept.output_ept",
"path": "development/results/piney-dam/ept",
"delivered_uri": "development/results/piney-dam/ept/",
"delivered_at": "2026-02-24T18:10:40.112Z"
}
]
}outputs[].path is the directory you declared. outputs[].delivered_uri is the object key actually written, and it is null until the output is delivered. See MinIO Outputs.
Recommended polling interval
Poll every 3–5 seconds. Most steps take tens of seconds to minutes depending on dataset size. Very large EPT builds may take longer.
Error handling
If job.status is failed, check job.error for a top-level message and inspect individual steps for error fields on failed steps.