renderly.Get API key
Renderly/Developers
BUILD WITH RENDERLY

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.

  1. 01 API key
  2. 02 Model
  3. 03 Price
  4. 04 Request
  5. 05 Result
Examples for your stack
01

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.

Keep your key private.

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.

02

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.

03

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.

04

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
One request ID for one job.

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.

05

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.

QueuedProcessingCompleted
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:

TypeSet upSigned with
Account webhooksRegister 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 requestAdd webhookUrl to POST /jobs. Receives that job’s job.completed or job.refunded event.Your account callback secret, under Settings → API access → Webhooks.
EventWhendata
job.completedThe job finished and its artifacts are ready.{job} with artifacts
job.refundedThe job failed and its credits were returned.{job}
balance.lowYour balance crossed below the low-balance alert you set in Settings.{balance, lowBalanceCredits}
webhook.testYou pressed “Send test”.{test: true}
JSON · delivery body
{"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 headerMeaning
X-Request-IdOn every response (req_…). Quote it when you contact support. SDK errors carry it as requestId / request_id.
X-RateLimit-LimitRequests allowed this minute by the tightest limit that applied.
X-RateLimit-RemainingRequests left in the current minute.
X-RateLimit-ResetUnix time (seconds) when the minute window ends.
Retry-AfterOn 429: seconds to wait before retrying.

Each API key allows 600 protected requests per minute. Account limits grow with lifetime purchased credits:

TierPurchased creditsQuotes/minJobs/minDownloads/min
standardBelow 10,00012060300
growth10,000 or more240120600
scale100,000 or more6003001,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

LanguageInstallUse
JavaScript / TypeScriptnpm install renderly-aiimport {Renderly} from 'renderly-ai' · Node.js 18+, Deno, Bun, edge · types included
Pythonpip install renderly-aifrom 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.

BehaviourDetail
RetriesReads 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 limitslastRateLimit / last_rate_limit holds the latest limit, remaining, reset and retryAfter.
ErrorsRenderlyError with code, status, requestId and retryAfter.
Budgetrun({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.

Shell · renderly
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 status

run 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.

JSON · Claude Desktop and Cursor (mcpServers)
{
  "mcpServers": {
    "renderly": {
      "command": "npx",
      "args": ["-y", "renderly-mcp"],
      "env": { "RENDERLY_API_KEY": "YOUR_API_KEY" }
    }
  }
}
Shell · Claude Code
claude mcp add renderly --env RENDERLY_API_KEY=YOUR_API_KEY -- npx -y renderly-mcp

Tools: 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
https://woovhhwoevjoipwltiwy.supabase.co/functions/v1/core-api
MethodEndpointWhat it does
GET/modelsPublic · search models; page with cursor
GET/models/{id}Public · one model with inputSchema
GET/catalogPublic · 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/statusPublic · component checks, daily outcomes, incidents
GET/accountTier, limits and the calling key
GET/walletBalance, reserved credits and alert threshold
GET/ledgerCredit movements; page with before
GET/usageJobs and credits by day, model or key
POST/quotesPrice your exact settings (free)
POST/jobsCreate or safely retry a request; optional wait and webhookUrl
GET/jobsRequest history with filters; page with before
GET/jobs/{id}One request’s status and artifacts; optional wait
POST/jobs/{id}/cancelCancel before generation starts
POST/uploads?kind=imageUpload 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-readableUse
openapi.jsonOpenAPI 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.txtIndex of this documentation for AI tools.
llms-full.txtThe 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.

StatusCodesNext step
400invalid_request, invalid_input, settings_not_quoted, invalid_upload_urlCheck the request against the model’s input schema. URL imports need a public HTTPS address.
401authentication_requiredCheck whether your key is invalid, expired or revoked.
403api_scope_forbidden, verified_account_required, account_temporarily_restricted, payment_account_review_requiredCheck the key’s scope (session-only routes are not available to keys) and account restrictions.
404not_found, quote_not_foundCheck the ID and that it belongs to your account.
409quote_price_changed, quote_expired, quote_input_mismatch, quote_already_usedGet and approve a new quote.
409insufficient_balanceAdd credits, then retry with the same request ID.
409request_id_conflictThe request ID was already used with a different body. Use the original body, or a new ID for a new job.
409job_not_cancellableGeneration already started; wait for the result.
409key_spend_limit_reachedThe key reached its monthly spend limit. Raise it in Settings or wait for next month (UTC).
410artifact_expiredThe stored result was deleted after its retention period.
429rate_limitedWait Retry-After seconds, then retry at a slower pace.
502upload_fetch_failedThe file at that URL could not be downloaded. Check it is public, or upload the bytes.
503model_unavailable, service_unavailableCheck 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

DataKept for
Results (artifacts)7 days by default. Choose from 1 hour to 30 days in Settings. Each artifact shows its expiresAt.
Uploaded inputs24 hours.
Download links15 minutes; request a new link at any time while the result is kept.
QuotesUntil 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.