Skip to main content
POST
/
v1
/
images
/
upload-url
Get a presigned upload URL
curl --request POST \
  --url https://api.fotolabs.co/v1/images/upload-url \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "filename": "Z6A_0235.NEF",
  "projectId": "ca5f09f7-6838-459c-ac0f-7be03c60de24"
}
'
{
  "imageId": "f3e088d1-33a5-4227-a2f6-c4f75617f847",
  "uploadUrl": "https://fotolabs-images-staging.s3.amazonaws.com/...",
  "originalImageUrl": "https://d1i1ga8jkrbik1.cloudfront.net/...",
  "expiresAt": "2026-05-09T19:00:00.000Z"
}

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.

Authorizations

Authorization
string
header
required

API key with fl_ prefix, issued from the Fotolabs dashboard

Body

application/json
filename
string
required

Original filename including extension. Determines file type and S3 Content-Type.

Example:

"Z6A_0235.NEF"

projectId
string<uuid>
required

Project this image belongs to. Must be in pending status.

Example:

"ca5f09f7-6838-459c-ac0f-7be03c60de24"

Response

Presigned URL ready. Upload the file within 1 hour.

imageId
string<uuid>
required
Example:

"f3e088d1-33a5-4227-a2f6-c4f75617f847"

uploadUrl
string<uri>
required

Presigned S3 PUT URL. Upload the file here with the matching Content-Type. Valid for 1 hour.

Example:

"https://fotolabs-images-staging.s3.amazonaws.com/..."

originalImageUrl
string<uri>
required

CloudFront URL where the original will be accessible after upload.

Example:

"https://d1i1ga8jkrbik1.cloudfront.net/..."

expiresAt
string<date-time>
required

When the presigned URL expires.

Example:

"2026-05-09T19:00:00.000Z"