From API key
to first result.
Images, video, language and more. Connect once, choose your model, and use the same request flow across your app, from the SDKs, the command line or an AI assistant.
- 01 API key
- 02 Model
- 03 Price
- 04 Request
- 05 Result
Get your API key
Sign in, open API access, and create a key with Read & create permissions. Copy the key when it appears and store it on your server.
Use an environment variable or secret store. Never put the key in a browser app, public repository or shared example. Read-only keys can check your balance and history, but cannot create jobs. A monthly spend limit on a key caps what it can spend.
Using Windows PowerShell?
$env:RENDERLY_API_KEY = "YOUR_API_KEY"
$env:RENDERLY_BASE_URL = "https://woovhhwoevjoipwltiwy.supabase.co/functions/v1/core-api"Use Node.js or Python for the examples below. The cURL examples use a POSIX shell.
Install the official SDK for your language. Both are MIT-licensed and have no dependencies; they add safe retries, long polling, rate-limit details and webhook verification.
The JavaScript package renderly-ai runs on Node.js 18+, Deno, Bun and edge runtimes and includes the renderly command line. The Python package renderly-ai needs Python 3.8+ and is imported as renderly_ai. The SDKs are optional: every step below also shows plain HTTPS code under “Without the SDK”. RENDERLY_BASE_URL is optional for the SDKs.
Check that your connection works
This reads your wallet and does not spend credits.
Choose a model
Select a model to see its exact request body and supported inputs. You can use the same key for multiple models.
Loading current model availability…
Find models from your application
GET /models is public and searchable with q, kind, operation, maker, available, limit (up to 200) and cursor; follow nextCursor for the next page. Each entry has its id, operation, sku, availability and a starting price. GET /models/{id} adds the creation settings and inputSchema. IDs are different from the model’s display name. GET /catalog still returns the whole catalogue in one response.
Get the price for your settings
Send your model and inputs to POST /quotes. The response contains quoteId, credits, maxCredits and expiresAt. This step does not charge your account.
Choose a model above to replace the placeholders with its actual contract.
Without the SDK
Review the maximum credits before continuing. Settings and uploaded file IDs must match the quote exactly. 1 credit = $0.01.
Create a request
After approving the quote, send it to POST /jobs with the same input and a unique requestId. This reserves credits and starts the job.
Without the SDK
Persist the ID and request body before sending. If the connection drops, retry the same ID and body: the original job comes back with reused: true. Creating a new ID can start a second billable job. The SDKs reuse the ID on their automatic retries.
Get a signed callback for this job
Add webhookUrl (a public HTTPS address) to the body. Renderly posts a signed job.completed or job.refunded event to it, signed with your account’s callback secret. See Webhooks.
Follow the request and get your result
Read GET /jobs/{id}?wait=60 until the status is completed or refunded. With wait, the API answers as soon as the job is final or after up to 60 seconds; repeat the call while the job is still running. Other states, including reconciling, still need a later check. Without wait, poll every 3 seconds.
Without the SDK
A completed job includes artifacts. Request a download URL with GET /artifacts/{id}. Links expire after 15 minutes (expiresIn: 900); request a new one when needed. Fetch the link without your API key. A refunded job has its reserved credits returned.
Prefer not to poll? Let the API wait for you (next section) or receive a signed webhook when the job finishes.
Wait for the result in one request
Add ?wait=N (0–60 seconds) or the header Prefer: wait=N to POST /jobs. The API holds the response until the job is completed or refunded, or until the wait ends, and returns the job in whatever state it reached. Fast models often finish inside one request; keep long polling GET /jobs/{id}?wait=60 for the rest. The SDKs’ run() combines quote, budget check, creation and waiting.
Set your HTTP client timeout above the wait (for example 75 seconds for wait=60). A timed-out request is safe to retry with the same request ID.
Input schema
Inputs vary by model. For dynamic models, pass the IDs below inside input.parameters. For fixed models, use the field names shown directly inside input. Every model also publishes its input as JSON Schema 2020-12 in GET /models/{id} → model.inputSchema; validate against it before quoting, or run renderly model <id>.
Choose a model to see its input fields.
Upload reference files
Send raw file bytes to POST /uploads?kind=image, video or audio with Content-Type: application/octet-stream, or send JSON {"url": "https://…"} to import a public HTTPS file. The response contains the upload id.
Replace YOUR_UPLOADED_ASSET_ID in a model example with the returned ID. Array inputs expect a list of IDs. Files are limited to 24 MiB and validated as in the workspace; other limits depend on the model. URL imports refuse private, local and redirect-to-private addresses with invalid_upload_url, and answer 502 upload_fetch_failed when the file cannot be downloaded. Model inputs take upload IDs, never URLs. Uploaded inputs are kept for 24 hours.
Webhooks
Instead of polling, Renderly can call your server. There are two ways to receive the same signed events:
| Type | Set up | Signed with |
|---|---|---|
| Account webhooks | Register up to five HTTPS endpoints under Settings → API access → Webhooks (signed-in browser session; API keys cannot manage webhooks). Receives every subscribed event for the account. | The endpoint’s secret (whsec_…), shown once at creation. |
| Per request | Add webhookUrl to POST /jobs. Receives that job’s job.completed or job.refunded event. | Your account callback secret, under Settings → API access → Webhooks. |
| Event | When | data |
|---|---|---|
job.completed | The job finished and its artifacts are ready. | {job} with artifacts |
job.refunded | The job failed and its credits were returned. | {job} |
balance.low | Your balance crossed below the low-balance alert you set in Settings. | {balance, lowBalanceCredits} |
webhook.test | You pressed “Send test”. | {test: true} |
{"id":"evt_5120","type":"job.completed","createdAt":"2026-10-26T09:00:15Z","attempt":1,
"data":{"job":{"id":"…","modelId":"…","status":"completed","artifacts":[{"id":"…","kind":"image","mimeType":"image/png"}]}}}Each delivery is a POST with the headers Renderly-Event, Renderly-Event-Id and Renderly-Signature: t=<unix seconds>,v1=<hex>, where v1 is HMAC-SHA256 of <t>.<raw body> with the signing secret. Verify it against the raw body before parsing, reject timestamps older than five minutes, and use id to ignore duplicates: a delivery can repeat if your server answers slowly.
Answer with any 2xx within 8 seconds. Other answers, timeouts and redirects (never followed) are retried after 1 minute, 5 minutes, 30 minutes, 2, 6, 12 and 24 hours; eight failed attempts end that delivery, and twenty consecutive failures turn an account endpoint off. Only public HTTPS hostnames are accepted.
Account, limits and headers
GET /account returns your account’s tier and per-minute limits, and describes the calling key: name, prefix, scopes, expiry, monthlySpendLimit and monthSpent. GET /wallet returns your balance, the credits reserved by unfinished jobs (already deducted from the balance) and your lowBalanceCredits alert.
| Response header | Meaning |
|---|---|
X-Request-Id | On every response (req_…). Quote it when you contact support. SDK errors carry it as requestId / request_id. |
X-RateLimit-Limit | Requests allowed this minute by the tightest limit that applied. |
X-RateLimit-Remaining | Requests left in the current minute. |
X-RateLimit-Reset | Unix time (seconds) when the minute window ends. |
Retry-After | On 429: seconds to wait before retrying. |
Each API key allows 600 protected requests per minute. Account limits grow with lifetime purchased credits:
| Tier | Purchased credits | Quotes/min | Jobs/min | Downloads/min |
|---|---|---|---|---|
standard | Below 10,000 | 120 | 60 | 300 |
growth | 10,000 or more | 240 | 120 | 600 |
scale | 100,000 or more | 600 | 300 | 1,200 |
A key with a monthly spend limit refuses new jobs with 409 key_spend_limit_reached when this calendar month’s spend (UTC) plus the new reservation would exceed it.
Usage and ledger
GET /usage totals jobs and credits (charged, refunded and still reserved) for a window of up to 366 days (default: the last 30), grouped by day, model or key. Jobs created in the browser appear under the key workspace. GET /ledger pages through every credit movement (limit up to 200, before, kind, from, to); continue with nextBefore. GET /jobs filters by status (including active), modelId, from, to and keyId.
Cancel a job
POST /jobs/{id}/cancel with {} cancels a job that has not been sent for generation yet and returns its full reservation: the response is {job, balance, cancelled: true} and the job carries cancelled: true. Once generation has started, the API answers 409 job_not_cancellable and the job finishes normally (or is refunded if it fails).
SDKs
| Language | Install | Use |
|---|---|---|
| JavaScript / TypeScript | npm install renderly-ai | import {Renderly} from 'renderly-ai' · Node.js 18+, Deno, Bun, edge · types included |
| Python | pip install renderly-ai | from renderly_ai import Renderly · Python 3.8+, standard library only |
Both read RENDERLY_API_KEY and the optional RENDERLY_BASE_URL, and cover every endpoint on this page: models and model search, quotes, jobs with server wait, cancellation, uploads from bytes or URL, downloads, account, wallet, ledger, usage, status and webhook verification.
| Behaviour | Detail |
|---|---|
| Retries | Reads and job creation retry network errors, 5xx and 429 (honouring Retry-After up to 60 seconds). Job creation keeps one request ID, so a retry never starts a second job. Quotes retry at most once; uploads and cancellation only after 429. |
| Rate limits | lastRateLimit / last_rate_limit holds the latest limit, remaining, reset and retryAfter. |
| Errors | RenderlyError with code, status, requestId and retryAfter. |
| Budget | run({maxCredits}) refuses an over-budget quote before anything is charged. |
Command line
The JavaScript package includes the renderly command. Run it with npx renderly-ai or install it with npm install -g renderly-ai. It reads RENDERLY_API_KEY; add --json to any command for machine-readable output.
renderly balance
renderly models "portrait" --kind image --available
renderly model MODEL_ID # fields and input schema
renderly quote MODEL_ID --prompt "A glass fox in morning light"
renderly run MODEL_ID --prompt "A glass fox in morning light" --max-credits 40 --out results/
renderly jobs --status active
renderly job JOB_ID --wait
renderly cancel JOB_ID
renderly download ARTIFACT_ID --out fox.png
renderly upload ./reference.png --kind image
renderly usage --group model --from 2026-10-01T00:00:00Z
renderly statusrun shows the quote and asks before spending unless you pass --yes, refuses any quote above --max-credits, waits for the result and downloads every artifact. Use --input '{"parameters":{…}}' or --input @input.json for full inputs. Exit codes: 0 success, 1 API error, 2 usage error.
AI assistants (MCP)
renderly-mcp is a Model Context Protocol server for Claude Desktop, Claude Code, Cursor and other MCP clients. It lets an assistant search models, read input schemas, quote, create jobs, follow them and fetch download links. Give it a Read only key for browsing and history, or a Read & create key with a monthly spend limit to let it create.
{
"mcpServers": {
"renderly": {
"command": "npx",
"args": ["-y", "renderly-mcp"],
"env": { "RENDERLY_API_KEY": "YOUR_API_KEY" }
}
}
}claude mcp add renderly --env RENDERLY_API_KEY=YOUR_API_KEY -- npx -y renderly-mcpTools: get_balance, get_usage, search_models, get_model, get_quote, create_job, get_job, cancel_job, list_jobs, get_download_url, upload_from_url and get_status. create_job spends credits: it requires a maxCredits budget and refuses, without charging, any quote above it.
API reference
Base URL
https://woovhhwoevjoipwltiwy.supabase.co/functions/v1/core-api| Method | Endpoint | What it does |
|---|---|---|
| GET | /models | Public · search models; page with cursor |
| GET | /models/{id} | Public · one model with inputSchema |
| GET | /catalog | Public · the whole catalogue with settings and availability |
| GET | /catalog/details?ids=… | Public · creation settings for up to 100 models |
| GET | /catalog/prices?ids=… | Public · display prices for up to 12 models |
| GET | /status | Public · component checks, daily outcomes, incidents |
| GET | /account | Tier, limits and the calling key |
| GET | /wallet | Balance, reserved credits and alert threshold |
| GET | /ledger | Credit movements; page with before |
| GET | /usage | Jobs and credits by day, model or key |
| POST | /quotes | Price your exact settings (free) |
| POST | /jobs | Create or safely retry a request; optional wait and webhookUrl |
| GET | /jobs | Request history with filters; page with before |
| GET | /jobs/{id} | One request’s status and artifacts; optional wait |
| POST | /jobs/{id}/cancel | Cancel before generation starts |
| POST | /uploads?kind=image | Upload image, video or audio bytes, or import a URL |
| GET | /artifacts/{id} | Get a 15-minute download URL |
All endpoints except the public ones require Authorization: Bearer YOUR_API_KEY. Read-only keys can call the GET routes; Read & create keys can also quote, create, cancel and upload. Key, webhook and alert management, account export and account deletion need a signed-in browser session and cannot be called with API keys.
| Machine-readable | Use |
|---|---|
| openapi.json | OpenAPI 3.1 description of every route above, with schemas, errors, rate-limit headers and webhook payloads. Import it into Postman, Insomnia or a code generator. |
| llms.txt | Index of this documentation for AI tools. |
| llms-full.txt | The complete API guide as plain text, ready to paste into an AI assistant. |
Errors and safe retries
Errors return { "error": { "code": "…", "message": "…" } }. Inspect the HTTP status before using the response, and include the X-Request-Id header when you contact support.
| Status | Codes | Next step |
|---|---|---|
| 400 | invalid_request, invalid_input, settings_not_quoted, invalid_upload_url | Check the request against the model’s input schema. URL imports need a public HTTPS address. |
| 401 | authentication_required | Check whether your key is invalid, expired or revoked. |
| 403 | api_scope_forbidden, verified_account_required, account_temporarily_restricted, payment_account_review_required | Check the key’s scope (session-only routes are not available to keys) and account restrictions. |
| 404 | not_found, quote_not_found | Check the ID and that it belongs to your account. |
| 409 | quote_price_changed, quote_expired, quote_input_mismatch, quote_already_used | Get and approve a new quote. |
| 409 | insufficient_balance | Add credits, then retry with the same request ID. |
| 409 | request_id_conflict | The request ID was already used with a different body. Use the original body, or a new ID for a new job. |
| 409 | job_not_cancellable | Generation already started; wait for the result. |
| 409 | key_spend_limit_reached | The key reached its monthly spend limit. Raise it in Settings or wait for next month (UTC). |
| 410 | artifact_expired | The stored result was deleted after its retention period. |
| 429 | rate_limited | Wait Retry-After seconds, then retry at a slower pace. |
| 502 | upload_fetch_failed | The file at that URL could not be downloaded. Check it is public, or upload the bytes. |
| 503 | model_unavailable, service_unavailable | Check model availability and retry later. An uncertain job submission must keep its original request ID. |
Safe to retry: GET requests and POST /jobs with the same request ID. Retry POST /quotes at most once, then request a new quote.
Retention
| Data | Kept for |
|---|---|
| Results (artifacts) | 7 days by default. Choose from 1 hour to 30 days in Settings. Each artifact shows its expiresAt. |
| Uploaded inputs | 24 hours. |
| Download links | 15 minutes; request a new link at any time while the result is kept. |
| Quotes | Until expiresAt in the quote. |
Model lifecycle and deprecation
When we plan to remove a model that has API usage, we mark it as deprecated in the catalogue and give at least 14 days’ notice before removing it. Removals forced by the model’s supplier, or required for safety, can happen sooner. Model availability can also change temporarily: check available, and handle 503 model_unavailable by retrying later or choosing another model. The full model lifecycle policy and the changelog list notices and platform changes.