PropertyPixel Docs

Start a signed upload

POST
/uploads

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.

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 go into.

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
files*array<>
Items1 <= items <= 25

Response Body

Start a signed upload

application/json
  1. response
object*string
id*string

Pass to POST /uploads/{id}/complete.

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
expires_at*string
Match^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
Formatdate-time
files*array<>
failed*array<>

Files rejected before upload (type or size).

curl -X POST "https://example.com/uploads" \  -H "Content-Type: application/json" \  -d '{    "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9",    "files": [      {        "filename": "string",        "content_type": "string",        "size": 1      }    ]  }'
{  "object": "upload",  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "expires_at": "2019-08-24T14:15:22Z",  "files": [    {      "filename": "string",      "upload_url": "http://example.com",      "method": "PUT",      "headers": {        "property1": "string",        "property2": "string"      },      "storage_path": "string"    }  ],  "failed": [    {      "filename": "string",      "error": "string"    }  ]}