{"openapi":"3.1.0","info":{"title":"Renda API","version":"1.0.0","description":"Agent-first cloud rendering for 3D files and scenes. Every error includes a `hint` describing the next step."},"servers":[{"url":"https://renda.vochsel.com/api/v1"}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"API key: rnd_live_…"}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","hint"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"},"issues":{"type":"array","items":{"type":"object"}}}}}},"RendaPackage":{"$ref":"https://renda.vochsel.com/api/v1/schema.json"},"HyperframesPackage":{"type":"object","required":["project"],"properties":{"project":{"type":"string","description":"asset://<sha256> of a zipped HyperFrames project, or https URL"},"name":{"type":"string"},"composition":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"},"fps":{"type":"number"},"format":{"enum":["mp4","webm","mov","gif"]},"quality":{"enum":["draft","looks","delivery"]},"durationSec":{"type":"number"},"variables":{"type":"object"}}},"JobRequest":{"type":"object","required":["package"],"properties":{"package":{"oneOf":[{"$ref":"#/components/schemas/RendaPackage"},{"$ref":"#/components/schemas/HyperframesPackage"}]},"kind":{"enum":["scene","hyperframes"],"default":"scene"},"priority":{"enum":["economy","standard","rush"],"default":"standard"},"idempotencyKey":{"type":"string"}}},"Job":{"type":"object","properties":{"id":{"type":"string"},"kind":{"enum":["scene","hyperframes"]},"name":{"type":["string","null"]},"status":{"enum":["queued","planning","rendering","encoding","succeeded","failed","canceled"]},"priority":{"enum":["economy","standard","rush"]},"progress":{"type":"number","minimum":0,"maximum":1},"engine":{"type":"string"},"hardware":{"enum":["cpu","gpu-l4","gpu-l40s"]},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":"string","format":"date-time"},"finishedAt":{"type":"string","format":"date-time"},"billedSeconds":{"type":"number"},"costUsd":{"type":"number"},"cached":{"type":"boolean"},"warnings":{"type":"array","items":{"type":"string"}},"error":{"type":"string"},"estimate":{"$ref":"#/components/schemas/Estimate"},"outputs":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string","format":"uri"},"contentType":{"type":"string"},"bytes":{"type":"integer"}}}}}},"Estimate":{"type":"object","properties":{"engine":{"type":"string"},"hardware":{"type":"string"},"frames":{"type":"integer"},"estSeconds":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2},"estWallSeconds":{"type":"array","items":{"type":"number"}},"estCostUsd":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2},"warnings":{"type":"array","items":{"type":"string"}}}}}},"paths":{"/auth/trial":{"post":{"summary":"Anonymous claimable trial: API key + ~5 free render-minutes, no signup. Give claimUrl to the human.","responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string"},"claimUrl":{"type":"string"},"freeSecondsLeft":{"type":"number"},"expiresAt":{"type":"string","format":"date-time"},"limits":{"type":"object"},"next":{"type":"array","items":{"type":"string"}}}}}}},"429":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/auth/magic/start":{"post":{"summary":"Email the user a 6-digit sign-in code (creates the account if new)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"next":{"type":"string"}}}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/auth/magic/verify":{"post":{"summary":"Exchange the emailed code for an API key","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","code"],"properties":{"email":{"type":"string"},"code":{"type":"string","pattern":"^\\d{6}$"},"keyName":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string"},"user":{"type":"object"},"org":{"type":"object"}}}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/auth/device":{"post":{"summary":"Start device login (CLI)","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"deviceCode":{"type":"string"},"userCode":{"type":"string"},"verificationUri":{"type":"string"},"verificationUriComplete":{"type":"string"},"interval":{"type":"integer"},"expiresIn":{"type":"integer"}}}}}}}}},"/auth/device/token":{"post":{"summary":"Poll for the device login result","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["deviceCode"],"properties":{"deviceCode":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string"}}}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"428":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me":{"get":{"security":[{"bearer":[]}],"summary":"Current user, org, free balance, billing status","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/uploads":{"post":{"security":[{"bearer":[]}],"summary":"Register a content-addressed upload; PUT bytes to uploadUrl unless exists","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["filename","size","sha256"],"properties":{"filename":{"type":"string"},"size":{"type":"integer"},"sha256":{"type":"string"},"contentType":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"assetUri":{"type":"string"},"exists":{"type":"boolean"},"uploadUrl":{"type":"string"},"uploadMethod":{"const":"PUT"},"uploadHeaders":{"type":"object"}}}}}},"401":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/estimate":{"post":{"security":[{"bearer":[]}],"summary":"Estimate hardware, time and cost (free)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["package"],"properties":{"package":{"type":"object"},"kind":{"enum":["scene","hyperframes"]},"priority":{"enum":["economy","standard","rush"]}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Estimate"}}}},"422":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/jobs":{"post":{"security":[{"bearer":[]}],"summary":"Submit a render job","parameters":[{"name":"Idempotency-Key","in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobRequest"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"402":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"security":[{"bearer":[]}],"summary":"List jobs (newest first)","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","maximum":200}},{"name":"before","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"status","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"jobs":{"type":"array","items":{"$ref":"#/components/schemas/Job"}}}}}}}}}},"/jobs/{id}":{"get":{"security":[{"bearer":[]}],"summary":"Get a job (outputs carry presigned download URLs)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/jobs/{id}/cancel":{"post":{"security":[{"bearer":[]}],"summary":"Cancel a job","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"409":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/usage":{"get":{"security":[{"bearer":[]}],"summary":"Usage and cost for a period (default: this month)","parameters":[{"name":"from","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/billing/checkout":{"post":{"security":[{"bearer":[]}],"summary":"Stripe Checkout link (setup mode) for the user to add a card","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"}}}}}}}}},"/billing/portal":{"get":{"security":[{"bearer":[]}],"summary":"Stripe customer portal link","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"}}}}}}}}},"/pricing":{"get":{"summary":"Price table","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/schema.json":{"get":{"summary":"Renda package JSON Schema","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}}}}}}