Wedding Projects API
A durable, resumable lifecycle for finishing up to 5,000 selected wedding photographs and delivering one ZIP plus manifest.
Production contract verified · 29 live checks · 2026-08-23Review and preview before processing
Create projects with "workflow_version": 2 to use durable selection, adjustable photographic finishing and selected-only billing. Originals stay private and unmodified. RAW development, generative face retouching and learned editing profiles are not part of this workflow.
| Endpoint | Purpose |
|---|---|
POST /v1/wedding-projects/{id}/assets/{asset}/analyze | Save focus and exposure suggestions. Add ?eyes=true for an optional advisory eye check; unavailable inference is reported explicitly. |
GET /v1/wedding-projects/{id}/review | Review exact/near-duplicate groups, suggested keepers and selected counts. Suggestions never delete photos. |
PATCH /v1/wedding-projects/{id}/review | Send {"asset_ids":["uuid"],"selected":false,"rating":3}. Selection and ratings are locked when processing starts. |
PATCH /v1/wedding-projects/{id}/recipe | Save preset, strength (0–1), exposure (-1.5–1.5 EV), warmth (-30–30), contrast (0.8–1.2), saturation (0.7–1.3), and jpeg_quality (80–98). |
GET /v1/wedding-projects/{id}/assets/{asset}/preview | Free authenticated JPEG sample using the saved recipe. Reference Match requires an uploaded reference. |
GET /v1/wedding-projects/{id}/assets/{asset}/original | Owner-only original download; add ?thumbnail=true for an oriented review image. |
Start reserves credits only for kept photos. Repeated starts and concurrent retries do not reserve twice. The ZIP contains finished selected JPEGs and a manifest recording the recipe, ratings and excluded photos. Failed and unprocessed photos are refunded.
Overview
Base URL: https://api.pixelapi.dev
The API separates project creation, sequential asset uploads, processing, and delivery. Clients should keep the returned project_id, reuse an idempotency_key when retrying creation, and give every file a stable client_asset_id.
| Source limit | 5,000 images per project |
|---|---|
| Accepted formats | JPEG, PNG, WebP |
| Maximum file size | 40 MB per image |
| Minimum dimensions | 64 × 64 pixels |
| Cost | 1 credit per selected source image when processing starts (review workflow v2) |
| Presets | natural_warm, true_color, cinematic_soft, reference_match |
Authentication
Send the API key as a Bearer token. Keep the real key in an environment variable; the example value below is deliberately non-working.
Authorization: Bearer pxapi_demo_not_a_real_key
Create a project
curl -X POST https://api.pixelapi.dev/v1/wedding-projects \
-H "Authorization: Bearer $PIXELAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Ananya and Rohan - final gallery",
"preset": "reference_match",
"workflow_version": 2,
"idempotency_key": "ananya-rohan-final-v1",
"preserve_resolution": true,
"jpeg_quality": 94
}'
| Field | Type | Notes |
|---|---|---|
name | string | 1–160 characters after whitespace normalization. |
preset | string | Defaults to natural_warm. |
idempotency_key | string | Optional, up to 160 characters. Reuse it to recover the same project. |
preserve_resolution | boolean | Defaults to true. |
jpeg_quality | integer | 80–98; default 94. |
webhook_url | string | Optional public HTTPS endpoint. Private, credentialed, or non-HTTPS URLs are rejected. |
{
"project_id": "3bf6b390-...",
"name": "Ananya and Rohan - final gallery",
"preset": "reference_match",
"status": "draft",
"counts": {"total": 0, "completed": 0, "failed": 0,
"cancelled": 0, "remaining": 0},
"progress_percent": 0.0,
"delivery_url": null,
"manifest_url": null
}
List projects
limit may be 1–100. Projects are returned newest first and are scoped to the authenticated account.
Get one project
Poll this endpoint while status is queued or processing. Terminal states are completed, completed_with_errors, cancelled, and failed.
Upload an asset
Use multipart form data. A new asset returns 201. Reusing the same client_asset_id returns the existing asset with 200, which makes an interrupted upload loop safe to resume.
curl -X POST \
"https://api.pixelapi.dev/v1/wedding-projects/$PROJECT_ID/assets" \
-H "Authorization: Bearer $PIXELAPI_API_KEY" \
-F "file=@approved_reference.jpg" \
-F "client_asset_id=approved-reference" \
-F "sort_order=0" \
-F "role=reference"
curl -X POST \
"https://api.pixelapi.dev/v1/wedding-projects/$PROJECT_ID/assets" \
-H "Authorization: Bearer $PIXELAPI_API_KEY" \
-F "[email protected]" \
-F "client_asset_id=source-00001" \
-F "sort_order=0" \
-F "role=source"
Upload only while the project is draft. Reference Match requires a reference asset before start. A new reference becomes the project's current reference.
List assets
Query parameters: offset from 0, limit from 1–500, and optional status. Each asset includes its stable IDs, role, order, dimensions, status, attempt count, output URL, and error message.
Delete a draft asset
Deletion is allowed only while the project is a draft. After processing starts, use cancellation or retry instead of altering the asset list.
Start processing
curl -X POST \
"https://api.pixelapi.dev/v1/wedding-projects/$PROJECT_ID/start" \
-H "Authorization: Bearer $PIXELAPI_API_KEY" \
-H "Content-Type: application/json" -d '{}'
The account must have enough credits for every selected source in workflow v2. Repeating start on an already-started or terminal project returns the current project and does not create a second run.
Cancel
A draft becomes cancelled immediately. An active project records a cancellation request and stops between assets. Credits reserved for unfinished work are refunded according to completed count. Calling cancel on a terminal project is idempotent.
Retry failed assets
Retry is available only after the current run reaches a terminal state. An empty object retries every failed source; provide selected asset UUIDs to retry a subset.
# Retry every failed source
{"asset_ids": null}
# Retry selected failed sources
{"asset_ids": ["5e39f8f9-...", "1ad4794a-..."]}
If there are no matching failed images, the endpoint returns 409 and no credits are deducted.
Manifest and delivery ZIP
The authenticated manifest endpoint works throughout the project. On completion, delivery_url points to the ZIP and manifest_url points to the packaged public manifest. The ZIP contains manifest.json plus ordered JPEGs inside finished/.
Errors and limits
| Status | Meaning |
|---|---|
| 401 / 403 | Authentication missing or rejected. |
| 402 | Insufficient credits to start or retry. |
| 404 | Project or asset does not exist for this account. |
| 409 | Lifecycle conflict: no source/reference, upload after start, early retry, or no failed images. |
| 413 | File exceeds 40 MB or project reached 5,000 sources. |
| 422 | Invalid preset, field, UUID, image, dimensions, or JPEG quality. |