LixiAI API Reference
Welcome to the LixiAI 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 LixiAI? 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 › Developer › 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://lixirender.com/api/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://lixirender.com/api/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
LixiAI 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://lixirender.com/cdn/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://lixirender.com/api/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. LixiAI 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://lixirender.com/cdn/renders/render_abc123xyz.jpg",
"timestamp": "2026-03-12T14:30:43Z"
}
Tip: Verify webhook authenticity by checking the X-LixiAI-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 put LixiAI on your website. Go to Dashboard → Developer → Embed Tools: the snippet there already contains your Embed ID (it starts with emb_). Copy it and paste it anywhere on your page — a Code Block in Squarespace, a Custom HTML block in WordPress/Wix/Shopify:
<iframe
src="https://lixirender.com/render-tool.html?eid=emb_YOUR_EMBED_ID"
width="100%"
height="900"
frameborder="0"
allow="camera"
style="border:0;border-radius:12px;"
title="LixiAI Kitchen Visualizer"
></iframe>
Embed ID vs API key
| Where | Use | |
|---|---|---|
Embed ID (emb_…) | Dashboard → Embed Tools, shown in the snippet and next to each key | Public. Goes in the iframe URL (?eid=). Safe to put on your website. |
API key (rai_live_… / rai_test_…) | Shown once when you generate the key | Secret. Only for server-to-server calls to the REST API. Never put it on a web page. |
Both a Test key and a Live key come with an Embed ID. The embed only works on domains you add under Allowed Domains (add yourdomain.com — www. is handled automatically). Note: most site builders preview your page inside their own editor domain, so the widget may show "Domain Not Authorized" in the editor preview; check the published page instead.
Node.js Example
const axios = require('axios');
async function generateRender(imageUrl, style) {
// Submit render job
const { data } = await axios.post(
'https://lixirender.com/api/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://lixirender.com/api/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