Dispatch the converged garment × presets catalog-shot journey
const url = 'https://example.com/v1/catalog-shots';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"garment_image_asset_refs":["01JUPLOAD0000000000000000A"],"product_title":"Emerald Silk Saree","model_preset_id":"01MODELMODELMODELMODELMO00","background_preset_id":"01BGBGBGBGBGBGBGBGBGBGBG00","shot_preset_id":"01SHOTSHOTSHOTSHOTSHOTSH00"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/v1/catalog-shots \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "garment_image_asset_refs": [ "01JUPLOAD0000000000000000A" ], "product_title": "Emerald Silk Saree", "model_preset_id": "01MODELMODELMODELMODELMO00", "background_preset_id": "01BGBGBGBGBGBGBGBGBGBGBG00", "shot_preset_id": "01SHOTSHOTSHOTSHOTSHOTSH00" }'Dispatch a catalog shot: compose one or more client-owned garment images onto a chosen model + background + shot preset in a single pass. Pass garment asset refs (from POST /v1/uploads) plus the three preset ids from GET /v1/presets (model/background/shot). Portrait is server-pinned; model + quality are optional (quality is gpt-image-family only). Returns 202 immediately with a job_id; poll GET /v1/jobs/{job_id} for the final render — its result artifact carries the signed image URL and echoes the four input refs in meta. Priced as a compose op; refunded automatically on any failure path.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Header Parameters
Section titled “Header Parameters”Request Bodyrequired
Section titled “Request Bodyrequired”POST /v1/catalog-shots — the converged garment × presets journey (TRI-232).
A single flat request that pins the whole catalog shoot: the client-owned garment image asset refs (from POST /v1/uploads / the assets registry) + a product title + three preset ids (model / background / shot, from GET /v1/presets). The gateway derives ownership from the authenticated principal and forwards to studio’s internal catalog-shot dispatch — the caller never supplies client_id/tenant_id.
Portrait is server-pinned (studio fixes aspect_ratio 2:3, the canonical
output shape); the only optional knobs are model (the image-generation
model, forwarded as studio’s image_model) and quality (gpt-image output
tier — a no-op for non-gpt models, which studio’s provider router silently
drops).
object
One or more client-owned product image asset refs (from POST /v1/uploads or the assets registry). Capped server-side at the generation model’s max input images.
Human-readable product title for the shot.
Model preset id (GET /v1/presets?kind=model).
Background preset id (GET /v1/presets?kind=background).
Shot preset id (GET /v1/presets?kind=shot).
Examples
One garment onto a model + background + shot preset
{ "garment_image_asset_refs": [ "01JUPLOAD0000000000000000A" ], "product_title": "Emerald Silk Saree", "model_preset_id": "01MODELMODELMODELMODELMO00", "background_preset_id": "01BGBGBGBGBGBGBGBGBGBGBG00", "shot_preset_id": "01SHOTSHOTSHOTSHOTSHOTSH00"}Responses
Section titled “Responses”Accepted — job queued. Poll /v1/jobs/{job_id} for the result.
Returned synchronously from any POST /v1/{name} (202).
object
26-char ULID — correlates with the row in credit_operations.
Studio’s job status at submit time. Almost always NOT_STARTED in this 202.
Credits deducted from the calling client. Refunded automatically on any failure path.
Example
{ "request_id": "01JREQREQREQREQREQREQREQ00", "job_id": "01JOBJOBJOBJOBJOBJOBJOBJOB0", "status": "NOT_STARTED", "credits_cost": 10}Insufficient credit balance — the request cost exceeds the client’s balance. No job created.
Example
{ "error": { "code": "INSUFFICIENT_BALANCE", "message": "Account balance is below the cost of this request.", "request_id": "01JREQREQREQREQREQREQREQ00" }}Request body failed validation (missing/invalid fields). No credits charged.
Example
{ "error": { "code": "VALIDATION_ERROR", "message": "Request body or parameters failed validation.", "request_id": "01JREQREQREQREQREQREQREQ00" }}Per-credential rate limit exceeded. Retry after a short backoff.
Example
{ "error": { "code": "RATE_LIMITED", "message": "Rate limit exceeded; try again shortly.", "request_id": "01JREQREQREQREQREQREQREQ00" }}