MinIO Outputs
The outputs field in a job request declares where final artifacts should be delivered in MinIO.
How it works
- You declare
outputsin the job request, mapping artifact references to MinIO directories - Ordo records the declarations in
job_output - Each step writes its artifact to the intermediate area,
artifacts/job_{id}/{step_id}/ - Once every step has finished, the Job Finalizator copies each declared artifact into its declared directory, then marks the job
success
Ordo does not move or write files. All storage operations are performed by n8n.
Delivery is all-or-nothing per job:
- If any step failed, nothing is delivered, not even the outputs of steps that succeeded. The job ends
partial, orfailedwhen no step succeeded. - If a declared artifact was never produced, the job is marked
partial. - Delivery is a copy. The intermediate artifact stays under
artifacts/job_{id}/. - A folder artifact delivers only the objects written since the job was created. Anything older under the same
artifacts/job_{id}/prefix is not copied.
Format
json
"outputs": {
"step:build_ept.output_ept": {
"path": "development/results/piney-dam/ept"
},
"step:build_copc.output_copc": {
"path": "development/results/piney-dam/copc"
}
}Keys are namespaced artifact references (must match a step: artifact produced by the recipe). Values have a single path field.
path is always a directory
The declared path is a directory, never a filename. You choose the directory. The executor chooses the name of what goes inside it.
- The first segment of
pathis the MinIO bucket (development,production). The rest is the key prefix. - No leading or trailing slash.
Where the delivered bytes end up depends on whether the artifact is a file or a folder:
| Artifact kind | Delivered at | Example (path = development/results/survey/copc) |
|---|---|---|
| File | {path}/{delivered filename} | development/results/survey/copc/output.copc.laz |
| Folder | {path}/… — the folder's contents land directly under path; the folder's own name is dropped | development/results/survey/ept/ept.json |
A file artifact keeps its name and gains a directory level. A folder artifact loses its name and its contents take its place. You cannot predict the final key from path alone; you also need the delivered name from the table below.
Delivered names
The delivered filename is whatever name the executor gives its intermediate file. You cannot choose it or override it.
| Executor | Output slot | Kind | Delivered at |
|---|---|---|---|
ASSIGN_PROJECTION | output_las | file | {path}/output.las |
REPROJECT_LAS | output_las | file | {path}/output.copc.laz (when the step skips, the input file under its own name) |
REGRID_LAS | output_las | file | {path}/output.las |
COLORIZE_AS_DEM | output_las | file | {path}/output.las |
COLORIZE_FROM_TIF | output_las | file | {path}/output.las |
BUILD_COPC | output_copc | file | {path}/output.copc.laz |
DATASET_INFO | metadata | file | {path}/info.json |
BUILD_COLORED_DSM | colored_dsm_tif | file | {path}/colored_dsm.tif |
BUILD_COLORED_HILLSHADE_DSM | colored_hillshade_dsm | file | {path}/colored_hillshade_dsm.tif |
BUILD_HILLSHADE_DSM | hillshade_dsm | file | {path}/hillshade_dsm.tif |
BUILD_CONTOURS | contours_mbtiles | file | {path}/contours.mbtiles |
BUILD_CONTOURS | contours_pmtiles | file | {path}/contours.pmtiles |
BUILD_XYZ_TILES | output_tiles | folder | {path}/{z}/{x}/{y}.png |
BUILD_EPT | output_ept | folder | {path}/ept.json, {path}/ept-data/…, {path}/ept-hierarchy/… |
BUILD_POTREE | output_potree | folder | {path}/metadata.json, {path}/octree.bin, {path}/hierarchy.bin, … |
CALL_WEBHOOK | none | — | nothing delivered |
These names are defined in each executor's n8n workflow, and a change there moves the delivered key. Don't build keys from this table. Read delivered_uri instead.
Reading the delivered key
After delivery, each entry in outputs carries the key that was actually written. It appears in GET /jobs/:id, GET /outputs?job_id=… and the on-exit webhook body:
json
{
"artifact_name": "step:dataset_info.metadata",
"path": "development/results/survey/metadata",
"delivered_uri": "development/results/survey/metadata/info.json",
"delivered_at": "2026-09-25T18:35:34.211Z"
}pathis what you requested. It never changes.delivered_uriis{bucket}/{key}of the delivered file. For a folder output it is the directory prefix, ending in/.- Both
delivered_urianddelivered_atarenulluntil the output has been delivered. They staynullfor jobs that endpartialorfailed. - The Finalizator records the key before it marks the job
successand before the on-exit hook runs. Asuccessjob therefore always has them set. - Jobs finalized before this field existed (up to job
1000014on prd) havenull.
Path conventions
Give each declared output its own directory. Delivery overwrites without warning:
- Two file outputs with the same delivered filename in the same directory overwrite each other. For example, two
BUILD_COPCsteps both writeoutput.copc.laz. - A folder output shares its directory with anything else declared there, because its contents are copied directly into
path. - Re-running a job with the same
pathoverwrites the previous delivery.
The one safe exception is file outputs whose delivered names differ, such as BUILD_CONTOURS' contours.mbtiles and contours.pmtiles. They can share a directory.
A consistent layout:
{bucket}/results/{project}/{output_name}/json
"outputs": {
"step:build_copc.output_copc": { "path": "production/results/survey/copc" },
"step:dataset_info.metadata": { "path": "production/results/survey/metadata" },
"step:build_xyz_tiles.output_tiles": { "path": "production/results/survey/tiles" }
}delivers:
production/results/survey/copc/output.copc.laz
production/results/survey/metadata/info.json
production/results/survey/tiles/{z}/{x}/{y}.pngDo not put a filename in path. "path": "development/results/survey/dataset.copc.laz" delivers to development/results/survey/dataset.copc.laz/output.copc.laz.
Known limitation: recipes that fan out
The Finalizator finds the artifact to deliver by its slot name (output_copc) alone and ignores the step:<id>. prefix. If a recipe has several steps that produce the same slot name (for example, three BUILD_COPC steps), their declared outputs cannot be told apart. They may all deliver the same file. Until this is fixed, do not rely on per-step outputs from fan-out recipes.
Optional
The outputs field is optional. If omitted, artifacts are still tracked in Ordo with their intermediate MinIO URIs (under artifacts/job_{id}/{step_id}/), but nothing is delivered.
You only need outputs if the downstream system needs to find the result at a known, stable MinIO path.