# Endpoints

The v2 API is available at the base URL `https://api.virtualstagingai.app/v2`.

The same API key can be used for both the v1 and v2 API. You can find or generate your API key in the [Settings](https://www.virtualstagingai.app/settings) section of your Virtual Staging AI account.&#x20;

Authenticate all requests by including an Authorization Header with the value (case sensitive):

`Authorization: Api-Key {your_api_key_here}`

## Check API status

> Returns 200 OK if the API is running

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"servers":[{"url":"https://api.virtualstagingai.app/v2","description":"Production base URL."},{"url":"https://us-central1-furniture-ai.cloudfunctions.net/apiV2","description":"Long-running operations endpoint."}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"API key authentication. Use the format: Api-Key ${key}."}}},"paths":{"/status":{"get":{"summary":"Check API status","description":"Returns 200 OK if the API is running","responses":{"200":{"description":"API is operational"}}}}}}
```

## Get current user details

> Returns information about the authenticated user including their usage limits

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"servers":[{"url":"https://api.virtualstagingai.app/v2","description":"Production base URL."},{"url":"https://us-central1-furniture-ai.cloudfunctions.net/apiV2","description":"Long-running operations endpoint."}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"API key authentication. Use the format: Api-Key ${key}."}},"responses":{"AuthError":{"description":"Authentication error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"UnexpectedError":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}}}},"paths":{"/user":{"get":{"summary":"Get current user details","description":"Returns information about the authenticated user including their usage limits","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"object","properties":{"email":{"type":"string"},"uid":{"type":"string"}}},"photoLimit":{"type":"object","properties":{"staging":{"oneOf":[{"type":"number"},{"type":"string","enum":["UNLIMITED"]}],"description":"The virtual staging photo limit. Can be a number or \"UNLIMITED\"."},"imageEditing":{"oneOf":[{"type":"number"},{"type":"string","enum":["UNLIMITED"]}],"description":"The image editing photo limit. Can be a number or \"UNLIMITED\"."}},"description":"The user's photo limit. Can be a number or the string \"UNLIMITED\" for unlimited plans."},"photosUsedThisPeriod":{"type":"object","properties":{"staging":{"type":"number","description":"Number of virtual staging photos used in the current period."},"imageEditing":{"type":"number","description":"Number of image editing photos used in the current period."}},"description":"Count of photos used in the current billing period by type."}}}}}},"401":{"$ref":"#/components/responses/AuthError"},"500":{"$ref":"#/components/responses/UnexpectedError"}}}}}}
```

## Get all renders

