Create a video
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.
AuthorizationBearer <token>An API key from Settings → Developers (pp_live_…), or an OAuth access token.
Idempotency-Key?stringA 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.
length <= 255application/json- body
project_id*stringThe project the photos belong to.
^([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)$uuidphoto_ids*array<>Photos in playback order, 1–9. One photo makes a short clip; several are joined into a Listing Tour with crossfades.
1 <= items <= 9clip_seconds?VideoClipSecondsSeconds of motion per photo (2, 3, 4, 5). Default 3.
3aspect_ratio?VideoAspectRatioOutput shape. Default "auto", which follows the first photo.
"auto""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?stringThe id of a quote the user confirmed. Omit it to get a quote first; nothing is spent without one.
^([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)$uuidauto_confirm?booleanREST 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.
Create a video
application/json- response
object*stringjobs*array<>failed*array<>credits_spent*integerpoll_after_ms*integerSuggested 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}