Platform bindings

Every app is handed a set of managed bindings on the env object passed to your api/*.js routes. They're provisioned and wired for you — there are no keys to paste or services to stand up. Read one off env and use it.

What you get

BindingWhat it isAvailabilityDocs
env.DBSQL database (SQLite)AutomaticDatabase
env.STORAGEFile storage + public file URLsAutomaticFile storage
env.AUTHUser accounts, sessions, 2FAAlways onAuth
env.PAYMENTSStripe checkout & subscriptionsSet Stripe keyPayments
env.AIOpenAI, Anthropic, built-in modelsAttachAI
env.EMAILSend transactional emailAttachEmail
env.MAPMaps + vector tiles from your GeoJSONOn referenceMaps
env.GEOSpatial queries (PostGIS)Paid planSpatial queries
env.SEARCHSemantic search / RAG over your textPaid planSemantic search
env.MEETINGRecord & transcribe Zoom/Meet/Teams callsPaid planMeeting recording
env.ROOMRealtime channels over WebSockets (chat, presence, multiplayer)Paid planRealtime
env.ANALYTICSTrack custom analytics events from your codeOn referenceAnalytics
env.CACHEKey-value cacheAttach

Automatic bindings are attached to every app. Always on means it's built into the runtime. Attach means it's optional — your assistant adds it with manage_resource (action: attach) when you ask for it. On reference means it wires itself up automatically as soon as your code uses it (no attach step). Paid plan means it's available once the app's org is on a paid plan. Binding names are fixed; you get one of each per app.

Using a binding

Bindings live on the env argument of your route handler:

// api/signup.js
export default {
  async fetch(request, env, ctx) {
    const { email, password } = await request.json();
    const result = await env.AUTH.signUp({ email, password });
    if (!result.ok) return Response.json({ error: result.error }, { status: 400 });
    // env.AUTH returns a Response with the session cookie already set
    return result.response;
  },
};

Alongside the bindings above you also get env.APP_ID, env.ENVIRONMENT ("production" or a preview / branch name), and any environment variables you've set on the app.

Provisioning

A database and storage come attached by default. The full set of attachable resources, and how to manage them over MCP (manage_resource, action: attach/detach/list), is covered in Build & deploy an app. Secrets and config values are managed with manage_app_env (action: set/list/delete) and injected at deploy.