POST /node/v1/uploads/inspect — NO SPENDFARPY 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.
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_V1ORDER A RENDER
One canonical sequence
inspect and quote do not spend. start reserves wallet funds. Server cents are authoritative.read quote_id, frames, price_cents, qualified_1c, pricing_versionhuman or app policy accepts the quotePOST /node/v1/uploads/{id}/start — SPEND BOUNDARYlegal_acceptance: "FARPY_LEGAL_V1"GET /node/v1/jobs/{job_id} or signed webhookZIP via download_urlreceipt + SHA-256 (file identity, not art review)01 / DISCOVERY
Live service contract
Do not hard-code renderer availability, pricing, limits, or cancellation behavior.02 / CONTRACT
Current public contract
Inspect, then quote
The locked quote shows quote_id, frame range, frame_count, price_cents, qualified_1c, and pricing_version. No reservation yet.
Start is the spend boundary
POST start with that quote_id and legal_acceptance FARPY_LEGAL_V1. Do not send price_cents.
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.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.
Canonical tools
farpy_inspect, farpy_quote, farpy_start, farpy_status, farpy_download, farpy_receipt. Auth stays in the environment, never as a tool argument.
Python client
farpy_client.py prepare (no spend) then start. Same contract as the homepage dropzone.
04 / AUTH
Three auth systems (not interchangeable)
- 1Browser sessionHomepage inspect → start uses a signed-in cookie. Not machine-to-machine.
- 2Account API keyAccount Settings
farpy_…Bearer keys for Public API V1 (/v1/renders). Shown once. - 3Job API agent key
farpy_agent_…Bearer keys for inspect/quote/start. Different store from Account Settings. Convergence is later work. - 4Revoke immediatelyRevoked keys stop authenticating without delay.
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.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.#!/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.
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 tohttps://api.farpy.com/v1. Prefer inspect/start above. These can reserve on upload./healthCheck service availability before sending credentials or work./capabilitiesRead currently accepted renderers, formats, queue state, and availability./pricingRead the active machine-readable pricing contract./limitsRead upload, frame, rate, and workload constraints./openapi.jsonDownload the OpenAPI 3.1 contract./rendersLegacy Public API V1 upload. Can reserve before a locked-quote accept. Prefer inspect./renders/preflightPlanning check. Not a locked quote./renders/{job_id}/submitLegacy start after /renders upload./renders/{job_id}Public API V1 job state./renders/{job_id}/cancelCancel before worker claim when the live contract permits it./renders/{job_id}/downloadRetrieve completed artifact delivery information./renders/{job_id}/receiptRetrieve the economic completion receipt./renders/{job_id}/proofRetrieve execution evidence and artifact hashes.STATUS · RECEIPT · DOWNLOAD