Virtual staging

Virtual staging API

Furnish empty rooms, empty furnished rooms, renovate spaces, and edit interiors with prompts or masks — all the room-content operations in one place.

The virtual staging endpoints cover everything that changes the contents of a room: adding furniture, removing it, renovating the space, surgical edits via prompt, and mask-based object removal. For photo cleanup (enhance, sky, blur), see Image enhancement.

Furnish an empty room

POST/api/furnish

Add realistic furniture to an empty room. Pedra preserves the room's architecture (walls, windows, doors, floors) and only adds furniture and decoration.

Interior staging examples
Before/after pairs across living rooms, bedrooms, kitchens, and offices in different furniture styles.
See examples →

Parameters

apiKeystringrequired
Your API key.
imageUrlstringrequired
URL of the empty room photo, or a base64 data URI (data:image/png;base64,...).
roomTypestringrequired
Type of space to furnish. The eight values below are the pre-defined space types. You can also pass any other space as a custom string (e.g. "Kid's room", "Garden", "Home gym").
Values: Living room Dining + Living room Bedroom Dining room Terrace Entrance Office Bathroom
stylestringrequired
Furniture style. Pass one of the named styles below, or a public URL to a reference image (e.g. a Pinterest photo or product shot) — Pedra will match the look from the reference.
Values: Minimalist Modern Scandinavian Industrial Bohemian Mid-century modern Traditional Mediterranean Coastal Rustic Farmhouse Contemporary
creativitystring
Deprecated and ignored since September 2026. Furnishing now has a single level: it adds furniture and decor while keeping walls, doors, windows and the camera angle exactly as they are, at 1 credit per image (2 when style is a reference-image URL). Requests that still send this parameter keep working.
preserveAspectRatioboolean
By default, the output comes back at whatever size the AI model produces, which may not match the aspect ratio or resolution of your photo. Set to true to get the result at the exact width and height of the input image: it is center-cropped to the original aspect ratio (never stretched) and resized to the original resolution.
Default: false
propertyIdstring
Optional id of the property (from list_properties or create_property) this photo belongs to. When set, the result is saved into that property's gallery — visible and editable from the app — instead of only returned as a URL. The response then also includes <code>source</code> (<code>imageId</code> and <code>name</code>) of the original photo, when it is already in that property or you also send <code>name</code>.
namestring
Optional name for the original photo (e.g. its file name), up to 200 characters. Requires <code>propertyId</code>. If the photo isn't in that property yet, it's saved there under this name in the same call, so you don't need <code>add_images_to_property</code> first, and it comes back as <code>source.name</code>. A photo already in the property keeps its name. Never shown on the image.

Example request

curl -X POST https://app.pedra.ai/api/furnish \
  -H "Content-Type: application/json" \
  -d '{
    "apiKey": "YOUR_API_KEY",
    "imageUrl": "https://example.com/empty-bedroom.jpg",
    "roomType": "Bedroom",
    "style": "Minimalist"
  }'

Example response

JSON
{
  "message": "Success",
  "output": [
    { "url": "https://img.pedra.ai/<generated-id>" }
  ]
}

Response time: ~30 seconds per image.

Empty a furnished room

POST/api/empty_room

Remove furniture and objects from a room, leaving the architecture intact. Useful when listing photos are taken with the previous owner's belongings still in place.

Decluttering & empty room examples
See real listings transformed from cluttered to clean-slate empty in seconds.
See examples →

Parameters

apiKeystringrequired
Your API key.
imageUrlstringrequired
URL of the furnished room photo, or a base64 data URI.
preserveAspectRatioboolean
By default, the output comes back at whatever size the AI model produces, which may not match the aspect ratio or resolution of your photo. Set to true to get the result at the exact width and height of the input image: it is center-cropped to the original aspect ratio (never stretched) and resized to the original resolution.
Default: false
propertyIdstring
Optional id of the property (from list_properties or create_property) this photo belongs to. When set, the result is saved into that property's gallery — visible and editable from the app — instead of only returned as a URL. The response then also includes <code>source</code> (<code>imageId</code> and <code>name</code>) of the original photo, when it is already in that property or you also send <code>name</code>.
namestring
Optional name for the original photo (e.g. its file name), up to 200 characters. Requires <code>propertyId</code>. If the photo isn't in that property yet, it's saved there under this name in the same call, so you don't need <code>add_images_to_property</code> first, and it comes back as <code>source.name</code>. A photo already in the property keeps its name. Never shown on the image.

