A Worker takes each delivery; Cloudflare’s network serves the page.
Cloudflare’s API covers accounts, zones, DNS, Workers, Pages projects and security settings — none of which is a post, page or article, so no tool can publish "to Cloudflare". What can take an article is the code Cloudflare runs for you: a route in your Next.js, Astro, SvelteKit or Nuxt app, or a single Worker in front of a static site. DraftSEO sends each finished article there as signed JSON, your code saves it to D1 (or to Postgres through Hyperdrive), and Cloudflare’s network serves the page.
| Cloudflare content API | None — zones, DNS, Workers, Pages — no post, page or article resource anywhere in Cloudflare’s API |
|---|---|
| Receiving end | Your app’s route or one Worker — recipes for Next.js, Astro, SvelteKit, Nuxt, Expo, Express, FastAPI and Django |
| Delivery security | HMAC signature + timestamp — checked over ${timestamp}.${rawBody}; a delivery more than 5 minutes old fails the check |
| Free-plan CPU budget | 10 ms per request — a long article in a large bundle can hit error 1102; the Paid plan allows up to 30 seconds |
| Bot Fight Mode | Turn it off — a WAF skip rule cannot bypass it, and it can challenge DraftSEO’s server-to-server POST |
Who does what
Choose the framework your Worker runs, paste its receiver, and add the signing secret with wrangler. Once the signed test passes, each article costs you nothing — your bindings, routes and components stay yours.
One wrangler command ships the secret — articles take care of themselves after that.
Setup
Cloudflare decides where the secret lives and how much CPU a request gets; your framework decides the rest.
Connect a site → Cloudflare, then choose Next.js, Astro, SvelteKit, Nuxt (Vue), Expo, Node.js / Express, FastAPI or Django — or a Containers stack such as Laravel, Ruby on Rails or ASP.NET Core. You get that stack’s recipe alongside your signing secret.
~1 minute
Next.js deploys through OpenNext (@opennextjs/cloudflare), Astro through npx astro add cloudflare, SvelteKit through @sveltejs/adapter-cloudflare and Nuxt through the cloudflare_module preset. A fully static site gets the ready-made Worker, which answers /webhook before your assets. Workers have no filesystem, so posts go to D1 or to Postgres through Hyperdrive.
~10 minutes
Run npx wrangler secret put DRAFTSEO_WEBHOOK_SECRET, which deploys a new version with the secret in one go. Keep it out of vars in wrangler.jsonc — there it sits in plain text in your repository.
~1 minute
Send test fires a signed test delivery — and a deliberately invalid one, which your receiver must reject. If Bot Fight Mode is on for your domain, switch it off first.
~1 minute
New articles reach your Worker on your publishing schedule, each with its images, slug and meta description.
Ongoing · zero clicks
FAQ
No — there is no content inside Cloudflare to publish into. Its API manages accounts, zones, DNS, Workers, Pages projects and security settings, and not one of those is a post, page or article. DraftSEO publishes into the app Cloudflare runs for you, which is where your blog is actually rendered.
Workers run Next.js (through OpenNext, or vinext for a new app), Astro, SvelteKit and Nuxt through their Cloudflare adapters, Expo through expo-server’s workerd adapter, Express through httpServerHandler, and FastAPI and Django through Python Workers, which are still in beta. PHP, Laravel, Ruby on Rails, Go, ASP.NET Core, Rust / Axum, Elixir / Phoenix, Java / Spring and Kotlin (Ktor) run only as Cloudflare Containers — a Docker image built for linux/amd64 behind a Worker, on the Workers Paid plan.
One Worker. A static site on Workers or Pages runs no code of its own, so nothing is there to answer DraftSEO’s POST. The connect wizard hands you a ready-to-paste Worker that answers /webhook before your static assets, with the Pages Functions variant in its last comment.
It can. The Free plan gives a request 10 ms of CPU time — waiting on the database does not count — and parsing a long article inside a large framework bundle can go over that and fail with error 1102. The Paid plan raises the limit to as much as 30 seconds.
In D1, or in a Postgres database you already run, reached through Hyperdrive. Django on Python Workers keeps its database on D1 through django-cf, and D1 does not support transactions — check that fits your app before you pick it.
No card required. Signed test delivery in under a minute.