{"openapi":"3.1.0","info":{"title":"PhotDev API","description":"Apply analog film-inspired filters to photographs. Agents can use POST /v1/develop without an API key; the shared public pool allows 100 transformations per UTC day. Output is capped at 12 megapixels; larger uploads are downscaled and the response carries X-PhotDev-Downscaled.","version":"1.0.0"},"paths":{"/":{"get":{"summary":"Index","operationId":"index__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/health":{"get":{"summary":"Health","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1":{"get":{"summary":"V1 Index","operationId":"v1_index_v1_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/filters":{"get":{"summary":"V1 Filters","operationId":"v1_filters_v1_filters_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/films/{film}":{"get":{"summary":"V1 Film","description":"One film: its variants with preset_ids, plus the box profile if known.","operationId":"v1_film_v1_films__film__get","parameters":[{"name":"film","in":"path","required":true,"schema":{"type":"string","title":"Film"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"description":"No exact or aliased film of that name"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/lut":{"get":{"summary":"V1 Lut","description":"Bake a look to a .cube for Lightroom or Resolve. No photo required.","operationId":"v1_lut_v1_lut_get","parameters":[{"name":"film","in":"query","required":false,"schema":{"type":"string","default":"","title":"Film"}},{"name":"preset_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset Id"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","default":33,"title":"Size"}},{"name":"strength","in":"query","required":false,"schema":{"type":"number","default":1.0,"title":"Strength"}},{"name":"lift","in":"query","required":false,"schema":{"type":"number","default":0.0,"title":"Lift"}},{"name":"adjust","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Adjust"}},{"name":"darkroom_json","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Darkroom Json"}}],"responses":{"200":{"description":"3D .cube LUT of the requested look","content":{"text/plain":{}}},"404":{"description":"No exact or aliased film of that name"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo.heic":{"get":{"summary":"Demo","operationId":"demo_demo_heic_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/presets":{"get":{"summary":"Presets","operationId":"presets_api_presets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/upload":{"post":{"summary":"Upload","operationId":"upload_api_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_api_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/image":{"delete":{"summary":"Delete Image","operationId":"delete_image_api_image_delete","parameters":[{"name":"image_id","in":"query","required":true,"schema":{"type":"string","title":"Image Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/original":{"get":{"summary":"Original","operationId":"original_api_original_get","parameters":[{"name":"image_id","in":"query","required":true,"schema":{"type":"string","title":"Image Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/preview":{"get":{"summary":"Preview","operationId":"preview_api_preview_get","parameters":[{"name":"image_id","in":"query","required":true,"schema":{"type":"string","title":"Image Id"}},{"name":"preset_id","in":"query","required":true,"schema":{"type":"string","title":"Preset Id"}},{"name":"strength","in":"query","required":false,"schema":{"type":"number","default":1.0,"title":"Strength"}},{"name":"lift","in":"query","required":false,"schema":{"type":"number","default":0.0,"title":"Lift"}},{"name":"vignette","in":"query","required":false,"schema":{"type":"number","default":0.0,"title":"Vignette"}},{"name":"full","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Full"}},{"name":"pan","in":"query","required":false,"schema":{"type":"number","default":0.0,"title":"Pan"}},{"name":"tilt","in":"query","required":false,"schema":{"type":"number","default":0.0,"title":"Tilt"}},{"name":"roll","in":"query","required":false,"schema":{"type":"number","default":0.0,"title":"Roll"}},{"name":"halation","in":"query","required":false,"schema":{"type":"number","default":0.0,"title":"Halation"}},{"name":"bloom","in":"query","required":false,"schema":{"type":"number","default":0.0,"title":"Bloom"}},{"name":"ca","in":"query","required":false,"schema":{"type":"number","default":0.0,"title":"Ca"}},{"name":"fringe","in":"query","required":false,"schema":{"type":"number","default":0.0,"title":"Fringe"}},{"name":"compress","in":"query","required":false,"schema":{"type":"number","default":0.0,"title":"Compress"}},{"name":"temp","in":"query","required":false,"schema":{"type":"number","default":0.0,"title":"Temp"}},{"name":"damage","in":"query","required":false,"schema":{"type":"string","default":"off","title":"Damage"}},{"name":"damage_amt","in":"query","required":false,"schema":{"type":"number","default":0.0,"title":"Damage Amt"}},{"name":"dmg_json","in":"query","required":false,"schema":{"type":"string","title":"Dmg Json"}},{"name":"darkroom_json","in":"query","required":false,"schema":{"type":"string","title":"Darkroom Json"}},{"name":"adjust_json","in":"query","required":false,"schema":{"type":"string","title":"Adjust Json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/thumb":{"get":{"summary":"Thumb","operationId":"thumb_api_thumb_get","parameters":[{"name":"image_id","in":"query","required":true,"schema":{"type":"string","title":"Image Id"}},{"name":"preset_id","in":"query","required":true,"schema":{"type":"string","title":"Preset Id"}},{"name":"side","in":"query","required":false,"schema":{"type":"integer","default":320,"title":"Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/suggestions":{"post":{"summary":"Suggestions","description":"Upload once and return scene-ranked film choices with tiny previews.","operationId":"suggestions_api_suggestions_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":6,"title":"Limit"}},{"name":"preview_size","in":"query","required":false,"schema":{"type":"integer","default":96,"title":"Preview Size"}},{"name":"include_base64","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Base64"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_suggestions_api_suggestions_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Suggestions For Image","description":"Rank an image already registered through /api/upload.","operationId":"suggestions_for_image_api_suggestions_get","parameters":[{"name":"image_id","in":"query","required":true,"schema":{"type":"string","title":"Image Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":6,"title":"Limit"}},{"name":"preview_size","in":"query","required":false,"schema":{"type":"integer","default":96,"title":"Preview Size"}},{"name":"include_base64","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Base64"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/autogeo":{"get":{"summary":"Autogeo","operationId":"autogeo_api_autogeo_get","parameters":[{"name":"image_id","in":"query","required":true,"schema":{"type":"string","title":"Image Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/process":{"post":{"summary":"Process","description":"Return the chosen filter applied to the full original as image bytes.","operationId":"process_api_process_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Full-resolution developed image","content":{"image/jpeg":{},"image/heic":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/develop":{"post":{"summary":"V1 Develop","description":"Agent-first one-shot upload → select → full-resolution development.","operationId":"v1_develop_v1_develop_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_v1_develop_v1_develop_post"}}}},"responses":{"200":{"description":"Full-resolution photo with the selected film-inspired filter","content":{"image/jpeg":{},"image/heic":{}}},"404":{"description":"No exact named film in the public catalog"},"429":{"description":"Shared public daily limit exhausted"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/suggest":{"post":{"summary":"V1 Suggest","description":"Rank films for a photo without rendering it at full resolution.\n\nBefore this, the only public way to learn which film suits a photo was to\nspend a full develop on film=auto and read X-PhotDev-Film off the response.\nPair this with keep=true and the follow-up develop reuses the handle, so a\nlook-then-choose flow costs one upload and one decode rather than two.\n\nkeep defaults to false. IMAGES is one shared 12-slot LRU, so retained\npublic uploads sit in the same store the local app uses; a dozen kept\nhandles would evict every in-progress session on the box.","operationId":"v1_suggest_v1_suggest_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_v1_suggest_v1_suggest_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"description":"Unknown image_id; the handle was evicted or never existed"},"429":{"description":"Shared public daily limit exhausted"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/export":{"post":{"summary":"Export","description":"Legacy local-app endpoint: render full resolution and save to Downloads.","operationId":"export_api_export_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_suggestions_api_suggestions_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_suggestions_api_suggestions_post"},"Body_upload_api_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_api_upload_post"},"Body_v1_develop_v1_develop_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"},"lut":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"Lut"},"image_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Id"},"film":{"type":"string","title":"Film","default":"auto"},"preset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset Id"},"format":{"type":"string","title":"Format","default":"jpeg"},"quality":{"type":"integer","title":"Quality","default":92},"strength":{"type":"number","title":"Strength","default":1.0},"lift":{"type":"number","title":"Lift","default":0.0},"vignette":{"type":"number","title":"Vignette","default":0.0},"adjust":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Adjust"},"darkroom_json":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Darkroom Json"},"crop_json":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Crop Json"},"keep":{"type":"boolean","title":"Keep","default":false}},"type":"object","title":"Body_v1_develop_v1_develop_post"},"Body_v1_suggest_v1_suggest_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"},"image_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Id"},"limit":{"type":"integer","title":"Limit","default":6},"preview_size":{"type":"integer","title":"Preview Size","default":96},"include_base64":{"type":"boolean","title":"Include Base64","default":true},"keep":{"type":"boolean","title":"Keep","default":false}},"type":"object","title":"Body_v1_suggest_v1_suggest_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}