Light AIDocs Beta Open Light AI

API reference

POSTCreate a photo upload

POST /v1/projects/{project_id}/photo_uploads: A single-use slot for a front photo larger than a JSON body allows (up to 10 MB, JPEG, PNG or WebP): PUT the bytes to upload_url with their Content-Type within 2 hours, then name the upload in a generation (source.type photo_upload).

POSThttps://api.light-ai.app/v1/projects/{project_id}/photo_uploads

A single-use slot for a front photo larger than a JSON body allows (up to 10 MB, JPEG, PNG or WebP): PUT the bytes to upload_url with their Content-Type within 2 hours, then name the upload in a generation (source.type photo_upload). At most 20 open slots and 100 slots a day per organization (429 photo_uploads_daily). Uploaded originals are working copies: deleted once used or a few hours after an unused slot expires; the generated mockups stay in the project. Test keys get a simulated slot (no upload URL).

Scopemockups:write
CredentialAPI key: Authorization: Bearer lai_live_… (or lai_test_…). Partner keys add Light-AI-Organization.
Test modeWorks with test keys against simulated test objects.

Path parameters#

project_idstringrequired#
The project id (prj_…). Id prefix prj_.

Headers#

Light-AI-Organizationstring#
Partner keys: the connected organization to act for (org_…). Organization keys may omit it. Id prefix org_.
Light-AI-Versionstring#
Pin a dated API version (defaults to the key's version). One of: 2026-11-01.

Response 201#

The upload slot.

idstringrequired#
Id prefix upl_.
objectstringrequired#
Always photo_upload.
livemodebooleanrequired#
false for objects created with a test key.
project_idstringrequired#
Id prefix prj_.
upload_urlstring | nullrequired#
PUT the photo bytes here (Content-Type image/jpeg, image/png or image/webp, at most 10 MB). null in test mode.
methodstringrequired#
Always PUT.
max_bytesintegerrequired#
content_typesstring[]required#
expires_attimestamprequired#
RFC 3339 timestamp (UTC, milliseconds).

Errors#

StatusMeaning
400Bad request. bad_request, test_mode_mismatch, test_mode_unsupported, unsupported_api_version
401Missing or invalid credential. authentication_required, invalid_api_key, api_key_revoked, api_key_expired, api_key_suspended
403Not allowed. insufficient_scope, plan_upgrade_required, organization_paused, organization_off_season, api_disabled, api_access_not_enabled, ip_not_allowed, forbidden
404Not found (also for objects of other organizations and for organizations without an active grant).
409Conflict. stale_state, conflict, idempotency_in_progress, idempotency_scope_mismatch, quote_already_decided, quote_not_current, billing_review_required
413Request bodies are limited to 256 KB.
422Validation failed. idempotency_key_reused
429Rate limited or daily cap reached. See Retry-After and the RateLimit headers. rate_limited, daily_cap_reached
500Unexpected server error. Safe to retry with exponential backoff; quote the Request-Id to support. internal_error
503Temporarily unavailable. Retry with exponential backoff. service_unavailable