API v1
The AI virtual staging API
Stage an empty room, clear out the furniture, or upscale a finished photo — with one authenticated POST. Built for photographers, brokerages and platforms shipping staging inside their own product.
Free presigned uploads · 1 credit per staged image
# 1. Your key, from the API dashboard. Never commit it.
export PICTASTIC_API_KEY="sk_live_..."
# 2. Ask for an upload slot (free — costs no credits)
curl -H "Authorization: Bearer $PICTASTIC_API_KEY" \
"https://app.pictastic.ai/api/v1/presigned-urls?count=1"
# → { "uploads": [ { "presignedUrl": "https://...", "publicUrl": "https://..." } ] }
# 3. Push your photo to the presigned URL
curl -X PUT -H "Content-Type: image/jpeg" \
--data-binary @empty-room.jpg "<presignedUrl>"
# 4. Stage it (1 credit)
curl -X POST "https://app.pictastic.ai/api/v1/virtual-staging" \
-H "Authorization: Bearer $PICTASTIC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"imageUrl": "<publicUrl>",
"roomType": "Living Room",
"designStyle": "Modern"
}'
# → { "jobId": "...", "status": "completed",
# "outputImageUrl": "https://...", "creditsCharged": 1 }Endpoints
Three operations, one input shape
All three take the same imageUrl and return an output URL plus a job id. Swapping one for another is a one-line change.
/virtual-stagingVirtual staging
Furnish an empty room in a chosen style, interior or exterior.
- Cost
- 1 credit
- Options
- roomType · designStyle · designType · prompt · aiIntervention
/furniture-removalFurniture removal
Strip an occupied room back to empty walls and floors, ready to restage.
- Cost
- 1 credit
- Options
- prompt (defaults to removing all furniture)
/upscaleUpscaling
Raise resolution on a finished image before it goes to the MLS.
- Cost
- 3 credits
- Options
- scaleFactor — 2 (default) or 4
Full parameter tables, job history and pagination are in the reference docs.
How it works
Upload, call, collect
Image inputs live on Pictastic storage, so every job starts with a free presigned upload.
- 1
Get a presigned upload URL
Ask for as many slots as you need, then PUT your image bytes straight to storage. This call is free — no credits.
- 2
Call the endpoint you want
Pass the returned publicUrl as imageUrl. Staging, removal and upscaling all take the same input shape.
- 3
Read the output URL
The response carries outputImageUrl and a downloadUrl, plus a jobId you can re-fetch later from the jobs history.
Auth and billing
One header, and no charge for our failures
Create a key in the dashboard, send it on every request, and check your balance whenever you like.
Authentication
Either header works — pick whichever your HTTP client makes easier.
- Authorization: Bearer <key>
- x-api-key: <key>
When it fails
- 401
- Invalid key
- 402
- Not enough credits
- 403
- API access not active
Credits
Charged per successful image, drawn from the same balance you use in the app.
- Virtual staging
- 1 credit
- Furniture removal
- 1 credit
- Upscaling
- 3 credits
- Presigned upload URLs
- Free
Failed jobs are refunded automatically. If processing does not complete, the credit goes back to your balance.
curl -H "Authorization: Bearer $PICTASTIC_API_KEY" \
"https://app.pictastic.ai/api/v1/credits"
# → { "totalCredits": 100, "usedCredits": 12, "remainingCredits": 88 }API questions
Can I send an image from my own S3 bucket or CDN?
Not directly. Image inputs have to live on Pictastic storage, so the flow is: request a presigned upload URL, PUT your bytes to it, then pass the returned publicUrl as imageUrl. Requesting presigned URLs is free and you can ask for several at once, so batching stays cheap.
What does each call cost?
Virtual staging and furniture removal are 1 credit per successful image. Upscaling is 3 credits. Requesting presigned upload URLs is free. If processing fails, the credit is refunded automatically — you are not billed for our errors.
How do I authenticate?
Create a key in the API dashboard, then send it on every request as either an Authorization: Bearer header or an x-api-key header. Either works. You will get a 401 for an invalid key, a 403 if API access is not active on your account, and a 402 if you are out of credits.
Is the response synchronous?
The POST returns a job with a status and, when it has finished, an outputImageUrl and a downloadUrl. Every call also records a jobId, so you can re-fetch a single job or page through your history per endpoint later rather than holding state yourself.
Do API credits work like credits in the app?
They draw on the same balance, so credits you already own are usable from either side. Check the balance any time with a GET to /credits, which returns your total, used and remaining counts.
Start staging by API today
Create a key in the dashboard and your first request can go out in the next few minutes.
Presigned uploads are free — you only spend credits on finished images.