RendrAI API Reference
Welcome to the RendrAI developer documentation. Our REST API lets you generate photorealistic interior renders programmatically, embed interactive visualization widgets on any website, and integrate AI rendering into your existing design workflows.
New to RendrAI? Start with the Quick Start guide to generate your first render in under 5 minutes. All API calls require an API key from your dashboard.
Quick Start
Get up and running in minutes. Here's the fastest path to your first AI render.
1. Get your API key
Sign up for a free account and navigate to Dashboard → API Keys to generate your key. Free accounts include 20 render credits.
2. Make your first request
Send a POST request to /v1/renders with your image URL and desired style:
curl -X POST https://api.rendrai.io/v1/renders \
-H "Authorization: Bearer rai_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_url": "https://your-server.com/room-photo.jpg",
"style": "scandinavian",
"room_type": "kitchen",
"quality": "4k",
"lighting": "natural_daylight"
}'
3. Poll for the result
Rendering typically takes 30–90 seconds. Poll the status endpoint or use webhooks for a callback when complete:
curl https://api.rendrai.io/v1/renders/render_abc123 \
-H "Authorization: Bearer rai_live_YOUR_API_KEY"
Authentication
All API requests must include your API key in the Authorization header as a Bearer token:
Authorization: Bearer rai_live_YOUR_API_KEY
RendrAI has two key types:
| Key Type | Prefix | Usage |
|---|---|---|
| Live key | rai_live_ | Production renders, debits real credits |
| Test key | rai_test_ | Testing, returns mock responses, no credit cost |
Security: Never expose your API key in client-side JavaScript or public repositories. Use environment variables and server-side code for API calls.
POST /v1/renders
Create a new render job. The render processes asynchronously; use the returned id to check status.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
image_url | string | Yes | Publicly accessible URL of the source room image (JPEG or PNG, max 20MB) |
style | string | Yes | Style preset slug (see GET /styles). Example: scandinavian |
room_type | string | Yes | One of: kitchen, living_room, bedroom, bathroom, office, dining_room, exterior |
quality | string | No | Output resolution: 1080p, 2k, 4k (default), 8k |
lighting | string | No | One of: natural_daylight, golden_hour, evening_ambient, dramatic_shadows, studio_lighting |
creativity | integer | No | 1–10. Low = conservative interpretation, high = creative reinterpretation. Default: 6 |
webhook_url | string | No | URL to POST the result to when rendering completes |
metadata | object | No | Arbitrary key/value pairs returned with the response |
Response
{
"id": "render_abc123xyz",
"status": "processing",
"created_at": "2026-03-12T14:30:00Z",
"estimated_seconds": 45,
"credits_used": 1,
"metadata": {}
}
GET /v1/renders/:id
Retrieve the status and result of a render job.
Response (completed)
{
"id": "render_abc123xyz",
"status": "completed",
"created_at": "2026-03-12T14:30:00Z",
"completed_at": "2026-03-12T14:30:43Z",
"render_seconds": 43,
"credits_used": 1,
"output": {
"url": "https://cdn.rendrai.io/renders/render_abc123xyz.jpg",
"width": 3840,
"height": 2160,
"format": "jpeg",
"size_bytes": 4820480,
"expires_at": "2026-04-12T14:30:43Z"
},
"input": {
"style": "scandinavian",
"room_type": "kitchen",
"quality": "4k",
"lighting": "natural_daylight"
}
}
Status values
| Status | Description |
|---|---|
queued | Waiting to be processed |
processing | AI is generating the render |
completed | Render finished successfully |
failed | Render failed — no credit charged |
GET /v1/styles
Returns the full list of available style presets with metadata.
curl https://api.rendrai.io/v1/styles \
-H "Authorization: Bearer rai_live_YOUR_API_KEY"
{
"styles": [
{
"id": "scandinavian",
"name": "Scandinavian",
"description": "Clean lines, natural materials, neutral tones with cozy warmth",
"available_for": ["kitchen", "living_room", "bedroom", "bathroom"],
"plan_required": "starter"
},
{
"id": "japandi",
"name": "Japandi",
"description": "Fusion of Japanese minimalism and Scandinavian functionality",
"available_for": ["kitchen", "living_room", "bedroom"],
"plan_required": "professional"
}
],
"total": 63
}
Webhooks
Rather than polling, you can specify a webhook_url in your render request. RendrAI will send a POST to your endpoint when the render completes or fails.
Webhook payload
{
"event": "render.completed",
"render_id": "render_abc123xyz",
"status": "completed",
"output_url": "https://cdn.rendrai.io/renders/render_abc123xyz.jpg",
"timestamp": "2026-03-12T14:30:43Z"
}
Tip: Verify webhook authenticity by checking the X-RendrAI-Signature header against an HMAC-SHA256 hash of the raw request body using your API key as the secret.
iFrame Embed
The simplest way to embed RendrAI on your website. Paste this snippet anywhere on your page:
<iframe
src="https://rendrai.io/embed/kitchen?key=YOUR_API_KEY"
width="100%"
height="700px"
frameborder="0"
allow="camera; microphone"
style="border-radius:12px;border:1px solid #E7E5E4;"
title="RendrAI Kitchen Visualizer"
></iframe>
Embed URL parameters
| Parameter | Description |
|---|---|
key | Your public embed key (different from your API key) |
theme | light or dark |
primary_color | Hex color for accent elements, e.g. %23F97316 |
room | Pre-selected room type: kitchen, living_room, etc. |
hide_branding | true to hide RendrAI branding (Professional plan+) |
Node.js Example
const axios = require('axios');
async function generateRender(imageUrl, style) {
// Submit render job
const { data } = await axios.post(
'https://api.rendrai.io/v1/renders',
{
image_url: imageUrl,
style: style,
room_type: 'kitchen',
quality: '4k',
lighting: 'natural_daylight'
},
{
headers: { 'Authorization': 'Bearer rai_live_YOUR_KEY' }
}
);
const renderId = data.id;
console.log('Render queued:', renderId);
// Poll until complete
let result;
while (true) {
await new Promise(r => setTimeout(r, 3000));
const { data: status } = await axios.get(
`https://api.rendrai.io/v1/renders/${renderId}`,
{ headers: { 'Authorization': 'Bearer rai_live_YOUR_KEY' } }
);
if (status.status === 'completed') {
result = status;
break;
}
if (status.status === 'failed') throw new Error('Render failed');
}
console.log('Render URL:', result.output.url);
return result.output.url;
}
generateRender('https://example.com/my-kitchen.jpg', 'scandinavian');
Error Codes
| Code | HTTP Status | Description |
|---|---|---|
unauthorized | 401 | Invalid or missing API key |
insufficient_credits | 402 | Account has no credits remaining |
invalid_image | 400 | Image URL is inaccessible or format is unsupported |
invalid_style | 400 | Style slug not found or not available on your plan |
rate_limited | 429 | Too many requests. See rate limits |
render_failed | 500 | Internal rendering error — no credit charged, retry safe |
Rate Limits
API rate limits are enforced per API key:
| Plan | Renders/min | API requests/min |
|---|---|---|
| Starter | 2 | 30 |
| Professional | 10 | 120 |
| Enterprise | Custom | Custom |
Rate limit headers are included in every response:
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 8
X-RateLimit-Reset: 1741788060