Skip to content
Pictastic.ai

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

bash
# 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.

POST/virtual-staging

Virtual staging

Furnish an empty room in a chosen style, interior or exterior.

Cost
1 credit
Options
roomType · designStyle · designType · prompt · aiIntervention
POST/furniture-removal

Furniture removal

Strip an occupied room back to empty walls and floors, ready to restage.

Cost
1 credit
Options
prompt (defaults to removing all furniture)
POST/upscale

Upscaling

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. 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. 2

    Call the endpoint you want

    Pass the returned publicUrl as imageUrl. Staging, removal and upscaling all take the same input shape.

  3. 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.

check 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.