FARPY
Developer surface

Farpy API

Use Farpy render artifacts programmatically: status, proof, receipts, and downloads.

Inspect Render Jobs Programmatically

Track render progress. Verify completed work. Fetch receipts. Download outputs. Submission API remains private alpha.

The public developer surface today is for inspecting completed or running work.

Receipt contract

Recommended integration flow

1. Upload/render through Farpy web flow
2. Save the JOB ID
3. Open /status/?job_id=JOB-...
4. Inspect /proof/?job_id=JOB-...
5. Fetch /receipt-static/JOB-.../index.json
6. Download ZIP when allowed

Not public yet

Why narrow?

Farpy is prioritizing the customer render path first: upload .blend → render → status → proof → receipt → ZIP.

The API expands after that path stays boring and repeatable.

Public endpoints

SurfaceEndpointUseStatus
StatusGET /status/?job_id=JOB-...Human-readable render progress and final state.Public
ProofGET /proof/?job_id=JOB-...Evidence page for completed render output.Public
ReceiptGET /receipt-static/JOB-.../index.jsonMachine-readable render receipt.Public
DownloadGET /download?job_id=JOB-...ZIP output when access is allowed.Public/gated
SubmitPOST /submitProgrammatic job creation.Private alpha

Copy-paste checks

Replace the JOB ID with your render ID. These endpoints are read-only public surfaces.

Status

curl -s "https://farpy.com/status/?job_id=JOB-1781039984005-a64cdf"

Proof

curl -s "https://farpy.com/proof/?job_id=JOB-1781039984005-a64cdf"

Receipt JSON

curl -s "https://farpy.com/receipt-static/JOB-1781039984005-a64cdf/index.json" | python3 -m json.tool

Download ZIP headers

curl -I "https://farpy.com/download?job_id=JOB-1781039984005-a64cdf"

Public job submission is still private alpha. Web upload remains the supported customer path.

Real response examples

Status RUNNING

{
  "job_id": "JOB-1781039984005-a64cdf",
  "state": "RUNNING",
  "frames_done": 6,
  "total_frames": 12,
  "percent_done": 50,
  "node": "pr-001-g0"
}

Status DONE

{
  "job_id": "JOB-1781039984005-a64cdf",
  "state": "DONE",
  "frames_done": 12,
  "total_frames": 12,
  "download_ready": true,
  "proof_url": "/proof/?job_id=JOB-1781039984005-a64cdf"
}

Receipt

{
  "job_id": "JOB-1781039984005-a64cdf",
  "state": "DONE",
  "verify": true,
  "frames": 12,
  "node": "pr-001-g0",
  "output_zip_sha256": "..."
}

Typical polling flow

1. Save JOB ID
2. Poll /status/?job_id=...
3. Wait for DONE
4. Open /proof/?job_id=...
5. Fetch receipt JSON
6. Download ZIP