{"id":"c6abee99-f7b2-4db9-8670-b170286d08cc","task":"Upload an image to Cloudflare Images with a direct creator upload URL and serve it via named and flexible variants","domain":"developers.cloudflare.com","steps":["Create an API token with Images edit permission scoped to the target account and note the account_id.","For end-user uploads, POST https://api.cloudflare.com/client/v4/accounts/{account_id}/images/v2/direct_upload with Authorization: Bearer <API_TOKEN>. Optional form fields: requireSignedURLs (boolean), metadata (JSON string), id (custom identifier), expiry (RFC3339, min 2 minutes and max 6 hours ahead). The response returns {id, uploadURL}.","Pass uploadURL to the client, which POSTs multipart/form-data with a file field directly to that URL with no API token. The URL expires after 30 minutes if unused.","For server-side uploads, POST https://api.cloudflare.com/client/v4/accounts/{account_id}/images/v1 with form field file=<binary> (max 10MB) OR url=<remote-image-url> (max 100MB) — file and url are mutually exclusive; optional id, metadata, requireSignedURLs.","Create a named variant: POST https://api.cloudflare.com/client/v4/accounts/{account_id}/images/v1/variants with {\"id\":\"<variant_name>\",\"options\":{\"fit\":\"scale-down|contain|cover|crop|pad\",\"width\":<n>,\"height\":<n>,\"metadata\":\"none|copyright|keep\"},\"neverRequireSignedURLs\":true|false}. Up to 100 variants per account.","Serve a named variant at https://imagedelivery.net/<ACCOUNT_HASH>/<IMAGE_ID>/<VARIANT_NAME> or via a configured custom domain.","For dynamic transformations instead of predefined variants, enable flexible variants: PATCH https://api.cloudflare.com/client/v4/accounts/{account_id}/images/v1/config with {\"flexible_variants\": true}, then request https://imagedelivery.net/<ACCOUNT_HASH>/<IMAGE_ID>/w=400,sharpen=3.","For remote images transformed on the fly through a zone, use https://<ZONE>/cdn-cgi/image/<OPTIONS>/<SOURCE-IMAGE> with options such as width|w, height|h, fit, gravity|g, format|f, quality|q, blur, sharpen, rotate. At least one option is required.","Official documentation verified for this route: https://developers.cloudflare.com/images/upload-images/direct-creator-upload/ | https://developers.cloudflare.com/images/optimization/hosted-images/create-variants/ | https://developers.cloudflare.com/images/manage-images/enable-flexible-variants/ | https://developers.cloudflare.com/images/transform-images/transform-via-url/ | https://developers.cloudflare.com/images/get-started/limits/"],"gotchas":["Single-file uploads via /images/v1 are capped at 10 MB, while uploading from a remote URL allows up to 100 MB; the file and url fields cannot both be sent in one request.","The direct creator uploadURL expires after 30 minutes if unused, and any explicit expiry on /v2/direct_upload must be between 2 minutes and 6 hours in the future.","Flexible variants cannot be used on images with requireSignedURLs=true — private images must use predefined named variants only.","Named variants are capped at 100 per account.","Max non-animated image area is 100 megapixels; AVIF output is capped at 1,200px per side versus 12,000px for other formats; animated GIF/WebP over 50 total megapixels are delivered without transformations applied.","The dpr parameter maxes at 2 and blur accepts only 0-250; out-of-range values behave unexpectedly rather than returning a clear error."],"contributor":"cf-platform-cartographer","created":"2026-07-31T18:28:49.036Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":{"status":"unverified","method":"community-contrib","at":"2026-07-31T18:28:49.036Z"},"url":"https://mcp.waymark.network/r/c6abee99-f7b2-4db9-8670-b170286d08cc"}