# Real estate listing videos from photos: an image to video workflow for property marketing Most listings start with a folder of still photos. Agents know video helps a listing stand out on portals, Reels, and YouTube Shorts. Organizing a videographer, a drone pilot, and an editor for every mid-market property usually doesn't make financial sense. Image-to-video models change this. You can take the 20 to 40 photos the photographer already delivered and turn them into short, cinematic clips: a slow push into the living room, a dolly across the kitchen island, a gentle reveal of the backyard at golden hour. You then assemble those clips into a listing reel. This guide covers a practical workflow built on [RelayDance](https://relaydance.com), an OpenAI-compatible API for ByteDance Seedance and other video models. It includes photo selection, prompt patterns, the API calls, cost math, and the guardrails that keep your marketing honest. --- ## Why image-to-video works well for listings Real estate is a good fit for image-to-video for three reasons: 1. **The source material is already good.** Professional listing photos are well lit, level, and wide-angle. They are close to the ideal input for a video model. 2. **The motion you need is simple.** Listing videos rarely need complex action. They need smooth, believable camera moves through static spaces. Video models handle this well. 3. **The format is short.** A typical social listing reel runs 30 to 60 seconds, built from 3 to 6 second shots. Seedance generates clips up to 15 seconds, which covers any single shot. The result won't replace a full walkthrough tour. It can turn a photo-only listing into a video listing within hours instead of days. --- ## Step 1: Pick and prepare your photos Not every listing photo makes a good video shot. Use these criteria to choose. **Good candidates:** - Wide shots of main rooms (living, kitchen, primary bedroom) - Exterior front elevation and backyard - Rooms with depth, such as a hallway leading to a window or a kitchen opening into a dining area - Twilight exteriors (these animate beautifully) **Weak candidates:** - Tight detail shots (faucets, light fixtures). These are fine as stills in the edit, but there's little room for camera movement. - Heavily HDR-processed images with haloing. The model may amplify artifacts. - Photos with people, pets, or legible personal items. Remove them for privacy anyway. **Preparation checklist:** - Export at the photographer's full resolution. Don't upload compressed portal thumbnails. - Crop to your target aspect ratio *before* generating: 16:9 for YouTube and portals, 9:16 for Reels, TikTok, and Shorts. This gives you control over what stays in frame. - Host the images at publicly reachable URLs, such as your CDN or a signed storage URL, so the API can fetch them. --- ## Step 2: Plan a shot list Treat it like a real shoot. A dependable 45-second structure looks like this: | # | Shot | Source photo | Camera move | Length | |---|------|-------------|-------------|--------| | 1 | Hero exterior | Front elevation | Slow push-in | 6s | | 2 | Entry / living | Living room wide | Lateral dolly left to right | 5s | | 3 | Kitchen | Kitchen wide | Slow push toward island | 5s | | 4 | Dining / flow | Dining into kitchen | Gentle pan | 4s | | 5 | Primary suite | Bedroom wide | Slow pull-back | 5s | | 6 | Bathroom | Primary bath | Subtle push-in | 4s | | 7 | Outdoor living | Backyard / patio | Rising crane-style move | 6s | | 8 | Closing exterior | Twilight front | Slow pull-back | 6s | That's 41 seconds of generated footage. With titles and a contact card added in your editor, you land around 45 to 50 seconds. --- ## Step 3: Write prompts that move the camera, not the house The most important prompting rule for real estate is this: **describe camera motion and lighting, and tell the model to keep the architecture unchanged.** You want the space to feel alive without inventing a skylight or widening the kitchen. A reusable prompt template: Cinematic real estate video of @image1. Smooth, slow [CAMERA MOVE], steady gimbal motion, no shake. Keep all architecture, furniture, fixtures, and finishes exactly as shown. Natural daylight through the windows, soft subtle light movement. No people, no text, no added objects. Examples by shot: - **Exterior hero:** "Slow push-in toward the front door of @image1, late-afternoon sun, light breeze moving the tree leaves, house and landscaping exactly as shown." - **Kitchen:** "Slow dolly forward toward the kitchen island in @image1, warm pendant lights on, keep countertops, cabinets, and appliances exactly as shown." - **Backyard:** "Gentle rising camera move over the patio in @image1, pool water rippling softly, sky unchanged, no added furniture." Small natural motion makes clips feel like real video rather than a Ken Burns pan. Leaves, water, curtains, and light shifting are all good options. Reference images go in `metadata.content[]` and are cited in the prompt as `@image1` through `@imageN`. A single request accepts up to 9 reference images, 3 reference videos, and 3 audio tracks. For most listing shots, one photo per clip gives the most faithful result. Multiple references are useful when you want the model to understand adjoining spaces, for example a living room and the kitchen visible beyond it. --- ## Step 4: Generate the clips via the API RelayDance speaks the OpenAI-compatible protocol. According to the official relaydance.com/docs: **"Set base_url to https://relaydance.com/v1 and keep your OpenAI SDK."** Authentication is a standard bearer token. You create keys at [relaydance.com/console](https://relaydance.com/console). Video generation is asynchronous. You submit a task, then poll it or receive a webhook. ### Submit a task `POST /v1/video/generations` with `model`, `prompt`, `seconds`, and a `metadata` object (`ratio`, `resolution`, `generate_audio`, `callback_url`, `content[]`): python import os import time import requests API = "https://relaydance.com/v1" HEADERS = { "Authorization": f"Bearer {os.environ['RELAYDANCE_API_KEY']}", "Content-Type": "application/json", } # Check https://relaydance.com/models for current model IDs and rates. MODEL = "doubao-seedance-2-5-1080p" def submit_shot(image_url: str, camera_move: str, seconds: int, ratio: str = "16:9"): prompt = ( f"Cinematic real estate video of @image1. Smooth, slow {camera_move}, " "steady gimbal motion, no shake. Keep all architecture, furniture, " "fixtures, and finishes exactly as shown. Natural daylight, subtle " "light movement. No people, no text, no added objects." ) body = { "model": MODEL, "prompt": prompt, "seconds": seconds, "metadata": { "ratio": ratio, "resolution": "1080p", "generate_audio": False, # add music in the edit instead # Reference media; confirm exact field shape in the docs "content": [ {"type": "image_url", "image_url": {"url": image_url}} ], }, } r = requests.post(f"{API}/video/generations", headers=HEADERS, json=body) r.raise_for_status() return r.json()["id"] Confirm the exact `content[]` item shape and response fields against the [API docs](https://relaydance.com/docs) before you ship. ### Poll for the result Poll `GET /v1/video/generations/{task_id}` until the status is `succeeded` or `failed`. A succeeded result contains the video URL. python def wait_for(task_id: str, interval: int = 10): while True: r = requests.get(f"{API}/video/generations/{task_id}", headers=HEADERS) r.raise_for_status() task = r.json() if task["status"] in ("succeeded", "failed"): return task time.sleep(interval) ### Or use a webhook If you're generating a whole shot list, or many listings at once, set `metadata.callback_url`. The final task state is then POSTed to your server, so you don't have to hold open polling loops. This works well for a brokerage-wide pipeline where a new listing upload triggers generation automatically. ### Run the whole shot list python shots = [ ("https://cdn.example.com/123-main/front.jpg", "push-in toward the front door", 6), ("https://cdn.example.com/123-main/living.jpg", "lateral dolly from left to right", 5), ("https://cdn.example.com/123-main/kitchen.jpg", "dolly forward toward the island", 5), # ... ] task_ids = [submit_shot(url, move, secs) for url, move, secs in shots] results = [wait_for(t) for t in task_ids] Submitting all tasks first and then waiting lets the clips render in parallel. --- ## Step 5: Review, regenerate, and assemble Review every clip before it goes anywhere near a listing. Watch for: - **Warped geometry:** bending door frames, drifting window mullions, shifting floor lines - **Invented features:** extra windows, added furniture, changed finishes - **Texture crawl:** countertops or carpets that "swim" during motion Regenerate the shots that fail. Sometimes a simpler camera move fixes it, for example a push-in instead of a pan. Billing works in your favor here. According to the official relaydance.com docs, **"Failed or errored requests are never billed"**, so a task that errors out doesn't cost you anything. A clip that *succeeds* but you reject is still billed, though. A cheap draft pass, described below, keeps rejected output inexpensive. Then assemble in any editor (CapCut, Premiere, DaVinci Resolve) or programmatically with FFmpeg. Add: - An opening title with address and price - Licensed background music - Lower-thirds for key features ("Renovated 2024 kitchen", "0.4 acre lot") - A closing card with agent contact details and brokerage branding --- ## What it costs RelayDance bills pay-as-you-go per generated video. Current rates from [relaydance.com/models](https://relaydance.com/models): | Model / tier | Approx. price | |---|---| | Seedance Fast | $0.152 / second | | Seedance 2.0, 720p | $0.190 / second | | Seedance 2.0, 1080p | $0.470 / second | | Seedance 2.5, 1080p (`doubao-seedance-2-5-1080p`, added 2026-10-10) | $0.711 / second | | Seedance native 4K | $4.90 per 5-second clip | Applied to the 41-second shot list above: - **Seedance Fast:** 41 × $0.152 ≈ **$6.23** - **Seedance 2.0 at 720p:** 41 × $0.190 ≈ **$7.79** - **Seedance 2.0 at 1080p:** 41 × $0.470 ≈ **$19.27** - **Seedance 2.5 at 1080p:** 41 × $0.711 ≈ **$29.15** These figures cover one pass with no regenerations, so budget extra for retakes. **A cost-effective pattern is a two-pass workflow:** 1. **Draft pass** on Seedance Fast or 2.0 at 720p to test camera moves and catch problems cheaply. 2. **Final pass** on 2.0 or 2.5 at 1080p, only for the shots you've approved. Reserve native 4K for the hero exterior or a luxury listing where the extra quality is visible. Rates change, so check the [models page](https://relaydance.com/models) for live pricing before you build budgets into client packages. ### Bonus: still images for staging and thumbnails The same API serves images at `POST /v1/images/generations`. According to relaydance.com/models, gpt-image-2 has an unusual billing model. Image output is free and only input is billed. Image-to-image starts from about CNY 0.035, and 4K output costs the same as 1K. That makes it inexpensive to produce high-resolution video thumbnails and social cover images. If you use it for virtual staging, see the disclosure guidance below. --- ## Guardrails: keep listing video honest Property marketing is regulated. A beautiful clip that misrepresents a home is a liability. Build these rules into your process: - **Never alter the property.** No added rooms, no changed finishes, no fake views, no removed power lines or neighboring buildings. Your prompts should explicitly say "exactly as shown," and your review step must enforce it. - **Disclose AI-generated or virtually staged content.** Many MLSs and portals require disclosure of virtual staging and digitally altered media. Rules vary by MLS and jurisdiction, so check yours. - **Keep the original photos in the listing.** Video should complement accurate photography, not replace it. - **Mind fair housing rules** in any text overlays or voiceover. Describe the property, not the ideal buyer. - **Confirm usage rights.** Make sure your photographer's license covers derivative works like video. --- ## Why an OpenAI-compatible API helps here For a brokerage or proptech team, the practical advantage is integration speed. You get direct, OpenAI-compatible access to Seedance without setting up a BytePlus enterprise account or going through KYC. Existing OpenAI SDK code and auth patterns carry over. Billing is pay-as-you-go via USDT or Stripe card, which fits per-listing costs that you can pass through to clients or absorb into a marketing package. The catalog also includes Seedance 1.5 Pro, HappyHorse video models, and Grok Imagine video and image models. You can test which model handles interiors best for your market without integrating several vendors. --- ## Quick-start checklist 1. Create an API key at [relaydance.com/console](https://relaydance.com/console). 2. Select 6 to 8 wide, high-resolution listing photos and crop them to your target ratio. 3. Write one camera-move prompt per photo, always including "keep architecture exactly as shown." 4. Run a draft pass at 720p or on Seedance Fast. 5. Review for warping and invented features, then regenerate failures. 6. Render approved shots at 1080p (or 4K for the hero shot). 7. Assemble with titles, music, and agent branding, and add disclosures. 8. Publish to portals, social, and the listing page. Full endpoint reference: [relaydance.com/docs](https://relaydance.com/docs). Current model rates: [relaydance.com/models](https://relaydance.com/models).
According to the official relaydance.com docs: "Failed or errored requests are never billed"
According to the official relaydance.com/docs docs: "Set base_url to https://relaydance.com/v1 and keep your OpenAI SDK"

Key facts and figures

ItemValueSource
Seedance 2.0 720p priceabout $0.190 / secondrelaydance.com/models
Seedance 2.0 1080p priceabout $0.470 / secondrelaydance.com/models
Seedance 2.5 1080p priceabout $0.711 / second, added 2026-10-10, model doubao-seedance-2-5-1080prelaydance.com/models
Seedance Fast priceabout $0.152 / secondrelaydance.com/models
Seedance native 4K priceabout $4.90 per 5-second cliprelaydance.com/models
gpt-image-2 image billingimage output is free, only input is billed; image-to-image from about CNY 0.035; 4K and 1K output cost the samerelaydance.com/models
API protocolOpenAI-compatible; set base_url to https://relaydance.com/v1relaydance.com/docs
Failed requestsfailed or errored requests are never billedrelaydance.com/docs

Data verified 2026-06-29; live prices are on the official /models page.


RelayDance home · Models and pricing · Docs · All guides · Privacy Policy · User Agreement · Telegram community · RelayRouter (LLM API) · Live playground