Skip to content
GitHubXDiscord

Route

Routes map URL patterns to Cloudflare Workers, controlling which requests are handled by your Workers.

The most convenient way to create routes is by defining them directly on your Worker.

import { Worker, Zone } from "alchemy/cloudflare";
// Create zone first so it exists for inference
const zone = await Zone("example-zone", {
name: "example.com",
});
const worker = await Worker("api", {
name: "api-worker",
entrypoint: "./src/api.ts",
routes: [
{
pattern: "api.example.com/*", // Zone ID inferred from example.com
},
{
pattern: "admin.example.com/*", // Also inferred from example.com
},
],
});
// Routes are accessible on the worker
console.log(worker.routes); // Array of created Route resources

For more control, you can explicitly specify zone IDs:

import { Worker, Zone } from "alchemy/cloudflare";
const zone = await Zone("example-zone", {
name: "example.com",
});
const worker = await Worker("api", {
name: "api-worker",
entrypoint: "./src/api.ts",
routes: [
{
pattern: "api.example.com/*",
zoneId: zone.id, // Explicit zone ID
},
],
});

You can create and manage Routes independently with the Route resource:

import { Route, Zone, Worker } from "alchemy/cloudflare";
const zone = await Zone("example-zone", {
name: "example.com",
});
const worker = await Worker("api", {
name: "api-worker",
entrypoint: "./src/api.ts",
});
const route = await Route("api-route", {
pattern: "api.example.com/*",
script: worker, // Can use Worker resource directly
zoneId: zone.id,
});

Standalone routes also support automatic zone ID inference:

const route = await Route("auto-route", {
pattern: "api.example.com/*", // Zone ID inferred
script: "my-worker",
});