PropertyPixel Docs

Create a video

POST
/videos

Turn listing photos into a video. One photo makes a Photo to Video clip; 2–9 photos make a Listing Tour, in the order given. Costs 400 credits per photo.

Defaults: clip_seconds 3, aspect_ratio "auto"; each photo uses its original unless versions names an enhanced result.

Spends credits in two steps. Call without quote_id first: you get a quote (cost, balance after, warnings) and nothing is spent. Show the cost to the user and wait for a yes, then call again with the same arguments plus quote_id. The quote lasts 10 minutes and only matches identical arguments.

Results are asynchronous: this returns job IDs right away (status pending). Poll get_job_status with the job IDs, waiting poll_after_ms between calls, until each job is completed or failed. Failed jobs are refunded automatically. Videos take a few minutes.

Requires a connection with edit access. Spends credits. Without quote_id it returns 409 quote_required with a quote and spends nothing. Resend with quote_id to run, or send auto_confirm: true to skip the quote.

Authorization

headerAuthorizationBearer <token>

An API key from Settings → Developers (pp_live_…), or an OAuth access token.

Header Parameters

Idempotency-Key?string

A unique key (for example a UUID) that makes retries safe. A retry with the same key and body returns the stored response; the same key with a different body returns 422. Keys last 24 hours.

Lengthlength <= 255

Request Body

application/json
  1. body
project_id*string

The project the photos belong to.

Match^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Formatuuid
photo_ids*array<>

Photos in playback order, 1–9. One photo makes a short clip; several are joined into a Listing Tour with crossfades.

Items1 <= items <= 9
clip_seconds?VideoClipSeconds

Seconds of motion per photo (2, 3, 4, 5). Default 3.

Default3
aspect_ratio?VideoAspectRatio

Output shape. Default "auto", which follows the first photo.

Default"auto"
Value in"auto""16:9""9:16""1:1"
versions?

Edit on top of a previous result instead of the original: map of photo_id → job_id of a completed job on that photo. Photos not listed use the original.

quote_id?string

The id of a quote the user confirmed. Omit it to get a quote first; nothing is spent without one.

Match^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Formatuuid
auto_confirm?boolean

REST with a personal API key only. Skip the quote step and spend immediately. For trusted scripts; ignored for app (OAuth) connections, which always get a quote.

Response Body

Create a video

application/json
  1. response
object*string
jobs*array<>
failed*array<>
credits_spent*integer
poll_after_ms*integer

Suggested wait before calling get_job_status.

curl -X POST "https://example.com/videos" \  -H "Content-Type: application/json" \  -d '{    "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9",    "photo_ids": [      "68e4fc1a-5272-4c7c-88ae-00ad654f19af"    ]  }'
{  "object": "job_batch",  "jobs": [    {      "object": "job",      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "kind": "enhancement",      "status": "pending",      "progress": 0,      "stage": "string",      "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9",      "photo_id": "50c42bd2-615e-4fec-a325-0e5c4d3d73d3",      "photo_ids": [        "68e4fc1a-5272-4c7c-88ae-00ad654f19af"      ],      "source_job_id": "82ec7aa8-71eb-48cf-81de-c1b18e40e554",      "enhancement_types": [        "string"      ],      "design_style": "string",      "ultra_hd": true,      "credits": 0,      "picked": true,      "watermarked": true,      "result": {        "url": "http://example.com",        "expires_at": "2019-08-24T14:15:22Z"      },      "thumbnail": {        "url": "http://example.com",        "expires_at": "2019-08-24T14:15:22Z"      },      "error": {        "code": "string",        "message": "string"      },      "created_at": "2019-08-24T14:15:22Z",      "completed_at": "2019-08-24T14:15:22Z"    }  ],  "failed": [    {      "photo_id": "string",      "error": "string"    }  ],  "credits_spent": 0,  "poll_after_ms": 0}

Virtually stage photos POST

Virtually stage rooms: furnish empty rooms or restyle furnished ones in a design_style. Costs 100 credits per variation per photo, plus 100 per variation with ultra_hd. Select photos with photo_ids, or project_id + all_photos: true. Defaults: variations 1, ultra_hd false; staging starts from the original photo unless versions names a prior result (e.g. a decluttered one). Spends credits in two steps. Call without quote_id first: you get a quote (cost, balance after, warnings) and nothing is spent. Show the cost to the user and wait for a yes, then call again with the same arguments plus quote_id. The quote lasts 10 minutes and only matches identical arguments. Results are asynchronous: this returns job IDs right away (status pending). Poll get_job_status with the job IDs, waiting poll_after_ms between calls, until each job is completed or failed. Failed jobs are refunded automatically. Requires a connection with edit access. Spends credits. Without `quote_id` it returns 409 `quote_required` with a quote and spends nothing. Resend with `quote_id` to run, or send `auto_confirm: true` to skip the quote.

Get edit recommendations POST

Free. Ask PropertyPixel's AI which corrective edits each photo needs (e.g. improve_lighting, clean_and_tidy, straighten_and_reframe). Select photos with photo_ids, or project_id + all_photos: true. Returns the Recommendations that already exist and starts analysis for photos that have none. Analysis is asynchronous: photos in pending_photo_ids are still being analysed, so call again after poll_after_ms to see them. A daily analysis limit applies; photos over it are listed in skipped_photo_ids. To run the suggestions, pass the ready Recommendation IDs to apply_recommendations (paid). Requires a connection with edit access.