Example request

curl -X POST https://app.pedra.ai/api/empty_room \
  -H "Content-Type: application/json" \
  -d '{
    "apiKey": "YOUR_API_KEY",
    "imageUrl": "https://example.com/furnished-room.jpg"
  }'

Example response

JSON
{
  "message": "Success",
  "output": [
    { "url": "https://img.pedra.ai/<generated-id>" }
  ]
}

Response time: ~30 seconds per image.

Renovate a room

POST/api/renovation

Show what a room could look like after renovation: new finishes, updated kitchens, refreshed bathrooms. Optionally keep windows in place and re-furnish in the same call.

Virtual renovation examples
Real renovation renders — dated kitchens, tired bathrooms, and refreshed interiors across styles.
See examples →

Parameters

apiKeystringrequired
Your API key.
imageUrlstringrequired
URL of the room photo to renovate.
stylestringrequired
Renovation style. Pass one of the named styles below, or a public URL to a reference image — Pedra matches finishes, palette, and overall look from the reference.
Values: Minimalist Modern Scandinavian Industrial Bohemian Mid-century modern Traditional Mediterranean Coastal Rustic Farmhouse Contemporary
preserveWindowsboolean
Keep windows in their original position. Recommended for accurate listings.
Default: false
furnishboolean
Add furniture to the renovated room in the same call. When true, roomType is required.
Default: false
roomTypestring
Used when furnish is true. Defaults to "Auto" (Pedra detects the space from the image). Accepts the same pre-defined space types as the furnish endpoint, plus any custom space you write as a string (e.g. "Kid's room", "Garden", "Home gym").
Values: Living room Dining + Living room Bedroom Dining room Terrace Entrance Office Bathroom Auto
Default: Auto
creativitystring
Deprecated and ignored since September 2026. Renovation now has a single level: it renews finishes, materials and furniture while keeping walls, doors, windows and the camera angle exactly as they are, at 1 credit per image. Requests that still send this parameter keep working.
preserveAspectRatioboolean
By default, the output comes back at whatever size the AI model produces, which may not match the aspect ratio or resolution of your photo. Set to true to get the result at the exact width and height of the input image: it is center-cropped to the original aspect ratio (never stretched) and resized to the original resolution.
Default: false
propertyIdstring
Optional id of the property (from list_properties or create_property) this photo belongs to. When set, the result is saved into that property's gallery — visible and editable from the app — instead of only returned as a URL. The response then also includes <code>source</code> (<code>imageId</code> and <code>name</code>) of the original photo, when it is already in that property or you also send <code>name</code>.
namestring
Optional name for the original photo (e.g. its file name), up to 200 characters. Requires <code>propertyId</code>. If the photo isn't in that property yet, it's saved there under this name in the same call, so you don't need <code>add_images_to_property</code> first, and it comes back as <code>source.name</code>. A photo already in the property keeps its name. Never shown on the image.

Example request

curl -X POST https://app.pedra.ai/api/renovation \
  -H "Content-Type: application/json" \
  -d '{
    "apiKey": "YOUR_API_KEY",
    "imageUrl": "https://example.com/dated-kitchen.jpg",
    "style": "Modern",
    "preserveWindows": true,
    "furnish": true,
    "roomType": "Kitchen"
  }'

Example response

JSON
{
  "message": "Success",
  "output": [
    { "url": "https://img.pedra.ai/<generated-id>" }
  ]
}

Response time: ~30 seconds per image.

Edit via prompt

