Results & artifacts
Every job ends in structured JSON that you can read programmatically, plus any files that your tasks uploaded as artifacts. This page covers results, live logs, and the artifact lifecycle.
Reading results
After a job reaches a terminal state, fetch its structured results:
curl -sS -H "Authorization: Bearer $TOKEN" \
https://computalot.com/api/v1/results/<job_id>The response includes per-task results plus summary, aggregate_result, aggregate_aliases, completeness, result_persisted, output_persisted, and your submitted metadata (meta / variant).
Task outcomes come from the process exit status. Exit 0 completes a task. Non-zero fails it. Result JSON cannot override that. result_quality and result_warnings are reserved response fields (currently null and []). The API accepts and ignores legacy object-shaped result_schema metadata. Non-object values return 422.
Logs and live output
While a task runs, the fastest log surface is GET /api/v1/jobs/<job_id>/stream (SSE) or GET /api/v1/jobs/<job_id>/tasks. Both update live_feedback.output_tail as stdout/stderr arrives. If your code launches child processes, run them unbuffered or flush explicitly. Their logs then appear immediately.
For the aggregated stdout/stderr after (or during) a run:
curl -sS -H "Authorization: Bearer $TOKEN" \
https://computalot.com/api/v1/jobs/<job_id>/outputTwo facts help when you debug:
- During auto-retry,
/outputkeeps the output and error of the most recent failed attempt until the new attempt writes its own. You never lose the failure that you chase. - If the worker failed before your command started, the visible text is platform preflight stderr, not your process output.
Artifacts
Artifacts are content-addressed file storage. They move data between jobs (datasets in, checkpoints and reports out). There are two ways in: relay uploads through the controller (up to 2 GiB), or registration of a URL where the object already lives. Retired direct and multipart upload endpoints return 410 Gone with migration guidance.
# Upload a file (relay, up to 2 GiB)
curl -sS -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/octet-stream" \
-H "X-Artifact-Filename: dataset.parquet" \
--data-binary @dataset.parquet \
https://computalot.com/api/v1/artifacts
# Register an existing external object (any size)
curl -sS -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"url":"https://storage.example/dataset.parquet","filename":"dataset.parquet"}' \
https://computalot.com/api/v1/artifacts/external
# Download
curl -sS -H "Authorization: Bearer $TOKEN" \
https://computalot.com/api/v1/artifacts/<id> -o output.bin
# List (includes size, timestamps, reference count, deletion eligibility)
curl -sS -H "Authorization: Bearer $TOKEN" \
https://computalot.com/api/v1/artifacts
# Delete once every referencing job is terminal
curl -sS -X DELETE -H "Authorization: Bearer $TOKEN" \
https://computalot.com/api/v1/artifacts/<id>To use an artifact as a job input, pass its concrete ID in payload._artifacts.download. The API validates ownership and records the reference at submission, before it creates work or a billing hold.
Quota and retention
- Artifacts stay retained (and count against your quota) until you delete them. The default quota is 100 GiB of retained bytes per account.
- Computalot deduplicates content by hash within your account. A repeat upload of the same bytes does not double-count. A relay upload that exceeds the quota returns
507with codeartifact_quota_exceeded. GET /api/v1/artifactsreports the authoritative quotalimit_bytes,used_bytes, andremaining_byteswith the artifact page.- Deletion is reference-safe.
DELETEreturns409 artifact_in_useonly while a producing job or a job input belongs to a non-terminal job. Completed, failed, cancelled, lost, and partial jobs do not block owner deletion. - An accepted deletion releases account quota and hides metadata immediately. Computalot removes namespaced backing data after the default 24-hour garbage-collection grace period. Historical job artifact links then return not found.
Streaming (SSE)
# Single job — task deltas with live_feedback.output_tail (rolling logs without polling)
curl -sS -N -H "Authorization: Bearer $TOKEN" \
https://computalot.com/api/v1/jobs/<job_id>/stream
# Multiple jobs — one stream; frames preserve client_ref, tags, meta, variant,
# aggregate summary fields, and result_persisted / output_persisted
curl -sS -N -H "Authorization: Bearer $TOKEN" \
"https://computalot.com/api/v1/jobs/watch?ids=<id1>,<id2>"
# Whole project
curl -sS -N -H "Authorization: Bearer $TOKEN" \
"https://computalot.com/api/v1/projects/<project>/stream"