[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-cloudflare-cloudflare-email-service":3,"mdc-f4zsqb-key":37,"related-org-cloudflare-cloudflare-email-service":1553,"related-repo-cloudflare-cloudflare-email-service":1733},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":32,"sourceUrl":35,"mdContent":36},"cloudflare-email-service","manage transactional emails with Cloudflare","Send and receive transactional emails with Cloudflare Email Service (Email Sending + Email Routing). Use when building email sending (Workers binding or REST API), email routing, Agents SDK email handling, or integrating email into any app — Workers, Node.js, Python, Go, etc. Also use for email deliverability, SPF\u002FDKIM\u002FDMARC, wrangler email setup, MCP email tools, or when a coding agent needs to send emails. Even for simple requests like \"add email to my Worker\" — this skill has critical config details.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"cloudflare","Cloudflare","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fcloudflare.jpg",[12,16,17,20],{"name":13,"slug":14,"type":15},"Cloudflare Workers","cloudflare-workers","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Serverless","serverless",{"name":21,"slug":22,"type":15},"Email","email",2112,"https:\u002F\u002Fgithub.com\u002Fcloudflare\u002Fskills","2026-04-16T05:02:38.301955",null,192,[29,8,30,31],"agents","skills","workers",{"repoUrl":24,"stars":23,"forks":27,"topics":33,"description":34},[29,8,30,31],"Skills for teaching agents how to build on Cloudflare.","https:\u002F\u002Fgithub.com\u002Fcloudflare\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fcloudflare-email-service","---\nname: cloudflare-email-service\ndescription: Send and receive transactional emails with Cloudflare Email Service (Email Sending + Email Routing). Use when building email sending (Workers binding or REST API), email routing, Agents SDK email handling, or integrating email into any app — Workers, Node.js, Python, Go, etc. Also use for email deliverability, SPF\u002FDKIM\u002FDMARC, wrangler email setup, MCP email tools, or when a coding agent needs to send emails. Even for simple requests like \"add email to my Worker\" — this skill has critical config details.\n---\n\n# Cloudflare Email Service\n\nYour knowledge of the Cloudflare Email Service, Email Routing or Email Sending may be outdated. **Prefer retrieval over pre-training** for any Cloudflare Email Service task.\n\nCloudflare Email Service lets you send transactional emails and route incoming emails, all within the Cloudflare platform. Your knowledge of this product may be outdated — it launched in 2025 and is evolving rapidly. **Prefer retrieval over pre-training** for any Email Service task.\n\n**If there is any discrepancy between this skill and the sources below, always trust the original source.** The Cloudflare docs, REST API spec, `@cloudflare\u002Fworkers-types`, and Agents SDK repo are the source of truth. This skill is a convenience guide — it may lag behind the latest changes. When in doubt, retrieve from the sources below and use what they say.\n\n## Retrieval Sources\n\n| Source | How to retrieve | Use for |\n|--------|----------------|---------|\n| Cloudflare docs | `cloudflare-docs` search tool or URL `https:\u002F\u002Fdevelopers.cloudflare.com\u002Femail-service\u002F` | API reference, limits, pricing, latest features |\n| REST API spec | `https:\u002F\u002Fdevelopers.cloudflare.com\u002Fapi\u002Fresources\u002Femail_sending` | OpenAPI spec for the Email Sending REST API |\n| Workers types | `https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@cloudflare\u002Fworkers-types` | Type signatures, binding shapes |\n| Agents SDK docs | Fetch `docs\u002Femail.md` from `https:\u002F\u002Fgithub.com\u002Fcloudflare\u002Fagents\u002Ftree\u002Fmain\u002Fdocs` | Email handling in Agents SDK |\n\n## FIRST: Check Prerequisites\n\nBefore writing any email code, verify the basics are in place:\n\n1. **Domain onboarded?** Run `npx wrangler email sending list` to see which domains have email sending enabled. If the domain isn't listed, run `npx wrangler email sending enable userdomain.com` or see [cli-and-mcp.md](references\u002Fcli-and-mcp.md) for full setup instructions.\n2. **Binding configured?** Look for `send_email` in `wrangler.jsonc` (for Workers)\n3. **postal-mime installed?** Run `npm ls postal-mime` (only needed for receiving\u002Fparsing emails)\n\n## What Do You Need?\n\nStart here. Find your situation, then follow the link for full details.\n\n| I want to... | Path | Reference |\n|--------------|------|-----------|\n| **Send emails from a Cloudflare Worker** | Workers binding (no API keys needed) | [sending.md](references\u002Fsending.md) |\n| **Send emails from an AI agent built with [Cloudflare Agents SDK](https:\u002F\u002Fdevelopers.cloudflare.com\u002Fagents\u002F)** | `onEmail()` + `replyToEmail()` in Agent class | [sending.md](references\u002Fsending.md) |\n| **Send emails from an external app or agent** (Node.js, Go, Python, etc.) | REST API with Bearer token | [rest-api.md](references\u002Frest-api.md) |\n| **Send emails from a coding agent** (Claude Code, Cursor, Copilot, etc.) | MCP tools, wrangler CLI, or REST API | [cli-and-mcp.md](references\u002Fcli-and-mcp.md) |\n| **Receive and process incoming emails** (Email Routing) | Workers `email()` handler | [routing.md](references\u002Frouting.md) |\n| **Set up Email Sending or Email Routing** | `wrangler email sending enable` \u002F `wrangler email routing enable`, or Dashboard | [cli-and-mcp.md](references\u002Fcli-and-mcp.md) |\n| **Improve deliverability, avoid spam folders** | Authentication, content, compliance | [deliverability.md](references\u002Fdeliverability.md) |\n\n## Quick Start — Workers Binding\n\nAdd the binding to `wrangler.jsonc`, then call `env.EMAIL.send()`. The `from` domain must be onboarded via `npx wrangler email sending enable yourdomain.com`.\n\n```jsonc\n\u002F\u002F wrangler.jsonc\n{ \"send_email\": [{ \"name\": \"EMAIL\" }] }\n```\n\n```typescript\nconst response = await env.EMAIL.send({\n  to: \"user@example.com\",\n  from: { email: \"welcome@yourdomain.com\", name: \"My App\" },\n  subject: \"Welcome!\",\n  html: \"\u003Ch1>Welcome!\u003C\u002Fh1>\",\n  text: \"Welcome!\",\n});\n```\n\nThe binding is recommended for Workers — no API keys needed. If a user specifically requests the REST API from within a Worker (e.g., they already have an API token workflow), that works too — see [rest-api.md](references\u002Frest-api.md).\n\nSee [sending.md](references\u002Fsending.md) for the full API, batch sends, attachments, custom headers, restricted bindings, and Agents SDK integration.\n\n## Quick Start — REST API\n\nFor apps outside Workers, or within Workers if the user explicitly requests it. Key differences from the Workers binding:\n\n- Endpoint: `POST https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Faccounts\u002F{account_id}\u002Femail\u002Fsending\u002Fsend`\n- `from` object uses `address` (not `email`): `{ \"address\": \"...\", \"name\": \"...\" }`\n- `replyTo` is `reply_to` (snake_case)\n- Response returns `{ delivered: [], permanent_bounces: [], queued: [] }` (not `messageId`)\n\nSee [rest-api.md](references\u002Frest-api.md) for curl examples, response format, and error handling.\n\n## Common Mistakes\n\n| Mistake | Why It Happens | Fix |\n|---------|---------------|-----|\n| Forgetting `send_email` binding in wrangler config | Email Service uses a binding, not an API key | Add `\"send_email\": [{ \"name\": \"EMAIL\" }]` to wrangler.jsonc |\n| Sending from an unverified domain | Domain must be onboarded onto Email Sending before first send | Run `wrangler email sending enable yourdomain.com` or onboard in Dashboard |\n| Reading `message.raw` twice in email handler | The raw stream is single-use — second read returns empty | Buffer first: `const raw = await new Response(message.raw).arrayBuffer()` |\n| Missing `text` field (HTML only) | Some email clients only show plain text; also helps spam scores | Always include both `html` and `text` versions |\n| Using email for marketing\u002Fbulk sends | Email Service is for transactional email only | Use a dedicated marketing email platform for newsletters and campaigns |\n| Forwarding to unverified destinations | `message.forward()` only works with verified addresses | Run `wrangler email routing addresses create user@gmail.com` or add in Dashboard |\n| Testing with fake addresses | Bounces from non-existent addresses hurt sender reputation | Use real addresses you control during development |\n| Hardcoding API tokens in source code | Tokens in code get committed and leaked | Use environment variables or Cloudflare secrets |\n| Ignoring the `from` domain requirement | The `from` address must use a domain onboarded to Email Service | Verify the domain first, then send from `anything@that-domain.com` |\n| Using `email` key in REST API `from` object | REST API uses `address` not `email` for `from` object | Use `{ \"address\": \"...\", \"name\": \"...\" }` for REST, `{ \"email\": \"...\", \"name\": \"...\" }` for Workers |\n| Using `replyTo` in REST API | REST API uses snake_case field names | Use `reply_to` for REST API, `replyTo` for Workers binding |\n\n## References\n\nRead the reference that matches your situation. You don't need all of them.\n\n- **[references\u002Fsending.md](references\u002Fsending.md)** — Workers binding API, attachments, Agents SDK email. For Workers or Agents SDK.\n- **[references\u002Frest-api.md](references\u002Frest-api.md)** — REST endpoint, curl examples, error handling. For apps NOT on Workers.\n- **[references\u002Frouting.md](references\u002Frouting.md)** — Inbound `email()` handler, forwarding, replying, parsing. For receiving emails.\n- **[references\u002Fcli-and-mcp.md](references\u002Fcli-and-mcp.md)** — Domain setup, wrangler commands, MCP tools. For first-time setup.\n- **[references\u002Fdeliverability.md](references\u002Fdeliverability.md)** — SPF\u002FDKIM\u002FDMARC, bounces, suppressions, best practices.\n",{"data":38,"body":39},{"name":4,"description":6},{"type":40,"children":41},"root",[42,50,64,75,94,101,240,246,251,334,340,345,591,597,633,664,949,959,970,976,981,1065,1075,1081,1466,1472,1477,1547],{"type":43,"tag":44,"props":45,"children":46},"element","h1",{"id":4},[47],{"type":48,"value":49},"text","Cloudflare Email Service",{"type":43,"tag":51,"props":52,"children":53},"p",{},[54,56,62],{"type":48,"value":55},"Your knowledge of the Cloudflare Email Service, Email Routing or Email Sending may be outdated. ",{"type":43,"tag":57,"props":58,"children":59},"strong",{},[60],{"type":48,"value":61},"Prefer retrieval over pre-training",{"type":48,"value":63}," for any Cloudflare Email Service task.",{"type":43,"tag":51,"props":65,"children":66},{},[67,69,73],{"type":48,"value":68},"Cloudflare Email Service lets you send transactional emails and route incoming emails, all within the Cloudflare platform. Your knowledge of this product may be outdated — it launched in 2025 and is evolving rapidly. ",{"type":43,"tag":57,"props":70,"children":71},{},[72],{"type":48,"value":61},{"type":48,"value":74}," for any Email Service task.",{"type":43,"tag":51,"props":76,"children":77},{},[78,83,85,92],{"type":43,"tag":57,"props":79,"children":80},{},[81],{"type":48,"value":82},"If there is any discrepancy between this skill and the sources below, always trust the original source.",{"type":48,"value":84}," The Cloudflare docs, REST API spec, ",{"type":43,"tag":86,"props":87,"children":89},"code",{"className":88},[],[90],{"type":48,"value":91},"@cloudflare\u002Fworkers-types",{"type":48,"value":93},", and Agents SDK repo are the source of truth. This skill is a convenience guide — it may lag behind the latest changes. When in doubt, retrieve from the sources below and use what they say.",{"type":43,"tag":95,"props":96,"children":98},"h2",{"id":97},"retrieval-sources",[99],{"type":48,"value":100},"Retrieval Sources",{"type":43,"tag":102,"props":103,"children":104},"table",{},[105,129],{"type":43,"tag":106,"props":107,"children":108},"thead",{},[109],{"type":43,"tag":110,"props":111,"children":112},"tr",{},[113,119,124],{"type":43,"tag":114,"props":115,"children":116},"th",{},[117],{"type":48,"value":118},"Source",{"type":43,"tag":114,"props":120,"children":121},{},[122],{"type":48,"value":123},"How to retrieve",{"type":43,"tag":114,"props":125,"children":126},{},[127],{"type":48,"value":128},"Use for",{"type":43,"tag":130,"props":131,"children":132},"tbody",{},[133,164,186,208],{"type":43,"tag":110,"props":134,"children":135},{},[136,142,159],{"type":43,"tag":137,"props":138,"children":139},"td",{},[140],{"type":48,"value":141},"Cloudflare docs",{"type":43,"tag":137,"props":143,"children":144},{},[145,151,153],{"type":43,"tag":86,"props":146,"children":148},{"className":147},[],[149],{"type":48,"value":150},"cloudflare-docs",{"type":48,"value":152}," search tool or URL ",{"type":43,"tag":86,"props":154,"children":156},{"className":155},[],[157],{"type":48,"value":158},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Femail-service\u002F",{"type":43,"tag":137,"props":160,"children":161},{},[162],{"type":48,"value":163},"API reference, limits, pricing, latest features",{"type":43,"tag":110,"props":165,"children":166},{},[167,172,181],{"type":43,"tag":137,"props":168,"children":169},{},[170],{"type":48,"value":171},"REST API spec",{"type":43,"tag":137,"props":173,"children":174},{},[175],{"type":43,"tag":86,"props":176,"children":178},{"className":177},[],[179],{"type":48,"value":180},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fapi\u002Fresources\u002Femail_sending",{"type":43,"tag":137,"props":182,"children":183},{},[184],{"type":48,"value":185},"OpenAPI spec for the Email Sending REST API",{"type":43,"tag":110,"props":187,"children":188},{},[189,194,203],{"type":43,"tag":137,"props":190,"children":191},{},[192],{"type":48,"value":193},"Workers types",{"type":43,"tag":137,"props":195,"children":196},{},[197],{"type":43,"tag":86,"props":198,"children":200},{"className":199},[],[201],{"type":48,"value":202},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@cloudflare\u002Fworkers-types",{"type":43,"tag":137,"props":204,"children":205},{},[206],{"type":48,"value":207},"Type signatures, binding shapes",{"type":43,"tag":110,"props":209,"children":210},{},[211,216,235],{"type":43,"tag":137,"props":212,"children":213},{},[214],{"type":48,"value":215},"Agents SDK docs",{"type":43,"tag":137,"props":217,"children":218},{},[219,221,227,229],{"type":48,"value":220},"Fetch ",{"type":43,"tag":86,"props":222,"children":224},{"className":223},[],[225],{"type":48,"value":226},"docs\u002Femail.md",{"type":48,"value":228}," from ",{"type":43,"tag":86,"props":230,"children":232},{"className":231},[],[233],{"type":48,"value":234},"https:\u002F\u002Fgithub.com\u002Fcloudflare\u002Fagents\u002Ftree\u002Fmain\u002Fdocs",{"type":43,"tag":137,"props":236,"children":237},{},[238],{"type":48,"value":239},"Email handling in Agents SDK",{"type":43,"tag":95,"props":241,"children":243},{"id":242},"first-check-prerequisites",[244],{"type":48,"value":245},"FIRST: Check Prerequisites",{"type":43,"tag":51,"props":247,"children":248},{},[249],{"type":48,"value":250},"Before writing any email code, verify the basics are in place:",{"type":43,"tag":252,"props":253,"children":254},"ol",{},[255,291,317],{"type":43,"tag":256,"props":257,"children":258},"li",{},[259,264,266,272,274,280,282,289],{"type":43,"tag":57,"props":260,"children":261},{},[262],{"type":48,"value":263},"Domain onboarded?",{"type":48,"value":265}," Run ",{"type":43,"tag":86,"props":267,"children":269},{"className":268},[],[270],{"type":48,"value":271},"npx wrangler email sending list",{"type":48,"value":273}," to see which domains have email sending enabled. If the domain isn't listed, run ",{"type":43,"tag":86,"props":275,"children":277},{"className":276},[],[278],{"type":48,"value":279},"npx wrangler email sending enable userdomain.com",{"type":48,"value":281}," or see ",{"type":43,"tag":283,"props":284,"children":286},"a",{"href":285},"references\u002Fcli-and-mcp.md",[287],{"type":48,"value":288},"cli-and-mcp.md",{"type":48,"value":290}," for full setup instructions.",{"type":43,"tag":256,"props":292,"children":293},{},[294,299,301,307,309,315],{"type":43,"tag":57,"props":295,"children":296},{},[297],{"type":48,"value":298},"Binding configured?",{"type":48,"value":300}," Look for ",{"type":43,"tag":86,"props":302,"children":304},{"className":303},[],[305],{"type":48,"value":306},"send_email",{"type":48,"value":308}," in ",{"type":43,"tag":86,"props":310,"children":312},{"className":311},[],[313],{"type":48,"value":314},"wrangler.jsonc",{"type":48,"value":316}," (for Workers)",{"type":43,"tag":256,"props":318,"children":319},{},[320,325,326,332],{"type":43,"tag":57,"props":321,"children":322},{},[323],{"type":48,"value":324},"postal-mime installed?",{"type":48,"value":265},{"type":43,"tag":86,"props":327,"children":329},{"className":328},[],[330],{"type":48,"value":331},"npm ls postal-mime",{"type":48,"value":333}," (only needed for receiving\u002Fparsing emails)",{"type":43,"tag":95,"props":335,"children":337},{"id":336},"what-do-you-need",[338],{"type":48,"value":339},"What Do You Need?",{"type":43,"tag":51,"props":341,"children":342},{},[343],{"type":48,"value":344},"Start here. Find your situation, then follow the link for full details.",{"type":43,"tag":102,"props":346,"children":347},{},[348,369],{"type":43,"tag":106,"props":349,"children":350},{},[351],{"type":43,"tag":110,"props":352,"children":353},{},[354,359,364],{"type":43,"tag":114,"props":355,"children":356},{},[357],{"type":48,"value":358},"I want to...",{"type":43,"tag":114,"props":360,"children":361},{},[362],{"type":48,"value":363},"Path",{"type":43,"tag":114,"props":365,"children":366},{},[367],{"type":48,"value":368},"Reference",{"type":43,"tag":130,"props":370,"children":371},{},[372,397,442,469,494,529,566],{"type":43,"tag":110,"props":373,"children":374},{},[375,383,388],{"type":43,"tag":137,"props":376,"children":377},{},[378],{"type":43,"tag":57,"props":379,"children":380},{},[381],{"type":48,"value":382},"Send emails from a Cloudflare Worker",{"type":43,"tag":137,"props":384,"children":385},{},[386],{"type":48,"value":387},"Workers binding (no API keys needed)",{"type":43,"tag":137,"props":389,"children":390},{},[391],{"type":43,"tag":283,"props":392,"children":394},{"href":393},"references\u002Fsending.md",[395],{"type":48,"value":396},"sending.md",{"type":43,"tag":110,"props":398,"children":399},{},[400,416,435],{"type":43,"tag":137,"props":401,"children":402},{},[403],{"type":43,"tag":57,"props":404,"children":405},{},[406,408],{"type":48,"value":407},"Send emails from an AI agent built with ",{"type":43,"tag":283,"props":409,"children":413},{"href":410,"rel":411},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fagents\u002F",[412],"nofollow",[414],{"type":48,"value":415},"Cloudflare Agents SDK",{"type":43,"tag":137,"props":417,"children":418},{},[419,425,427,433],{"type":43,"tag":86,"props":420,"children":422},{"className":421},[],[423],{"type":48,"value":424},"onEmail()",{"type":48,"value":426}," + ",{"type":43,"tag":86,"props":428,"children":430},{"className":429},[],[431],{"type":48,"value":432},"replyToEmail()",{"type":48,"value":434}," in Agent class",{"type":43,"tag":137,"props":436,"children":437},{},[438],{"type":43,"tag":283,"props":439,"children":440},{"href":393},[441],{"type":48,"value":396},{"type":43,"tag":110,"props":443,"children":444},{},[445,455,460],{"type":43,"tag":137,"props":446,"children":447},{},[448,453],{"type":43,"tag":57,"props":449,"children":450},{},[451],{"type":48,"value":452},"Send emails from an external app or agent",{"type":48,"value":454}," (Node.js, Go, Python, etc.)",{"type":43,"tag":137,"props":456,"children":457},{},[458],{"type":48,"value":459},"REST API with Bearer token",{"type":43,"tag":137,"props":461,"children":462},{},[463],{"type":43,"tag":283,"props":464,"children":466},{"href":465},"references\u002Frest-api.md",[467],{"type":48,"value":468},"rest-api.md",{"type":43,"tag":110,"props":470,"children":471},{},[472,482,487],{"type":43,"tag":137,"props":473,"children":474},{},[475,480],{"type":43,"tag":57,"props":476,"children":477},{},[478],{"type":48,"value":479},"Send emails from a coding agent",{"type":48,"value":481}," (Claude Code, Cursor, Copilot, etc.)",{"type":43,"tag":137,"props":483,"children":484},{},[485],{"type":48,"value":486},"MCP tools, wrangler CLI, or REST API",{"type":43,"tag":137,"props":488,"children":489},{},[490],{"type":43,"tag":283,"props":491,"children":492},{"href":285},[493],{"type":48,"value":288},{"type":43,"tag":110,"props":495,"children":496},{},[497,507,520],{"type":43,"tag":137,"props":498,"children":499},{},[500,505],{"type":43,"tag":57,"props":501,"children":502},{},[503],{"type":48,"value":504},"Receive and process incoming emails",{"type":48,"value":506}," (Email Routing)",{"type":43,"tag":137,"props":508,"children":509},{},[510,512,518],{"type":48,"value":511},"Workers ",{"type":43,"tag":86,"props":513,"children":515},{"className":514},[],[516],{"type":48,"value":517},"email()",{"type":48,"value":519}," handler",{"type":43,"tag":137,"props":521,"children":522},{},[523],{"type":43,"tag":283,"props":524,"children":526},{"href":525},"references\u002Frouting.md",[527],{"type":48,"value":528},"routing.md",{"type":43,"tag":110,"props":530,"children":531},{},[532,540,559],{"type":43,"tag":137,"props":533,"children":534},{},[535],{"type":43,"tag":57,"props":536,"children":537},{},[538],{"type":48,"value":539},"Set up Email Sending or Email Routing",{"type":43,"tag":137,"props":541,"children":542},{},[543,549,551,557],{"type":43,"tag":86,"props":544,"children":546},{"className":545},[],[547],{"type":48,"value":548},"wrangler email sending enable",{"type":48,"value":550}," \u002F ",{"type":43,"tag":86,"props":552,"children":554},{"className":553},[],[555],{"type":48,"value":556},"wrangler email routing enable",{"type":48,"value":558},", or Dashboard",{"type":43,"tag":137,"props":560,"children":561},{},[562],{"type":43,"tag":283,"props":563,"children":564},{"href":285},[565],{"type":48,"value":288},{"type":43,"tag":110,"props":567,"children":568},{},[569,577,582],{"type":43,"tag":137,"props":570,"children":571},{},[572],{"type":43,"tag":57,"props":573,"children":574},{},[575],{"type":48,"value":576},"Improve deliverability, avoid spam folders",{"type":43,"tag":137,"props":578,"children":579},{},[580],{"type":48,"value":581},"Authentication, content, compliance",{"type":43,"tag":137,"props":583,"children":584},{},[585],{"type":43,"tag":283,"props":586,"children":588},{"href":587},"references\u002Fdeliverability.md",[589],{"type":48,"value":590},"deliverability.md",{"type":43,"tag":95,"props":592,"children":594},{"id":593},"quick-start-workers-binding",[595],{"type":48,"value":596},"Quick Start — Workers Binding",{"type":43,"tag":51,"props":598,"children":599},{},[600,602,607,609,615,617,623,625,631],{"type":48,"value":601},"Add the binding to ",{"type":43,"tag":86,"props":603,"children":605},{"className":604},[],[606],{"type":48,"value":314},{"type":48,"value":608},", then call ",{"type":43,"tag":86,"props":610,"children":612},{"className":611},[],[613],{"type":48,"value":614},"env.EMAIL.send()",{"type":48,"value":616},". The ",{"type":43,"tag":86,"props":618,"children":620},{"className":619},[],[621],{"type":48,"value":622},"from",{"type":48,"value":624}," domain must be onboarded via ",{"type":43,"tag":86,"props":626,"children":628},{"className":627},[],[629],{"type":48,"value":630},"npx wrangler email sending enable yourdomain.com",{"type":48,"value":632},".",{"type":43,"tag":634,"props":635,"children":640},"pre",{"className":636,"code":637,"language":638,"meta":639,"style":639},"language-jsonc shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F wrangler.jsonc\n{ \"send_email\": [{ \"name\": \"EMAIL\" }] }\n","jsonc","",[641],{"type":43,"tag":86,"props":642,"children":643},{"__ignoreMap":639},[644,655],{"type":43,"tag":645,"props":646,"children":649},"span",{"class":647,"line":648},"line",1,[650],{"type":43,"tag":645,"props":651,"children":652},{},[653],{"type":48,"value":654},"\u002F\u002F wrangler.jsonc\n",{"type":43,"tag":645,"props":656,"children":658},{"class":647,"line":657},2,[659],{"type":43,"tag":645,"props":660,"children":661},{},[662],{"type":48,"value":663},"{ \"send_email\": [{ \"name\": \"EMAIL\" }] }\n",{"type":43,"tag":634,"props":665,"children":669},{"className":666,"code":667,"language":668,"meta":639,"style":639},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const response = await env.EMAIL.send({\n  to: \"user@example.com\",\n  from: { email: \"welcome@yourdomain.com\", name: \"My App\" },\n  subject: \"Welcome!\",\n  html: \"\u003Ch1>Welcome!\u003C\u002Fh1>\",\n  text: \"Welcome!\",\n});\n","typescript",[670],{"type":43,"tag":86,"props":671,"children":672},{"__ignoreMap":639},[673,734,769,841,871,901,930],{"type":43,"tag":645,"props":674,"children":675},{"class":647,"line":648},[676,682,688,694,700,705,709,714,718,724,729],{"type":43,"tag":645,"props":677,"children":679},{"style":678},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[680],{"type":48,"value":681},"const",{"type":43,"tag":645,"props":683,"children":685},{"style":684},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[686],{"type":48,"value":687}," response ",{"type":43,"tag":645,"props":689,"children":691},{"style":690},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[692],{"type":48,"value":693},"=",{"type":43,"tag":645,"props":695,"children":697},{"style":696},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[698],{"type":48,"value":699}," await",{"type":43,"tag":645,"props":701,"children":702},{"style":684},[703],{"type":48,"value":704}," env",{"type":43,"tag":645,"props":706,"children":707},{"style":690},[708],{"type":48,"value":632},{"type":43,"tag":645,"props":710,"children":711},{"style":684},[712],{"type":48,"value":713},"EMAIL",{"type":43,"tag":645,"props":715,"children":716},{"style":690},[717],{"type":48,"value":632},{"type":43,"tag":645,"props":719,"children":721},{"style":720},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[722],{"type":48,"value":723},"send",{"type":43,"tag":645,"props":725,"children":726},{"style":684},[727],{"type":48,"value":728},"(",{"type":43,"tag":645,"props":730,"children":731},{"style":690},[732],{"type":48,"value":733},"{\n",{"type":43,"tag":645,"props":735,"children":736},{"class":647,"line":657},[737,743,748,753,759,764],{"type":43,"tag":645,"props":738,"children":740},{"style":739},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[741],{"type":48,"value":742},"  to",{"type":43,"tag":645,"props":744,"children":745},{"style":690},[746],{"type":48,"value":747},":",{"type":43,"tag":645,"props":749,"children":750},{"style":690},[751],{"type":48,"value":752}," \"",{"type":43,"tag":645,"props":754,"children":756},{"style":755},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[757],{"type":48,"value":758},"user@example.com",{"type":43,"tag":645,"props":760,"children":761},{"style":690},[762],{"type":48,"value":763},"\"",{"type":43,"tag":645,"props":765,"children":766},{"style":690},[767],{"type":48,"value":768},",\n",{"type":43,"tag":645,"props":770,"children":772},{"class":647,"line":771},3,[773,778,782,787,792,796,800,805,809,814,819,823,827,832,836],{"type":43,"tag":645,"props":774,"children":775},{"style":739},[776],{"type":48,"value":777},"  from",{"type":43,"tag":645,"props":779,"children":780},{"style":690},[781],{"type":48,"value":747},{"type":43,"tag":645,"props":783,"children":784},{"style":690},[785],{"type":48,"value":786}," {",{"type":43,"tag":645,"props":788,"children":789},{"style":739},[790],{"type":48,"value":791}," email",{"type":43,"tag":645,"props":793,"children":794},{"style":690},[795],{"type":48,"value":747},{"type":43,"tag":645,"props":797,"children":798},{"style":690},[799],{"type":48,"value":752},{"type":43,"tag":645,"props":801,"children":802},{"style":755},[803],{"type":48,"value":804},"welcome@yourdomain.com",{"type":43,"tag":645,"props":806,"children":807},{"style":690},[808],{"type":48,"value":763},{"type":43,"tag":645,"props":810,"children":811},{"style":690},[812],{"type":48,"value":813},",",{"type":43,"tag":645,"props":815,"children":816},{"style":739},[817],{"type":48,"value":818}," name",{"type":43,"tag":645,"props":820,"children":821},{"style":690},[822],{"type":48,"value":747},{"type":43,"tag":645,"props":824,"children":825},{"style":690},[826],{"type":48,"value":752},{"type":43,"tag":645,"props":828,"children":829},{"style":755},[830],{"type":48,"value":831},"My App",{"type":43,"tag":645,"props":833,"children":834},{"style":690},[835],{"type":48,"value":763},{"type":43,"tag":645,"props":837,"children":838},{"style":690},[839],{"type":48,"value":840}," },\n",{"type":43,"tag":645,"props":842,"children":844},{"class":647,"line":843},4,[845,850,854,858,863,867],{"type":43,"tag":645,"props":846,"children":847},{"style":739},[848],{"type":48,"value":849},"  subject",{"type":43,"tag":645,"props":851,"children":852},{"style":690},[853],{"type":48,"value":747},{"type":43,"tag":645,"props":855,"children":856},{"style":690},[857],{"type":48,"value":752},{"type":43,"tag":645,"props":859,"children":860},{"style":755},[861],{"type":48,"value":862},"Welcome!",{"type":43,"tag":645,"props":864,"children":865},{"style":690},[866],{"type":48,"value":763},{"type":43,"tag":645,"props":868,"children":869},{"style":690},[870],{"type":48,"value":768},{"type":43,"tag":645,"props":872,"children":874},{"class":647,"line":873},5,[875,880,884,888,893,897],{"type":43,"tag":645,"props":876,"children":877},{"style":739},[878],{"type":48,"value":879},"  html",{"type":43,"tag":645,"props":881,"children":882},{"style":690},[883],{"type":48,"value":747},{"type":43,"tag":645,"props":885,"children":886},{"style":690},[887],{"type":48,"value":752},{"type":43,"tag":645,"props":889,"children":890},{"style":755},[891],{"type":48,"value":892},"\u003Ch1>Welcome!\u003C\u002Fh1>",{"type":43,"tag":645,"props":894,"children":895},{"style":690},[896],{"type":48,"value":763},{"type":43,"tag":645,"props":898,"children":899},{"style":690},[900],{"type":48,"value":768},{"type":43,"tag":645,"props":902,"children":904},{"class":647,"line":903},6,[905,910,914,918,922,926],{"type":43,"tag":645,"props":906,"children":907},{"style":739},[908],{"type":48,"value":909},"  text",{"type":43,"tag":645,"props":911,"children":912},{"style":690},[913],{"type":48,"value":747},{"type":43,"tag":645,"props":915,"children":916},{"style":690},[917],{"type":48,"value":752},{"type":43,"tag":645,"props":919,"children":920},{"style":755},[921],{"type":48,"value":862},{"type":43,"tag":645,"props":923,"children":924},{"style":690},[925],{"type":48,"value":763},{"type":43,"tag":645,"props":927,"children":928},{"style":690},[929],{"type":48,"value":768},{"type":43,"tag":645,"props":931,"children":933},{"class":647,"line":932},7,[934,939,944],{"type":43,"tag":645,"props":935,"children":936},{"style":690},[937],{"type":48,"value":938},"}",{"type":43,"tag":645,"props":940,"children":941},{"style":684},[942],{"type":48,"value":943},")",{"type":43,"tag":645,"props":945,"children":946},{"style":690},[947],{"type":48,"value":948},";\n",{"type":43,"tag":51,"props":950,"children":951},{},[952,954,958],{"type":48,"value":953},"The binding is recommended for Workers — no API keys needed. If a user specifically requests the REST API from within a Worker (e.g., they already have an API token workflow), that works too — see ",{"type":43,"tag":283,"props":955,"children":956},{"href":465},[957],{"type":48,"value":468},{"type":48,"value":632},{"type":43,"tag":51,"props":960,"children":961},{},[962,964,968],{"type":48,"value":963},"See ",{"type":43,"tag":283,"props":965,"children":966},{"href":393},[967],{"type":48,"value":396},{"type":48,"value":969}," for the full API, batch sends, attachments, custom headers, restricted bindings, and Agents SDK integration.",{"type":43,"tag":95,"props":971,"children":973},{"id":972},"quick-start-rest-api",[974],{"type":48,"value":975},"Quick Start — REST API",{"type":43,"tag":51,"props":977,"children":978},{},[979],{"type":48,"value":980},"For apps outside Workers, or within Workers if the user explicitly requests it. Key differences from the Workers binding:",{"type":43,"tag":982,"props":983,"children":984},"ul",{},[985,996,1027,1046],{"type":43,"tag":256,"props":986,"children":987},{},[988,990],{"type":48,"value":989},"Endpoint: ",{"type":43,"tag":86,"props":991,"children":993},{"className":992},[],[994],{"type":48,"value":995},"POST https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Faccounts\u002F{account_id}\u002Femail\u002Fsending\u002Fsend",{"type":43,"tag":256,"props":997,"children":998},{},[999,1004,1006,1012,1014,1019,1021],{"type":43,"tag":86,"props":1000,"children":1002},{"className":1001},[],[1003],{"type":48,"value":622},{"type":48,"value":1005}," object uses ",{"type":43,"tag":86,"props":1007,"children":1009},{"className":1008},[],[1010],{"type":48,"value":1011},"address",{"type":48,"value":1013}," (not ",{"type":43,"tag":86,"props":1015,"children":1017},{"className":1016},[],[1018],{"type":48,"value":22},{"type":48,"value":1020},"): ",{"type":43,"tag":86,"props":1022,"children":1024},{"className":1023},[],[1025],{"type":48,"value":1026},"{ \"address\": \"...\", \"name\": \"...\" }",{"type":43,"tag":256,"props":1028,"children":1029},{},[1030,1036,1038,1044],{"type":43,"tag":86,"props":1031,"children":1033},{"className":1032},[],[1034],{"type":48,"value":1035},"replyTo",{"type":48,"value":1037}," is ",{"type":43,"tag":86,"props":1039,"children":1041},{"className":1040},[],[1042],{"type":48,"value":1043},"reply_to",{"type":48,"value":1045}," (snake_case)",{"type":43,"tag":256,"props":1047,"children":1048},{},[1049,1051,1057,1058,1064],{"type":48,"value":1050},"Response returns ",{"type":43,"tag":86,"props":1052,"children":1054},{"className":1053},[],[1055],{"type":48,"value":1056},"{ delivered: [], permanent_bounces: [], queued: [] }",{"type":48,"value":1013},{"type":43,"tag":86,"props":1059,"children":1061},{"className":1060},[],[1062],{"type":48,"value":1063},"messageId",{"type":48,"value":943},{"type":43,"tag":51,"props":1066,"children":1067},{},[1068,1069,1073],{"type":48,"value":963},{"type":43,"tag":283,"props":1070,"children":1071},{"href":465},[1072],{"type":48,"value":468},{"type":48,"value":1074}," for curl examples, response format, and error handling.",{"type":43,"tag":95,"props":1076,"children":1078},{"id":1077},"common-mistakes",[1079],{"type":48,"value":1080},"Common Mistakes",{"type":43,"tag":102,"props":1082,"children":1083},{},[1084,1105],{"type":43,"tag":106,"props":1085,"children":1086},{},[1087],{"type":43,"tag":110,"props":1088,"children":1089},{},[1090,1095,1100],{"type":43,"tag":114,"props":1091,"children":1092},{},[1093],{"type":48,"value":1094},"Mistake",{"type":43,"tag":114,"props":1096,"children":1097},{},[1098],{"type":48,"value":1099},"Why It Happens",{"type":43,"tag":114,"props":1101,"children":1102},{},[1103],{"type":48,"value":1104},"Fix",{"type":43,"tag":130,"props":1106,"children":1107},{},[1108,1141,1167,1199,1239,1257,1288,1306,1324,1362,1429],{"type":43,"tag":110,"props":1109,"children":1110},{},[1111,1123,1128],{"type":43,"tag":137,"props":1112,"children":1113},{},[1114,1116,1121],{"type":48,"value":1115},"Forgetting ",{"type":43,"tag":86,"props":1117,"children":1119},{"className":1118},[],[1120],{"type":48,"value":306},{"type":48,"value":1122}," binding in wrangler config",{"type":43,"tag":137,"props":1124,"children":1125},{},[1126],{"type":48,"value":1127},"Email Service uses a binding, not an API key",{"type":43,"tag":137,"props":1129,"children":1130},{},[1131,1133,1139],{"type":48,"value":1132},"Add ",{"type":43,"tag":86,"props":1134,"children":1136},{"className":1135},[],[1137],{"type":48,"value":1138},"\"send_email\": [{ \"name\": \"EMAIL\" }]",{"type":48,"value":1140}," to wrangler.jsonc",{"type":43,"tag":110,"props":1142,"children":1143},{},[1144,1149,1154],{"type":43,"tag":137,"props":1145,"children":1146},{},[1147],{"type":48,"value":1148},"Sending from an unverified domain",{"type":43,"tag":137,"props":1150,"children":1151},{},[1152],{"type":48,"value":1153},"Domain must be onboarded onto Email Sending before first send",{"type":43,"tag":137,"props":1155,"children":1156},{},[1157,1159,1165],{"type":48,"value":1158},"Run ",{"type":43,"tag":86,"props":1160,"children":1162},{"className":1161},[],[1163],{"type":48,"value":1164},"wrangler email sending enable yourdomain.com",{"type":48,"value":1166}," or onboard in Dashboard",{"type":43,"tag":110,"props":1168,"children":1169},{},[1170,1183,1188],{"type":43,"tag":137,"props":1171,"children":1172},{},[1173,1175,1181],{"type":48,"value":1174},"Reading ",{"type":43,"tag":86,"props":1176,"children":1178},{"className":1177},[],[1179],{"type":48,"value":1180},"message.raw",{"type":48,"value":1182}," twice in email handler",{"type":43,"tag":137,"props":1184,"children":1185},{},[1186],{"type":48,"value":1187},"The raw stream is single-use — second read returns empty",{"type":43,"tag":137,"props":1189,"children":1190},{},[1191,1193],{"type":48,"value":1192},"Buffer first: ",{"type":43,"tag":86,"props":1194,"children":1196},{"className":1195},[],[1197],{"type":48,"value":1198},"const raw = await new Response(message.raw).arrayBuffer()",{"type":43,"tag":110,"props":1200,"children":1201},{},[1202,1214,1219],{"type":43,"tag":137,"props":1203,"children":1204},{},[1205,1207,1212],{"type":48,"value":1206},"Missing ",{"type":43,"tag":86,"props":1208,"children":1210},{"className":1209},[],[1211],{"type":48,"value":48},{"type":48,"value":1213}," field (HTML only)",{"type":43,"tag":137,"props":1215,"children":1216},{},[1217],{"type":48,"value":1218},"Some email clients only show plain text; also helps spam scores",{"type":43,"tag":137,"props":1220,"children":1221},{},[1222,1224,1230,1232,1237],{"type":48,"value":1223},"Always include both ",{"type":43,"tag":86,"props":1225,"children":1227},{"className":1226},[],[1228],{"type":48,"value":1229},"html",{"type":48,"value":1231}," and ",{"type":43,"tag":86,"props":1233,"children":1235},{"className":1234},[],[1236],{"type":48,"value":48},{"type":48,"value":1238}," versions",{"type":43,"tag":110,"props":1240,"children":1241},{},[1242,1247,1252],{"type":43,"tag":137,"props":1243,"children":1244},{},[1245],{"type":48,"value":1246},"Using email for marketing\u002Fbulk sends",{"type":43,"tag":137,"props":1248,"children":1249},{},[1250],{"type":48,"value":1251},"Email Service is for transactional email only",{"type":43,"tag":137,"props":1253,"children":1254},{},[1255],{"type":48,"value":1256},"Use a dedicated marketing email platform for newsletters and campaigns",{"type":43,"tag":110,"props":1258,"children":1259},{},[1260,1265,1276],{"type":43,"tag":137,"props":1261,"children":1262},{},[1263],{"type":48,"value":1264},"Forwarding to unverified destinations",{"type":43,"tag":137,"props":1266,"children":1267},{},[1268,1274],{"type":43,"tag":86,"props":1269,"children":1271},{"className":1270},[],[1272],{"type":48,"value":1273},"message.forward()",{"type":48,"value":1275}," only works with verified addresses",{"type":43,"tag":137,"props":1277,"children":1278},{},[1279,1280,1286],{"type":48,"value":1158},{"type":43,"tag":86,"props":1281,"children":1283},{"className":1282},[],[1284],{"type":48,"value":1285},"wrangler email routing addresses create user@gmail.com",{"type":48,"value":1287}," or add in Dashboard",{"type":43,"tag":110,"props":1289,"children":1290},{},[1291,1296,1301],{"type":43,"tag":137,"props":1292,"children":1293},{},[1294],{"type":48,"value":1295},"Testing with fake addresses",{"type":43,"tag":137,"props":1297,"children":1298},{},[1299],{"type":48,"value":1300},"Bounces from non-existent addresses hurt sender reputation",{"type":43,"tag":137,"props":1302,"children":1303},{},[1304],{"type":48,"value":1305},"Use real addresses you control during development",{"type":43,"tag":110,"props":1307,"children":1308},{},[1309,1314,1319],{"type":43,"tag":137,"props":1310,"children":1311},{},[1312],{"type":48,"value":1313},"Hardcoding API tokens in source code",{"type":43,"tag":137,"props":1315,"children":1316},{},[1317],{"type":48,"value":1318},"Tokens in code get committed and leaked",{"type":43,"tag":137,"props":1320,"children":1321},{},[1322],{"type":48,"value":1323},"Use environment variables or Cloudflare secrets",{"type":43,"tag":110,"props":1325,"children":1326},{},[1327,1339,1351],{"type":43,"tag":137,"props":1328,"children":1329},{},[1330,1332,1337],{"type":48,"value":1331},"Ignoring the ",{"type":43,"tag":86,"props":1333,"children":1335},{"className":1334},[],[1336],{"type":48,"value":622},{"type":48,"value":1338}," domain requirement",{"type":43,"tag":137,"props":1340,"children":1341},{},[1342,1344,1349],{"type":48,"value":1343},"The ",{"type":43,"tag":86,"props":1345,"children":1347},{"className":1346},[],[1348],{"type":48,"value":622},{"type":48,"value":1350}," address must use a domain onboarded to Email Service",{"type":43,"tag":137,"props":1352,"children":1353},{},[1354,1356],{"type":48,"value":1355},"Verify the domain first, then send from ",{"type":43,"tag":86,"props":1357,"children":1359},{"className":1358},[],[1360],{"type":48,"value":1361},"anything@that-domain.com",{"type":43,"tag":110,"props":1363,"children":1364},{},[1365,1384,1409],{"type":43,"tag":137,"props":1366,"children":1367},{},[1368,1370,1375,1377,1382],{"type":48,"value":1369},"Using ",{"type":43,"tag":86,"props":1371,"children":1373},{"className":1372},[],[1374],{"type":48,"value":22},{"type":48,"value":1376}," key in REST API ",{"type":43,"tag":86,"props":1378,"children":1380},{"className":1379},[],[1381],{"type":48,"value":622},{"type":48,"value":1383}," object",{"type":43,"tag":137,"props":1385,"children":1386},{},[1387,1389,1394,1396,1401,1403,1408],{"type":48,"value":1388},"REST API uses ",{"type":43,"tag":86,"props":1390,"children":1392},{"className":1391},[],[1393],{"type":48,"value":1011},{"type":48,"value":1395}," not ",{"type":43,"tag":86,"props":1397,"children":1399},{"className":1398},[],[1400],{"type":48,"value":22},{"type":48,"value":1402}," for ",{"type":43,"tag":86,"props":1404,"children":1406},{"className":1405},[],[1407],{"type":48,"value":622},{"type":48,"value":1383},{"type":43,"tag":137,"props":1410,"children":1411},{},[1412,1414,1419,1421,1427],{"type":48,"value":1413},"Use ",{"type":43,"tag":86,"props":1415,"children":1417},{"className":1416},[],[1418],{"type":48,"value":1026},{"type":48,"value":1420}," for REST, ",{"type":43,"tag":86,"props":1422,"children":1424},{"className":1423},[],[1425],{"type":48,"value":1426},"{ \"email\": \"...\", \"name\": \"...\" }",{"type":48,"value":1428}," for Workers",{"type":43,"tag":110,"props":1430,"children":1431},{},[1432,1443,1448],{"type":43,"tag":137,"props":1433,"children":1434},{},[1435,1436,1441],{"type":48,"value":1369},{"type":43,"tag":86,"props":1437,"children":1439},{"className":1438},[],[1440],{"type":48,"value":1035},{"type":48,"value":1442}," in REST API",{"type":43,"tag":137,"props":1444,"children":1445},{},[1446],{"type":48,"value":1447},"REST API uses snake_case field names",{"type":43,"tag":137,"props":1449,"children":1450},{},[1451,1452,1457,1459,1464],{"type":48,"value":1413},{"type":43,"tag":86,"props":1453,"children":1455},{"className":1454},[],[1456],{"type":48,"value":1043},{"type":48,"value":1458}," for REST API, ",{"type":43,"tag":86,"props":1460,"children":1462},{"className":1461},[],[1463],{"type":48,"value":1035},{"type":48,"value":1465}," for Workers binding",{"type":43,"tag":95,"props":1467,"children":1469},{"id":1468},"references",[1470],{"type":48,"value":1471},"References",{"type":43,"tag":51,"props":1473,"children":1474},{},[1475],{"type":48,"value":1476},"Read the reference that matches your situation. You don't need all of them.",{"type":43,"tag":982,"props":1478,"children":1479},{},[1480,1492,1504,1523,1535],{"type":43,"tag":256,"props":1481,"children":1482},{},[1483,1490],{"type":43,"tag":57,"props":1484,"children":1485},{},[1486],{"type":43,"tag":283,"props":1487,"children":1488},{"href":393},[1489],{"type":48,"value":393},{"type":48,"value":1491}," — Workers binding API, attachments, Agents SDK email. For Workers or Agents SDK.",{"type":43,"tag":256,"props":1493,"children":1494},{},[1495,1502],{"type":43,"tag":57,"props":1496,"children":1497},{},[1498],{"type":43,"tag":283,"props":1499,"children":1500},{"href":465},[1501],{"type":48,"value":465},{"type":48,"value":1503}," — REST endpoint, curl examples, error handling. For apps NOT on Workers.",{"type":43,"tag":256,"props":1505,"children":1506},{},[1507,1514,1516,1521],{"type":43,"tag":57,"props":1508,"children":1509},{},[1510],{"type":43,"tag":283,"props":1511,"children":1512},{"href":525},[1513],{"type":48,"value":525},{"type":48,"value":1515}," — Inbound ",{"type":43,"tag":86,"props":1517,"children":1519},{"className":1518},[],[1520],{"type":48,"value":517},{"type":48,"value":1522}," handler, forwarding, replying, parsing. For receiving emails.",{"type":43,"tag":256,"props":1524,"children":1525},{},[1526,1533],{"type":43,"tag":57,"props":1527,"children":1528},{},[1529],{"type":43,"tag":283,"props":1530,"children":1531},{"href":285},[1532],{"type":48,"value":285},{"type":48,"value":1534}," — Domain setup, wrangler commands, MCP tools. For first-time setup.",{"type":43,"tag":256,"props":1536,"children":1537},{},[1538,1545],{"type":43,"tag":57,"props":1539,"children":1540},{},[1541],{"type":43,"tag":283,"props":1542,"children":1543},{"href":587},[1544],{"type":48,"value":587},{"type":48,"value":1546}," — SPF\u002FDKIM\u002FDMARC, bounces, suppressions, best practices.",{"type":43,"tag":1548,"props":1549,"children":1550},"style",{},[1551],{"type":48,"value":1552},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1554,"total":1732},[1555,1570,1584,1599,1612,1626,1640,1654,1671,1687,1700,1715],{"slug":1556,"name":1556,"fn":1557,"description":1558,"org":1559,"tags":1560,"stars":1567,"repoUrl":1568,"updatedAt":1569},"code-review","review code changes for quality and risk","Review code changes for correctness, clarity, and risk. Use when the user asks for a review, a second opinion on a diff, or feedback on code they wrote.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1561,1562,1564],{"name":9,"slug":8,"type":15},{"name":1563,"slug":1556,"type":15},"Code Review",{"name":1565,"slug":1566,"type":15},"Engineering","engineering",5284,"https:\u002F\u002Fgithub.com\u002Fcloudflare\u002Fagents","2026-06-08T08:19:41.621858",{"slug":1571,"name":1571,"fn":1572,"description":1573,"org":1574,"tags":1575,"stars":1567,"repoUrl":1568,"updatedAt":1583},"debug-plan","create systematic debugging plans","Create a systematic debugging plan for a bug report. Use when the user asks how to investigate a failure, regression, or unexpected behavior.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1576,1579,1582],{"name":1577,"slug":1578,"type":15},"Code Analysis","code-analysis",{"name":1580,"slug":1581,"type":15},"Debugging","debugging",{"name":1565,"slug":1566,"type":15},"2026-05-30T06:16:58.837407",{"slug":1585,"name":1585,"fn":1586,"description":1587,"org":1588,"tags":1589,"stars":1567,"repoUrl":1568,"updatedAt":1598},"escalation","escalate customer issues to human agents","Decide when and how to escalate a customer conversation to a human agent. Use when a request is high-risk, the customer is frustrated, or the issue is outside what you can resolve.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1590,1593,1596],{"name":1591,"slug":1592,"type":15},"Communications","communications",{"name":1594,"slug":1595,"type":15},"Customer Support","customer-support",{"name":1597,"slug":1585,"type":15},"Escalation","2026-06-08T08:19:43.130686",{"slug":1600,"name":1600,"fn":1601,"description":1602,"org":1603,"tags":1604,"stars":1567,"repoUrl":1568,"updatedAt":1611},"pirate-voice","rewrite text in pirate voice","Rewrite or answer in a playful pirate voice. Use when the user asks for pirate tone, nautical phrasing, or says to talk like a pirate.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1605,1608],{"name":1606,"slug":1607,"type":15},"Creative","creative",{"name":1609,"slug":1610,"type":15},"Writing","writing","2026-05-30T06:17:00.080367",{"slug":1613,"name":1613,"fn":1614,"description":1615,"org":1616,"tags":1617,"stars":1567,"repoUrl":1568,"updatedAt":1625},"release-notes","draft product release notes","Draft short release notes from a list of changes. Use when the user asks for changelogs, release notes, or a concise product update.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1618,1621,1624],{"name":1619,"slug":1620,"type":15},"Content Creation","content-creation",{"name":1622,"slug":1623,"type":15},"Documentation","documentation",{"name":1609,"slug":1610,"type":15},"2026-05-30T06:17:01.278643",{"slug":1627,"name":1627,"fn":1628,"description":1629,"org":1630,"tags":1631,"stars":1567,"repoUrl":1568,"updatedAt":1639},"test-plan","produce focused test plans","Produce a focused test plan for a change. Use when the user asks how to test a feature, what cases to cover, or for a QA checklist before shipping.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1632,1633,1636],{"name":1565,"slug":1566,"type":15},{"name":1634,"slug":1635,"type":15},"QA","qa",{"name":1637,"slug":1638,"type":15},"Testing","testing","2026-05-30T06:17:02.479863",{"slug":1641,"name":1641,"fn":1642,"description":1643,"org":1644,"tags":1645,"stars":1567,"repoUrl":1568,"updatedAt":1653},"workspace-digest","summarize files in the shared workspace","Summarize the files saved in this assistant's shared workspace. Use when the user asks what is in their workspace, for a file inventory, or a digest of saved work.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1646,1647,1650],{"name":1622,"slug":1623,"type":15},{"name":1648,"slug":1649,"type":15},"Knowledge Management","knowledge-management",{"name":1651,"slug":1652,"type":15},"Summarization","summarization","2026-06-07T07:51:27.265303",{"slug":1655,"name":1655,"fn":1656,"description":1657,"org":1658,"tags":1659,"stars":1668,"repoUrl":1669,"updatedAt":1670},"cloudflare-bundler-apps","author Cloudflare Worker Bundler applications","Author Cloudflare Worker Bundler-compatible apps that build and preview correctly inside a space. Use this skill whenever you scaffold, modify, or deploy a project that will be built with `@cloudflare\u002Fworker-bundler` (i.e. anything served from `\u002Fspace\u002F:name\u002Fpreview\u002F:branch\u002F`). Covers wrangler config, project layout, static asset rules, server entry conventions, npm dependency limits, and the most common cause of blank previews (JSX in browser scripts).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1660,1661,1662,1665],{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":1663,"slug":1664,"type":15},"Deployment","deployment",{"name":1666,"slug":1667,"type":15},"Web Development","web-development",5145,"https:\u002F\u002Fgithub.com\u002Fcloudflare\u002Fvibesdk","2026-06-16T09:45:57.551207",{"slug":1672,"name":1672,"fn":1673,"description":1674,"org":1675,"tags":1676,"stars":1668,"repoUrl":1669,"updatedAt":1686},"frontend-design","create production-grade frontend interfaces","Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML\u002FCSS layouts, or when styling\u002Fbeautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1677,1680,1683,1685],{"name":1678,"slug":1679,"type":15},"Design","design",{"name":1681,"slug":1682,"type":15},"Frontend","frontend",{"name":1684,"slug":1229,"type":15},"HTML",{"name":1666,"slug":1667,"type":15},"2026-06-16T09:46:01.852741",{"slug":1688,"name":1688,"fn":1689,"description":1690,"org":1691,"tags":1692,"stars":1668,"repoUrl":1669,"updatedAt":1699},"frontend-design-landing-page","build marketing landing pages","Marketing landing page and conversion-focused product page reference. Use this skill when building hero sections, feature grids, pricing pages, testimonials, CTAs, footers, navigation bars, or any public-facing marketing surface. Covers a warm, professional, developer-friendly design language (cream backgrounds, generous whitespace, pill CTAs, corner-bracket card decorations) and a complete token set, animation system, and copy-paste component snippets. NOT for product\u002Fdashboard UIs — use frontend-design-saas for those.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1693,1694,1695,1698],{"name":1681,"slug":1682,"type":15},{"name":1684,"slug":1229,"type":15},{"name":1696,"slug":1697,"type":15},"Marketing","marketing",{"name":1666,"slug":1667,"type":15},"2026-06-16T09:46:00.515859",{"slug":1701,"name":1701,"fn":1702,"description":1703,"org":1704,"tags":1705,"stars":1668,"repoUrl":1669,"updatedAt":1714},"frontend-design-saas","build SaaS dashboard and product UIs","S-tier SaaS dashboard and product UI reference. Use this skill when building application shells, data tables, settings panels, billing pages, dashboards, auth flows, admin tools, or any internal\u002Fcustomer-facing SaaS product UI. Inspired by Stripe, Linear, Vercel, Airbnb, Notion. Covers neutral-led design tokens, sidebar+content shells, dense data UIs, form-heavy configuration pages, command palettes, empty states, and the accessibility (WCAG AA+) bar these products clear.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1706,1707,1708,1711],{"name":1678,"slug":1679,"type":15},{"name":1681,"slug":1682,"type":15},{"name":1709,"slug":1710,"type":15},"SaaS","saas",{"name":1712,"slug":1713,"type":15},"UI Components","ui-components","2026-06-16T09:45:58.956063",{"slug":1716,"name":1716,"fn":1717,"description":1718,"org":1719,"tags":1720,"stars":23,"repoUrl":24,"updatedAt":1731},"agents-sdk","build AI agents on Cloudflare Workers","Build AI agents on Cloudflare Workers using the Agents SDK. Load when creating stateful agents, durable workflows, real-time WebSocket apps, scheduled tasks, MCP servers, chat applications, voice agents, or browser automation. Covers Agent class, state management, callable RPC, Workflows, durable execution, queues, retries, observability, and React hooks. Biases towards retrieval from Cloudflare docs over pre-trained knowledge.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1721,1723,1724,1725,1728],{"name":1722,"slug":29,"type":15},"Agents",{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":1726,"slug":1727,"type":15},"MCP","mcp",{"name":1729,"slug":1730,"type":15},"WebSockets","websockets","2026-04-06T18:07:36.660888",22,{"items":1734,"total":1836},[1735,1743,1755,1762,1788,1807,1820],{"slug":1716,"name":1716,"fn":1717,"description":1718,"org":1736,"tags":1737,"stars":23,"repoUrl":24,"updatedAt":1731},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1738,1739,1740,1741,1742],{"name":1722,"slug":29,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":1726,"slug":1727,"type":15},{"name":1729,"slug":1730,"type":15},{"slug":8,"name":8,"fn":1744,"description":1745,"org":1746,"tags":1747,"stars":23,"repoUrl":24,"updatedAt":1754},"build on the full Cloudflare platform","Comprehensive Cloudflare platform skill covering Workers, Pages, storage (KV, D1, R2), AI (Workers AI, Vectorize, Agents SDK), feature flags (Flagship), networking (Tunnel, Spectrum), security (WAF, DDoS), and infrastructure-as-code (Terraform, Pulumi). Use for any Cloudflare development task. Biases towards retrieval from Cloudflare docs over pre-trained knowledge.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1748,1749,1750,1751],{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":18,"slug":19,"type":15},{"name":1752,"slug":1753,"type":15},"Storage","storage","2026-04-06T18:07:35.399081",{"slug":4,"name":4,"fn":5,"description":6,"org":1756,"tags":1757,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1758,1759,1760,1761],{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"slug":1763,"name":1763,"fn":1764,"description":1765,"org":1766,"tags":1767,"stars":23,"repoUrl":24,"updatedAt":1787},"cloudflare-one","configure and manage Cloudflare One Zero Trust","Guides Cloudflare One Zero Trust and SASE work across Access, Gateway, WARP, Tunnel, Cloudflare WAN, DLP, CASB, device posture, and identity. Use when designing, configuring, troubleshooting, or reviewing Cloudflare One deployments. Retrieval-first: use current Cloudflare docs\u002FAPI schemas instead of embedded product docs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1768,1771,1772,1775,1778,1781,1784],{"name":1769,"slug":1770,"type":15},"Access Control","access-control",{"name":9,"slug":8,"type":15},{"name":1773,"slug":1774,"type":15},"Infrastructure","infrastructure",{"name":1776,"slug":1777,"type":15},"Networking","networking",{"name":1779,"slug":1780,"type":15},"SASE","sase",{"name":1782,"slug":1783,"type":15},"Security","security",{"name":1785,"slug":1786,"type":15},"Zero Trust","zero-trust","2026-06-15T09:51:34.015251",{"slug":1789,"name":1789,"fn":1790,"description":1791,"org":1792,"tags":1793,"stars":23,"repoUrl":24,"updatedAt":1806},"cloudflare-one-migrations","plan migrations to Cloudflare One","Plans migrations from Zscaler ZIA\u002FZPA, Palo Alto, legacy VPN, SWG, or SASE stacks to Cloudflare One. Use for migration assessments, policy mapping, rollout plans, and parity\u002Fgap analysis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1794,1795,1798,1799,1802,1803],{"name":9,"slug":8,"type":15},{"name":1796,"slug":1797,"type":15},"Migration","migration",{"name":1776,"slug":1777,"type":15},{"name":1800,"slug":1801,"type":15},"Risk Assessment","risk-assessment",{"name":1782,"slug":1783,"type":15},{"name":1804,"slug":1805,"type":15},"Strategy","strategy","2026-06-15T09:51:35.348691",{"slug":1808,"name":1808,"fn":1809,"description":1810,"org":1811,"tags":1812,"stars":23,"repoUrl":24,"updatedAt":1819},"durable-objects","build Cloudflare Durable Objects","Create and review Cloudflare Durable Objects. Use when building stateful coordination (chat rooms, multiplayer games, booking systems), implementing RPC methods, SQLite storage, alarms, WebSockets, or reviewing DO code for best practices. Covers Workers integration, wrangler config, and testing with Vitest. Biases towards retrieval from Cloudflare docs over pre-trained knowledge.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1813,1814,1815,1818],{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":1816,"slug":1817,"type":15},"State Management","state-management",{"name":1729,"slug":1730,"type":15},"2026-04-06T18:07:39.148434",{"slug":1821,"name":1821,"fn":1822,"description":1823,"org":1824,"tags":1825,"stars":23,"repoUrl":24,"updatedAt":1835},"sandbox-sdk","build sandboxed code execution apps on Cloudflare","Build sandboxed applications for secure code execution. Load when building AI code execution, code interpreters, CI\u002FCD systems, interactive dev environments, or executing untrusted code. Covers Sandbox SDK lifecycle, commands, files, code interpreter, and preview URLs. Biases towards retrieval from Cloudflare docs over pre-trained knowledge.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1826,1827,1828,1831,1834],{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":1829,"slug":1830,"type":15},"Code Execution","code-execution",{"name":1832,"slug":1833,"type":15},"Sandboxing","sandboxing",{"name":18,"slug":19,"type":15},"2026-04-06T18:07:37.89439",11]