FARPY API

Order verified Blender compute.

Same path as the browser: inspect a .blend, read the exact quote, then start. Start is the spend boundary. Download the ZIP and receipt after completion.

farpy_client.py
1. Create a Job API farpy_agent_ key
2. Download farpy_client.py
3. Prepare (no spend), then start

$ python3 farpy_client.py prepare scene.blend
$ python3 farpy_client.py start UPLOAD_ID \
    --quote-id QTE-... \
    --legal-acceptance FARPY_LEGAL_V1

ORDER A RENDER

One canonical sequence

inspect and quote do not spend. start reserves wallet funds. Server cents are authoritative.
INSPECTPOST /node/v1/uploads/inspect — NO SPEND
QUOTEread quote_id, frames, price_cents, qualified_1c, pricing_version
DECIDEhuman or app policy accepts the quote
STARTPOST /node/v1/uploads/{id}/start — SPEND BOUNDARY
LEGALlegal_acceptance: "FARPY_LEGAL_V1"
STATUSGET /node/v1/jobs/{job_id} or signed webhook
DOWNLOADZIP via download_url
RECEIPTreceipt + SHA-256 (file identity, not art review)
QUOTEVisible before start
STARTOnly spend step
DELIVERYZIP + receipt + proof
AUTHThree systems, not one

01 / DISCOVERY

Live service contract

Do not hard-code renderer availability, pricing, limits, or cancellation behavior.

02 / CONTRACT

Current public contract

ACCEPT

Inspect, then quote

The locked quote shows quote_id, frame range, frame_count, price_cents, qualified_1c, and pricing_version. No reservation yet.

EXECUTE

Start is the spend boundary

POST start with that quote_id and legal_acceptance FARPY_LEGAL_V1. Do not send price_cents.

VERIFY

Download and prove

Completed work exposes a ZIP, a receipt, and SHA-256 byte identity — not an art review.

03 / GUIDES

Integration guides

04 / MCP

Model Context Protocol (MCP)

MCP V1 is live at https://api.farpy.com/mcp. Same contract as the browser: inspect → quote → start. start is the only spend tool. Discord bot is also available. MCP for agents.
LIVE

HTTP MCP V1

Let an AI agent inspect, quote, run, and return a verified result. Bearer farpy_agent_ keys only. Do not call farpy_render or farpy_submit_render.

TOOLS

Canonical tools

farpy_inspect, farpy_quote, farpy_start, farpy_status, farpy_download, farpy_receipt. Auth stays in the environment, never as a tool argument.

NOW

Python client

farpy_client.py prepare (no spend) then start. Same contract as the homepage dropzone.

04 / AUTH

Three auth systems (not interchangeable)

  1. 1
    Browser sessionHomepage inspect → start uses a signed-in cookie. Not machine-to-machine.
  2. 2
    Account API keyAccount Settings farpy_… Bearer keys for Public API V1 (/v1/renders). Shown once.
  3. 3
    Job API agent keyfarpy_agent_… Bearer keys for inspect/quote/start. Different store from Account Settings. Convergence is later work.
  4. 4
    Revoke immediatelyRevoked keys stop authenticating without delay.
JOB API (inspect / start)
Authorization: Bearer farpy_agent_<secret>

PUBLIC API V1 (legacy /v1/renders)
Authorization: Bearer farpy_<secret>

CREATE ACCOUNT KEY
POST /v1/api-keys
{"name":"production-agent"}

05 / CLIENT

Dependency-free Python client

Python 3 standard library. prepare does not spend. start does.
farpy_client.pyfarpy_client_example.pySHA256SUMS
export FARPY_AGENT_KEY="farpy_agent_..."

python3 farpy_client.py prepare scene.blend
python3 farpy_client.py start UPLOAD_ID \
  --quote-id QTE-... \
  --legal-acceptance FARPY_LEGAL_V1

python3 farpy_client.py status JOB_ID

06 / SUBMIT

Copy-paste inspect then start

The key stays in the environment. Wallet is reserved only on start.
bashprepare-then-start.sh
#!/usr/bin/env bash
set -euo pipefail

: "${FARPY_AGENT_KEY:?Set FARPY_AGENT_KEY (Job API farpy_agent_ key). Account Settings farpy_ keys are a different store.}"
: "${1:?Usage: ./prepare-then-start.sh scene.blend}"

ORIGIN="https://farpy.com"
FILE="$1"
AUTH="Authorization: Bearer $FARPY_AGENT_KEY"

# NO SPEND: inspect returns upload_id + locked quote.
INSPECT="$(
  curl -fsS "$ORIGIN/node/v1/uploads/inspect" \
    -H "$AUTH" \
    -F "file=@$FILE"
)"
echo "$INSPECT" | jq '{upload_id, quote_id, frame_start, frame_end, frame_count, price_cents, qualified_1c, pricing_version, quote}'

UPLOAD_ID="$(printf "%s" "$INSPECT" | jq -er '.upload_id')"
QUOTE_ID="$(printf "%s" "$INSPECT" | jq -er '.quote_id // .quote.quote_id')"
PRICE_CENTS="$(printf "%s" "$INSPECT" | jq -er '.price_cents // .quote.price_cents')"
echo "QUOTE $QUOTE_ID = $PRICE_CENTS cents. Decide before start. Wallet is not reserved yet."

# SPEND / reservation boundary. Do not send price_cents.
curl -fsS -X POST "$ORIGIN/node/v1/uploads/$UPLOAD_ID/start" \
  -H "$AUTH" \
  -H "Content-Type: application/json" \
  --data "$(jq -nc --arg quote_id "$QUOTE_ID" '{quote_id:$quote_id, legal_acceptance:"FARPY_LEGAL_V1"}')"

07 / QUOTE

Client cents are not authority

Read quote_id, frame range, frame_count, price_cents, qualified_1c, and pricing_version before start. Send quote_id. Do not send price_cents. The server locked quote is the price.

NO SPEND
prepare() / inspect() / quote()

SPEND BOUNDARY
start(..., quote_id=..., legal_acceptance="FARPY_LEGAL_V1")

DEPRECATED
FarpyClient.render() — upload+submit, no quote gate

08 / ROUTES

Public API V1 routes (still live)

Paths relative to https://api.farpy.com/v1. Prefer inspect/start above. These can reserve on upload.
GET/healthCheck service availability before sending credentials or work.
GET/capabilitiesRead currently accepted renderers, formats, queue state, and availability.
GET/pricingRead the active machine-readable pricing contract.
GET/limitsRead upload, frame, rate, and workload constraints.
GET/openapi.jsonDownload the OpenAPI 3.1 contract.
POST/rendersLegacy Public API V1 upload. Can reserve before a locked-quote accept. Prefer inspect.
POST/renders/preflightPlanning check. Not a locked quote.
POST/renders/{job_id}/submitLegacy start after /renders upload.
GET/renders/{job_id}Public API V1 job state.
POST/renders/{job_id}/cancelCancel before worker claim when the live contract permits it.
GET/renders/{job_id}/downloadRetrieve completed artifact delivery information.
GET/renders/{job_id}/receiptRetrieve the economic completion receipt.
GET/renders/{job_id}/proofRetrieve execution evidence and artifact hashes.

STATUS · RECEIPT · DOWNLOAD

The job is not complete until the artifact, receipt, and proof are retrievable.

System statusReceipt guideManage API keys