Complete a signed upload
Finish a signed upload: verifies each stored file (size, type and content) and adds it to the project as a photo. List every file that uploaded; files left out are discarded and their reserved room released. HEIC/HEIF files are converted to JPEG. Returns the new photos and a failed list with a reason per file.
Requires a connection with edit access.
AuthorizationBearer <token>An API key from Settings → Developers (pp_live_…), or an OAuth access token.
id*stringThe upload id from POST /uploads.
^([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)$uuidIdempotency-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 same project_id used to create the upload.
^([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)$uuidfiles*array<>items <= 25Complete a signed upload
application/json- response
object*stringphotos*array<>failed*array<>curl -X POST "https://example.com/uploads/497f6eca-6276-4993-bfeb-53cbbbba6f08/complete" \ -H "Content-Type: application/json" \ -d '{ "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9", "files": [ { "storage_path": "string", "filename": "string", "size": 1, "content_type": "string" } ] }'{ "object": "photo_list", "photos": [ { "object": "photo", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9", "filename": "string", "room_type": "string", "width": 0, "height": 0, "original": { "url": "http://example.com", "expires_at": "2019-08-24T14:15:22Z" }, "thumbnail": { "url": "http://example.com", "expires_at": "2019-08-24T14:15:22Z" }, "created_at": "2019-08-24T14:15:22Z" } ], "failed": [ { "filename": "string", "error": "string" } ]}Start a signed upload POST
Reserve room in a project for up to 25 photos and get one signed URL per file. PUT each file's raw bytes to its upload_url with exactly the returned headers, then call POST /uploads/{id}/complete with the storage_path, filename, size and content_type of every file that uploaded. Files must be JPEG, PNG, WebP, HEIC or HEIF, at most 25 MB each; a project holds at most 100 photos. The reservation expires at expires_at (about 15 minutes); complete before then. Files are stored exactly as sent, except HEIC/HEIF, which is converted to JPEG on completion. Downscale large images yourself (the web app uses a 2048px long edge). Requires a connection with edit access.
Create an upload link POST
Create a private link (with a QR code) the user opens on their phone or computer to add photos to a project, with no login. Use it when the user needs to send photos you can't receive directly, such as photos on their phone. Share the url, or show the QR code, and tell the user the link works for 2 hours. Photos appear in the project as they upload. To follow progress, call get_project and read upload_link.status and upload_link.photos_received until status is done (the user tapped Done), or simply ask the user to tell you when they've finished. Requires a connection with edit access.