Authentication
A Bearer token in the Authorization header. Create keys in Settings.
Authorization: Bearer YOUR_API_KEYImages, video, audio and 3D behind one API, paid from the same balance as the studio. Create a key in Settings and install the CLI with npm.
$ npm i -g pufy-ioSwap the model ID to switch between image, video and speech. The fields follow the model.
1# 1. Generate an image2curl -X POST https://pufy.io/api/v1/api/catalog/generations \3 -H "Authorization: Bearer $PUFY_API_KEY" \4 -H 'Content-Type: application/json' \5 -H "Idempotency-Key: $(uuidgen)" \6 -d '{7 "modelId": "luma/uni-v1/text-to-image",8 "inputs": {9 "prompt": "Neon city street after rain, cinematic night",10 "size": "16:9"11 }12}'13 14# 2. Poll with the generation id from step 1 until its status is succeeded15curl https://pufy.io/api/v1/api/catalog/generations/$ID \16 -H "Authorization: Bearer $PUFY_API_KEY"17 18# 3. Download the file19curl https://pufy.io/api/v1/api/catalog/generations/$ID/content \20 -H "Authorization: Bearer $PUFY_API_KEY" \21 -o result.jpeg
export PUFY_API_KEY="YOUR_API_KEY"npm i -g pufy-iopufy run luma/uni-v1/text-to-image -p "violet neon fox" -o ./out/Run any model from a shell, a CI job or a coding agent. Every render is priced before it starts and drawn from the same balance.
pufy loginPaste your API key once; it is checked and savedpufy whoamiThe key's name and your balancepufy models --type videoEvery video model with its starting pricepufy run <model> -hA model's fields, fetched live: type, default, allowed valuespufy run <model> -p "<prompt>" -o ./out/Render and save the result in a folderpufy run <model> -p "..." --dry-runThe exact price, without spending anythingpufy run <model> -p "..." --max-price 0.50Refuse to run if the price is higherpufy run <model> -p "..." --json -o ./out/One JSON result, ready for the next steppufy skill installTeach your coding agent to use the CLIA Bearer token in the Authorization header. Create keys in Settings.
Authorization: Bearer YOUR_API_KEYStarting a render answers at once with status queued. Poll the render until it has succeeded, failed or been refunded.
{ "status": "queued" }Ask for the exact price of your inputs without starting anything. Every amount is in euro cents.
POST /api/v1/api/catalog/quoteSend an Idempotency-Key header and a retried request never charges twice.
Idempotency-Key: render-042Each key has a per-minute limit and an optional daily cap. Past the limit the API answers 429.
429 Too Many RequestsJSON errors with a code and a message. A render that fails is refunded to your balance automatically.
{ "status": "refunded" }/api/catalog/meYour key and balance/api/catalog/modelsEvery model/api/catalog/models/detail?id=MODEL_IDOne model and its fields/api/catalog/quotePrice for exact inputs/api/catalog/generationsStart a render/api/catalog/generationsYour recent renders/api/catalog/generations/IDOne render's status/api/catalog/generations/ID/contentThe result file/api/catalog/generations/IDDelete a renderTop up €3 and start in the studio
Create an API key in Settings and call any model. Install the CLI with npm. Failed renders are refunded.