Synced from
docs/llm-agent-reference-compact.mdin the Computalot monorepo.
Computalot is a distributed compute platform. Submit typed jobs, get structured JSON results. GPU and CPU capacity, metered by the task-second at market rates.
Open access. Any wallet can authenticate (challenge → sign → verify) and fund the account with USDC via x402 or MPP — no approval needed. API keys are issued on request via the waitlist at
/. Discovery endpoints are public.
Base URL: https://computalot.com
https://computalot.com/skill.md— install this skill to get startedhttps://computalot.com/llms.txt— this compact referencehttps://computalot.com/llms-full.txt— full reference with tutorialshttps://computalot.com/api/v1/docs— machine-readable JSON indexhttps://computalot.com/openapi.json— OpenAPI 3.1 schema of the public APIhttps://computalot.com/docs— human docshttps://computalot.com/docs/pricing— indicative rates and worked cost examples
Recent Contract Changes (2026-07-15)
- Open wallet access: any wallet can authenticate (challenge → sign → verify) and fund the account — no allowlist entry required. API keys remain issued on request via the waitlist.
- MPP (Machine Payments Protocol, mpp.dev) is accepted alongside x402: quote
402s carry aWWW-Authenticate: Paymentchallenge (EVM charge; decoded copy in the body’smppblock), quotes settle withAuthorization: Payment <base64url credential>(EIP-3009), and success returns aPayment-Receiptheader. GET /api/v1/account/quotes/:quote_idreturns one quote (with its x402 payment requirements); the OpenAPI 3.1 schema is served at/openapi.json; a pricing page with indicative market ranges lives at/docs/pricing; public endpoints answerHEADlikeGET.- Job submission accepts
preset(resource preset name fromGET /api/v1/presets; explicitrequirementswin) andclient_ref(≤255-byte grouping label, searchable via/api/v1/results?client_ref=...). - Artifact uploads use the authenticated controller relay (up to 2 GiB) or external URL registration. Direct and multipart object-store upload endpoints return
410 Gone. - The default retained-byte quota is 100 GiB per account. Local/R2 content hashes are deduplicated within the account; quota exhaustion returns
507 artifact_quota_exceeded. - Artifact owners can delete once every referencing job is terminal. Active jobs return
409 artifact_in_use; accepted deletion releases account quota immediately, andGET /api/v1/artifactsreports authoritative used/remaining quota. - Worker exit status is terminal truth.
result_quality/result_warningsare reserved asnull/[], and non-emptyresult_schemareturns422. max_retriesaccepts0through10,depends_onaccepts at most 50 job IDs, and job/artifact admission is validated before work or billing holds are created.- User-upload projects require OCI + gVisor and cannot declare
runtime.init.commands,runtime.services, orvalidation.commands.
Feedback — Report Bugs & Request Features
This is beta software. Please report bugs, request features, and share ideas:
curl -sS -X POST https://computalot.com/api/v1/feedback \
-H "Content-Type: application/json" \
-d '{"type": "bug", "title": "Brief summary", "description": "What happened, what you expected"}'Types: bug, feature_request, provisioning, job_type_request. No auth required.
The Model
Projects carry your code (tarball with Dockerfile + computalot.project.json). Jobs run against a project as one of four typed shapes — structured_runner, sweep, map_reduce, benchmark — and return structured JSON results.
Auth
# API key (issued on request via the waitlist)
export TOKEN="flk_..."
# Wallet session (any wallet)
# 1. POST /api/v1/auth/wallet/challenge
# 2. Sign challenge.message with your wallet
# 3. POST /api/v1/auth/wallet/verify → returns fls_... token
# All protected endpoints:
Authorization: Bearer $TOKENNo auth required: /health, /docs, /llms.txt, /llms-full.txt, /api/v1/docs/*, POST /api/v1/feedback, POST /api/v1/auth/wallet/challenge, POST /api/v1/auth/wallet/verify.
GET /metrics is operator-gated: local requests, admin auth, or the dedicated metrics token only.
Project Quickstart
# 1. Create project
curl -sS -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
https://computalot.com/api/v1/projects \
-d '{"name": "my-proj", "remote_dir": "/root/projects/my-proj"}'
# 2. Upload tarball (raw binary, NOT multipart)
tar czf code.tar.gz Dockerfile computalot.project.json script.py
curl -sS -X POST -H "Authorization: Bearer $TOKEN" \
--data-binary @code.tar.gz \
https://computalot.com/api/v1/projects/my-proj/push
# 3. Submit job immediately after push
curl -sS -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
https://computalot.com/api/v1/jobs \
-d '{"type": "structured_runner", "runner_command": ["python3", "script.py"], "payload": {"test": true}, "project": "my-proj", "timeout_s": 120}'
# 4. Optional: prepare currently available workers ahead of time
curl -sS -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
https://computalot.com/api/v1/projects/my-proj/init
# 5. Inspect published vs warm state
curl -sS -H "Authorization: Bearer $TOKEN" \
https://computalot.com/api/v1/projects/my-proj/status
# 6. Results
curl -sS -H "Authorization: Bearer $TOKEN" https://computalot.com/api/v1/results/<job_id>Project Lifecycle & Readiness
- Readiness is active revision truth, not machine-count truth
- After
POST /api/v1/projects/:name/push, a successful response can includetarball_diff - Use
GET /api/v1/projects/:name/statusfor top-level readiness andGET /api/v1/projects/:name/status/detailsfor diagnostics + recovery guidance can_accept_new_jobs: truemeans the latest revision is published and can be submitted immediatelyready_for_jobscan stay false after push while the first job or an optional/initprepares runtime- Install dependencies and build assets in the Dockerfile. User uploads cannot declare host-style
runtime.init.commands,runtime.services, orvalidation.commands; use declarativevalidation.executables/validation.filesand a smoke job instead.
Job Types
| Type | Use case | Key fields |
|---|---|---|
structured_runner | Run script with JSON in/out, optional fan-out | runner_command, payload, fan_out, merge_strategy |
sweep | Grid search over parameter combinations | runner_command, parameters, fixed_payload, rank_by |
map_reduce | Chunked parallelism with reduce operators | runner_command, split, reduce, payload |
benchmark | Compare named candidates with replicas | runner_command, candidates, shared_payload, replicas, rank_by |
Default to structured_runner unless another type clearly fits.
Runner Protocol
Your script receives input and writes output via environment variables:
$COMPUTALOT_TASK_PAYLOAD— path to JSON input file. Read this.$COMPUTALOT_TASK_RESULT— path to write JSON output. Computalot reads this after exit.$COMPUTALOT_ARTIFACT_DIR— directory for output files. Auto-uploaded on completion.$COMPUTALOT_TASK_SCRATCH_DIR— private per-task temp space.$COMPUTALOT_TASK_CACHE_DIR— per-project build cache shared by concurrent tasks on the node. Never stage builds under a deterministic temp name: build in a per-task unique temp dir, then atomicallyos.replace(temp, final)and tolerate the final path already existing.flockis supported.- Exit 0 = success. Non-zero = failure. Exit 137 (OOM/SIGKILL) is treated as an infra failure: the task requeues automatically without consuming
max_retries— repeated 137s mean the task needs more memory. - Progress: print
COMPUTALOT_PROGRESS:{"epoch":5,"loss":0.23}to stdout.
import json, os
payload = json.load(open(os.environ['COMPUTALOT_TASK_PAYLOAD']))
result = {'score': 0.95, 'model': payload['model']}
json.dump(result, open(os.environ['COMPUTALOT_TASK_RESULT'], 'w'))Fan-Out
Split one job into parallel tasks:
Do not send a top-level tasks array. The public API rejects it so per-task commands and routing cannot bypass submission validation; use one of the supported fan-out shapes below.
By list values — one task per item:
{"fan_out": {"by": "models"}, "payload": {"models": ["gpt4", "claude", "llama"]}}By explicit items — custom payload per task:
{"fan_out": {"items": [{"params": [0.1, 0.5]}, {"params": [0.2, 0.4]}]}}By chunks — split a numeric range:
{"fan_out": {"chunks": 20, "range_field": "total_seeds", "total": 10000}}These are mutually exclusive. Add batch_size to group tiny items into one task. Merge strategies: collect (default), keyed, weighted_avg.
Choose exactly one fan-out shape per submit. Mixed shapes are rejected with 422.
Common Job Fields
| Field | Type | Default | Notes |
|---|---|---|---|
project | string | required | Must match a registered project |
timeout_s | int | 3600 | Per-task timeout |
max_retries | int 0-10 | 0 | Auto-retry failed tasks up to N times; the hold covers all requested attempts (infra failures like OOM/lost workers requeue free) |
priority | string | normal | high, normal, or low |
depends_on | [string] | [] | Up to 50 account-accessible job IDs; completed/partial dependencies unblock work, failed/cancelled dependencies cancel it |
tags | [string] | [] | Labels for grouping/filtering (max 20) |
callback_url | reserved | null | Non-empty values return 422; use job SSE/watch or polling |
requirements | object | null | {cpu, memory_mb, gpu_count, gpu_memory_mb, profile, storage_gb} |
preset | string | null | Resource preset name from GET /api/v1/presets (e.g. gpu_batch); explicit requirements fields take precedence |
client_ref | string | null | Grouping/search label (max 255 bytes); filter with GET /api/v1/results?client_ref=... |
checkpointing | object | null | {enabled, resume_from_latest} |
Long ML jobs: use _artifacts.download with concrete account-accessible artifact IDs for one-off large inputs, manifest data_sources for immutable remote weights/datasets, and manifest cache_mounts for writable runtime caches. Resolve upstream IDs from GET /api/v1/results/:job_id before submitting downstream work. Submission verifies ownership and records retained artifact references atomically before creating work or placing a billing hold. hf-mount only applies to manifest-declared Hugging Face data_sources, not arbitrary runner-side downloads.
Results & Streaming
# Terminal results
curl -sS -H "Authorization: Bearer $TOKEN" https://computalot.com/api/v1/results/<job_id>
# Per-task details and progress
curl -sS -H "Authorization: Bearer $TOKEN" https://computalot.com/api/v1/jobs/<job_id>/tasks
# Stdout/stderr
curl -sS -H "Authorization: Bearer $TOKEN" https://computalot.com/api/v1/jobs/<job_id>/output
# SSE stream (one job)
curl -sS -N -H "Authorization: Bearer $TOKEN" https://computalot.com/api/v1/jobs/<job_id>/stream
# SSE stream (multiple jobs)
curl -sS -N -H "Authorization: Bearer $TOKEN" "https://computalot.com/api/v1/jobs/watch?ids=<id1>,<id2>"Job lifecycle: planning → queued → running → completed | partial | failed | cancelled
Process exit is terminal truth: exit 0 completes and non-zero fails. result_quality/result_warnings are reserved (null/[]), and non-empty result_schema returns 422.
completed means every task succeeded. partial means at least one task succeeded and at least one failed or was cancelled. failed means no task succeeded and execution ended in failure.
Debug failures: GET /api/v1/jobs/:id for error and recommended_action, GET /api/v1/jobs/:id/tasks for per-task diagnostics.
During retries, GET /api/v1/jobs/:id/tasks and GET /api/v1/jobs/:id/output preserve the most recent failed attempt’s diagnostics until the current attempt emits its own output.
Public task/result payloads keep the submitted task contract visible, but redact provider IDs, raw runtime paths, and image refs/digests.
Billing
- Pricing model: metered market-rate compute per task-second. The submit response’s
summary.billing_estimateis the authoritative per-job quote; indicative class ranges live at/docs/pricing. Queue time is never charged;timeout_scaps each task’s runtime cost. - Check balance:
GET /api/v1/account/balance - Jobs reserve a bounded hold for the initial attempt plus requested
max_retries, then settle to actual usage on terminal completion; infrastructure requeues do not consume the configured retry budget - Project init is free but requires $5 available balance
- Fund via x402:
POST /api/v1/account/quotes/topup→ pay →POST /api/v1/account/quotes/:id/pay/x402(base64 payment payload inPAYMENT-SIGNATURE, bearer auth) - Fund via MPP (mpp.dev): the same 402 carries a
WWW-Authenticate: Paymentchallenge (methodevm, intentcharge; decoded copy in the body’smppblock). Sign the same EIP-3009 authorization, wrap it as an MPP credential, and POST the pay URL (or/topup) withAuthorization: Payment <base64url credential>— no bearer token. Success returns aPayment-Receiptheader. - If a request returns
402, fund the account and retry the same request
Billing truth lives on GET /api/v1/account/balance, GET /api/v1/account/holds, and GET /api/v1/account/ledger.
Use GET /api/v1/account/quotes to inspect open top-up and shortfall quotes before retrying blocked work, and GET /api/v1/account/quotes/:quote_id to fetch one quote’s payment requirements (x402 attrs.x402_payment_required plus the decoded MPP challenge in mpp).
If project init or job submit returns a shortfall quote, fund the account and retry POST /api/v1/projects/:name/init or retry the same submit request to POST /api/v1/jobs.
Artifact Lifecycle
- Relay upload:
POST /api/v1/artifacts, raw body, max 2 GiB. - External object:
POST /api/v1/artifacts/external. - Direct/multipart object-store endpoints return
410 Gone. - Default retained-byte quota: 100 GiB per account; local/R2 content is deduplicated by account + content hash.
- Quota exhaustion: HTTP
507, codeartifact_quota_exceeded. - Deletion:
409 artifact_in_useonly while a producing job or job input belongs to a non-terminal job. Terminal references are reported but do not block owner deletion. - Accepted deletion releases account quota and hides metadata immediately; namespaced backing data is removed after the default 24-hour grace.
Python SDK & CLI
python3 -m pip install --user --break-system-packages \
https://computalot.com/docs/downloads/computalot-0.2.1-py3-none-any.whl
export PATH="$HOME/.local/bin:$PATH"from computalot import ComputalotClient
client = ComputalotClient(controller_url="https://computalot.com", token="YOUR_TOKEN")
docs = client.docs_index()
jobs = client.list_jobs(limit=5)
print(docs["status"])
print(len(jobs.get("jobs", [])))computalot docs --llm
computalot jobs --limit 5
computalot job <job_id>Endpoint Reference
Jobs
| Method | Path | Purpose |
|---|---|---|
| POST | /api/v1/jobs | Submit job |
| POST | /api/v1/jobs/batch | Submit up to 200 jobs |
| GET | /api/v1/jobs?status=&project=&tag=&limit=50 | List jobs |
| GET | /api/v1/jobs/:id | Job state |
| GET | /api/v1/jobs/:id/output | Stdout/stderr |
| GET | /api/v1/jobs/:id/tasks | Per-task details and progress |
| GET | /api/v1/jobs/:id/events?limit=200 | Lifecycle events |
| GET | /api/v1/jobs/:id/stream | SSE stream (one job) |
| GET | /api/v1/jobs/watch?ids=a,b,c | SSE stream (multiple jobs, max 100) |
| PUT | /api/v1/jobs/:id/cancel | Cancel job |
| GET | /api/v1/presets | Resource presets (use to populate requirements) |
Billing
| Method | Path | Purpose |
|---|---|---|
| GET | /api/v1/account/balance | Balance and holds |
| GET | /api/v1/account/ledger | Transaction history |
| GET | /api/v1/account/holds | Active holds |
| GET | /api/v1/account/quotes | Funding quotes |
| GET | /api/v1/account/quotes/:id | One quote + its x402 requirements and MPP challenge |
| POST | /api/v1/account/quotes/topup | Create top-up quote (or settle via MPP credential) |
| POST | /api/v1/account/quotes/:id/pay/x402 | Settle quote — x402 PAYMENT-SIGNATURE or MPP Authorization: Payment |
Results & Artifacts
| Method | Path | Purpose |
|---|---|---|
| GET | /api/v1/results/:job_id | Per-task results |
| POST | /api/v1/artifacts | Relay upload artifact (max 2 GiB) |
| POST | /api/v1/artifacts/external | Register an existing external URL |
| GET | /api/v1/artifacts | List artifacts with authoritative quota limit/used/remaining bytes |
| GET | /api/v1/artifacts/:id | Download artifact |
| DELETE | /api/v1/artifacts/:id | Delete once all referencing jobs are terminal; active references return 409 artifact_in_use |
Projects
| Method | Path | Purpose |
|---|---|---|
| POST | /api/v1/projects | Create project |
| GET | /api/v1/projects | List projects |
| GET | /api/v1/projects/:name | Project config |
| PUT | /api/v1/projects/:name | Update metadata |
| POST | /api/v1/projects/:name/push | Upload tarball |
| DELETE | /api/v1/projects/:name | Delete project |
| POST | /api/v1/projects/:name/init | Optionally pre-warm available workers |
| GET | /api/v1/projects/:name/status | Check readiness |
| GET | /api/v1/projects/:name/status/details | Setup diagnostics |
| POST | /api/v1/projects/:name/invalidate | Discard old prepared runtime state |
| PUT | /api/v1/projects/:name/kv/:key | Write shared state |
| GET | /api/v1/projects/:name/kv/:key | Read shared state |
| GET | /api/v1/projects/:name/stream | SSE stream for project |
Public (no auth)
| Method | Path | Purpose |
|---|---|---|
| GET | /skill.md | Agent skill file — start here |
| GET | /llms.txt | This compact reference |
| GET | /llms-full.txt | Full reference with tutorials |
| GET | /openapi.json | OpenAPI 3.1 schema of the public API |
| GET | /api/v1/docs | JSON docs index |
| GET | /api/v1/docs/python-sdk | Python SDK guide |
| GET | /api/v1/docs/workflows | Workflow patterns |
| POST | /api/v1/auth/wallet/challenge | Start wallet auth |
| POST | /api/v1/auth/wallet/verify | Complete wallet auth |
| POST | /api/v1/feedback | Report bugs and request features |
Ops (operator-facing)
| Method | Path | Purpose |
|---|---|---|
| GET | /health | Liveness probe (no auth) |
| GET | /live | Liveness probe (no auth, same as /health) |
| GET | /ready | Readiness probe (no auth; 503 until controller core is up) |
| GET | /metrics | Prometheus metrics (admin auth, dedicated metrics token, or local request) |