Cloudflare Images adds AVIF, blur controls, and Stream bundles
Cloudflare Images has been live for two months, and the usage numbers are already substantial: more than 70 million images delivered per day on average in the week of November 5 to 12, and over 1.5 million images uploaded so far. The team is now rolling out the most-requested features: AVIF encoding, blur support for variants, a path to serving images from custom domains, and new bundled pricing with Cloudflare Stream.
AVIF delivery without code changes
AVIF support, previously added to Image Resizing, is now available in Cloudflare Images. The format combines the HEIF ISO standard with the royalty-free AV1 codec from Mozilla, Xiph, Google, Cisco, and others. Compared with older formats like JPEG, WebP, JPEG 2000, and JPEG XR, AVIF offers better compression and image quality by a wide margin. Global browser support currently sits at nearly 70% across Chrome and Firefox.
Image delivery through the managed imagedelivery.net domain uses Cloudflare Workers. The request logic inspects the HTTP Accept header to decide whether to serve AVIF, WebP, or JPEG:
const WEBP_ACCEPT_HEADER = /image\/webp/i;
const AVIF_ACCEPT_HEADER = /image\/avif/i;
addEventListener("fetch", (event) => {
event.respondWith(handleRequest(event));
});
async function handleRequest(event) {
const request = event.request;
const url = new URL(request.url);
const headers = new Headers(request.headers);
const accept = headers.get("accept");
let format = undefined;
if (WEBP_ACCEPT_HEADER.test(accept)) {
format = "webp";
}
if (AVIF_ACCEPT_HEADER.test(accept)) {
format = "avif";
}
const resizingReq = new Request(url, {
headers,
cf: {
image: { ..., format },
},
});
return fetch(resizingReq);
}
If the processed image is already in the Cloudflare cache, it is served from there; otherwise, it is resized, transformed, and cached. Clients without AVIF support are served WebP or JPEG. The key benefit for existing Cloudflare Images customers is that no code changes are required, although conversions currently happen at request time. The team notes that upload-time conversion will follow later. Since AVIF transformation is compute-intensive, the format decision is balanced against file-size gains.
Blur for paid-content previews
Blur is now supported in both the URL format and through Cloudflare Workers. For Cloudflare Images, blur can be defined as a variant property through the variant API:
curl -X POST "https://api.cloudflare.com/client/v4/accounts/9a7806061c88ada191ed06f989cc3dac/images/v1/variants" \
-H "Authorization: Bearer <api_token>" \
-H "Content-Type: application/json" \
--data '{"id":"blur","options":{"metadata":"none","blur":20},"neverRequireSignedURLs":true}'
One intended pattern is for content that requires an access token. An image can be uploaded as a private asset:
curl -X POST "https://api.cloudflare.com/client/v4/accounts/9a7806061c88ada191ed06f989cc3dac/images/v1" \
-H "Authorization: Bearer <api_token>"
--form 'file=@./<file_name>' \
--form 'requireSignedURLs=true'
A variant configured with blur can be fetched without a signature, providing a preview:
Access to the unblurred image requires a valid signed URL:
Combining blurred variants with signed URLs gives content publishers a lightweight way to gate premium material. The blur variant option will be available in the Cloudflare dashboard soon.
Serving images from custom domains
Customers who want to serve images from their own domains can do so now with a Worker that redirects to imagedelivery.net:
const IMAGE_DELIVERY_HOST = "https://imagedelivery.net";
addEventListener("fetch", async (event) => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
const url = new URL(request.url);
const { pathname, search } = url;
const destinationURL = IMAGE_DELIVERY_HOST + pathname + search;
return fetch(new Request(destinationURL));
}
The script assumes the same URL format as standard Cloudflare Images URLs:
https://<customdomain.net>/<encoded account id>/<image id>/<variant name>
Workers can be customized to map paths like /images/, infer account IDs or variant names, or fully map custom URLs to Cloudflare Images. For those who prefer not to manage a Worker, Cloudflare will add native support for the following format before the holidays, available on all customer domains under the same account with an active Images subscription:
https://<customdomain.net>/cdn-cgi/imagedelivery/<encrypted_account_id>/<_image_id>/<variant_name>
Combined Images and Stream pricing
To simplify purchasing for platforms that need both images and video, Cloudflare has introduced two bundles with Stream.
- Starter bundle at $10 per month, 50% cheaper than the unbundled options: 1,000 stored Stream minutes and 5,000 minutes served, plus 100,000 stored images and 500,000 images served.
- Creator bundle at $50 per month, saving over 60%: 10,000 stored Stream minutes and 50,000 minutes served, plus 500,000 stored images and 1,000,000 images served.
Both bundles become available to all customers at the end of November. Analytics for Cloudflare Images is the next feature on the roadmap, giving customers visibility into image usage across their accounts.



