Using the Cache API
Use the Cache API to store responses in Cloudflare's cache.
If you want to get started quickly, click on the button below.
This creates a repository in your GitHub account and deploys the application to Cloudflare Workers.
export default {  async fetch(request, env, ctx) {    const cacheUrl = new URL(request.url);
    // Construct the cache key from the cache URL    const cacheKey = new Request(cacheUrl.toString(), request);    const cache = caches.default;
    // Check whether the value is already available in the cache    // if not, you will need to fetch it from origin, and store it in the cache    let response = await cache.match(cacheKey);
    if (!response) {      console.log(        `Response for request url: ${request.url} not present in cache. Fetching and caching request.`,      );      // If not in cache, get it from origin      response = await fetch(request);
      // Must use Response constructor to inherit all of response's fields      response = new Response(response.body, response);
      // Cache API respects Cache-Control headers. Setting s-max-age to 10      // will limit the response to be in cache for 10 seconds max
      // Any changes made to the response here will be reflected in the cached value      response.headers.append("Cache-Control", "s-maxage=10");
      ctx.waitUntil(cache.put(cacheKey, response.clone()));    } else {      console.log(`Cache hit for: ${request.url}.`);    }    return response;  },};interface Env {}export default {  async fetch(request, env, ctx): Promise<Response> {    const cacheUrl = new URL(request.url);
    // Construct the cache key from the cache URL    const cacheKey = new Request(cacheUrl.toString(), request);    const cache = caches.default;
    // Check whether the value is already available in the cache    // if not, you will need to fetch it from origin, and store it in the cache    let response = await cache.match(cacheKey);
    if (!response) {      console.log(        `Response for request url: ${request.url} not present in cache. Fetching and caching request.`,      );      // If not in cache, get it from origin      response = await fetch(request);
      // Must use Response constructor to inherit all of response's fields      response = new Response(response.body, response);
      // Cache API respects Cache-Control headers. Setting s-max-age to 10      // will limit the response to be in cache for 10 seconds max
      // Any changes made to the response here will be reflected in the cached value      response.headers.append("Cache-Control", "s-maxage=10");
      ctx.waitUntil(cache.put(cacheKey, response.clone()));    } else {      console.log(`Cache hit for: ${request.url}.`);    }    return response;  },} satisfies ExportedHandler<Env>;from workers import WorkerEntrypointfrom pyodide.ffi import create_proxyfrom js import Response, Request, URL, caches, fetch
class Default(WorkerEntrypoint):    async def fetch(self, request):        cache_url = request.url
        # Construct the cache key from the cache URL        cache_key = Request.new(cache_url, request)        cache = caches.default
        # Check whether the value is already available in the cache        # if not, you will need to fetch it from origin, and store it in the cache        response = await cache.match(cache_key)
        if response is None:            print(f"Response for request url: {request.url} not present in cache. Fetching and caching request.")            # If not in cache, get it from origin            response = await fetch(request)            # Must use Response constructor to inherit all of response's fields            response = Response.new(response.body, response)
            # Cache API respects Cache-Control headers. Setting s-max-age to 10            # will limit the response to be in cache for 10 seconds s-maxage            # Any changes made to the response here will be reflected in the cached value            response.headers.append("Cache-Control", "s-maxage=10")            self.ctx.waitUntil(create_proxy(cache.put(cache_key, response.clone())))        else:            print(f"Cache hit for: {request.url}.")        return responseimport { Hono } from "hono";import { cache } from "hono/cache";
const app = new Hono();
// We leverage hono built-in cache helper hereapp.get(  "*",  cache({    cacheName: "my-cache",    cacheControl: "max-age=3600", // 1 hour  }),);
// Add a route to handle the request if it's not in cacheapp.get("*", (c) => {  return c.text("Hello from Hono!");});
export default app;Was this helpful?
- Resources
- API
- New to Cloudflare?
- Directory
- Sponsorships
- Open Source
- Support
- Help Center
- System Status
- Compliance
- GDPR
- Company
- cloudflare.com
- Our team
- Careers
- © 2025 Cloudflare, Inc.
- Privacy Policy
- Terms of Use
- Report Security Issues
- Trademark