Give any agent a film lab in one line.
Upload a photograph, name a film-inspired filter—or let PhotDev choose—and receive the processed full-resolution image. No account. No API key.
PhotDev develops photos with analog film looks — free, no account, no API key. Read https://phot.dev/api/ to learn the API and its MCP server, then add the MCP endpoint https://api.phot.dev/mcp (Streamable HTTP) to your tools. Use list_films and get_film to resolve exact film names, suggest_films to rank looks for a photo with previews, develop_photo to render the pick, and bake_lut to export a 3D .cube LUT. Discovery tools are free; suggest_films and develop_photo each spend one slot of a shared pool of 100 transformations per UTC day. Pass keep=true and reuse the returned image_id to iterate on an upload instead of re-sending it.
curl -sS https://api.phot.dev/v1/develop \ -F 'file=@photo.jpg' \ -F 'film=Kodak Portra 400' \ -o developed.jpg
Crop an image
Add -F 'crop_json={"ratio":"4:5"}' for a centered crop, or pass a normalized rectangle: {"x":0.1,"y":0.1,"w":0.8,"h":0.8,"ratio":"Free"}. Coordinates refer to the orientation-corrected image, with x and y at the top-left corner.
Ratios: Free, Original, 1:1, 4:3, 3:4, 4:5, 5:4, 3:2, 2:3, 16:9, 9:16. With coordinates, the rectangle defines the crop and the ratio trims it to match. An explicit full-frame rectangle keeps the full image, matching the editor.
The API crops after film processing. It preserves the retained original for later requests, omits original EXIF from crop responses, and rejects invalid rectangles with 422 before decoding. Existing resolution limits still apply. Crops do not belong in color LUTs or film presets.
Teach an agent
To apply a film look, POST the image to https://api.phot.dev/v1/develop as multipart field file, set film to an exact filter name or auto, and save the binary response.
MCP server
PhotDev speaks MCP natively. Point any remote-capable client at https://api.phot.dev/mcp (Streamable HTTP, stateless, no account) and the whole contract becomes tools:
Free discovery
list_films, get_film and bake_lut resolve exact film names and preset IDs, and bake 3D .cube LUTs, without spending quota.
Suggest, then develop
suggest_films ranks films with previews, develop_photo renders the pick. Each spends one slot of the same daily pool as the REST API; keep=true lets the follow-up reuse the upload.
claude mcp add --transport http photdev https://api.phot.dev/mcp
Contract
- POST
https://api.phot.dev/v1/develop- file
- Required multipart image. Maximum 120 MB.
- film
- Exact name from
/v1/filters, orauto. Defaults toauto. - format
jpegorheic. Defaults tojpeg.- quality
- 1–100. Defaults to 92.
- strength
- 0–1.5. Defaults to 1.
- response
- Binary image at the original oriented dimensions.
Two useful modes
Exact film
Use a name from the catalog. Unknown names fail instead of silently substituting another stock.
-F 'film=Fuji FP-100c Negative'Automatic
PhotDev inspects tone, saturation, skin-like hues, sky, foliage, and clipping before selecting a restrained candidate.
-F 'film=auto'Rate limit
The free public pool allows 100 transformations per UTC day, shared globally. Discovery endpoints do not consume the quota.
Every image response includes RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset. Exhausted requests return HTTP 429. The counter resets at 00:00 UTC.
Privacy
The API uploads the source to an isolated Cloudflare Container, processes it ephemerally, returns the result, and removes the one-shot upload.
Prefer the browser app at phot.dev when local-only processing matters: the browser version keeps photos on-device. The API is an explicit opt-in convenience for agents and automations.
Agent-readable
Machine contract ↗
Compact JSON with the endpoint, fields, quota, privacy, and one-line example.
Filter catalog ↗
Exact accepted names, medium, maker, and stable preset IDs.
llms.txt
The shortest context for language models discovering PhotDev.
OpenAPI
Interactive schema for the complete authenticated and public API.