Skip to main content
POST
/
v1
/
real-estate
/
living-property
curl -X POST https://api.vibepeak.ai/v1/real-estate/living-property \
  -H "Authorization: Bearer vpk_live_xxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "images": [
      { "url": "https://example.com/property/living-room.jpg", "room_type": "living_room" },
      { "url": "https://example.com/property/kitchen.jpg", "room_type": "kitchen" },
      { "url": "https://example.com/property/bedroom.jpg", "room_type": "bedroom" },
      { "url": "https://example.com/property/bathroom.jpg", "room_type": "bathroom" },
      { "url": "https://example.com/property/exterior.jpg", "room_type": "exterior" }
    ],
    "voice": {
      "voice_id": "EXAVITQu4vr4xnSDxMaL",
      "language": "en"
    },
    "modification_mode": "no_modify",
    "script": "Welcome to this stunning modern home where comfort meets contemporary design. The spacious living room is filled with natural light and elegant finishes. The kitchen offers sleek cabinetry and generous counter space. Each bedroom feels calm and inviting, while the bright bathroom adds a touch of luxury. Step outside to enjoy a beautiful private garden.",
    "webhook_url": "https://yourserver.com/webhooks/vibepeak",
    "subtitle": {
      "subtitle_style_preset": "classic"
    },
    "elements_config": {
      "enabled": true,
      "watermark": {
        "url": "https://example.com/logo.png",
        "position": "bottom-right",
        "size": 20,
        "opacity": 100
      },
      "text": {
        "content": "Powered by Vibepeak",
        "color": "#FFFFFF",
        "font": "Inter",
        "size": 20,
        "position": "center"
      }
    }
  }'
{
  "task_id": "task_abc123xyz",
  "status": "queued",
  "message": "Real estate video generation request accepted",
  "created_at": "2026-01-19T12:00:00Z",
  "credits_charged": 15,
  "livemode": true,
  "request_id": "req_xyz123",
  "_links": {
    "self": "/v1/tasks/task_abc123xyz",
    "poll_interval_seconds": 30
  }
}

Example Output


Creates a new living property video from real estate images. This endpoint uses AI to transform static property photos into dynamic videos with optional virtual staging, AI-generated narration, and background music. The video generation is asynchronous - you’ll receive a task ID to poll for status or configure a webhook to be notified when complete.

Key Features

  • Virtual Staging: Add people, furniture, or redecorate rooms using AI
  • AI Narration: Provide your own script for professional text-to-speech narration — or set voiceover_enabled: false for a music-only video
  • Background Music: Optional ambient music that complements your property video

Request Body

images
object[]
required
Array of image objects for the video. Must contain 5 to 9 images.You can also pass a plain URL string instead of an object — it behaves the same as { "url": "..." }.Each image object contains:
  • url (required): Publicly accessible HTTP(S) URL of the property image
  • room_type (optional): Type of room for better AI processing
  • modification_mode (optional): per-image override of the request-level modification_mode — omit to inherit
  • include_humans_and_pets (optional): per-image override of the request-level include_humans_and_pets — omit to inherit
