/t/ and the file path. The first request renders and caches the result, the rest are served from cache.
GET /t/photos/portrait.jpg.
Auth: public, rate limited. For URLs that cannot be guessed or edited, use signed URLs, which are self-hosted only.
On Cloud the same path sits behind a bucket prefix, /b/{bucketId}/t/.... See your base URL. Everything after it is identical.
Recipes
Image parameters
g_face uses saliency detection, not face detection. It keeps whatever region scores as most interesting, which on a portrait is normally the face.
Corner radius is clamped to half the shorter side. Cut corners are transparent, so pair r with f_png, f_webp or f_avif, or add b to fill them and stay on JPEG.
Limited crop modes
c_limit is the same as c_fit, which never enlarges. lpad and mpad place the image by g (north, south, east, west, default center) and fill with b.
Automatic background
b_auto picks the fill color from the image, so a padded product shot does not end up with a jarring white band. Use it with c_pad.
For gradients,
number is 2 (default) or 4. With 2 colors, direction is horizontal (default), vertical, diagonal_desc or diagonal_asc. With 4, each corner gets its own color. palette_ limits the result to the listed colors, as CSS names or hex without rgb:, for example b_auto:predominant:palette_white_black_navy.
b_blurred pads with a blurred copy of the image itself, the usual way to fit a portrait into a landscape slot: c_pad,w_1200,h_630,b_blurred:400:-20. Intensity runs 1 to 2000 (default 100), brightness -300 to 100 (default 0).
Default image
d_placeholders:avatar.png serves placeholders/avatar.png when the requested file does not exist, with the rest of the transformation applied, so w_96,h_96,c_fill,d_avatar.png/users/42.jpg always returns a 96 px image. The response carries X-Default-Image and Cache-Control: private, max-age=60, so no shared cache pins the placeholder once the real file is uploaded. If the default image is missing too, the answer is 404.
Self-hosted only for now. On Cloud
d_ is accepted and ignored: a missing file still answers 404.Effects
Effects run after resizing, so they work on the delivered pixels, and before the overlay, so a watermark is left untouched. Put several in one segment and they apply left to right:e_negate,e_brightness:30 and e_brightness:30,e_negate give different results.
Colors take
rgb:<hex> with 3, 4, 6 or 8 digits, or a CSS color name. e_tint takes the hex without rgb:, as Cloudinary does.
Quality
Leaveq unset and each format gets the quality it deserves: 80 for AVIF, 85 for WebP, 90 for JPEG, 100 for PNG. Large files shift a few points, clamped to 70-95. An explicit 1 to 100 is used as given.
Formats
Omitf and Openinary picks the best format the browser accepts, in order AVIF, WebP, then JPEG or PNG. f_auto goes further: it encodes every supported candidate, compares byte counts and serves the smallest, at the cost of a slower first request.
Input: JPEG, PNG, WebP, AVIF, GIF (first frame), HEIC/HEIF (converted to JPEG at upload), PSD (layers composited)
Output: AVIF, WebP, JPEG, PNG, GIF
Video parameters
A bare
/t/clip.mp4 streams the original untouched. Add q_auto to opt into the default encode without choosing a CRF.
The default q_60 favors encoding speed over file size, which is what makes large sources viable. Raise it when output quality matters more than job time.
Videos also apply fixed limits: 720p maximum when you request no explicit w or h, a 200 MB cap on the source, and a 5 minute encode timeout. See video processing.
Input: MP4 (H.264/H.265), MOV, WebM (VP8/VP9) · Output: MP4, WebM, MOV
Pass-through formats
Audio and 3D files are stored and delivered, never transformed. Request them with no transformation segment and the stored bytes come back untouched, as inGET /t/audio/podcast.mp3 or GET /t/models/duck.glb.
Adding parameters to one returns
400 rather than the original, so a “resized” variant that is really the untouched file never gets cached.
Response
Returns the binary content, withCache-Control set for browser caching and X-Content-Type-Options: nosniff. The content type comes from the extension via the shared media table, never from sniffing the body, which is why uploads are validated by content in the first place.
Waiting on a 202
A202 means the variant is being generated and nothing is wrong. It always says when to come back:
The simplest client honours
Retry-After and requests the same URL again until it gets a 200. Every retry returns a fresh estimate, sharper as the job advances: once a video encode has started, the estimate comes from its own measured speed. Retrying sooner than Retry-After is harmless but cannot make the transformation finish faster.
Gotchas
Only the short parameter keys work. The parser splits a segment at its first underscore, sothumbnail_time_5 reads as the key thumbnail, fails, and the segment is then treated as a folder name, ending in a 404.
Video URLs accept the image-only parameters a, ar, r, b, e, o, co and bo and silently ignore them. The URL still works, the output is just re-encoded without them.
For compatibility with Cloudinary-shaped URLs, c also accepts fill_pad (as fill), limit (as fit) and thumb (as crop), and g also accepts c, n, s, e, w, faces, face_center, faces_center, north_center and south_center.
Related
Authenticated Transform
Signed URLs that cannot be guessed or edited.
Upload Files
Upload media and pre-generate variants.
Video Status
Poll a queued video transformation.
Automatic Format Selection
How the default format and quality are chosen.