Documentation Index
Fetch the complete documentation index at: https://docs.fotolabs.co/llms.txt
Use this file to discover all available pages before exploring further.
Prerequisites
- A Fotolabs account on an Essential or Ultimate plan
- Your API key from the Fotolabs dashboard
1. Create a project
curl -X POST https://api.fotolabs.co/v1/projects \
-H "Authorization: Bearer fl_<key>" \
-H "Content-Type: application/json" \
-d '{ "name": "233 Broadway, New York, NY", "templateId": "original" }'
{
"projectId": "ca5f09f7-6838-459c-ac0f-7be03c60de24",
"name": "233 Broadway, New York, NY"
}
Save the projectId — you’ll use it in every subsequent call.
2. Upload images
Call this once per image. Supported formats: JPEG, PNG, NEF, CR2, CR3, ARW, DNG, ORF, RW2, RAF, and more.
curl -X POST https://api.fotolabs.co/v1/images/upload-url \
-H "Authorization: Bearer fl_<key>" \
-H "Content-Type: application/json" \
-d '{ "filename": "Z6A_0235.NEF", "projectId": "ca5f09f7-..." }'
{
"imageId": "f3e088d1-33a5-4227-a2f6-c4f75617f847",
"uploadUrl": "https://fotolabs-images-prod.s3.amazonaws.com/...",
"originalImageUrl": "https://cdn.fotolabs.co/...",
"expiresAt": "2026-05-09T20:00:00.000Z"
}
Then PUT the file directly to S3 — no auth header needed:
curl -X PUT "<uploadUrl>" \
-H "Content-Type: image/x-nikon-nef" \
--data-binary @Z6A_0235.NEF
Repeat for every photo in the listing.
3. Process the project
One call enqueues all images. HDR brackets are detected automatically from EXIF timestamps and exposure values — just upload everything flat.
curl -X POST https://api.fotolabs.co/v1/projects/ca5f09f7-.../process \
-H "Authorization: Bearer fl_<key>" \
-H "Content-Type: application/json" \
-d '{ "templateId": "original", "autoLevel": true }'
{
"jobs": [
{ "jobId": "aaa-...", "type": "hdr", "imageIds": ["aaa-...", "bbb-...", "ccc-..."] },
{ "jobId": "ddd-...", "type": "single", "imageIds": ["ddd-..."] }
]
}
4. Poll for results
Processing takes 60–120 seconds per job. Poll the project until status is completed.
curl https://api.fotolabs.co/v1/projects/ca5f09f7-... \
-H "Authorization: Bearer fl_<key>"
{
"projectId": "ca5f09f7-...",
"status": "completed",
"images": [
{
"imageId": "aaa-...",
"status": "completed",
"resultImageUrl": "https://cdn.fotolabs.co/.../result/aaa-....jpg",
"originalImageUrl": "https://cdn.fotolabs.co/...",
"errorMessage": null,
"createdAt": "2026-05-09T18:00:48.421Z",
"updatedAt": "2026-05-09T18:06:00.240Z"
}
]
}
Download each resultImageUrl — that’s your processed JPEG.
Next steps
All endpoints
Full parameter reference and error codes.
Enhancement styles
Twilight, virtual staging, and custom change request notes.