{"name":"PhotDev Agent API","description":"Apply an analog film-inspired filter to a photo in one request.","endpoint":"https://api.phot.dev/v1/develop","method":"POST multipart/form-data","fields":{"file":"image: HEIC, JPEG, PNG, TIFF, WebP, or supported RAW. Send this or image_id, never both","image_id":"reuse an upload kept by an earlier call (X-PhotDev-Image-Id)","lut":"a 3D .cube file; LUT_3D_SIZE 2-65. Replaces film and preset_id rather than layering over them","film":"filter name or a known alias, or auto; default auto","preset_id":"exact variant id from /v1/films/{film}; overrides film","format":"jpeg or heic; default jpeg","quality":"1-100; default 92","strength":"0-1.5; default 1","lift":"0-2 EV compressed-exposure lift; default 0","vignette":"0-2 cos^4 lens falloff; default 0","adjust":"JSON finishing layer: {bright:-1..1, contrast:-1..1, black:0..0.98, white:0..1, curve:[x,y,...] 0-255 pairs, max 32 points, curveSpace:rgb|lab|oklch|hsb, curves:{channel:[x,y,...]} with channels master,r,g,b (rgb), l,a,b (lab), l,c,h (oklch) or h,s,b (hsb)}","darkroom_json":"JSON recipe: stock, process, grain, highlightTransport, lens, print, condition","crop_json":"JSON normalized rectangle {x,y,w,h,ratio} or centered {ratio:'4:5'}; applied after rendering; cropped outputs omit original EXIF","keep":"true retains the upload for reuse through image_id; default false"},"filters":"https://api.phot.dev/v1/filters","film_detail":"https://api.phot.dev/v1/films/{film}","lut":{"endpoint":"https://api.phot.dev/v1/lut","method":"GET","purpose":"bake a look to a 3D .cube for Lightroom or Resolve","query":"film or preset_id, size 17|33, strength, lift, adjust, darkroom_json","note":"needs no photo and spends no quota; pointwise stages only, so lens, condition and print texture are excluded"},"suggest":{"endpoint":"https://api.phot.dev/v1/suggest","method":"POST multipart/form-data","purpose":"rank films for a photo without a full-resolution render","fields":"file or image_id, limit 1-12, preview_size 64-256, include_base64, keep","note":"spends one quota slot; pass keep=true so the follow-up develop reuses the same upload"},"response_headers":["X-PhotDev-Image-Id","X-PhotDev-Preset-Id","X-PhotDev-Film","X-PhotDev-Selection","X-PhotDev-Image-Kept","X-PhotDev-Downscaled"],"mcp":"https://api.phot.dev/mcp","mcp_tools":"MCP endpoint (Streamable HTTP): list_films, get_film, suggest_films, develop_photo, bake_lut; suggest and develop each spend one slot of the same public pool","daily_limit":100,"ip_daily_limit":25,"limit_scope":"shared public transformations per UTC day; both /v1/develop and /v1/suggest spend a slot. ip_daily_limit is one address's share of that pool; exhausting it returns 429 with scope=ip while the shared pool stays open","limits":{"max_upload_mb":120,"max_input_megapixels":60,"max_output_megapixels":12,"oversize_behaviour":"downscaled to max_output_megapixels; the response carries X-PhotDev-Downscaled: <source WxH> -> <rendered WxH>"},"one_line":"curl -sS https://api.phot.dev/v1/develop -F 'file=@photo.jpg' -F 'film=Kodak Portra 400' -o developed.jpg","privacy":"The public API uploads the photo for ephemeral processing; the browser app remains on-device."}