One POST request turns a listing photo into a cinematic video clip. One more merges those clips into a branded reel with music, address text, an ending card, and your logo. Build it into your own app or bolt it onto the platform you already run.
Activate a plan, generate a key, and make your first call in under ten minutes.
The developer dashboard is where you activate API access, mint keys, and watch what your integration is doing. No sales call, no waitlist, no manual provisioning step between you and your first request.

The hard parts of AI video — the model, the render farm, the music mixing, the overlay compositing, the file hosting — already exist behind these endpoints. You supply photos and prompts.
Already run a CRM, MLS tool, listing portal, or property management app? Drop the API behind a single button so every listing in your database can generate a cinematic video without your users ever leaving your product.
Ship a standalone AI video product without training a model or building a render pipeline. You send photos and prompts, we handle generation, merging, music, overlays, and hosting of the finished MP4.
Photographers, agencies, and marketing teams can wire the API into their existing workflows so every shoot automatically produces a reel for the client, batched overnight and delivered in the morning.
Loop your photo library through the videos endpoint and produce a clip per room, then merge them into one walkthrough reel per property.
Trigger a video job the moment a new listing hits your database, poll for completion in a background worker, and push the finished URL to your listing page.
Request portrait orientation for 1080x1920 output ready for Instagram Reels, TikTok, and YouTube Shorts, complete with music and an ending card.
Burn address text, price callouts, and your client's logo into every reel so the output ships fully branded straight out of the API.
Every endpoint lives under one base URL and returns JSON. Here is the complete path from an empty project to a finished branded reel.
Open the API dashboard, choose a plan to activate API access, then generate a key from the API Keys tab. Send it on every request as either an Authorization: Bearer header or an x-api-key header. Keys are scoped to your account, credits are shared across all of them, and a revoked key returns 401 immediately.
Authorization: Bearer <API_KEY>
# or
x-api-key: <API_KEY>All input images must live on our storage — external image URLs are rejected. Call the presigned URL endpoint to reserve upload slots for 1 to 20 images. This endpoint is completely free and never costs a credit.
GET /api/v1/presigned-urls?count=1
{
"bucket": "api-uploads",
"uploads": [
{
"path": "<keyId>/<uuid>",
"token": "...",
"presignedUrl": "https://...",
"publicUrl": "https://..."
}
]
}PUT the raw image bytes to the presignedUrl with a Content-Type of image/jpeg or image/png. Hold on to the matching publicUrl — that is the value you pass as imageUrl in the next step.
curl -X PUT "<presignedUrl>" \
-H "Content-Type: image/jpeg" \
--data-binary @photo.jpgPOST a prompt plus your uploaded imageUrl. Optionally add an endImageUrl for the last frame, a list of camera effects, and a duration of 4, 5, or 6 seconds. The call is asynchronous: it charges 1 credit upfront and returns a jobId right away.
POST /api/v1/videos
{
"prompt": "smooth cinematic reveal of a modern living room",
"imageUrl": "<publicUrl>",
"effects": ["push_in", "pan_left"],
"duration": 5
}
{ "jobId": "uuid", "status": "pending", "creditsCharged": 1 }Check the job every few seconds until status flips to completed or failed. A finished job returns video_url for inline playback and download_url for a forced download. If generation fails, the credit is refunded to your account automatically.
GET /api/v1/videos/:jobId
{
"job": {
"status": "completed",
"video_url": "https://...",
"download_url": "https://...?download",
"credit_cost": 1
}
}Pass 2 to 20 completed job IDs in the order you want them to play. Layer on background music, a text overlay, an ending card, and a watermark logo. This also costs 1 credit and returns a jobId you poll the same way.
POST /api/v1/reels
{
"videoJobIds": ["uuid-1", "uuid-2"],
"orientation": "portrait",
"musicType": "lofi",
"textOverlay": { "text": "123 Main Street, Miami", "fontSize": 56 },
"ending": { "text": "Contact us today!", "duration": 3 },
"logo": { "url": "<logoPublicUrl>", "scale": 15 }
}The full request and response schema for every field, including the exact base URL, lives in the API documentation. Grab a key from the API dashboard and you can paste these calls straight into your terminal.
Two of them cost a credit. The other six are free, so status polling and usage checks never eat into your plan.
/api/v1/presigned-urlsFreeReserve 1–20 signed upload URLs for your input images./api/v1/videos1 creditTurn one property photo into a cinematic video clip./api/v1/videos/:jobIdFreeCheck status and fetch the finished video and download URLs./api/v1/videosFreeList this key's video jobs, newest first, with limit and offset./api/v1/reels1 creditMerge 2–20 completed clips into one branded reel./api/v1/reels/:jobIdFreeCheck reel status and fetch the merged output video./api/v1/reelsFreeList this key's reel jobs, newest first, with limit and offset./api/v1/creditsFreeRead total, used, and remaining credits on the account.Pass any combination of effect codes in the effects array to control how the camera travels through the still photo. Clip duration is 4, 5, or 6 seconds.
dolly_zoompull_outpush_inaerial_dronelow_anglehigh_angleaerialzoom_inzoom_outtruck_lefttruck_rightpedestal_downpedestal_upcrane_downcrane_uppan_leftpan_rightorbit_leftorbit_rightMerging is not just concatenation. One call handles music, typography, a closing card, and a watermark, so the file that comes back is already client-ready.
Choose no_music, tropical, lofi, or jazz. Per-clip fade in and out is on by default and can be switched off with isFadingEnable.
Set the text, font family, size from 12–200px, color, background color and opacity, bold and italic, percentage-based position, and how many seconds it stays on screen.
Append a closing message after the last clip with its own font size, colors, optional background image, and a duration of 1–10 seconds.
Overlay a PNG logo across the whole video with control over position, scale from 5–40% of frame width, and opacity.
400Validation failed — the message lists the allowed values for the field you got wrong.401Invalid or missing API key, including keys you have revoked.402Not enough credits. The response includes required and remaining counts.403The key is valid but API access is not enabled for the account yet.404Resource not found, which also covers jobs that are not owned by this key.500Internal server error.Choose a plan in the dashboard to activate API access. Switch to annual billing and one month is free.
Need higher volume? Read the API docs or contact support for a custom plan.
Video is the format that moves listings, and everyone in property knows it. The problem has never been demand — it has been unit economics. A videographer costs hundreds of dollars per property and takes days to turn around. That math works for a luxury listing and collapses for everything else, which is why the overwhelming majority of listings still ship as a photo carousel. An AI video generation API changes the cost per listing from hundreds of dollars to a single credit, which is what makes video viable at portfolio scale.
Building that capability yourself is a much bigger project than it first appears. You need a video-generation model and the GPU capacity to serve it, a job queue that survives long renders, an FFmpeg pipeline for merging clips and mixing music, a compositing layer for text overlays and logo watermarks, storage and a CDN for the finished MP4s, and a billing system that refunds work that failed halfway through. Each of those is weeks of engineering and an ongoing operational burden. The overlay and branding layer alone is a product in its own right.
A photo to video API collapses all of that into two paid endpoints. You POST a prompt and an image URL, you poll a job, and you get back a hosted MP4 with a playback URL and a download URL. Merging is one more call that accepts up to twenty completed clips in whatever order you specify, along with background music, address text, a closing card, and a logo. The asynchronous job model matters more than it sounds: because nothing blocks on an open HTTP connection, you can fan out hundreds of jobs from a background worker and collect results as they land, instead of babysitting long-running requests.
The credit model is deliberately simple so you can build pricing on top of it. One video is one credit, one reel merge is one credit, and everything else — uploads, status polls, job lists, balance checks — is free. Credits are charged when a job is accepted and refunded automatically when a render fails, so a bad generation never shows up on your bill. Because credits sit on the account rather than the key, you can issue a separate key per environment or per client and still draw from a single balance, which makes multi-tenant integrations straightforward.
For anyone reselling video, the branding controls are the important part. Every reel can carry your own logo, your own typography, and your own call to action, so the output looks like it came from your product rather than ours. Combined with AI avatar presenters and automatic voiceovers, you can assemble a complete white-labeled listing marketing product on top of infrastructure you did not have to build. Read the API documentation to see the full schema, then activate a key and ship your first request today.
Activate a plan, generate a key, and POST your first job. The docs have every field, every error code, and a copy-paste end-to-end example.