How to add AI staging to your product
What it takes to put virtual staging inside a listing portal or CRM, using the models on Replicate with your own token.
If your product handles property listings, you end up handling property photos, and photo quality is usually the weakest part of a listing. This is what it actually takes to add staging to the product you already have.
There is no PropLabs API to sign up for
The models are published on Replicate. You call them through Replicate's API, with your own Replicate token, and Replicate bills you for the compute. There is nothing to provision with us.
That has a useful consequence: you can evaluate the whole thing before writing any integration code. Run the model on twenty of your own listing photos in the playground and see whether the output clears your bar. If it does not, you have spent nothing.
The call
Each model is addressed by account and name:
POST https://api.replicate.com/v1/models/proplabs/virtual-staging/predictions
The Node client, which is how most of this ends up being written:
import Replicate from "replicate";
const replicate = new Replicate({ auth: process.env.REPLICATE_API_TOKEN });
const output = await replicate.run("proplabs/virtual-staging", {input: { image: listingPhotoUrl, replicate_api_key: process.env.REPLICATE_API_TOKEN, room: "Living Room", furniture_style: "Scandinavian", },
});
Virtual staging takes nine room types and sixteen named styles, plus a field for naming the exact pieces you want. Your interface decides how much of that to expose — a single "stage this" button, or the full style picker.
Chain removal before staging
Staging expects an empty room. Most listing photos are not empty. Run furniture removal first, then pass its output into staging:
const key = process.env.REPLICATE_API_TOKEN;
const empty = await replicate.run("proplabs/furniture-removal", {input: { image: listingPhotoUrl, replicate_api_key: key, scope: "Furniture and decor" },
});
const staged = await replicate.run("proplabs/virtual-staging", {input: { image: empty, replicate_api_key: key, room: "Living Room", furniture_style: "Coastal" },
});
Furniture removal works to a specific rule: if an object would leave with the owner when they move out, it goes; if it would still be there for the next occupant, it stays. Fitted kitchens, bathrooms and built-in storage are kept.
The watermark
Output is watermarked by default and free to try — you pay only Replicate for the generation, on your own API token. That is what makes the evaluation above free.
For production you need clean output, which means passing a token:
watermark_remove_token: process.env.PROPLABS_TOKEN
A token is $100 a month, covers 1,000 images in that month across all seven models, and does not roll an unused balance into the next one. Size the allowance against a normal month rather than a quiet one. Keep yours server-side, like any other secret.
Running a shoot, not an image
Replicate's API handles concurrent predictions, so a property with thirty photos is a loop rather than a queue you have to build. The concurrency available to you comes from your Replicate account.
Things worth deciding early
Who picks the style. Letting agents choose from sixteen styles is a nicer product than choosing for them, but it is more surface area in your UI and more runs per listing.
What happens on a bad result. These are generative models. Occasionally a run produces something you would not publish. Decide whether a human approves output before it goes live, or whether users can re-run it themselves.
Disclosure. Many jurisdictions require edited listing photographs to be disclosed as edited. If your product produces them at scale, that rule is worth understanding before launch rather than after.
If Replicate is not where this can live
Volume, latency, or where the data has to sit can all make Replicate the wrong home for this. Direct API access and deployment under your own infrastructure are things we arrange case by case — tell us the constraints.
Try it on your own photo
Free and watermarked. A token for clean output is $100 a month for 1,000 images.