POST/api/edit_via_prompt

Make targeted edits described in plain English: "Add a modern chandelier", "Repaint the walls white", "Remove the rug". Best for one-off fixes that don't map to the other endpoints.

Parameters

apiKeystringrequired
Your API key.
imageUrlstringrequired
URL of the photo to edit, or a base64 data URI.
promptstringrequired
Plain-English editing instruction. Be specific — "add a beige sofa against the back wall" works better than "add furniture".
preserveAspectRatioboolean
By default, the output comes back at whatever size the AI model produces, which may not match the aspect ratio or resolution of your photo. Set to true to get the result at the exact width and height of the input image: it is center-cropped to the original aspect ratio (never stretched) and resized to the original resolution.
Default: false
propertyIdstring
Optional id of the property (from list_properties or create_property) this photo belongs to. When set, the result is saved into that property's gallery — visible and editable from the app — instead of only returned as a URL. The response then also includes <code>source</code> (<code>imageId</code> and <code>name</code>) of the original photo, when it is already in that property or you also send <code>name</code>.
namestring
Optional name for the original photo (e.g. its file name), up to 200 characters. Requires <code>propertyId</code>. If the photo isn't in that property yet, it's saved there under this name in the same call, so you don't need <code>add_images_to_property</code> first, and it comes back as <code>source.name</code>. A photo already in the property keeps its name. Never shown on the image.

Example request

curl -X POST https://app.pedra.ai/api/edit_via_prompt \
  -H "Content-Type: application/json" \
  -d '{
    "apiKey": "YOUR_API_KEY",
    "imageUrl": "https://example.com/living-room.jpg",
    "prompt": "Add a modern chandelier to the ceiling"
  }'

Example response

JSON
{
  "message": "Success",
  "output": {
    "url": "https://img.pedra.ai/<generated-id>"
  }
}

Response time: ~15 seconds per image. Cost: 2 credits per call. output is a single object.

Remove object

POST/api/remove_object

Removes specific objects from an image using a mask. The mask is a separate image where white pixels mark what to remove and black pixels mark what to keep. Use this when you need surgical control vs. edit_via_prompt.

Object removal examples
Same gallery as /api/empty_room — clutter, furniture, and objects removed from real listing photos.
See examples →

Parameters

apiKeystringrequired
Your API key.
imageUrlstringrequired
URL of the source photo.
maskUrlstringrequired
URL of the mask image. White areas are removed; black areas are preserved.
preserveAspectRatioboolean
By default, the output comes back at whatever size the AI model produces, which may not match the aspect ratio or resolution of your photo. Set to true to get the result at the exact width and height of the input image: it is center-cropped to the original aspect ratio (never stretched) and resized to the original resolution.
Default: false
propertyIdstring
Optional id of the property (from list_properties or create_property) this photo belongs to. When set, the result is saved into that property's gallery — visible and editable from the app — instead of only returned as a URL. The response then also includes <code>source</code> (<code>imageId</code> and <code>name</code>) of the original photo, when it is already in that property or you also send <code>name</code>.
namestring
Optional name for the original photo (e.g. its file name), up to 200 characters. Requires <code>propertyId</code>. If the photo isn't in that property yet, it's saved there under this name in the same call, so you don't need <code>add_images_to_property</code> first, and it comes back as <code>source.name</code>. A photo already in the property keeps its name. Never shown on the image.

Example request

curl -X POST https://app.pedra.ai/api/remove_object \
  -H "Content-Type: application/json" \
  -d '{
    "apiKey": "YOUR_API_KEY",
    "imageUrl": "https://example.com/cluttered-room.jpg",
    "maskUrl": "https://example.com/mask.png"
  }'

Example response

JSON
{
  "message": "Success",
  "output": {
    "url": "https://img.pedra.ai/<generated-id>"
  }
}

Response time: ~15 seconds per image. output is a single object.

Next

See Image enhancement for sharpening, sky replacement, and blurring — or Errors & limits for failure handling.