Skip to content

API Contracts

Nine real route groups are mounted in main.py: members, datasets, compute, jobs, workers, admin, receipts, health (plus the worker sub-routes under jobs/lease). All paths are exactly as written — no version prefix.

MethodPathNotes
GET/healthLiveness.

The house receipt hash chainseq + parent_hash, genesis = 64 zeros (mirrors the Cloud).

MethodPathNotes
GET/receiptsThe chain in seq order (coordinates only; ?limit=).
GET/receipts/verifyRecompute every checksum, validate seq + parent_hash links. Returns { ok, receipts_checked, errors }.
MethodPathBody / Response
POST/membersMemberCreate {email, name}MemberRead.
GET/members/{member_id}MemberRead.
POST/members/{member_id}/activateMarks annual fee paid, sets membership window → MemberRead; mints a membership receipt for $100.00.
GET/members/{member_id}/statusMemberStatusRead {member_id, status, active, annual_fee_paid, membership_expires_at}.

MemberRead fields: id, email, name, status, annual_fee_paid, membership_started_at, membership_expires_at, created_at.

MethodPathBody / Response
POST/datasetsDatasetCreateDatasetRead.
GET/datasetslist[DatasetRead].
GET/datasets/{dataset_id}DatasetRead.
POST/datasets/{dataset_id}/accessDatasetAccessRequest {member_id}DatasetAccessResponse; mints a dataset_access receipt.

DatasetRead fields: id, title, domain, description, object_uri, license_type, quality_tier, checksum_sha256 (64-hex), size_bytes, row_count, is_member_access, created_at. DatasetAccessResponse: access_granted, dataset_id, member_id, receipt_id, object_uri.

MethodPathBody / Response
GET/compute/inventorylist[ComputeNodeRead].
POST/compute/register-nodeComputeNodeCreateComputeNodeRead.
POST/compute/quoteComputeQuoteRequest {member_id, requested_gpu_sku, estimated_hours>0, job_type}ComputeQuoteResponse; mints a compute_quote receipt.

Quotes use server-side pricing only (core/pricing.py) — the caller’s rate is never trusted. ComputeQuoteResponse: member_id, requested_gpu_sku, gpu_display_name, hourly_rate_usd, estimated_hours, estimated_cost_usd, job_type, receipt_id. Worked examples: 2h rtx6000_blackwell_96gb = $10.00; 3h rog_astral_5090_32gb = $6.00.

MethodPathBody / Response
POST/jobsJobCreate {member_id, job_type, requested_gpu_sku, estimated_hours>0, input_dataset_ids[], output_uri?}JobRead.
GET/jobs/{job_id}JobRead.
POST/jobs/{job_id}/startJobRead.
POST/jobs/{job_id}/completeJobRead.
POST/jobs/{job_id}/cancelJobRead.

JobRead fields: id, member_id, job_type, requested_gpu_sku, assigned_node_id, status, estimated_hours, estimated_cost_usd, actual_started_at, actual_finished_at, actual_hours, actual_cost_usd, input_dataset_ids, output_uri, receipt_id, created_at.

Workers — /workers (authenticated — bearer token)

Section titled “Workers — /workers (authenticated — bearer token)”
MethodPathBody / Response
POST/workers/registerWorkerRegisterRequestWorkerRegisterResponse {worker_id, worker_token, status}.
POST/workers/heartbeatWorkerHeartbeatRequestWorkerHeartbeatResponse {ok, worker_id, server_time, next_heartbeat_seconds}.
POST/workers/jobs/leaseWorkerLeaseRequest {supported_job_types[], supported_gpu_skus[], max_jobs}WorkerLeaseResponse {lease_id, lease_token, job, expires_at, message}.
POST/workers/jobs/{job_id}/acceptLeaseTokenRequest {lease_token}JobRead.
POST/workers/jobs/{job_id}/statusWorkerStatusRequest.
POST/workers/jobs/{job_id}/logsWorkerLogRequest.
POST/workers/jobs/{job_id}/artifactsWorkerArtifactRequest.
POST/workers/jobs/{job_id}/completeWorkerCompleteRequestJobRead (computes actual cost).
POST/workers/jobs/{job_id}/failWorkerFailRequestJobRead (no charge in v0.2).

register returns the long-lived worker_token; lease returns a lease_token (server stores only its hash, 600s TTL). See Worker Contract (v0.2).

MethodPathNotes
GET/admin/summaryFleet/member/job summary.
GET/admin/workersList workers.
GET/admin/workers/{worker_id}One worker.

🐝 Operator-grade · books and records · to the shed.