Results & artifacts
Every job ends in structured JSON you can read programmatically, plus any files your tasks uploaded as artifacts. This page covers reading results, watching logs live, 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, and result JSON cannot override that. result_quality and result_warnings are reserved response fields (currently null and []); non-empty result_schema submissions return 422.
Logs and live output
While a task is running, 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 so their logs 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 things worth knowing when debugging:
- During auto-retry,
/outputpreserves the most recent failed attempt’s output and error until the new attempt writes its own — you never lose the failure you’re chasing. - If the worker failed before your command started, the visible text is platform preflight stderr, not your process output.
Artifacts
Content-addressed file storage for moving data between jobs (datasets in, checkpoints and reports out). Two ways in: relay uploads through the controller (up to 2 GiB) or registering a URL where the object already lives. Retired direct/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 — ownership is verified and the reference recorded at submission, before any work or billing hold is created.
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.
- Content is deduplicated by hash within your account, so re-uploading the same bytes doesn’t double-count; a relay upload that would exceed the quota returns
507with codeartifact_quota_exceeded. GET /api/v1/artifactsreports authoritative quotalimit_bytes,used_bytes, andremaining_bytesalongside the artifact page.- Deletion is reference-safe:
DELETEreturns409 artifact_in_useonly while a producing job or job input belongs to a non-terminal job. Completed, failed, cancelled, lost, and partial jobs do not block owner deletion. - Accepted deletion releases account quota and hides metadata immediately. Namespaced backing data is removed after the default 24-hour garbage-collection grace; 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"