Real estate photo to video AI: a listing tour from photos

Turn listing photos into a video tour with AI: animate each photo as a clip's first frame, join the clips in room order, and check every frame.

5 min readSume
All posts

To turn real estate photos into a video with AI, make each listing photo the first frame of a short image-to-video clip and describe one camera move in the prompt, such as a slow push-in or a pan. Join the clips in room order with transitions and a music bed, add the address and price as on-screen text, and compare every clip with its photo before you post it.

The photo sets only the first frame; the model generates every frame after it. The Sume facts below come from Video generation, Timeline 1.0, and Video captions, read on 2026-09-27.

How do I turn one listing photo into a moving clip?

Put the photo's URL in frame_images on POST /v1/videos, with frame_type: "first_frame". The image must be reachable over public HTTPS. The docs advise prompts that include motion, camera angles, lighting, and scene composition, so give each room one move: a slow push-in toward the windows, a pan across the kitchen, a pull-back from the front door.

Make one clip per room. Most models stop at 15 seconds per clip; seedance-2.5 and wan-3.0 go to 30. A model takes a first frame when its supported_frame_images on GET /v1/videos/models lists first_frame. The call answers 202 with a job id and a polling_url; poll it until status is completed.

curl -X POST https://api.sume.com/v1/videos \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: listing-living-room-001" \
  -d '{
    "model": "seedance-2",
    "prompt": "Slow push-in across the living room toward the windows, steady camera, soft daylight",
    "frame_images": [
      {
        "type": "image_url",
        "image_url": { "url": "https://example.com/listing/living-room.jpg" },
        "frame_type": "first_frame"
      }
    ],
    "aspect_ratio": "16:9",
    "duration": 5
  }'

How do I join the clips into one tour?

Sume mirrors each finished clip to a Sume-owned media.sume.com URL, which the job's result at GET /v1/jobs/{id}/result carries. Timeline 1.0 takes only your own workspace's media.sume.com URLs. List the clips in video[] in room order: each slot has a start and a duration, the first starts at 0, and each later slot can open with a transition (fade, dissolve, wipeleft, wiperight, slideup, or slidedown) of up to 1 second.

For a music-only tour, set audio.mode to "silence" with the tour's length in audio.duration_seconds, and add a soundtrack. With silence, the bed is the whole track, so the API reference says to set its gain_db to 0. The bed must be Sume-hosted too, such as a Music Router track (which BGM catalog tracks qualify). The output is 1080×1920 unless you set output; use 1920×1080 for a horizontal tour.

The movement has to come from the generated clips. A still on a Timeline is a static hold (its motion field is ignored), so a Timeline of stills makes a slideshow, not a tour.

curl -X POST https://api.sume.com/v1/timeline-1.0/render \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: listing-tour-001" \
  -d '{
    "audio": { "mode": "silence", "duration_seconds": 15 },
    "soundtrack": {
      "url": "https://media.sume.com/artifacts/artf_demo/music.mp3",
      "gain_db": 0,
      "loop": true,
      "fade_out_seconds": 2
    },
    "output": { "width": 1920, "height": 1080 },
    "video": [
      { "source_url": "https://media.sume.com/artifacts/artf_demo/exterior.mp4", "start": 0, "duration": 5 },
      { "source_url": "https://media.sume.com/artifacts/artf_demo/living-room.mp4", "start": 5, "duration": 5,
        "transition": { "type": "dissolve", "duration": 0.5 } },
      { "source_url": "https://media.sume.com/artifacts/artf_demo/kitchen.mp4", "start": 10, "duration": 5,
        "transition": { "type": "dissolve", "duration": 0.5 } }
    ]
  }'

How do I add the address and price?

Burn them onto the finished tour with POST /v1/video-captions and cues. Each cue has text, start, and end in seconds, and cues skip speech-to-text, so a tour with no voice works. Send the tour's media.sume.com URL as video_url.

Today the caption job refuses a source longer than 60 seconds, so keep the captioned tour to a minute. A caption job is a fixed amount for videos up to 60 seconds; confirm it in GET /v1/catalog. Placing and styling the lines is covered in how to add text over a video.

Will the AI video show the property accurately?

Not by itself. Your photo sets only the first frame, and the model generates every frame after it, so a clip can show fixtures, finishes, views, or proportions the home doesn't have, and a move that reveals space outside the photo has to invent it. Treat each clip as an illustration and check it:

  • Pull stills with POST /v1/video-frames at the times you name in at[]. It takes a Sume-hosted clip and is unbilled.
  • Compare each still with its photo: fixtures, windows, views, finishes, and the size of the room.
  • Regenerate or drop any clip that changes the room, and keep the original photos as the listing's record.

What does a listing video cost, and what are the limits?

Each step is a separate job with its own price. Video models are billed at the provider's list price × 1.25; each model's rates are its pricing_skus on GET /v1/videos/models.

From Video generation, Timeline 1.0, Video captions, Video frames, and API pricing, read 2026-09-27.
StepEndpointLimitsPrice
One clip per photoPOST /v1/videosUp to 15 s on most models; seedance-2.5 4–30 s, wan-3.0 2–30 sPer model, in pricing_skus
The tourPOST /v1/timeline-1.0/render1–200 slots, 1–1,800 s, even edges from 256 to 2,160 pxListed at $0.10 per output minute
Address and pricePOST /v1/video-captionsSource up to 60 s todayFixed per job; see GET /v1/catalog
Frame checkPOST /v1/video-framesOne Sume-hosted clip per jobUnbilled

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume