PropertyPixel Docs
API referenceRecommendations

Get edit recommendations

POST
/recommendations

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.

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
photo_ids?array<>

The photos to use. Get IDs from get_project. Alternatively pass project_id with all_photos: true.

Items1 <= items <= 100
project_id?string

The project the photos belong to. Required with all_photos; with photo_ids it must match their project.

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
all_photos?boolean

Use every photo in project_id instead of listing photo_ids.

Response Body

Get edit recommendations

application/json
  1. response
object*string
recommendations*array<>
pending_photo_ids*array<>

Photos still being analysed. Call again after poll_after_ms.

skipped_photo_ids*array<>

Photos with no Recommendation that could not be queued now (daily analysis limit reached, or the photo is not in a project).

poll_after_ms*integer

Wait this long before calling again; 0 when nothing is pending.

curl -X POST "https://example.com/recommendations" \  -H "Content-Type: application/json" \  -d '{}'
{  "object": "recommendation_list",  "recommendations": [    {      "object": "recommendation",      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "photo_id": "50c42bd2-615e-4fec-a325-0e5c4d3d73d3",      "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9",      "status": "pending",      "enhancement_types": [        "string"      ],      "room_type": "string",      "summary": "string",      "job_id": "453bd7d7-5355-4d6d-a38e-d9e7eb218c3f",      "created_at": "2019-08-24T14:15:22Z"    }  ],  "pending_photo_ids": [    "860782d6-245f-4833-94ab-e4e45d6a33d5"  ],  "skipped_photo_ids": [    "0e6faf33-e00e-4d7f-9204-61573b848f33"  ],  "poll_after_ms": 0}

Create a video POST

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.

Apply recommendations POST

Run ready Recommendations from get_recommendations as enhancement jobs: one job per photo with all its suggested edits. Costs 100 credits per Recommendation. Only status ready can be applied. Spends credits in two steps. Call without quote_id first: you get a quote 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 (valid 10 minutes). Results are asynchronous: poll get_job_status with the returned job IDs, waiting poll_after_ms between calls. 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.