Per-image exceptions. The top-level modification_mode / include_humans_and_pets apply to every image. To make an exception for one image — say, keep a facade original while the rest of the gallery is restyled — set those fields on that image object only:
{
  "modification_mode": "change_decoration",
  "include_humans_and_pets": true,
  "images": [
    "https://example.com/property/living-room.jpg",
    {
      "url": "https://example.com/property/facade.jpg",
      "room_type": "exterior",
      "modification_mode": "no_modify",
      "include_humans_and_pets": false
    }
  ]
}
decoration_style stays request-level — it is a global aesthetic, not a per-image toggle.
All image URLs must be unique. Duplicate URLs are not allowed.
Minimum resolution (HD floor): every image’s long side must be at least 1280 px and short side at least 720 px. Images below this threshold are rejected with IMAGE_RESOLUTION_TOO_LOW. CRMs that expose thumbnail URLs by default usually have a higher-resolution variant — use that one.
voiceover_enabled
boolean
default:"true"
Whether the video has a voiceover (narration). Defaults to true.Set to false to create a music-only video: omit voice and script, and the video is produced with background music only (or silent if background_music is false). Subtitles are not available without a voiceover.
voice
object
Voice configuration for text-to-speech narration. Required when voiceover_enabled is true (the default); omit it together with script when voiceover_enabled is false.
modification_mode
string
required
How to process the property images using AI.
ValueDescription
no_modifyKeep rooms as-is, add realistic people for a lived-in feel
change_decorationModernize old or outdated furniture and decor
The change_decoration mode uses AI virtual staging to transform your images. Processing may take longer for this mode.
Whether people are added is controlled by include_humans_and_pets. Together with modification_mode, it also selects the per-scene script budget — see script.
furnish was previously accepted but is no longer supported. Requests using it are rejected with a VALIDATION_ERROR. Use change_decoration to restyle or furnish the room, or no_modify to keep it unchanged.
decoration_style
string
Interior decoration style applied when modification_mode is change_decoration. Ignored for the other modes. Defaults to a modern aesthetic when omitted.
include_humans_and_pets
boolean
default:"true"
Whether to add realistic people (and occasionally a pet) to the staged scenes.When enabled together with change_decoration, the video uses longer two-step scenes (the room is restyled, then animated), which widens the per-scene script budget — see script. Set to false to keep scenes free of people and use the single-step budget.
script
string
Narration script for text-to-speech. Required when voiceover_enabled is true (the default); omit it together with voice when voiceover_enabled is false. The length must scale with the number of images, and the per-scene budget depends on the render mode:Single-stepno_modify, or any mode with include_humans_and_pets set to false. Scenes are ~5 seconds, requiring 65–85 characters per image:
ImagesMin charactersMax characters
5325425
9585765
Two-stepchange_decoration with include_humans_and_pets set to true (the default). Scenes are ~7 seconds (restyle + animation), requiring 110–140 characters per image:
ImagesMin charactersMax characters
5550700
99901260
Scripts outside the applicable range are rejected with SCRIPT_TOO_SHORT or SCRIPT_TOO_LONG.
Numbers and symbols are allowed. Write the script naturally — numbers (e.g. 3 bedrooms, 580.000 €) and symbols are read correctly by text-to-speech. Only emojis and other non-speech characters (pictographs, control characters) are rejected.
Write compelling property descriptions that highlight key features. The script should flow naturally when spoken aloud, and its length must fit the per-scene budget above.
background_music
boolean
default:"true"
Enable AI-generated background music.When true, adds ambient music that complements the property video. The music is automatically mixed at an appropriate volume to not overpower the narration.
subtitle
object
Subtitle configuration for word-level animated overlays. Use subtitle_style_preset for quick setup or styles for granular control. Providing both will result in a validation error.
Requires voiceover. Subtitles are derived from the narration’s word timing, so omit subtitle (or set it to false) when voiceover_enabled is false — the request is rejected otherwise.
webhook_url
string
HTTPS URL to receive webhook notification when the task completes.See Webhooks for payload format and verification details.
Webhook URLs must use HTTPS and cannot point to private/internal networks (SSRF protection).
elements_config
object
Configuration for visual elements and branding overlays. If not provided, elements are disabled by default.

Test Mode

test_scenario
string
default:"success"
Sandbox-only scenario selector. Honored only for test-mode (vpk_test_) keys and silently ignored for live keys, so it is safe to leave in shared request-building code.
ValueOutcome
successSynthetic task completes with a watermarked sample video
failSynthetic task fails with a sanitized, public-safe error
slowLike success, but completes after a noticeably longer delay
Test mode never spends credits or runs the real pipeline. See Test Mode for the full sandbox model.

Response

Returns a 202 Accepted response with task details.
task_id
string
required
Unique identifier for the task. Use this to poll for status via Get Task.
status
string
required
Initial task status. Always queued for new tasks.
message
string
required
Human-readable confirmation message.
created_at
string
required
Task creation timestamp (ISO 8601 format).
credits_charged
integer
required
Number of credits charged for this request (15 credits). Always 0 for test-mode requests.
livemode
boolean
required
true for live (vpk_live_) requests; false for test-mode (vpk_test_) requests. Use this to tell a real task from a sandbox one. See Test Mode.
request_id
string
required
Unique request ID for support reference.
HATEOAS links for navigation.
  • self: URL to poll for task status
  • poll_interval_seconds: Recommended polling interval (30 seconds)

