Prerequisites
- A Decart account at platform.decart.ai
- An API key
export DECART_API_KEY="your-api-key-here"
Using an AI coding agent? Run
npx skills add https://docs.platform.decart.ai to teach it Decart’s APIs, or connect the MCP server for live docs search.Pick your first integration path
- Realtime
- Video Editing
- Image Editing
1) Install SDK
npm install @decartai/sdk
2) Connect camera + model
import { createDecartClient, models } from "@decartai/sdk";
const model = models.realtime("lucy-latest");
// Request camera access — will throw if the user denies permission
let stream: MediaStream;
try {
stream = await navigator.mediaDevices.getUserMedia({
video: { frameRate: model.fps, width: model.width, height: model.height },
audio: true,
});
} catch (err) {
if (err instanceof DOMException && err.name === "NotAllowedError") {
console.error("Camera permission denied. Please allow camera access and reload.");
} else {
console.error("Could not access camera:", err);
}
throw err;
}
const client = createDecartClient({ apiKey: process.env.DECART_API_KEY });
const realtimeClient = await client.realtime.connect(stream, {
model,
mirror: "auto",
onRemoteStream: (remoteStream) => {
document.getElementById("output").srcObject = remoteStream;
},
onError: (err) => {
console.error("Realtime connection error:", err);
},
onDisconnect: (reason) => {
console.log("Disconnected:", reason);
},
initialState: {
prompt: { text: "Substitute the character in the video with an anime-style hero with spiky silver hair and glowing blue eyes.", enhance: true },
},
});
// Switch to a different transformation on the fly
await realtimeClient.setPrompt("Substitute the character in the video with a Renaissance oil painting portrait.");
Expected result
You should see the transformed stream rendered in your output video element.Common issues:
- Camera permission denied — the browser will prompt the user. If denied,
getUserMediathrows aNotAllowedError. - No camera found — throws a
NotFoundError. Check that a video device is connected. - Connection drops — the
onDisconnectcallback fires. In production, implement reconnection logic.
For browser/mobile production setups, use Client Tokens instead of exposing a permanent API key.
1) Submit + poll with the SDK
import { createDecartClient, models } from "@decartai/sdk";
import { writeFileSync } from "fs";
const client = createDecartClient({ apiKey: process.env.DECART_API_KEY });
const result = await client.queue.submitAndPoll({
model: models.video("lucy-latest"),
data: "https://example.com/input_video.mp4",
prompt: "Transform into Studio Ghibli animation style",
onStatusChange: (job) => console.log(`Status: ${job.status}`),
});
if (result.status === "completed") {
const buffer = Buffer.from(await result.data.arrayBuffer());
writeFileSync("transformed_video.mp4", buffer);
}
2) Same flow in multiple languages
import { createDecartClient, models } from "@decartai/sdk";
const client = createDecartClient({ apiKey: process.env.DECART_API_KEY });
const result = await client.queue.submitAndPoll({
model: models.video("lucy-latest"),
data: "https://example.com/input_video.mp4",
prompt: "Transform into Studio Ghibli animation style",
onStatusChange: (job) => console.log(job.status),
});
import asyncio
import os
from decart import DecartClient, models
async def main():
async with DecartClient(api_key=os.getenv("DECART_API_KEY")) as client:
result = await client.queue.submit_and_poll({
"model": models.video("lucy-latest"),
"data": "https://example.com/input_video.mp4",
"prompt": "Transform into Studio Ghibli animation style",
"on_status_change": lambda job: print(job.status),
})
asyncio.run(main())
JOB_ID=$(curl -s -X POST https://api.decart.ai/v1/jobs/lucy-latest \
-H "X-API-KEY: $DECART_API_KEY" \
-F "data=@input_video.mp4" \
-F "prompt=Transform into Studio Ghibli animation style" | jq -r '.job_id')
while true; do
STATUS=$(curl -s -H "X-API-KEY: $DECART_API_KEY" \
https://api.decart.ai/v1/jobs/$JOB_ID | jq -r '.status')
[ "$STATUS" = "completed" ] && break
[ "$STATUS" = "failed" ] && exit 1
sleep 2
done
curl -H "X-API-KEY: $DECART_API_KEY" \
https://api.decart.ai/v1/jobs/$JOB_ID/content --output transformed_video.mp4
Expected result
You should havetransformed_video.mp4 in your current directory.import { createDecartClient, models } from "@decartai/sdk";
import { readFileSync } from "fs";
const client = createDecartClient({ apiKey: process.env.DECART_API_KEY });
const imageBuffer = readFileSync("input.jpg");
const imageBlob = new Blob([imageBuffer], { type: "image/jpeg" });
const result = await client.process({
model: models.image("lucy-image-2"),
prompt: "Transform into a watercolor painting style",
data: imageBlob,
resolution: "720p",
});
document.querySelector("img").src = URL.createObjectURL(result);
Next steps
Lucy 2.1 Realtime
Start with the flagship realtime model for character transformation.
JavaScript Realtime SDK
Full WebRTC integration guide.
Client Tokens
Secure browser/mobile realtime authentication.
Models
Pick the best model for your use case.
Examples Hub
Browse official examples and realtime-first starter projects.
Use Cases
See complete realtime and batch product patterns.