INTEGRITY Cloudflare Docs

Route to private services from Workers

This example shows how to use Workers VPC to create a centralized gateway that routes requests based on URL paths, provides authentication and rate limiting, and load balances across internal services.

Prerequisites

1. Create the VPC Services

First, create services for your internal APIs using hostnames:

# Create user service
npx wrangler vpc service create user-service \
  --type http \
  --tunnel-id <YOUR_TUNNEL_ID> \
  --hostname user-api.internal.example.com

# Create orders service
npx wrangler vpc service create order-service \
  --type http \
  --tunnel-id <YOUR_TUNNEL_ID> \
  --hostname orders-api.internal.example.com

Note the service IDs returned for the next step.

2. Configure your Worker

Update your Wrangler configuration file:

{
	"$schema": "./node_modules/wrangler/config-schema.json",
	"name": "api-gateway",
	"main": "src/index.js",
	// Set this to today's date
	"compatibility_date": "2026-08-28",
	"vpc_services": [
		{
			"binding": "USER_SERVICE",
			"service_id": "<YOUR_USER_SERVICE_ID>"
		},
		{
			"binding": "ORDER_SERVICE",
			"service_id": "<YOUR_ORDER_SERVICE_ID>"
		}
	]
}
"$schema" = "./node_modules/wrangler/config-schema.json"
name = "api-gateway"
main = "src/index.js"
# Set this to today's date
compatibility_date = "2026-08-28"

[[vpc_services]]
binding = "USER_SERVICE"
service_id = "<YOUR_USER_SERVICE_ID>"

[[vpc_services]]
binding = "ORDER_SERVICE"
service_id = "<YOUR_ORDER_SERVICE_ID>"

3. Implement the Worker

In your Workers code, use the VPC Service bindings to route requests to the appropriate services:

index.js
export default {
	async fetch(request, env, ctx) {
		const url = new URL(request.url);

		// Route to internal services
		if (url.pathname.startsWith('/api/users')) {
			const response = await env.USER_SERVICE.fetch("https://user-api.internal.example.com" + url.pathname);
			return response;
		} else if (url.pathname.startsWith('/api/orders')) {
			const response = await env.ORDER_SERVICE.fetch("https://orders-api.internal.example.com" + url.pathname);
			return response;
		}

		return new Response('Not Found', { status: 404 });
	},
};

4. Deploy and test

Now, you can deploy and test your Worker:

npx wrangler deploy
# Test user service requests
curl https://api-gateway.workers.dev/api/users

# Test orders service requests
curl https://api-gateway.workers.dev/api/orders

Next steps