Docs

Worker bindings

Inspect what your live Worker can use, connect KV, buckets and email, and understand missing values before changing code.

Updated October 18, 2026
On this page
  1. Find the resource behind a binding
  2. Connect several services
  3. Understand readiness
  4. Use a rate limiter
  5. Inspect from the API
  6. Keep the storage models separate

A binding is a resource or value your Worker receives on env. Open Deployments → Bindings to inspect the live release. The config describes the connection; the binding's data and account-level setup are managed separately.

Find the resource behind a binding

BindingConfigure itManage it
Static assetsassets.binding in wrangler configDeploy the asset directory with the release.
Key-valuekv_namespacesOpen the exact namespace in Storage → Key-value.
Object bucketr2_bucketsOpen its folder in Storage → Files.
Emailsend_emailFinish domain and destination setup under account Email.
Cron Triggertriggers.cronsInspect, pause or resume under Schedules.
Rate limiterratelimitsConfigure the key limit and window in wrangler config.
Config valuevarsDeploy config changes, or override the value in Variables.
SecretVariablesSet a runtime or build-and-runtime value with the required name.

The workspace shows live-release bindings, not an undeployed config file or a failed release. A project with no live release has no live binding inventory. A static release has no Worker env.

Connect several services

wrangler.jsonc
{
  "name": "my-app",
  "main": "src/index.js",
  "kv_namespaces": [{ "binding": "CACHE", "id": "cache" }],
  "r2_buckets": [{ "binding": "UPLOADS", "bucket_name": "uploads" }],
  "send_email": [{ "name": "EMAIL" }],
  "triggers": { "crons": ["0 3 * * *"] }
}

Deploy the config with your supported hand-written Worker, then check Bindings. Existing data is not copied from Cloudflare. Set secrets separately and verify email setup before expecting delivery. See the Cloudflare compatibility matrix for the supported runtime and binding differences.

Understand readiness

Ready means the resource is connected; it does not prove your application has useful data in it. A new namespace or bucket can be empty. Counts and sizes may be unavailable when the storage listing cannot be read.

Missing on a secret means the live Worker expects a value that is no longer set. Overridden on a config variable means a value in Variables takes precedence. Edit the variable's runtime scope when the Worker needs it during requests.

Email needs more than a binding declaration. Its console readiness checks provider availability, verified sending domains, the binding's sender and recipient restrictions, confirmed destinations and remaining monthly allowance. Follow the displayed next action under Email; adding a different confirmed recipient does not satisfy a binding restricted to one address.

Cron Triggers use the live config's scheduled() handler, not a public HTTP route. Pausing one preserves its history; removing it means editing triggers.crons and deploying again. See Schedules.

Use a rate limiter

A supported wrangler ratelimits binding exposes env.<binding>.limit({ key }), returning { success }. The configured limit applies per key in fixed windows of 10 or 60 seconds. Your code chooses a key and handles refusal; the binding does not authenticate the caller for you.

JavaScript
const result = await env.RATE_LIMITER.limit({ key: "contact-form" });
if (!result.success) return new Response("Try again later", { status: 429 });

Choose a trusted key appropriate to the workload and your request environment. Do not use this as an atomic counter or assume another provider's global distribution semantics. The live binding inventory shows the configured limit and period.

Inspect from the API

Terminal
curl https://api.fortly.com/projects/my-app-ada/bindings \
  -H "Authorization: Bearer $FORTLY_TOKEN"

The response includes deployment and bindings. For a Worker it also includes worker: true and framework; static releases report worker: false. Binding rows have name, kind and state, with details such as namespace, bucket, objects, bytes, limit, period or destination for the relevant kind. Secret values are not included.

This endpoint is an inventory, not an email-send authorization check: its email state does not evaluate every sender restriction, provider setting or quota. Read Email API and handle errors from send() as documented. To change a binding declaration, deploy updated config; this GET route does not mutate it.

Keep the storage models separate

PostgreSQL is for relational records and queries. KV holds small values with optional expiry. Files and R2-compatible buckets hold objects. Point-in-time recovery restores the project's PostgreSQL database, not KV, bucket contents or account email settings.

Something missing or unclear? Tell us and we will fix the page.© 2026 Fortly