> Returns all renders for the authenticated user

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"servers":[{"url":"https://api.virtualstagingai.app/v2","description":"Production base URL."},{"url":"https://us-central1-furniture-ai.cloudfunctions.net/apiV2","description":"Long-running operations endpoint."}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"API key authentication. Use the format: Api-Key ${key}."}},"schemas":{"Render":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for this render."},"created_at":{"type":"number","description":"Creation timestamp (epoch milliseconds)."},"queued_at":{"type":["number","null"],"description":"Timestamp when the render was queued for processing (epoch milliseconds)."},"variations":{"type":"object","properties":{"total_count":{"type":"number","description":"Total number of completed variations for this render."},"next_cursor":{"type":["string","null"],"description":"Cursor to use to get the next page of variations."},"items":{"type":"array","description":"List of variations for this render.","items":{"$ref":"#/components/schemas/Variation"}}},"required":["total_count"]},"eta":{"type":["number","null"],"description":"Estimated time remaining for the first variation to complete (epoch milliseconds timestamp)."}},"required":["id","created_at","variations","eta"]},"Variation":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for this variation."},"type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation (staging, removal, etc.)."},"render_id":{"type":"string","description":"ID of the parent render this variation belongs to."},"created_at":{"type":"number","description":"Creation timestamp (epoch milliseconds)."},"status":{"type":"string","enum":["queued","rendering","done","error","idle","deleted"],"description":"Current status of the variation."},"result":{"oneOf":[{"$ref":"#/components/schemas/ImageResult"},{"type":"array","items":{"$ref":"#/components/schemas/ImageResult"}}],"description":"Result images (only present when status is 'done')."},"base_variation_id":{"description":"ID of the removal variation used as base, if this staging variation used a removal variation as its base.","type":"string"},"eta":{"type":["number","null"],"description":"Estimated time remaining for the variation to complete (epoch milliseconds timestamp)."},"config":{"oneOf":[{"$ref":"#/components/schemas/LegacyStagingConfig"},{"$ref":"#/components/schemas/VariationStagingConfigRead"},{"$ref":"#/components/schemas/DayToDuskConfig"},{"$ref":"#/components/schemas/EnhancementConfig"}],"description":"Configuration used to generate this variation."}},"required":["id","render_id","created_at","status","eta"]},"ImageResult":{"type":"object","properties":{"url":{"type":"string","description":"Original image URL."},"optimized_url":{"type":["string","null"],"description":"Optimized (compressed) version URL."},"thumbnail_url":{"type":["string","null"],"description":"Thumbnail version URL."}},"required":["url"]},"LegacyStagingConfig":{"type":"object","properties":{"type":{"type":"string","enum":["legacy_staging"]},"room_type":{"$ref":"#/components/schemas/AnyRoomType"},"style":{"$ref":"#/components/schemas/FurnitureStyles"}},"required":["room_type","style","type"]},"AnyRoomType":{"oneOf":[{"$ref":"#/components/schemas/RoomType"},{"type":"string","enum":["bathroom"],"deprecated":true,"description":"Deprecated. Not accepted for new staging requests; may appear in historical variation data."}],"description":"Room type (active or deprecated). Use for reading variation/config output only."},"RoomType":{"type":"string","enum":["living","bed","kitchen","dining","home_office","outdoor","kids_room"],"description":"Room types accepted for new staging requests (bathroom excluded)."},"FurnitureStyles":{"oneOf":[{"type":"string","enum":["standard","modern","scandinavian","industrial","midcentury","luxury","farmhouse","coastal"],"description":"Available furniture styles for staging."},{"type":"string","enum":["american","southwestern","hamptons"],"deprecated":true,"description":"Deprecated styles. These will be mapped to the closest existing style and are available only for backwards compatibility."}]},"VariationStagingConfigRead":{"type":"object","properties":{"type":{"type":"string","enum":["staging"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"add_virtually_staged_watermark":{"type":["boolean","null"],"description":"Whether to add a 'virtually staged' watermark to the output image."},"add_furniture":{"type":"object","properties":{"style":{"$ref":"#/components/schemas/FurnitureStyles"},"room_type":{"$ref":"#/components/schemas/AnyRoomType"},"base_variation_id":{"description":"ID of an existing removal variation that is being used as the base for this staging variation. This should be used to create multiple staging variations from a single removal variation.","type":"string"}},"required":["style","room_type"],"description":"Configuration for adding furniture to the image."},"remove_furniture":{"type":"object","properties":{"mode":{"type":"string","enum":["on","off","auto"],"description":"Furniture removal mode to use."},"mask_url":{"$ref":"#/components/schemas/ImageUrl","description":"URL of the mask image indicating areas to remove furniture from."}},"required":["mode"],"description":"Configuration for removing furniture from the image."}},"required":["type"]},"OutputResolution":{"oneOf":[{"type":"integer","enum":[1536],"description":"Force output to 1536px resolution regardless of input size"},{"type":"string","enum":["default"],"description":"Smart resolution: For Staging renders, upscale to 1536px minimum, or 3072px if input is larger than 1536px. For Enhancements and Day to Dusk renders, return size as-is to a maximum of 3072px."}],"default":"default","description":"Output image resolution. Use 'default' for smart resolution handling or 1536 to force 1536px output. Defaults to 'default' when omitted."},"ImageUrl":{"type":"string","pattern":"^(https?:\\/\\/[^\\s]+|data:image\\/[a-zA-Z+]+;base64,[A-Za-z0-9+/=]+)$","description":"URL for an image, either HTTP/HTTPS URL or base64 encoded data URL."},"DayToDuskConfig":{"type":"object","properties":{"type":{"type":"string","enum":["daytodusk"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"sky_style":{"$ref":"#/components/schemas/SkyStyle"}},"required":["sky_style","type"]},"SkyStyle":{"type":"string","enum":["dusk","golden","blue"],"description":"Available sky styles for day-to-dusk transformations."},"EnhancementConfig":{"type":"object","properties":{"type":{"type":"string","enum":["enhancement"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"}},"required":["type"]}},"responses":{"AuthError":{"description":"Authentication error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"UnexpectedError":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}}}},"paths":{"/renders":{"get":{"summary":"Get all renders","description":"Returns all renders for the authenticated user","parameters":[{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Render ID to start after"},{"in":"query","name":"order","description":"The order in which to display renders. Based on their creation date.","schema":{"type":"string","enum":["asc","desc"],"default":"desc"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"total_count":{"type":"number","description":"The total number of completed variations for this render."},"next_cursor":{"type":["string","null"],"description":"The cursor to use to get the next page of renders."},"items":{"type":"array","items":{"$ref":"#/components/schemas/Render","description":"A list of renders."}}}}}}},"401":{"$ref":"#/components/responses/AuthError"},"500":{"$ref":"#/components/responses/UnexpectedError"}}}}}}
```

{% hint style="warning" %}
**Deprecated styles:** Please note that the `hamptons`, `american`, and `southwestern` styles have been deprecated, and now are mapped to other existing styles. The API will continue to support their use, but they may be removed in future versions
{% endhint %}

## Create a new render

> Create a new render with either a single configuration or multiple configurations.\
> \
> \*\*Single Config Format\*\*: Use this for creating a single render with one configuration.\
> \*\*Multi Config Format\*\*: Use this for creating a single render with multiple configurations. This can be used to generate variations with different room styles, furniture etc. without having to make a new request.\
> \
> \## Examples\
> \
> \### Single Config (Staging)\
> \`\`\`json\
> {\
> &#x20; "config": {\
> &#x20;   "type": "staging",\
> &#x20;   "add\_furniture": {\
> &#x20;     "room\_type": "living",\
> &#x20;     "style": "modern"\
> &#x20;   }\
> &#x20; },\
> &#x20; "image\_url": "<https://example.com/image.jpg",\\>
> &#x20; "variation\_count": 3,\
> &#x20; "wait\_for\_completion": false\
> }\
> \`\`\`\
> \
> \### Multi Config (Multiple Staging Variations)\
> \`\`\`json\
> {\
> &#x20; "configs": \[\
> &#x20;   {\
> &#x20;     "type": "staging",\
> &#x20;     "add\_furniture": {\
> &#x20;       "room\_type": "living",\
> &#x20;       "style": "modern"\
> &#x20;     },\
> &#x20;     "variation\_count": 2\
> &#x20;   },\
> &#x20;   {\
> &#x20;     "type": "staging",\
> &#x20;     "add\_furniture": {\
> &#x20;       "room\_type": "living",\
> &#x20;       "style": "scandinavian"\
> &#x20;     },\
> &#x20;     "variation\_count": 1\
> &#x20;   }\
> &#x20; ],\
> &#x20; "image\_url": "<https://example.com/image.jpg",\\>
> &#x20; "wait\_for\_completion": true\
> }\
> \`\`\`\
> \
> \### Single Config (Day to Dusk)\
> \`\`\`json\
> {\
> &#x20; "config": {\
> &#x20;   "type": "daytodusk",\
> &#x20;   "sky\_style": "golden"\
> &#x20; },\
> &#x20; "image\_url": "<https://example.com/image.jpg",\\>
> &#x20; "variation\_count": 1\
> }\
> \`\`\`<br>

````json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"servers":[{"url":"https://api.virtualstagingai.app/v2","description":"Production base URL."},{"url":"https://us-central1-furniture-ai.cloudfunctions.net/apiV2","description":"Long-running operations endpoint."}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"API key authentication. Use the format: Api-Key ${key}."}},"schemas":{"RenderStagingConfig":{"type":"object","properties":{"type":{"type":"string","enum":["staging"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"add_virtually_staged_watermark":{"type":["boolean","null"],"description":"Whether to add a 'virtually staged' watermark to the output image."},"add_furniture":{"type":"object","properties":{"style":{"$ref":"#/components/schemas/FurnitureStyles"},"room_type":{"$ref":"#/components/schemas/RoomType"}},"required":["style","room_type"],"description":"Configuration for adding furniture to the image."},"multi_view_staging":{"type":"object","properties":{"image_url":{"description":"Image URL to use for the second perspective.","$ref":"#/components/schemas/ImageUrl"}},"required":["image_url"],"description":"Configuration for multi-view staging using a second perspective image."},"remove_furniture":{"type":"object","properties":{"mode":{"type":"string","enum":["on","off","auto"],"description":"Furniture removal mode to use."},"mask_url":{"$ref":"#/components/schemas/ImageUrl","description":"URL of the mask image indicating areas to remove furniture from."}},"required":["mode"],"description":"Configuration for removing furniture from the image."}},"required":["type"]},"OutputResolution":{"oneOf":[{"type":"integer","enum":[1536],"description":"Force output to 1536px resolution regardless of input size"},{"type":"string","enum":["default"],"description":"Smart resolution: For Staging renders, upscale to 1536px minimum, or 3072px if input is larger than 1536px. For Enhancements and Day to Dusk renders, return size as-is to a maximum of 3072px."}],"default":"default","description":"Output image resolution. Use 'default' for smart resolution handling or 1536 to force 1536px output. Defaults to 'default' when omitted."},"FurnitureStyles":{"oneOf":[{"type":"string","enum":["standard","modern","scandinavian","industrial","midcentury","luxury","farmhouse","coastal"],"description":"Available furniture styles for staging."},{"type":"string","enum":["american","southwestern","hamptons"],"deprecated":true,"description":"Deprecated styles. These will be mapped to the closest existing style and are available only for backwards compatibility."}]},"RoomType":{"type":"string","enum":["living","bed","kitchen","dining","home_office","outdoor","kids_room"],"description":"Room types accepted for new staging requests (bathroom excluded)."},"ImageUrl":{"type":"string","pattern":"^(https?:\\/\\/[^\\s]+|data:image\\/[a-zA-Z+]+;base64,[A-Za-z0-9+/=]+)$","description":"URL for an image, either HTTP/HTTPS URL or base64 encoded data URL."},"DayToDuskConfig":{"type":"object","properties":{"type":{"type":"string","enum":["daytodusk"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"sky_style":{"$ref":"#/components/schemas/SkyStyle"}},"required":["sky_style","type"]},"SkyStyle":{"type":"string","enum":["dusk","golden","blue"],"description":"Available sky styles for day-to-dusk transformations."},"EnhancementConfig":{"type":"object","properties":{"type":{"type":"string","enum":["enhancement"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"}},"required":["type"]},"VariationStagingConfigWithVariationCount":{"allOf":[{"$ref":"#/components/schemas/VariationStagingConfig"},{"type":"object","properties":{"variation_count":{"type":"integer","minimum":1,"description":"Number of variations to create with this configuration."}},"required":["variation_count"]}]},"VariationStagingConfig":{"type":"object","properties":{"type":{"type":"string","enum":["staging"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"add_virtually_staged_watermark":{"type":["boolean","null"],"description":"Whether to add a 'virtually staged' watermark to the output image."},"add_furniture":{"type":"object","properties":{"style":{"$ref":"#/components/schemas/FurnitureStyles"},"room_type":{"$ref":"#/components/schemas/RoomType"},"base_variation_id":{"description":"ID of an existing removal variation that is being used as the base for this staging variation. This should be used to create multiple staging variations from a single removal variation.","type":"string"}},"required":["style","room_type"],"description":"Configuration for adding furniture to the image."},"remove_furniture":{"type":"object","properties":{"mode":{"type":"string","enum":["on","off","auto"],"description":"Furniture removal mode to use."},"mask_url":{"$ref":"#/components/schemas/ImageUrl","description":"URL of the mask image indicating areas to remove furniture from."}},"required":["mode"],"description":"Configuration for removing furniture from the image."}},"required":["type"]},"DayToDuskConfigWithVariationCount":{"allOf":[{"$ref":"#/components/schemas/DayToDuskConfig"},{"type":"object","properties":{"variation_count":{"type":"integer","minimum":1,"description":"Number of variations to create with this configuration."}},"required":["variation_count"]}]},"EnhancementConfigWithVariationCount":{"allOf":[{"$ref":"#/components/schemas/EnhancementConfig"},{"type":"object","properties":{"variation_count":{"type":"integer","minimum":1,"description":"Number of variations to create with this configuration."}},"required":["variation_count"]}]},"DoneWebhookResponse":{"type":"object","properties":{"render_id":{"type":"string","description":"ID of the render that this variation belongs to."},"variation_id":{"type":"string","description":"ID of the variation that completed."},"variation_type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation that completed."},"base_variation_id":{"type":["string","null"],"description":"ID of the removal variation used as base, if this staging variation used a removal variation as its base."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["done"],"description":"Event type indicating successful completion."},"result":{"oneOf":[{"$ref":"#/components/schemas/ImageResult"},{"type":"array","items":{"$ref":"#/components/schemas/ImageResult"}}],"description":"Generated result images."}},"required":["event_type","result","render_id","variation_id","variation_type","timestamp","base_variation_id"]},"ImageResult":{"type":"object","properties":{"url":{"type":"string","description":"Original image URL."},"optimized_url":{"type":["string","null"],"description":"Optimized (compressed) version URL."},"thumbnail_url":{"type":["string","null"],"description":"Thumbnail version URL."}},"required":["url"]},"ErrorWebhookResponse":{"type":"object","properties":{"render_id":{"type":"string","description":"ID of the render that this variation belongs to."},"variation_id":{"type":"string","description":"ID of the variation that failed."},"variation_type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation that failed."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["error"],"description":"Event type indicating an error occurred."},"error_message":{"type":"string","description":"Detailed error message explaining the failure."}},"required":["event_type","error_message","render_id","variation_id","variation_type","timestamp"]},"UpdateWebhookResponse":{"type":"object","properties":{"render_id":{"type":"string","description":"ID of the render that this variation belongs to."},"variation_id":{"type":"string","description":"ID of the variation that was updated."},"variation_type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation that was updated."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["update"],"description":"Event type indicating a status update."},"variation_status":{"type":"string","enum":["queued","rendering","done","error","idle","deleted"],"description":"Current status of the variation."},"eta":{"type":"number","description":"Estimated time remaining for the variation to complete (epoch milliseconds timestamp)."}},"required":["event_type","variation_status","eta","render_id","variation_id","variation_type","timestamp"]},"Render":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for this render."},"created_at":{"type":"number","description":"Creation timestamp (epoch milliseconds)."},"queued_at":{"type":["number","null"],"description":"Timestamp when the render was queued for processing (epoch milliseconds)."},"variations":{"type":"object","properties":{"total_count":{"type":"number","description":"Total number of completed variations for this render."},"next_cursor":{"type":["string","null"],"description":"Cursor to use to get the next page of variations."},"items":{"type":"array","description":"List of variations for this render.","items":{"$ref":"#/components/schemas/Variation"}}},"required":["total_count"]},"eta":{"type":["number","null"],"description":"Estimated time remaining for the first variation to complete (epoch milliseconds timestamp)."}},"required":["id","created_at","variations","eta"]},"Variation":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for this variation."},"type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation (staging, removal, etc.)."},"render_id":{"type":"string","description":"ID of the parent render this variation belongs to."},"created_at":{"type":"number","description":"Creation timestamp (epoch milliseconds)."},"status":{"type":"string","enum":["queued","rendering","done","error","idle","deleted"],"description":"Current status of the variation."},"result":{"oneOf":[{"$ref":"#/components/schemas/ImageResult"},{"type":"array","items":{"$ref":"#/components/schemas/ImageResult"}}],"description":"Result images (only present when status is 'done')."},"base_variation_id":{"description":"ID of the removal variation used as base, if this staging variation used a removal variation as its base.","type":"string"},"eta":{"type":["number","null"],"description":"Estimated time remaining for the variation to complete (epoch milliseconds timestamp)."},"config":{"oneOf":[{"$ref":"#/components/schemas/LegacyStagingConfig"},{"$ref":"#/components/schemas/VariationStagingConfigRead"},{"$ref":"#/components/schemas/DayToDuskConfig"},{"$ref":"#/components/schemas/EnhancementConfig"}],"description":"Configuration used to generate this variation."}},"required":["id","render_id","created_at","status","eta"]},"LegacyStagingConfig":{"type":"object","properties":{"type":{"type":"string","enum":["legacy_staging"]},"room_type":{"$ref":"#/components/schemas/AnyRoomType"},"style":{"$ref":"#/components/schemas/FurnitureStyles"}},"required":["room_type","style","type"]},"AnyRoomType":{"oneOf":[{"$ref":"#/components/schemas/RoomType"},{"type":"string","enum":["bathroom"],"deprecated":true,"description":"Deprecated. Not accepted for new staging requests; may appear in historical variation data."}],"description":"Room type (active or deprecated). Use for reading variation/config output only."},"VariationStagingConfigRead":{"type":"object","properties":{"type":{"type":"string","enum":["staging"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"add_virtually_staged_watermark":{"type":["boolean","null"],"description":"Whether to add a 'virtually staged' watermark to the output image."},"add_furniture":{"type":"object","properties":{"style":{"$ref":"#/components/schemas/FurnitureStyles"},"room_type":{"$ref":"#/components/schemas/AnyRoomType"},"base_variation_id":{"description":"ID of an existing removal variation that is being used as the base for this staging variation. This should be used to create multiple staging variations from a single removal variation.","type":"string"}},"required":["style","room_type"],"description":"Configuration for adding furniture to the image."},"remove_furniture":{"type":"object","properties":{"mode":{"type":"string","enum":["on","off","auto"],"description":"Furniture removal mode to use."},"mask_url":{"$ref":"#/components/schemas/ImageUrl","description":"URL of the mask image indicating areas to remove furniture from."}},"required":["mode"],"description":"Configuration for removing furniture from the image."}},"required":["type"]}},"responses":{"ValidationError":{"description":"Validation error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"errors":{"type":"array","items":{"type":"string"}}},"required":["message"]}}}},"AuthError":{"description":"Authentication error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"ForbiddenError":{"description":"Forbidden error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"UnexpectedError":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}}}},"paths":{"/renders":{"post":{"summary":"Create a new render","description":"Create a new render with either a single configuration or multiple configurations.\n\n**Single Config Format**: Use this for creating a single render with one configuration.\n**Multi Config Format**: Use this for creating a single render with multiple configurations. This can be used to generate variations with different room styles, furniture etc. without having to make a new request.\n\n## Examples\n\n### Single Config (Staging)\n```json\n{\n  \"config\": {\n    \"type\": \"staging\",\n    \"add_furniture\": {\n      \"room_type\": \"living\",\n      \"style\": \"modern\"\n    }\n  },\n  \"image_url\": \"https://example.com/image.jpg\",\n  \"variation_count\": 3,\n  \"wait_for_completion\": false\n}\n```\n\n### Multi Config (Multiple Staging Variations)\n```json\n{\n  \"configs\": [\n    {\n      \"type\": \"staging\",\n      \"add_furniture\": {\n        \"room_type\": \"living\",\n        \"style\": \"modern\"\n      },\n      \"variation_count\": 2\n    },\n    {\n      \"type\": \"staging\",\n      \"add_furniture\": {\n        \"room_type\": \"living\",\n        \"style\": \"scandinavian\"\n      },\n      \"variation_count\": 1\n    }\n  ],\n  \"image_url\": \"https://example.com/image.jpg\",\n  \"wait_for_completion\": true\n}\n```\n\n### Single Config (Day to Dusk)\n```json\n{\n  \"config\": {\n    \"type\": \"daytodusk\",\n    \"sky_style\": \"golden\"\n  },\n  \"image_url\": \"https://example.com/image.jpg\",\n  \"variation_count\": 1\n}\n```\n","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["config","image_url","variation_count"],"additionalProperties":false,"properties":{"config":{"oneOf":[{"$ref":"#/components/schemas/RenderStagingConfig"},{"$ref":"#/components/schemas/DayToDuskConfig"},{"$ref":"#/components/schemas/EnhancementConfig"}]},"image_url":{"$ref":"#/components/schemas/ImageUrl"},"variation_count":{"type":"integer","minimum":1,"description":"Number of variations to create with this configuration"},"webhook_url":{"type":["string","null"],"format":"uri"},"wait_for_completion":{"type":["boolean","null"],"default":false}}},{"type":"object","required":["configs","image_url"],"additionalProperties":false,"properties":{"configs":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/VariationStagingConfigWithVariationCount"},"minItems":1,"description":"Array of staging configurations, each with its own variation count"},{"type":"array","items":{"$ref":"#/components/schemas/DayToDuskConfigWithVariationCount"},"minItems":1,"description":"Array of day-to-dusk configurations, each with its own variation count"},{"type":"array","items":{"$ref":"#/components/schemas/EnhancementConfigWithVariationCount"},"minItems":1,"description":"Array of enhancement configurations, each with its own variation count"}]},"image_url":{"$ref":"#/components/schemas/ImageUrl"},"webhook_url":{"type":["string","null"],"format":"uri"},"wait_for_completion":{"type":["boolean","null"],"default":false}}}]}}}},"callbacks":{"renderWebhook":{"{$request.body.webhook_url}":{"post":{"description":"Webhook response sent upon the completion of each variation that is part of the render","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/DoneWebhookResponse"},{"$ref":"#/components/schemas/ErrorWebhookResponse"},{"$ref":"#/components/schemas/UpdateWebhookResponse"}]}}}},"responses":{"200":{"description":"Webhook received successfully"}}}}}},"responses":{"200":{"description":"Render created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Render"}}}},"201":{"description":"Render created and queued for processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Render"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/AuthError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"500":{"$ref":"#/components/responses/UnexpectedError"}}}}}}
````

## Get render details

> Returns details about a render including the status, variations, and result URL

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"servers":[{"url":"https://api.virtualstagingai.app/v2","description":"Production base URL."},{"url":"https://us-central1-furniture-ai.cloudfunctions.net/apiV2","description":"Long-running operations endpoint."}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"API key authentication. Use the format: Api-Key ${key}."}},"schemas":{"Render":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for this render."},"created_at":{"type":"number","description":"Creation timestamp (epoch milliseconds)."},"queued_at":{"type":["number","null"],"description":"Timestamp when the render was queued for processing (epoch milliseconds)."},"variations":{"type":"object","properties":{"total_count":{"type":"number","description":"Total number of completed variations for this render."},"next_cursor":{"type":["string","null"],"description":"Cursor to use to get the next page of variations."},"items":{"type":"array","description":"List of variations for this render.","items":{"$ref":"#/components/schemas/Variation"}}},"required":["total_count"]},"eta":{"type":["number","null"],"description":"Estimated time remaining for the first variation to complete (epoch milliseconds timestamp)."}},"required":["id","created_at","variations","eta"]},"Variation":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for this variation."},"type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation (staging, removal, etc.)."},"render_id":{"type":"string","description":"ID of the parent render this variation belongs to."},"created_at":{"type":"number","description":"Creation timestamp (epoch milliseconds)."},"status":{"type":"string","enum":["queued","rendering","done","error","idle","deleted"],"description":"Current status of the variation."},"result":{"oneOf":[{"$ref":"#/components/schemas/ImageResult"},{"type":"array","items":{"$ref":"#/components/schemas/ImageResult"}}],"description":"Result images (only present when status is 'done')."},"base_variation_id":{"description":"ID of the removal variation used as base, if this staging variation used a removal variation as its base.","type":"string"},"eta":{"type":["number","null"],"description":"Estimated time remaining for the variation to complete (epoch milliseconds timestamp)."},"config":{"oneOf":[{"$ref":"#/components/schemas/LegacyStagingConfig"},{"$ref":"#/components/schemas/VariationStagingConfigRead"},{"$ref":"#/components/schemas/DayToDuskConfig"},{"$ref":"#/components/schemas/EnhancementConfig"}],"description":"Configuration used to generate this variation."}},"required":["id","render_id","created_at","status","eta"]},"ImageResult":{"type":"object","properties":{"url":{"type":"string","description":"Original image URL."},"optimized_url":{"type":["string","null"],"description":"Optimized (compressed) version URL."},"thumbnail_url":{"type":["string","null"],"description":"Thumbnail version URL."}},"required":["url"]},"LegacyStagingConfig":{"type":"object","properties":{"type":{"type":"string","enum":["legacy_staging"]},"room_type":{"$ref":"#/components/schemas/AnyRoomType"},"style":{"$ref":"#/components/schemas/FurnitureStyles"}},"required":["room_type","style","type"]},"AnyRoomType":{"oneOf":[{"$ref":"#/components/schemas/RoomType"},{"type":"string","enum":["bathroom"],"deprecated":true,"description":"Deprecated. Not accepted for new staging requests; may appear in historical variation data."}],"description":"Room type (active or deprecated). Use for reading variation/config output only."},"RoomType":{"type":"string","enum":["living","bed","kitchen","dining","home_office","outdoor","kids_room"],"description":"Room types accepted for new staging requests (bathroom excluded)."},"FurnitureStyles":{"oneOf":[{"type":"string","enum":["standard","modern","scandinavian","industrial","midcentury","luxury","farmhouse","coastal"],"description":"Available furniture styles for staging."},{"type":"string","enum":["american","southwestern","hamptons"],"deprecated":true,"description":"Deprecated styles. These will be mapped to the closest existing style and are available only for backwards compatibility."}]},"VariationStagingConfigRead":{"type":"object","properties":{"type":{"type":"string","enum":["staging"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"add_virtually_staged_watermark":{"type":["boolean","null"],"description":"Whether to add a 'virtually staged' watermark to the output image."},"add_furniture":{"type":"object","properties":{"style":{"$ref":"#/components/schemas/FurnitureStyles"},"room_type":{"$ref":"#/components/schemas/AnyRoomType"},"base_variation_id":{"description":"ID of an existing removal variation that is being used as the base for this staging variation. This should be used to create multiple staging variations from a single removal variation.","type":"string"}},"required":["style","room_type"],"description":"Configuration for adding furniture to the image."},"remove_furniture":{"type":"object","properties":{"mode":{"type":"string","enum":["on","off","auto"],"description":"Furniture removal mode to use."},"mask_url":{"$ref":"#/components/schemas/ImageUrl","description":"URL of the mask image indicating areas to remove furniture from."}},"required":["mode"],"description":"Configuration for removing furniture from the image."}},"required":["type"]},"OutputResolution":{"oneOf":[{"type":"integer","enum":[1536],"description":"Force output to 1536px resolution regardless of input size"},{"type":"string","enum":["default"],"description":"Smart resolution: For Staging renders, upscale to 1536px minimum, or 3072px if input is larger than 1536px. For Enhancements and Day to Dusk renders, return size as-is to a maximum of 3072px."}],"default":"default","description":"Output image resolution. Use 'default' for smart resolution handling or 1536 to force 1536px output. Defaults to 'default' when omitted."},"ImageUrl":{"type":"string","pattern":"^(https?:\\/\\/[^\\s]+|data:image\\/[a-zA-Z+]+;base64,[A-Za-z0-9+/=]+)$","description":"URL for an image, either HTTP/HTTPS URL or base64 encoded data URL."},"DayToDuskConfig":{"type":"object","properties":{"type":{"type":"string","enum":["daytodusk"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"sky_style":{"$ref":"#/components/schemas/SkyStyle"}},"required":["sky_style","type"]},"SkyStyle":{"type":"string","enum":["dusk","golden","blue"],"description":"Available sky styles for day-to-dusk transformations."},"EnhancementConfig":{"type":"object","properties":{"type":{"type":"string","enum":["enhancement"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"}},"required":["type"]}},"responses":{"AuthError":{"description":"Authentication error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"ValidationError":{"description":"Validation error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"errors":{"type":"array","items":{"type":"string"}}},"required":["message"]}}}},"UnexpectedError":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}}}},"paths":{"/renders/{render_id}":{"get":{"summary":"Get render details","description":"Returns details about a render including the status, variations, and result URL","parameters":[{"in":"path","name":"render_id","required":true,"schema":{"type":"string"},"description":"The ID of the render to get details for"},{"in":"query","name":"include_variations","schema":{"type":"boolean","default":false}},{"in":"query","name":"variations_limit","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"in":"query","name":"variations_cursor","schema":{"type":"string"},"description":"Variation ID to start after"},{"in":"query","name":"variations_order","description":"The order in which to display variations. Based on their creation date.","schema":{"type":"string","enum":["asc","desc"],"default":"asc"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Render"}}}},"401":{"$ref":"#/components/responses/AuthError"},"404":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/UnexpectedError"}}}}}}
```

## Get variation details

> Returns details about a variation including the status and result URL

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"servers":[{"url":"https://api.virtualstagingai.app/v2","description":"Production base URL."},{"url":"https://us-central1-furniture-ai.cloudfunctions.net/apiV2","description":"Long-running operations endpoint."}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"API key authentication. Use the format: Api-Key ${key}."}},"schemas":{"Variation":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for this variation."},"type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation (staging, removal, etc.)."},"render_id":{"type":"string","description":"ID of the parent render this variation belongs to."},"created_at":{"type":"number","description":"Creation timestamp (epoch milliseconds)."},"status":{"type":"string","enum":["queued","rendering","done","error","idle","deleted"],"description":"Current status of the variation."},"result":{"oneOf":[{"$ref":"#/components/schemas/ImageResult"},{"type":"array","items":{"$ref":"#/components/schemas/ImageResult"}}],"description":"Result images (only present when status is 'done')."},"base_variation_id":{"description":"ID of the removal variation used as base, if this staging variation used a removal variation as its base.","type":"string"},"eta":{"type":["number","null"],"description":"Estimated time remaining for the variation to complete (epoch milliseconds timestamp)."},"config":{"oneOf":[{"$ref":"#/components/schemas/LegacyStagingConfig"},{"$ref":"#/components/schemas/VariationStagingConfigRead"},{"$ref":"#/components/schemas/DayToDuskConfig"},{"$ref":"#/components/schemas/EnhancementConfig"}],"description":"Configuration used to generate this variation."}},"required":["id","render_id","created_at","status","eta"]},"ImageResult":{"type":"object","properties":{"url":{"type":"string","description":"Original image URL."},"optimized_url":{"type":["string","null"],"description":"Optimized (compressed) version URL."},"thumbnail_url":{"type":["string","null"],"description":"Thumbnail version URL."}},"required":["url"]},"LegacyStagingConfig":{"type":"object","properties":{"type":{"type":"string","enum":["legacy_staging"]},"room_type":{"$ref":"#/components/schemas/AnyRoomType"},"style":{"$ref":"#/components/schemas/FurnitureStyles"}},"required":["room_type","style","type"]},"AnyRoomType":{"oneOf":[{"$ref":"#/components/schemas/RoomType"},{"type":"string","enum":["bathroom"],"deprecated":true,"description":"Deprecated. Not accepted for new staging requests; may appear in historical variation data."}],"description":"Room type (active or deprecated). Use for reading variation/config output only."},"RoomType":{"type":"string","enum":["living","bed","kitchen","dining","home_office","outdoor","kids_room"],"description":"Room types accepted for new staging requests (bathroom excluded)."},"FurnitureStyles":{"oneOf":[{"type":"string","enum":["standard","modern","scandinavian","industrial","midcentury","luxury","farmhouse","coastal"],"description":"Available furniture styles for staging."},{"type":"string","enum":["american","southwestern","hamptons"],"deprecated":true,"description":"Deprecated styles. These will be mapped to the closest existing style and are available only for backwards compatibility."}]},"VariationStagingConfigRead":{"type":"object","properties":{"type":{"type":"string","enum":["staging"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"add_virtually_staged_watermark":{"type":["boolean","null"],"description":"Whether to add a 'virtually staged' watermark to the output image."},"add_furniture":{"type":"object","properties":{"style":{"$ref":"#/components/schemas/FurnitureStyles"},"room_type":{"$ref":"#/components/schemas/AnyRoomType"},"base_variation_id":{"description":"ID of an existing removal variation that is being used as the base for this staging variation. This should be used to create multiple staging variations from a single removal variation.","type":"string"}},"required":["style","room_type"],"description":"Configuration for adding furniture to the image."},"remove_furniture":{"type":"object","properties":{"mode":{"type":"string","enum":["on","off","auto"],"description":"Furniture removal mode to use."},"mask_url":{"$ref":"#/components/schemas/ImageUrl","description":"URL of the mask image indicating areas to remove furniture from."}},"required":["mode"],"description":"Configuration for removing furniture from the image."}},"required":["type"]},"OutputResolution":{"oneOf":[{"type":"integer","enum":[1536],"description":"Force output to 1536px resolution regardless of input size"},{"type":"string","enum":["default"],"description":"Smart resolution: For Staging renders, upscale to 1536px minimum, or 3072px if input is larger than 1536px. For Enhancements and Day to Dusk renders, return size as-is to a maximum of 3072px."}],"default":"default","description":"Output image resolution. Use 'default' for smart resolution handling or 1536 to force 1536px output. Defaults to 'default' when omitted."},"ImageUrl":{"type":"string","pattern":"^(https?:\\/\\/[^\\s]+|data:image\\/[a-zA-Z+]+;base64,[A-Za-z0-9+/=]+)$","description":"URL for an image, either HTTP/HTTPS URL or base64 encoded data URL."},"DayToDuskConfig":{"type":"object","properties":{"type":{"type":"string","enum":["daytodusk"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"sky_style":{"$ref":"#/components/schemas/SkyStyle"}},"required":["sky_style","type"]},"SkyStyle":{"type":"string","enum":["dusk","golden","blue"],"description":"Available sky styles for day-to-dusk transformations."},"EnhancementConfig":{"type":"object","properties":{"type":{"type":"string","enum":["enhancement"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"}},"required":["type"]}},"responses":{"AuthError":{"description":"Authentication error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"ValidationError":{"description":"Validation error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"errors":{"type":"array","items":{"type":"string"}}},"required":["message"]}}}},"UnexpectedError":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}}}},"paths":{"/renders/{render_id}/variations/{variation_id}":{"get":{"summary":"Get variation details","description":"Returns details about a variation including the status and result URL","parameters":[{"in":"path","name":"render_id","required":true,"schema":{"type":"string"},"description":"The ID of the base render"},{"in":"path","name":"variation_id","required":true,"schema":{"type":"string"},"description":"The ID of the variation to get details for"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Variation"}}}},"401":{"$ref":"#/components/responses/AuthError"},"404":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/UnexpectedError"}}}}}}
```

## Create new variations

> Create one or more variations for an existing render. Status updates will be sent to the webhook\_url specified in the render if one was provided.

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"servers":[{"url":"https://api.virtualstagingai.app/v2","description":"Production base URL."},{"url":"https://us-central1-furniture-ai.cloudfunctions.net/apiV2","description":"Long-running operations endpoint."}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"API key authentication. Use the format: Api-Key ${key}."}},"schemas":{"VariationStagingConfig":{"type":"object","properties":{"type":{"type":"string","enum":["staging"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"add_virtually_staged_watermark":{"type":["boolean","null"],"description":"Whether to add a 'virtually staged' watermark to the output image."},"add_furniture":{"type":"object","properties":{"style":{"$ref":"#/components/schemas/FurnitureStyles"},"room_type":{"$ref":"#/components/schemas/RoomType"},"base_variation_id":{"description":"ID of an existing removal variation that is being used as the base for this staging variation. This should be used to create multiple staging variations from a single removal variation.","type":"string"}},"required":["style","room_type"],"description":"Configuration for adding furniture to the image."},"remove_furniture":{"type":"object","properties":{"mode":{"type":"string","enum":["on","off","auto"],"description":"Furniture removal mode to use."},"mask_url":{"$ref":"#/components/schemas/ImageUrl","description":"URL of the mask image indicating areas to remove furniture from."}},"required":["mode"],"description":"Configuration for removing furniture from the image."}},"required":["type"]},"OutputResolution":{"oneOf":[{"type":"integer","enum":[1536],"description":"Force output to 1536px resolution regardless of input size"},{"type":"string","enum":["default"],"description":"Smart resolution: For Staging renders, upscale to 1536px minimum, or 3072px if input is larger than 1536px. For Enhancements and Day to Dusk renders, return size as-is to a maximum of 3072px."}],"default":"default","description":"Output image resolution. Use 'default' for smart resolution handling or 1536 to force 1536px output. Defaults to 'default' when omitted."},"FurnitureStyles":{"oneOf":[{"type":"string","enum":["standard","modern","scandinavian","industrial","midcentury","luxury","farmhouse","coastal"],"description":"Available furniture styles for staging."},{"type":"string","enum":["american","southwestern","hamptons"],"deprecated":true,"description":"Deprecated styles. These will be mapped to the closest existing style and are available only for backwards compatibility."}]},"RoomType":{"type":"string","enum":["living","bed","kitchen","dining","home_office","outdoor","kids_room"],"description":"Room types accepted for new staging requests (bathroom excluded)."},"ImageUrl":{"type":"string","pattern":"^(https?:\\/\\/[^\\s]+|data:image\\/[a-zA-Z+]+;base64,[A-Za-z0-9+/=]+)$","description":"URL for an image, either HTTP/HTTPS URL or base64 encoded data URL."},"DayToDuskConfig":{"type":"object","properties":{"type":{"type":"string","enum":["daytodusk"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"sky_style":{"$ref":"#/components/schemas/SkyStyle"}},"required":["sky_style","type"]},"SkyStyle":{"type":"string","enum":["dusk","golden","blue"],"description":"Available sky styles for day-to-dusk transformations."},"EnhancementConfig":{"type":"object","properties":{"type":{"type":"string","enum":["enhancement"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"}},"required":["type"]},"DoneWebhookResponse":{"type":"object","properties":{"render_id":{"type":"string","description":"ID of the render that this variation belongs to."},"variation_id":{"type":"string","description":"ID of the variation that completed."},"variation_type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation that completed."},"base_variation_id":{"type":["string","null"],"description":"ID of the removal variation used as base, if this staging variation used a removal variation as its base."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["done"],"description":"Event type indicating successful completion."},"result":{"oneOf":[{"$ref":"#/components/schemas/ImageResult"},{"type":"array","items":{"$ref":"#/components/schemas/ImageResult"}}],"description":"Generated result images."}},"required":["event_type","result","render_id","variation_id","variation_type","timestamp","base_variation_id"]},"ImageResult":{"type":"object","properties":{"url":{"type":"string","description":"Original image URL."},"optimized_url":{"type":["string","null"],"description":"Optimized (compressed) version URL."},"thumbnail_url":{"type":["string","null"],"description":"Thumbnail version URL."}},"required":["url"]},"ErrorWebhookResponse":{"type":"object","properties":{"render_id":{"type":"string","description":"ID of the render that this variation belongs to."},"variation_id":{"type":"string","description":"ID of the variation that failed."},"variation_type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation that failed."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["error"],"description":"Event type indicating an error occurred."},"error_message":{"type":"string","description":"Detailed error message explaining the failure."}},"required":["event_type","error_message","render_id","variation_id","variation_type","timestamp"]},"UpdateWebhookResponse":{"type":"object","properties":{"render_id":{"type":"string","description":"ID of the render that this variation belongs to."},"variation_id":{"type":"string","description":"ID of the variation that was updated."},"variation_type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation that was updated."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["update"],"description":"Event type indicating a status update."},"variation_status":{"type":"string","enum":["queued","rendering","done","error","idle","deleted"],"description":"Current status of the variation."},"eta":{"type":"number","description":"Estimated time remaining for the variation to complete (epoch milliseconds timestamp)."}},"required":["event_type","variation_status","eta","render_id","variation_id","variation_type","timestamp"]},"Variation":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for this variation."},"type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation (staging, removal, etc.)."},"render_id":{"type":"string","description":"ID of the parent render this variation belongs to."},"created_at":{"type":"number","description":"Creation timestamp (epoch milliseconds)."},"status":{"type":"string","enum":["queued","rendering","done","error","idle","deleted"],"description":"Current status of the variation."},"result":{"oneOf":[{"$ref":"#/components/schemas/ImageResult"},{"type":"array","items":{"$ref":"#/components/schemas/ImageResult"}}],"description":"Result images (only present when status is 'done')."},"base_variation_id":{"description":"ID of the removal variation used as base, if this staging variation used a removal variation as its base.","type":"string"},"eta":{"type":["number","null"],"description":"Estimated time remaining for the variation to complete (epoch milliseconds timestamp)."},"config":{"oneOf":[{"$ref":"#/components/schemas/LegacyStagingConfig"},{"$ref":"#/components/schemas/VariationStagingConfigRead"},{"$ref":"#/components/schemas/DayToDuskConfig"},{"$ref":"#/components/schemas/EnhancementConfig"}],"description":"Configuration used to generate this variation."}},"required":["id","render_id","created_at","status","eta"]},"LegacyStagingConfig":{"type":"object","properties":{"type":{"type":"string","enum":["legacy_staging"]},"room_type":{"$ref":"#/components/schemas/AnyRoomType"},"style":{"$ref":"#/components/schemas/FurnitureStyles"}},"required":["room_type","style","type"]},"AnyRoomType":{"oneOf":[{"$ref":"#/components/schemas/RoomType"},{"type":"string","enum":["bathroom"],"deprecated":true,"description":"Deprecated. Not accepted for new staging requests; may appear in historical variation data."}],"description":"Room type (active or deprecated). Use for reading variation/config output only."},"VariationStagingConfigRead":{"type":"object","properties":{"type":{"type":"string","enum":["staging"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"add_virtually_staged_watermark":{"type":["boolean","null"],"description":"Whether to add a 'virtually staged' watermark to the output image."},"add_furniture":{"type":"object","properties":{"style":{"$ref":"#/components/schemas/FurnitureStyles"},"room_type":{"$ref":"#/components/schemas/AnyRoomType"},"base_variation_id":{"description":"ID of an existing removal variation that is being used as the base for this staging variation. This should be used to create multiple staging variations from a single removal variation.","type":"string"}},"required":["style","room_type"],"description":"Configuration for adding furniture to the image."},"remove_furniture":{"type":"object","properties":{"mode":{"type":"string","enum":["on","off","auto"],"description":"Furniture removal mode to use."},"mask_url":{"$ref":"#/components/schemas/ImageUrl","description":"URL of the mask image indicating areas to remove furniture from."}},"required":["mode"],"description":"Configuration for removing furniture from the image."}},"required":["type"]}},"responses":{"ValidationError":{"description":"Validation error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"errors":{"type":"array","items":{"type":"string"}}},"required":["message"]}}}},"AuthError":{"description":"Authentication error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"ForbiddenError":{"description":"Forbidden error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"UnexpectedError":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}}}},"paths":{"/renders/{render_id}/variations":{"post":{"summary":"Create new variations","description":"Create one or more variations for an existing render. Status updates will be sent to the webhook_url specified in the render if one was provided.","parameters":[{"in":"path","name":"render_id","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["config","variation_count"],"additionalProperties":false,"properties":{"config":{"oneOf":[{"$ref":"#/components/schemas/VariationStagingConfig"},{"$ref":"#/components/schemas/DayToDuskConfig"},{"$ref":"#/components/schemas/EnhancementConfig"}]},"variation_count":{"type":"integer","minimum":1},"wait_for_completion":{"type":["boolean","null"],"default":false}}}}}},"callbacks":{"variationWebhook":{"{$parent_render.webhook_url}":{"post":{"requestBody":{"description":"Webhook response sent upon the completion of each variation. The response is sent to the webhook_url specified in the parent render.","required":true,"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/DoneWebhookResponse"},{"$ref":"#/components/schemas/ErrorWebhookResponse"},{"$ref":"#/components/schemas/UpdateWebhookResponse"}]}}}},"responses":{"200":{"description":"Webhook received successfully"}}}}}},"responses":{"200":{"description":"Variations created and completed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"variations":{"type":"array","items":{"$ref":"#/components/schemas/Variation"}}}}}}},"201":{"description":"Variations created and processing started","content":{"application/json":{"schema":{"type":"object","properties":{"variations":{"type":"array","items":{"$ref":"#/components/schemas/Variation"}}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/AuthError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/UnexpectedError"}}}}}}
```

## Create multiple renders in bulk

> Creates multiple renders with the specified parameters.

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"servers":[{"url":"https://api.virtualstagingai.app/v2","description":"Production base URL."},{"url":"https://us-central1-furniture-ai.cloudfunctions.net/apiV2","description":"Long-running operations endpoint."}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"API key authentication. Use the format: Api-Key ${key}."}},"schemas":{"RenderStagingConfig":{"type":"object","properties":{"type":{"type":"string","enum":["staging"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"add_virtually_staged_watermark":{"type":["boolean","null"],"description":"Whether to add a 'virtually staged' watermark to the output image."},"add_furniture":{"type":"object","properties":{"style":{"$ref":"#/components/schemas/FurnitureStyles"},"room_type":{"$ref":"#/components/schemas/RoomType"}},"required":["style","room_type"],"description":"Configuration for adding furniture to the image."},"multi_view_staging":{"type":"object","properties":{"image_url":{"description":"Image URL to use for the second perspective.","$ref":"#/components/schemas/ImageUrl"}},"required":["image_url"],"description":"Configuration for multi-view staging using a second perspective image."},"remove_furniture":{"type":"object","properties":{"mode":{"type":"string","enum":["on","off","auto"],"description":"Furniture removal mode to use."},"mask_url":{"$ref":"#/components/schemas/ImageUrl","description":"URL of the mask image indicating areas to remove furniture from."}},"required":["mode"],"description":"Configuration for removing furniture from the image."}},"required":["type"]},"OutputResolution":{"oneOf":[{"type":"integer","enum":[1536],"description":"Force output to 1536px resolution regardless of input size"},{"type":"string","enum":["default"],"description":"Smart resolution: For Staging renders, upscale to 1536px minimum, or 3072px if input is larger than 1536px. For Enhancements and Day to Dusk renders, return size as-is to a maximum of 3072px."}],"default":"default","description":"Output image resolution. Use 'default' for smart resolution handling or 1536 to force 1536px output. Defaults to 'default' when omitted."},"FurnitureStyles":{"oneOf":[{"type":"string","enum":["standard","modern","scandinavian","industrial","midcentury","luxury","farmhouse","coastal"],"description":"Available furniture styles for staging."},{"type":"string","enum":["american","southwestern","hamptons"],"deprecated":true,"description":"Deprecated styles. These will be mapped to the closest existing style and are available only for backwards compatibility."}]},"RoomType":{"type":"string","enum":["living","bed","kitchen","dining","home_office","outdoor","kids_room"],"description":"Room types accepted for new staging requests (bathroom excluded)."},"ImageUrl":{"type":"string","pattern":"^(https?:\\/\\/[^\\s]+|data:image\\/[a-zA-Z+]+;base64,[A-Za-z0-9+/=]+)$","description":"URL for an image, either HTTP/HTTPS URL or base64 encoded data URL."},"DayToDuskConfig":{"type":"object","properties":{"type":{"type":"string","enum":["daytodusk"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"sky_style":{"$ref":"#/components/schemas/SkyStyle"}},"required":["sky_style","type"]},"SkyStyle":{"type":"string","enum":["dusk","golden","blue"],"description":"Available sky styles for day-to-dusk transformations."},"EnhancementConfig":{"type":"object","properties":{"type":{"type":"string","enum":["enhancement"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"}},"required":["type"]},"DoneWebhookResponse":{"type":"object","properties":{"render_id":{"type":"string","description":"ID of the render that this variation belongs to."},"variation_id":{"type":"string","description":"ID of the variation that completed."},"variation_type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation that completed."},"base_variation_id":{"type":["string","null"],"description":"ID of the removal variation used as base, if this staging variation used a removal variation as its base."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["done"],"description":"Event type indicating successful completion."},"result":{"oneOf":[{"$ref":"#/components/schemas/ImageResult"},{"type":"array","items":{"$ref":"#/components/schemas/ImageResult"}}],"description":"Generated result images."}},"required":["event_type","result","render_id","variation_id","variation_type","timestamp","base_variation_id"]},"ImageResult":{"type":"object","properties":{"url":{"type":"string","description":"Original image URL."},"optimized_url":{"type":["string","null"],"description":"Optimized (compressed) version URL."},"thumbnail_url":{"type":["string","null"],"description":"Thumbnail version URL."}},"required":["url"]},"ErrorWebhookResponse":{"type":"object","properties":{"render_id":{"type":"string","description":"ID of the render that this variation belongs to."},"variation_id":{"type":"string","description":"ID of the variation that failed."},"variation_type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation that failed."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["error"],"description":"Event type indicating an error occurred."},"error_message":{"type":"string","description":"Detailed error message explaining the failure."}},"required":["event_type","error_message","render_id","variation_id","variation_type","timestamp"]},"UpdateWebhookResponse":{"type":"object","properties":{"render_id":{"type":"string","description":"ID of the render that this variation belongs to."},"variation_id":{"type":"string","description":"ID of the variation that was updated."},"variation_type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation that was updated."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["update"],"description":"Event type indicating a status update."},"variation_status":{"type":"string","enum":["queued","rendering","done","error","idle","deleted"],"description":"Current status of the variation."},"eta":{"type":"number","description":"Estimated time remaining for the variation to complete (epoch milliseconds timestamp)."}},"required":["event_type","variation_status","eta","render_id","variation_id","variation_type","timestamp"]},"Render":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for this render."},"created_at":{"type":"number","description":"Creation timestamp (epoch milliseconds)."},"queued_at":{"type":["number","null"],"description":"Timestamp when the render was queued for processing (epoch milliseconds)."},"variations":{"type":"object","properties":{"total_count":{"type":"number","description":"Total number of completed variations for this render."},"next_cursor":{"type":["string","null"],"description":"Cursor to use to get the next page of variations."},"items":{"type":"array","description":"List of variations for this render.","items":{"$ref":"#/components/schemas/Variation"}}},"required":["total_count"]},"eta":{"type":["number","null"],"description":"Estimated time remaining for the first variation to complete (epoch milliseconds timestamp)."}},"required":["id","created_at","variations","eta"]},"Variation":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for this variation."},"type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation (staging, removal, etc.)."},"render_id":{"type":"string","description":"ID of the parent render this variation belongs to."},"created_at":{"type":"number","description":"Creation timestamp (epoch milliseconds)."},"status":{"type":"string","enum":["queued","rendering","done","error","idle","deleted"],"description":"Current status of the variation."},"result":{"oneOf":[{"$ref":"#/components/schemas/ImageResult"},{"type":"array","items":{"$ref":"#/components/schemas/ImageResult"}}],"description":"Result images (only present when status is 'done')."},"base_variation_id":{"description":"ID of the removal variation used as base, if this staging variation used a removal variation as its base.","type":"string"},"eta":{"type":["number","null"],"description":"Estimated time remaining for the variation to complete (epoch milliseconds timestamp)."},"config":{"oneOf":[{"$ref":"#/components/schemas/LegacyStagingConfig"},{"$ref":"#/components/schemas/VariationStagingConfigRead"},{"$ref":"#/components/schemas/DayToDuskConfig"},{"$ref":"#/components/schemas/EnhancementConfig"}],"description":"Configuration used to generate this variation."}},"required":["id","render_id","created_at","status","eta"]},"LegacyStagingConfig":{"type":"object","properties":{"type":{"type":"string","enum":["legacy_staging"]},"room_type":{"$ref":"#/components/schemas/AnyRoomType"},"style":{"$ref":"#/components/schemas/FurnitureStyles"}},"required":["room_type","style","type"]},"AnyRoomType":{"oneOf":[{"$ref":"#/components/schemas/RoomType"},{"type":"string","enum":["bathroom"],"deprecated":true,"description":"Deprecated. Not accepted for new staging requests; may appear in historical variation data."}],"description":"Room type (active or deprecated). Use for reading variation/config output only."},"VariationStagingConfigRead":{"type":"object","properties":{"type":{"type":"string","enum":["staging"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"add_virtually_staged_watermark":{"type":["boolean","null"],"description":"Whether to add a 'virtually staged' watermark to the output image."},"add_furniture":{"type":"object","properties":{"style":{"$ref":"#/components/schemas/FurnitureStyles"},"room_type":{"$ref":"#/components/schemas/AnyRoomType"},"base_variation_id":{"description":"ID of an existing removal variation that is being used as the base for this staging variation. This should be used to create multiple staging variations from a single removal variation.","type":"string"}},"required":["style","room_type"],"description":"Configuration for adding furniture to the image."},"remove_furniture":{"type":"object","properties":{"mode":{"type":"string","enum":["on","off","auto"],"description":"Furniture removal mode to use."},"mask_url":{"$ref":"#/components/schemas/ImageUrl","description":"URL of the mask image indicating areas to remove furniture from."}},"required":["mode"],"description":"Configuration for removing furniture from the image."}},"required":["type"]}},"responses":{"ValidationError":{"description":"Validation error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"errors":{"type":"array","items":{"type":"string"}}},"required":["message"]}}}},"AuthError":{"description":"Authentication error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"ForbiddenError":{"description":"Forbidden error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"UnexpectedError":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}}}},"paths":{"/renders/bulk":{"post":{"summary":"Create multiple renders in bulk","description":"Creates multiple renders with the specified parameters.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["renders"],"additionalProperties":false,"properties":{"webhook_url":{"type":["string","null"],"format":"uri"},"wait_for_completion":{"type":["boolean","null"],"default":false},"renders":{"type":"array","minItems":1,"items":{"type":"object","required":["config","image_url","variation_count"],"additionalProperties":false,"properties":{"config":{"oneOf":[{"$ref":"#/components/schemas/RenderStagingConfig"},{"$ref":"#/components/schemas/DayToDuskConfig"},{"$ref":"#/components/schemas/EnhancementConfig"}]},"image_url":{"$ref":"#/components/schemas/ImageUrl"},"variation_count":{"type":"integer","minimum":1}}}}}}}}},"callbacks":{"renderWebhook":{"{$request.body.webhook_url}":{"post":{"description":"Webhook response sent upon the completion of each variation that is part of any render in the bulk request","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/DoneWebhookResponse"},{"$ref":"#/components/schemas/ErrorWebhookResponse"},{"$ref":"#/components/schemas/UpdateWebhookResponse"}]}}}},"responses":{"200":{"description":"Webhook received successfully"}}}}}},"responses":{"200":{"description":"Renders created and completed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"renders":{"type":"array","items":{"anyOf":[{"$ref":"#/components/schemas/Render"},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string","description":"Error message describing what went wrong"},"original_image_url":{"type":"string","description":"URL of the image that failed processing"}}}]}}}}}}},"201":{"description":"Renders created and queued for processing","content":{"application/json":{"schema":{"type":"object","properties":{"renders":{"type":"array","items":{"anyOf":[{"$ref":"#/components/schemas/Render"},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string","description":"Error message describing what went wrong"},"original_image_url":{"type":"string","description":"URL of the image that failed processing"}}}]}}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/AuthError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/UnexpectedError"}}}}}}
```

## Create multiple variations in bulk

> Creates multiple variations for an existing render with different configurations.

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"servers":[{"url":"https://api.virtualstagingai.app/v2","description":"Production base URL."},{"url":"https://us-central1-furniture-ai.cloudfunctions.net/apiV2","description":"Long-running operations endpoint."}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"API key authentication. Use the format: Api-Key ${key}."}},"schemas":{"VariationStagingConfig":{"type":"object","properties":{"type":{"type":"string","enum":["staging"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"add_virtually_staged_watermark":{"type":["boolean","null"],"description":"Whether to add a 'virtually staged' watermark to the output image."},"add_furniture":{"type":"object","properties":{"style":{"$ref":"#/components/schemas/FurnitureStyles"},"room_type":{"$ref":"#/components/schemas/RoomType"},"base_variation_id":{"description":"ID of an existing removal variation that is being used as the base for this staging variation. This should be used to create multiple staging variations from a single removal variation.","type":"string"}},"required":["style","room_type"],"description":"Configuration for adding furniture to the image."},"remove_furniture":{"type":"object","properties":{"mode":{"type":"string","enum":["on","off","auto"],"description":"Furniture removal mode to use."},"mask_url":{"$ref":"#/components/schemas/ImageUrl","description":"URL of the mask image indicating areas to remove furniture from."}},"required":["mode"],"description":"Configuration for removing furniture from the image."}},"required":["type"]},"OutputResolution":{"oneOf":[{"type":"integer","enum":[1536],"description":"Force output to 1536px resolution regardless of input size"},{"type":"string","enum":["default"],"description":"Smart resolution: For Staging renders, upscale to 1536px minimum, or 3072px if input is larger than 1536px. For Enhancements and Day to Dusk renders, return size as-is to a maximum of 3072px."}],"default":"default","description":"Output image resolution. Use 'default' for smart resolution handling or 1536 to force 1536px output. Defaults to 'default' when omitted."},"FurnitureStyles":{"oneOf":[{"type":"string","enum":["standard","modern","scandinavian","industrial","midcentury","luxury","farmhouse","coastal"],"description":"Available furniture styles for staging."},{"type":"string","enum":["american","southwestern","hamptons"],"deprecated":true,"description":"Deprecated styles. These will be mapped to the closest existing style and are available only for backwards compatibility."}]},"RoomType":{"type":"string","enum":["living","bed","kitchen","dining","home_office","outdoor","kids_room"],"description":"Room types accepted for new staging requests (bathroom excluded)."},"ImageUrl":{"type":"string","pattern":"^(https?:\\/\\/[^\\s]+|data:image\\/[a-zA-Z+]+;base64,[A-Za-z0-9+/=]+)$","description":"URL for an image, either HTTP/HTTPS URL or base64 encoded data URL."},"DayToDuskConfig":{"type":"object","properties":{"type":{"type":"string","enum":["daytodusk"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"sky_style":{"$ref":"#/components/schemas/SkyStyle"}},"required":["sky_style","type"]},"SkyStyle":{"type":"string","enum":["dusk","golden","blue"],"description":"Available sky styles for day-to-dusk transformations."},"EnhancementConfig":{"type":"object","properties":{"type":{"type":"string","enum":["enhancement"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"}},"required":["type"]},"DoneWebhookResponse":{"type":"object","properties":{"render_id":{"type":"string","description":"ID of the render that this variation belongs to."},"variation_id":{"type":"string","description":"ID of the variation that completed."},"variation_type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation that completed."},"base_variation_id":{"type":["string","null"],"description":"ID of the removal variation used as base, if this staging variation used a removal variation as its base."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["done"],"description":"Event type indicating successful completion."},"result":{"oneOf":[{"$ref":"#/components/schemas/ImageResult"},{"type":"array","items":{"$ref":"#/components/schemas/ImageResult"}}],"description":"Generated result images."}},"required":["event_type","result","render_id","variation_id","variation_type","timestamp","base_variation_id"]},"ImageResult":{"type":"object","properties":{"url":{"type":"string","description":"Original image URL."},"optimized_url":{"type":["string","null"],"description":"Optimized (compressed) version URL."},"thumbnail_url":{"type":["string","null"],"description":"Thumbnail version URL."}},"required":["url"]},"ErrorWebhookResponse":{"type":"object","properties":{"render_id":{"type":"string","description":"ID of the render that this variation belongs to."},"variation_id":{"type":"string","description":"ID of the variation that failed."},"variation_type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation that failed."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["error"],"description":"Event type indicating an error occurred."},"error_message":{"type":"string","description":"Detailed error message explaining the failure."}},"required":["event_type","error_message","render_id","variation_id","variation_type","timestamp"]},"UpdateWebhookResponse":{"type":"object","properties":{"render_id":{"type":"string","description":"ID of the render that this variation belongs to."},"variation_id":{"type":"string","description":"ID of the variation that was updated."},"variation_type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation that was updated."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["update"],"description":"Event type indicating a status update."},"variation_status":{"type":"string","enum":["queued","rendering","done","error","idle","deleted"],"description":"Current status of the variation."},"eta":{"type":"number","description":"Estimated time remaining for the variation to complete (epoch milliseconds timestamp)."}},"required":["event_type","variation_status","eta","render_id","variation_id","variation_type","timestamp"]},"Variation":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for this variation."},"type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation (staging, removal, etc.)."},"render_id":{"type":"string","description":"ID of the parent render this variation belongs to."},"created_at":{"type":"number","description":"Creation timestamp (epoch milliseconds)."},"status":{"type":"string","enum":["queued","rendering","done","error","idle","deleted"],"description":"Current status of the variation."},"result":{"oneOf":[{"$ref":"#/components/schemas/ImageResult"},{"type":"array","items":{"$ref":"#/components/schemas/ImageResult"}}],"description":"Result images (only present when status is 'done')."},"base_variation_id":{"description":"ID of the removal variation used as base, if this staging variation used a removal variation as its base.","type":"string"},"eta":{"type":["number","null"],"description":"Estimated time remaining for the variation to complete (epoch milliseconds timestamp)."},"config":{"oneOf":[{"$ref":"#/components/schemas/LegacyStagingConfig"},{"$ref":"#/components/schemas/VariationStagingConfigRead"},{"$ref":"#/components/schemas/DayToDuskConfig"},{"$ref":"#/components/schemas/EnhancementConfig"}],"description":"Configuration used to generate this variation."}},"required":["id","render_id","created_at","status","eta"]},"LegacyStagingConfig":{"type":"object","properties":{"type":{"type":"string","enum":["legacy_staging"]},"room_type":{"$ref":"#/components/schemas/AnyRoomType"},"style":{"$ref":"#/components/schemas/FurnitureStyles"}},"required":["room_type","style","type"]},"AnyRoomType":{"oneOf":[{"$ref":"#/components/schemas/RoomType"},{"type":"string","enum":["bathroom"],"deprecated":true,"description":"Deprecated. Not accepted for new staging requests; may appear in historical variation data."}],"description":"Room type (active or deprecated). Use for reading variation/config output only."},"VariationStagingConfigRead":{"type":"object","properties":{"type":{"type":"string","enum":["staging"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"add_virtually_staged_watermark":{"type":["boolean","null"],"description":"Whether to add a 'virtually staged' watermark to the output image."},"add_furniture":{"type":"object","properties":{"style":{"$ref":"#/components/schemas/FurnitureStyles"},"room_type":{"$ref":"#/components/schemas/AnyRoomType"},"base_variation_id":{"description":"ID of an existing removal variation that is being used as the base for this staging variation. This should be used to create multiple staging variations from a single removal variation.","type":"string"}},"required":["style","room_type"],"description":"Configuration for adding furniture to the image."},"remove_furniture":{"type":"object","properties":{"mode":{"type":"string","enum":["on","off","auto"],"description":"Furniture removal mode to use."},"mask_url":{"$ref":"#/components/schemas/ImageUrl","description":"URL of the mask image indicating areas to remove furniture from."}},"required":["mode"],"description":"Configuration for removing furniture from the image."}},"required":["type"]}},"responses":{"ValidationError":{"description":"Validation error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"errors":{"type":"array","items":{"type":"string"}}},"required":["message"]}}}},"AuthError":{"description":"Authentication error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"ForbiddenError":{"description":"Forbidden error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"UnexpectedError":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}}}},"paths":{"/renders/variations/bulk":{"post":{"summary":"Create multiple variations in bulk","description":"Creates multiple variations for an existing render with different configurations.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["renders"],"additionalProperties":false,"properties":{"wait_for_completion":{"type":["boolean","null"],"default":false},"renders":{"type":"array","minItems":1,"items":{"type":"object","required":["render_id","variation_count","config"],"additionalProperties":false,"properties":{"render_id":{"type":"string"},"variation_count":{"type":"integer","minimum":1},"config":{"oneOf":[{"$ref":"#/components/schemas/VariationStagingConfig"},{"$ref":"#/components/schemas/DayToDuskConfig"},{"$ref":"#/components/schemas/EnhancementConfig"}]}}}}}}}}},"callbacks":{"variationWebhook":{"{$parent_render.webhook_url}":{"post":{"description":"Webhook response sent upon the completion of each variation. The response is sent to the webhook_url specified in each parent render.","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/DoneWebhookResponse"},{"$ref":"#/components/schemas/ErrorWebhookResponse"},{"$ref":"#/components/schemas/UpdateWebhookResponse"}]}}}},"responses":{"200":{"description":"Webhook received successfully"}}}}}},"responses":{"200":{"description":"Variations for renders created and completed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/Variation"},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string","description":"Error message describing what went wrong"},"render_id":{"type":"string","description":"ID of the render that failed processing"}}}]}}}}}}},"201":{"description":"Variations for renders created and processing started","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/Variation"},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string","description":"Error message describing what went wrong"},"render_id":{"type":"string","description":"ID of the render that failed processing"}}}]}}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/AuthError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/UnexpectedError"}}}}}}
```

## Submit an image for a furniture mask generation

> Submits an image for analysis to generate a furniture mask. If a webhook\_url is provided, completion status will be sent to that URL.

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"servers":[{"url":"https://api.virtualstagingai.app/v2","description":"Production base URL."},{"url":"https://us-central1-furniture-ai.cloudfunctions.net/apiV2","description":"Long-running operations endpoint."}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"API key authentication. Use the format: Api-Key ${key}."}},"schemas":{"ImageUrl":{"type":"string","pattern":"^(https?:\\/\\/[^\\s]+|data:image\\/[a-zA-Z+]+;base64,[A-Za-z0-9+/=]+)$","description":"URL for an image, either HTTP/HTTPS URL or base64 encoded data URL."},"AnalysisDoneWebhookResponse":{"type":"object","properties":{"id":{"type":"string","description":"Analysis ID."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["analysis_completion"],"description":"Event type indicating successful analysis completion."},"percentage_masked":{"type":"number","description":"Percentage of the image that was identified as furniture."},"result_url":{"type":"string","description":"URL of the analysis result image."}},"required":["event_type","result_url","id","percentage_masked","timestamp"]},"AnalysisErrorWebhookResponse":{"type":"object","properties":{"id":{"type":"string","description":"Analysis ID."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["analysis_error"],"description":"Event type indicating analysis failure."},"error_message":{"type":"string","description":"Detailed error message explaining the failure."}},"required":["id","timestamp","event_type","error_message"]},"Analysis":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for this analysis."},"created_at":{"type":"number","description":"Creation timestamp (epoch milliseconds)."},"result_url":{"type":"string","description":"URL of the analysis result image."},"percentage_masked":{"type":"number","description":"Percentage of the image that was identified as furniture."},"status":{"type":"string","enum":["done","error"],"description":"Status of the analysis."}},"required":["id","created_at","result_url","status"]}},"responses":{"ValidationError":{"description":"Validation error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"errors":{"type":"array","items":{"type":"string"}}},"required":["message"]}}}},"AuthError":{"description":"Authentication error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"UnexpectedError":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}}}},"paths":{"/analyze":{"post":{"summary":"Submit an image for a furniture mask generation","description":"Submits an image for analysis to generate a furniture mask. If a webhook_url is provided, completion status will be sent to that URL.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["image_url"],"additionalProperties":false,"properties":{"image_url":{"$ref":"#/components/schemas/ImageUrl"},"webhook_url":{"type":["string","null"],"format":"uri","description":"URL for completion payload"}}}}}},"callbacks":{"analysisWebhook":{"{$request.body.webhook_url}":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/AnalysisDoneWebhookResponse"},{"$ref":"#/components/schemas/AnalysisErrorWebhookResponse"}]}}}},"responses":{"200":{"description":"Webhook received successfully"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Analysis"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/AuthError"},"404":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/UnexpectedError"}}}}}}
```

## Check if two images are compatible for multi-view staging

> Analyzes two images to determine if they can be used together for multi-view staging.

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"servers":[{"url":"https://api.virtualstagingai.app/v2","description":"Production base URL."},{"url":"https://us-central1-furniture-ai.cloudfunctions.net/apiV2","description":"Long-running operations endpoint."}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"API key authentication. Use the format: Api-Key ${key}."}},"schemas":{"MultiViewCompatibilityRequest":{"type":"object","properties":{"image_urls":{"type":"array","items":{"$ref":"#/components/schemas/ImageUrl"},"minItems":2,"maxItems":2,"description":"Array of two image URLs to check for compatibility."}},"required":["image_urls"]},"ImageUrl":{"type":"string","pattern":"^(https?:\\/\\/[^\\s]+|data:image\\/[a-zA-Z+]+;base64,[A-Za-z0-9+/=]+)$","description":"URL for an image, either HTTP/HTTPS URL or base64 encoded data URL."},"MultiViewCompatibilityResponse":{"type":"object","properties":{"compatible":{"type":"boolean","description":"Whether the images are compatible for multi-view staging."},"hard_rejected":{"type":"boolean","description":"Whether the multi-view staging was hard rejected. If true, multi-view staging is not possible. If false but compatible is false, multi-view staging is possible but the result may not be as good."},"rejection_reason":{"type":["string","null"],"description":"Reason for rejection if images are not compatible."}},"required":["compatible","hard_rejected"]}},"responses":{"ValidationError":{"description":"Validation error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"errors":{"type":"array","items":{"type":"string"}}},"required":["message"]}}}},"AuthError":{"description":"Authentication error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"UnexpectedError":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}}}},"paths":{"/multi-view-compatibility":{"post":{"summary":"Check if two images are compatible for multi-view staging","description":"Analyzes two images to determine if they can be used together for multi-view staging.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiViewCompatibilityRequest"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiViewCompatibilityResponse"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/AuthError"},"500":{"$ref":"#/components/responses/UnexpectedError"}}}}}}
```

## Create or update webhook secret

> Sets or updates the webhook secret used for HMAC signature verification

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"servers":[{"url":"https://api.virtualstagingai.app/v2","description":"Production base URL."},{"url":"https://us-central1-furniture-ai.cloudfunctions.net/apiV2","description":"Long-running operations endpoint."}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"API key authentication. Use the format: Api-Key ${key}."}},"responses":{"ValidationError":{"description":"Validation error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"errors":{"type":"array","items":{"type":"string"}}},"required":["message"]}}}},"AuthError":{"description":"Authentication error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"UnexpectedError":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}}}},"paths":{"/user/webhook-secret":{"post":{"summary":"Create or update webhook secret","description":"Sets or updates the webhook secret used for HMAC signature verification","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["webhook_secret"],"additionalProperties":false,"properties":{"webhook_secret":{"type":"string","minLength":1,"pattern":"^[a-zA-Z0-9_-]+$","description":"The webhook secret to use for HMAC signature verification"}}}}}},"responses":{"200":{"description":"Webhook secret updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/AuthError"},"500":{"$ref":"#/components/responses/UnexpectedError"}}}}}}
```

## Remove webhook secret

> Removes the webhook secret used for HMAC signature verification

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"servers":[{"url":"https://api.virtualstagingai.app/v2","description":"Production base URL."},{"url":"https://us-central1-furniture-ai.cloudfunctions.net/apiV2","description":"Long-running operations endpoint."}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"API key authentication. Use the format: Api-Key ${key}."}},"responses":{"AuthError":{"description":"Authentication error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"UnexpectedError":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}}}},"paths":{"/user/webhook-secret":{"delete":{"summary":"Remove webhook secret","description":"Removes the webhook secret used for HMAC signature verification","responses":{"200":{"description":"Webhook secret removed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}}},"401":{"$ref":"#/components/responses/AuthError"},"500":{"$ref":"#/components/responses/UnexpectedError"}}}}}}
```

### Schemas

## The ImageUrl object

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"components":{"schemas":{"ImageUrl":{"type":"string","pattern":"^(https?:\\/\\/[^\\s]+|data:image\\/[a-zA-Z+]+;base64,[A-Za-z0-9+/=]+)$","description":"URL for an image, either HTTP/HTTPS URL or base64 encoded data URL."}}}}
```

## The FurnitureStyles object

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"components":{"schemas":{"FurnitureStyles":{"oneOf":[{"type":"string","enum":["standard","modern","scandinavian","industrial","midcentury","luxury","farmhouse","coastal"],"description":"Available furniture styles for staging."},{"type":"string","enum":["american","southwestern","hamptons"],"deprecated":true,"description":"Deprecated styles. These will be mapped to the closest existing style and are available only for backwards compatibility."}]}}}}
```

## The RoomType object

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"components":{"schemas":{"RoomType":{"type":"string","enum":["living","bed","kitchen","dining","home_office","outdoor","kids_room"],"description":"Room types accepted for new staging requests (bathroom excluded)."}}}}
```

## The SkyStyle object

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"components":{"schemas":{"SkyStyle":{"type":"string","enum":["dusk","golden","blue"],"description":"Available sky styles for day-to-dusk transformations."}}}}
```

## The DayToDuskConfig object

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"components":{"schemas":{"DayToDuskConfig":{"type":"object","properties":{"type":{"type":"string","enum":["daytodusk"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"sky_style":{"$ref":"#/components/schemas/SkyStyle"}},"required":["sky_style","type"]},"OutputResolution":{"oneOf":[{"type":"integer","enum":[1536],"description":"Force output to 1536px resolution regardless of input size"},{"type":"string","enum":["default"],"description":"Smart resolution: For Staging renders, upscale to 1536px minimum, or 3072px if input is larger than 1536px. For Enhancements and Day to Dusk renders, return size as-is to a maximum of 3072px."}],"default":"default","description":"Output image resolution. Use 'default' for smart resolution handling or 1536 to force 1536px output. Defaults to 'default' when omitted."},"SkyStyle":{"type":"string","enum":["dusk","golden","blue"],"description":"Available sky styles for day-to-dusk transformations."}}}}
```

## The EnhancementConfig object

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"components":{"schemas":{"EnhancementConfig":{"type":"object","properties":{"type":{"type":"string","enum":["enhancement"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"}},"required":["type"]},"OutputResolution":{"oneOf":[{"type":"integer","enum":[1536],"description":"Force output to 1536px resolution regardless of input size"},{"type":"string","enum":["default"],"description":"Smart resolution: For Staging renders, upscale to 1536px minimum, or 3072px if input is larger than 1536px. For Enhancements and Day to Dusk renders, return size as-is to a maximum of 3072px."}],"default":"default","description":"Output image resolution. Use 'default' for smart resolution handling or 1536 to force 1536px output. Defaults to 'default' when omitted."}}}}
```

## The LegacyStagingConfig object

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"components":{"schemas":{"LegacyStagingConfig":{"type":"object","properties":{"type":{"type":"string","enum":["legacy_staging"]},"room_type":{"$ref":"#/components/schemas/AnyRoomType"},"style":{"$ref":"#/components/schemas/FurnitureStyles"}},"required":["room_type","style","type"]},"AnyRoomType":{"oneOf":[{"$ref":"#/components/schemas/RoomType"},{"type":"string","enum":["bathroom"],"deprecated":true,"description":"Deprecated. Not accepted for new staging requests; may appear in historical variation data."}],"description":"Room type (active or deprecated). Use for reading variation/config output only."},"RoomType":{"type":"string","enum":["living","bed","kitchen","dining","home_office","outdoor","kids_room"],"description":"Room types accepted for new staging requests (bathroom excluded)."},"FurnitureStyles":{"oneOf":[{"type":"string","enum":["standard","modern","scandinavian","industrial","midcentury","luxury","farmhouse","coastal"],"description":"Available furniture styles for staging."},{"type":"string","enum":["american","southwestern","hamptons"],"deprecated":true,"description":"Deprecated styles. These will be mapped to the closest existing style and are available only for backwards compatibility."}]}}}}
```

## The ImageResult object

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"components":{"schemas":{"ImageResult":{"type":"object","properties":{"url":{"type":"string","description":"Original image URL."},"optimized_url":{"type":["string","null"],"description":"Optimized (compressed) version URL."},"thumbnail_url":{"type":["string","null"],"description":"Thumbnail version URL."}},"required":["url"]}}}}
```

## The Variation object

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"components":{"schemas":{"Variation":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for this variation."},"type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation (staging, removal, etc.)."},"render_id":{"type":"string","description":"ID of the parent render this variation belongs to."},"created_at":{"type":"number","description":"Creation timestamp (epoch milliseconds)."},"status":{"type":"string","enum":["queued","rendering","done","error","idle","deleted"],"description":"Current status of the variation."},"result":{"oneOf":[{"$ref":"#/components/schemas/ImageResult"},{"type":"array","items":{"$ref":"#/components/schemas/ImageResult"}}],"description":"Result images (only present when status is 'done')."},"base_variation_id":{"description":"ID of the removal variation used as base, if this staging variation used a removal variation as its base.","type":"string"},"eta":{"type":["number","null"],"description":"Estimated time remaining for the variation to complete (epoch milliseconds timestamp)."},"config":{"oneOf":[{"$ref":"#/components/schemas/LegacyStagingConfig"},{"$ref":"#/components/schemas/VariationStagingConfigRead"},{"$ref":"#/components/schemas/DayToDuskConfig"},{"$ref":"#/components/schemas/EnhancementConfig"}],"description":"Configuration used to generate this variation."}},"required":["id","render_id","created_at","status","eta"]},"ImageResult":{"type":"object","properties":{"url":{"type":"string","description":"Original image URL."},"optimized_url":{"type":["string","null"],"description":"Optimized (compressed) version URL."},"thumbnail_url":{"type":["string","null"],"description":"Thumbnail version URL."}},"required":["url"]},"LegacyStagingConfig":{"type":"object","properties":{"type":{"type":"string","enum":["legacy_staging"]},"room_type":{"$ref":"#/components/schemas/AnyRoomType"},"style":{"$ref":"#/components/schemas/FurnitureStyles"}},"required":["room_type","style","type"]},"AnyRoomType":{"oneOf":[{"$ref":"#/components/schemas/RoomType"},{"type":"string","enum":["bathroom"],"deprecated":true,"description":"Deprecated. Not accepted for new staging requests; may appear in historical variation data."}],"description":"Room type (active or deprecated). Use for reading variation/config output only."},"RoomType":{"type":"string","enum":["living","bed","kitchen","dining","home_office","outdoor","kids_room"],"description":"Room types accepted for new staging requests (bathroom excluded)."},"FurnitureStyles":{"oneOf":[{"type":"string","enum":["standard","modern","scandinavian","industrial","midcentury","luxury","farmhouse","coastal"],"description":"Available furniture styles for staging."},{"type":"string","enum":["american","southwestern","hamptons"],"deprecated":true,"description":"Deprecated styles. These will be mapped to the closest existing style and are available only for backwards compatibility."}]},"VariationStagingConfigRead":{"type":"object","properties":{"type":{"type":"string","enum":["staging"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"add_virtually_staged_watermark":{"type":["boolean","null"],"description":"Whether to add a 'virtually staged' watermark to the output image."},"add_furniture":{"type":"object","properties":{"style":{"$ref":"#/components/schemas/FurnitureStyles"},"room_type":{"$ref":"#/components/schemas/AnyRoomType"},"base_variation_id":{"description":"ID of an existing removal variation that is being used as the base for this staging variation. This should be used to create multiple staging variations from a single removal variation.","type":"string"}},"required":["style","room_type"],"description":"Configuration for adding furniture to the image."},"remove_furniture":{"type":"object","properties":{"mode":{"type":"string","enum":["on","off","auto"],"description":"Furniture removal mode to use."},"mask_url":{"$ref":"#/components/schemas/ImageUrl","description":"URL of the mask image indicating areas to remove furniture from."}},"required":["mode"],"description":"Configuration for removing furniture from the image."}},"required":["type"]},"OutputResolution":{"oneOf":[{"type":"integer","enum":[1536],"description":"Force output to 1536px resolution regardless of input size"},{"type":"string","enum":["default"],"description":"Smart resolution: For Staging renders, upscale to 1536px minimum, or 3072px if input is larger than 1536px. For Enhancements and Day to Dusk renders, return size as-is to a maximum of 3072px."}],"default":"default","description":"Output image resolution. Use 'default' for smart resolution handling or 1536 to force 1536px output. Defaults to 'default' when omitted."},"ImageUrl":{"type":"string","pattern":"^(https?:\\/\\/[^\\s]+|data:image\\/[a-zA-Z+]+;base64,[A-Za-z0-9+/=]+)$","description":"URL for an image, either HTTP/HTTPS URL or base64 encoded data URL."},"DayToDuskConfig":{"type":"object","properties":{"type":{"type":"string","enum":["daytodusk"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"sky_style":{"$ref":"#/components/schemas/SkyStyle"}},"required":["sky_style","type"]},"SkyStyle":{"type":"string","enum":["dusk","golden","blue"],"description":"Available sky styles for day-to-dusk transformations."},"EnhancementConfig":{"type":"object","properties":{"type":{"type":"string","enum":["enhancement"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"}},"required":["type"]}}}}
```

## The Render object

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"components":{"schemas":{"Render":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for this render."},"created_at":{"type":"number","description":"Creation timestamp (epoch milliseconds)."},"queued_at":{"type":["number","null"],"description":"Timestamp when the render was queued for processing (epoch milliseconds)."},"variations":{"type":"object","properties":{"total_count":{"type":"number","description":"Total number of completed variations for this render."},"next_cursor":{"type":["string","null"],"description":"Cursor to use to get the next page of variations."},"items":{"type":"array","description":"List of variations for this render.","items":{"$ref":"#/components/schemas/Variation"}}},"required":["total_count"]},"eta":{"type":["number","null"],"description":"Estimated time remaining for the first variation to complete (epoch milliseconds timestamp)."}},"required":["id","created_at","variations","eta"]},"Variation":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for this variation."},"type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation (staging, removal, etc.)."},"render_id":{"type":"string","description":"ID of the parent render this variation belongs to."},"created_at":{"type":"number","description":"Creation timestamp (epoch milliseconds)."},"status":{"type":"string","enum":["queued","rendering","done","error","idle","deleted"],"description":"Current status of the variation."},"result":{"oneOf":[{"$ref":"#/components/schemas/ImageResult"},{"type":"array","items":{"$ref":"#/components/schemas/ImageResult"}}],"description":"Result images (only present when status is 'done')."},"base_variation_id":{"description":"ID of the removal variation used as base, if this staging variation used a removal variation as its base.","type":"string"},"eta":{"type":["number","null"],"description":"Estimated time remaining for the variation to complete (epoch milliseconds timestamp)."},"config":{"oneOf":[{"$ref":"#/components/schemas/LegacyStagingConfig"},{"$ref":"#/components/schemas/VariationStagingConfigRead"},{"$ref":"#/components/schemas/DayToDuskConfig"},{"$ref":"#/components/schemas/EnhancementConfig"}],"description":"Configuration used to generate this variation."}},"required":["id","render_id","created_at","status","eta"]},"ImageResult":{"type":"object","properties":{"url":{"type":"string","description":"Original image URL."},"optimized_url":{"type":["string","null"],"description":"Optimized (compressed) version URL."},"thumbnail_url":{"type":["string","null"],"description":"Thumbnail version URL."}},"required":["url"]},"LegacyStagingConfig":{"type":"object","properties":{"type":{"type":"string","enum":["legacy_staging"]},"room_type":{"$ref":"#/components/schemas/AnyRoomType"},"style":{"$ref":"#/components/schemas/FurnitureStyles"}},"required":["room_type","style","type"]},"AnyRoomType":{"oneOf":[{"$ref":"#/components/schemas/RoomType"},{"type":"string","enum":["bathroom"],"deprecated":true,"description":"Deprecated. Not accepted for new staging requests; may appear in historical variation data."}],"description":"Room type (active or deprecated). Use for reading variation/config output only."},"RoomType":{"type":"string","enum":["living","bed","kitchen","dining","home_office","outdoor","kids_room"],"description":"Room types accepted for new staging requests (bathroom excluded)."},"FurnitureStyles":{"oneOf":[{"type":"string","enum":["standard","modern","scandinavian","industrial","midcentury","luxury","farmhouse","coastal"],"description":"Available furniture styles for staging."},{"type":"string","enum":["american","southwestern","hamptons"],"deprecated":true,"description":"Deprecated styles. These will be mapped to the closest existing style and are available only for backwards compatibility."}]},"VariationStagingConfigRead":{"type":"object","properties":{"type":{"type":"string","enum":["staging"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"add_virtually_staged_watermark":{"type":["boolean","null"],"description":"Whether to add a 'virtually staged' watermark to the output image."},"add_furniture":{"type":"object","properties":{"style":{"$ref":"#/components/schemas/FurnitureStyles"},"room_type":{"$ref":"#/components/schemas/AnyRoomType"},"base_variation_id":{"description":"ID of an existing removal variation that is being used as the base for this staging variation. This should be used to create multiple staging variations from a single removal variation.","type":"string"}},"required":["style","room_type"],"description":"Configuration for adding furniture to the image."},"remove_furniture":{"type":"object","properties":{"mode":{"type":"string","enum":["on","off","auto"],"description":"Furniture removal mode to use."},"mask_url":{"$ref":"#/components/schemas/ImageUrl","description":"URL of the mask image indicating areas to remove furniture from."}},"required":["mode"],"description":"Configuration for removing furniture from the image."}},"required":["type"]},"OutputResolution":{"oneOf":[{"type":"integer","enum":[1536],"description":"Force output to 1536px resolution regardless of input size"},{"type":"string","enum":["default"],"description":"Smart resolution: For Staging renders, upscale to 1536px minimum, or 3072px if input is larger than 1536px. For Enhancements and Day to Dusk renders, return size as-is to a maximum of 3072px."}],"default":"default","description":"Output image resolution. Use 'default' for smart resolution handling or 1536 to force 1536px output. Defaults to 'default' when omitted."},"ImageUrl":{"type":"string","pattern":"^(https?:\\/\\/[^\\s]+|data:image\\/[a-zA-Z+]+;base64,[A-Za-z0-9+/=]+)$","description":"URL for an image, either HTTP/HTTPS URL or base64 encoded data URL."},"DayToDuskConfig":{"type":"object","properties":{"type":{"type":"string","enum":["daytodusk"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"},"sky_style":{"$ref":"#/components/schemas/SkyStyle"}},"required":["sky_style","type"]},"SkyStyle":{"type":"string","enum":["dusk","golden","blue"],"description":"Available sky styles for day-to-dusk transformations."},"EnhancementConfig":{"type":"object","properties":{"type":{"type":"string","enum":["enhancement"]},"output_resolution":{"$ref":"#/components/schemas/OutputResolution"}},"required":["type"]}}}}
```

## The Analysis object

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"components":{"schemas":{"Analysis":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for this analysis."},"created_at":{"type":"number","description":"Creation timestamp (epoch milliseconds)."},"result_url":{"type":"string","description":"URL of the analysis result image."},"percentage_masked":{"type":"number","description":"Percentage of the image that was identified as furniture."},"status":{"type":"string","enum":["done","error"],"description":"Status of the analysis."}},"required":["id","created_at","result_url","status"]}}}}
```

## The AnalysisDoneWebhookResponse object

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"components":{"schemas":{"AnalysisDoneWebhookResponse":{"type":"object","properties":{"id":{"type":"string","description":"Analysis ID."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["analysis_completion"],"description":"Event type indicating successful analysis completion."},"percentage_masked":{"type":"number","description":"Percentage of the image that was identified as furniture."},"result_url":{"type":"string","description":"URL of the analysis result image."}},"required":["event_type","result_url","id","percentage_masked","timestamp"]}}}}
```

## The AnalysisErrorWebhookResponse object

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"components":{"schemas":{"AnalysisErrorWebhookResponse":{"type":"object","properties":{"id":{"type":"string","description":"Analysis ID."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["analysis_error"],"description":"Event type indicating analysis failure."},"error_message":{"type":"string","description":"Detailed error message explaining the failure."}},"required":["id","timestamp","event_type","error_message"]}}}}
```

## The DoneWebhookResponse object

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"components":{"schemas":{"DoneWebhookResponse":{"type":"object","properties":{"render_id":{"type":"string","description":"ID of the render that this variation belongs to."},"variation_id":{"type":"string","description":"ID of the variation that completed."},"variation_type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation that completed."},"base_variation_id":{"type":["string","null"],"description":"ID of the removal variation used as base, if this staging variation used a removal variation as its base."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["done"],"description":"Event type indicating successful completion."},"result":{"oneOf":[{"$ref":"#/components/schemas/ImageResult"},{"type":"array","items":{"$ref":"#/components/schemas/ImageResult"}}],"description":"Generated result images."}},"required":["event_type","result","render_id","variation_id","variation_type","timestamp","base_variation_id"]},"ImageResult":{"type":"object","properties":{"url":{"type":"string","description":"Original image URL."},"optimized_url":{"type":["string","null"],"description":"Optimized (compressed) version URL."},"thumbnail_url":{"type":["string","null"],"description":"Thumbnail version URL."}},"required":["url"]}}}}
```

## The ErrorWebhookResponse object

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"components":{"schemas":{"ErrorWebhookResponse":{"type":"object","properties":{"render_id":{"type":"string","description":"ID of the render that this variation belongs to."},"variation_id":{"type":"string","description":"ID of the variation that failed."},"variation_type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation that failed."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["error"],"description":"Event type indicating an error occurred."},"error_message":{"type":"string","description":"Detailed error message explaining the failure."}},"required":["event_type","error_message","render_id","variation_id","variation_type","timestamp"]}}}}
```

## The UpdateWebhookResponse object

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"components":{"schemas":{"UpdateWebhookResponse":{"type":"object","properties":{"render_id":{"type":"string","description":"ID of the render that this variation belongs to."},"variation_id":{"type":"string","description":"ID of the variation that was updated."},"variation_type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation that was updated."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["update"],"description":"Event type indicating a status update."},"variation_status":{"type":"string","enum":["queued","rendering","done","error","idle","deleted"],"description":"Current status of the variation."},"eta":{"type":"number","description":"Estimated time remaining for the variation to complete (epoch milliseconds timestamp)."}},"required":["event_type","variation_status","eta","render_id","variation_id","variation_type","timestamp"]}}}}
```

## The WebhookResponse object

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"components":{"schemas":{"WebhookResponse":{"oneOf":[{"$ref":"#/components/schemas/DoneWebhookResponse"},{"$ref":"#/components/schemas/ErrorWebhookResponse"},{"$ref":"#/components/schemas/UpdateWebhookResponse"},{"$ref":"#/components/schemas/AnalysisDoneWebhookResponse"},{"$ref":"#/components/schemas/AnalysisErrorWebhookResponse"}],"description":"Webhook response payload for various events."},"DoneWebhookResponse":{"type":"object","properties":{"render_id":{"type":"string","description":"ID of the render that this variation belongs to."},"variation_id":{"type":"string","description":"ID of the variation that completed."},"variation_type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation that completed."},"base_variation_id":{"type":["string","null"],"description":"ID of the removal variation used as base, if this staging variation used a removal variation as its base."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["done"],"description":"Event type indicating successful completion."},"result":{"oneOf":[{"$ref":"#/components/schemas/ImageResult"},{"type":"array","items":{"$ref":"#/components/schemas/ImageResult"}}],"description":"Generated result images."}},"required":["event_type","result","render_id","variation_id","variation_type","timestamp","base_variation_id"]},"ImageResult":{"type":"object","properties":{"url":{"type":"string","description":"Original image URL."},"optimized_url":{"type":["string","null"],"description":"Optimized (compressed) version URL."},"thumbnail_url":{"type":["string","null"],"description":"Thumbnail version URL."}},"required":["url"]},"ErrorWebhookResponse":{"type":"object","properties":{"render_id":{"type":"string","description":"ID of the render that this variation belongs to."},"variation_id":{"type":"string","description":"ID of the variation that failed."},"variation_type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation that failed."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["error"],"description":"Event type indicating an error occurred."},"error_message":{"type":"string","description":"Detailed error message explaining the failure."}},"required":["event_type","error_message","render_id","variation_id","variation_type","timestamp"]},"UpdateWebhookResponse":{"type":"object","properties":{"render_id":{"type":"string","description":"ID of the render that this variation belongs to."},"variation_id":{"type":"string","description":"ID of the variation that was updated."},"variation_type":{"type":"string","enum":["staging","removal","enhancement","daytodusk","multi-view-staging"],"description":"Type of variation that was updated."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["update"],"description":"Event type indicating a status update."},"variation_status":{"type":"string","enum":["queued","rendering","done","error","idle","deleted"],"description":"Current status of the variation."},"eta":{"type":"number","description":"Estimated time remaining for the variation to complete (epoch milliseconds timestamp)."}},"required":["event_type","variation_status","eta","render_id","variation_id","variation_type","timestamp"]},"AnalysisDoneWebhookResponse":{"type":"object","properties":{"id":{"type":"string","description":"Analysis ID."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["analysis_completion"],"description":"Event type indicating successful analysis completion."},"percentage_masked":{"type":"number","description":"Percentage of the image that was identified as furniture."},"result_url":{"type":"string","description":"URL of the analysis result image."}},"required":["event_type","result_url","id","percentage_masked","timestamp"]},"AnalysisErrorWebhookResponse":{"type":"object","properties":{"id":{"type":"string","description":"Analysis ID."},"timestamp":{"type":"number","description":"Event timestamp (epoch milliseconds)."},"event_type":{"type":"string","enum":["analysis_error"],"description":"Event type indicating analysis failure."},"error_message":{"type":"string","description":"Detailed error message explaining the failure."}},"required":["id","timestamp","event_type","error_message"]}}}}
```

## The MultiViewCompatibilityRequest object

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"components":{"schemas":{"MultiViewCompatibilityRequest":{"type":"object","properties":{"image_urls":{"type":"array","items":{"$ref":"#/components/schemas/ImageUrl"},"minItems":2,"maxItems":2,"description":"Array of two image URLs to check for compatibility."}},"required":["image_urls"]},"ImageUrl":{"type":"string","pattern":"^(https?:\\/\\/[^\\s]+|data:image\\/[a-zA-Z+]+;base64,[A-Za-z0-9+/=]+)$","description":"URL for an image, either HTTP/HTTPS URL or base64 encoded data URL."}}}}
```

## The MultiViewCompatibilityResponse object

```json
{"openapi":"3.1.0","info":{"title":"Virtual Staging AI API","version":"2.0.0"},"components":{"schemas":{"MultiViewCompatibilityResponse":{"type":"object","properties":{"compatible":{"type":"boolean","description":"Whether the images are compatible for multi-view staging."},"hard_rejected":{"type":"boolean","description":"Whether the multi-view staging was hard rejected. If true, multi-view staging is not possible. If false but compatible is false, multi-view staging is possible but the result may not be as good."},"rejection_reason":{"type":["string","null"],"description":"Reason for rejection if images are not compatible."}},"required":["compatible","hard_rejected"]}}}}
```