Response Headers

HeaderDescription
LocationURL to poll for task status (/v1/tasks/{taskId})
Retry-AfterRecommended polling interval in seconds (30)
curl -X POST https://api.vibepeak.ai/v1/real-estate/living-property \
  -H "Authorization: Bearer vpk_live_xxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "images": [
      { "url": "https://example.com/property/living-room.jpg", "room_type": "living_room" },
      { "url": "https://example.com/property/kitchen.jpg", "room_type": "kitchen" },
      { "url": "https://example.com/property/bedroom.jpg", "room_type": "bedroom" },
      { "url": "https://example.com/property/bathroom.jpg", "room_type": "bathroom" },
      { "url": "https://example.com/property/exterior.jpg", "room_type": "exterior" }
    ],
    "voice": {
      "voice_id": "EXAVITQu4vr4xnSDxMaL",
      "language": "en"
    },
    "modification_mode": "no_modify",
    "script": "Welcome to this stunning modern home where comfort meets contemporary design. The spacious living room is filled with natural light and elegant finishes. The kitchen offers sleek cabinetry and generous counter space. Each bedroom feels calm and inviting, while the bright bathroom adds a touch of luxury. Step outside to enjoy a beautiful private garden.",
    "webhook_url": "https://yourserver.com/webhooks/vibepeak",
    "subtitle": {
      "subtitle_style_preset": "classic"
    },
    "elements_config": {
      "enabled": true,
      "watermark": {
        "url": "https://example.com/logo.png",
        "position": "bottom-right",
        "size": 20,
        "opacity": 100
      },
      "text": {
        "content": "Powered by Vibepeak",
        "color": "#FFFFFF",
        "font": "Inter",
        "size": 20,
        "position": "center"
      }
    }
  }'
{
  "task_id": "task_abc123xyz",
  "status": "queued",
  "message": "Real estate video generation request accepted",
  "created_at": "2026-01-19T12:00:00Z",
  "credits_charged": 15,
  "livemode": true,
  "request_id": "req_xyz123",
  "_links": {
    "self": "/v1/tasks/task_abc123xyz",
    "poll_interval_seconds": 30
  }
}

Error Codes

CodeStatusDescription
INVALID_JSON400Request body is not valid JSON (malformed/truncated payload)
VALIDATION_ERROR400Invalid request parameters
INVALID_IMAGE_URL400One or more image URLs are inaccessible or invalid
INVALID_WATERMARK_URL400The elements_config watermark URL is inaccessible or does not return an image
IMAGE_RESOLUTION_TOO_LOW400One or more images are below the HD floor (long ≥ 1280 px, short ≥ 720 px)
SCRIPT_TOO_SHORT400Script is shorter than the per-scene minimum (image_count × 65 single-step, × 120 two-step)
SCRIPT_TOO_LONG400Script is longer than the per-scene maximum (image_count × 85 single-step, × 150 two-step)
SCRIPT_INVALID_CHARACTERS400Script contains emojis or other non-speech characters not supported by TTS
VOICE_NOT_FOUND404The specified voice ID does not exist
VOICE_ACCESS_DENIED403The specified voice is not accessible to your account
INVALID_API_KEY401Invalid or missing API key
PLAN_REQUIRED403Plan doesn’t include API access
INSUFFICIENT_CREDITS402Not enough credits to process the request
CONCURRENCY_LIMIT_EXCEEDED429Concurrent task limit reached
SERVICE_UNAVAILABLE503Video generation service temporarily unavailable
See Error Handling for more details.

Credits

This endpoint charges 15 credits per request upon successful task creation. If the task fails during processing, credits are not refunded.

Processing Time

Video generation typically takes 3-5 minutes depending on:
  • Number of images
  • Selected modification mode (change_decoration takes longer)
  • Current system load
Use the Retry-After header (30 seconds) as a guide for polling frequency.

Next Steps

After creating a task:
  1. Poll for status: Use Get Task to check progress
  2. Wait for webhook: If configured, receive notification when complete
  3. Download video: Access the video URL from the completed task result