One Expo Router API Route — signed articles arrive as JSON.
Expo Router API Routes are standard Request/Response handlers, so a file at app/webhook+api.ts is all DraftSEO needs: request.text() hands you the raw body, Web Crypto checks the HMAC, and you store the post. The one requirement is a web deployment — set web.output to "server" in app.json, because API Routes do not exist in the "static" or "single" outputs, and a mobile-only build has no URL for Google to crawl.
| Connection | An API Route — app/webhook+api.ts, recipe provided |
|---|---|
| Security | HMAC-signed + timestamped — Web Crypto over ${timestamp}.${rawBody}, replay-window protected |
| Payload | Full article JSON — title, HTML, images, meta, slug, language |
| Requirement | web.output: "server" — a web deployment is needed; a mobile-only app has nothing to index |
| Hosting | EAS Hosting or any adapter — the same +api.ts file runs on Vercel, Netlify, Cloudflare, Bun or Express |
Who does what
Paste the +api.ts route, verify the HMAC over request.text(), store the post in an HTTP-reachable database, and serve it from your blog routes. After the green test delivery: zero minutes per article.
The recipe includes the blog index and article routes, so the pages are crawlable from day one.
Setup
Connect a site → Expo. You get a signing secret and the Expo Router recipe.
~1 minute
Set "web": { "output": "server" } in app.json — API Routes only exist in that output.
~1 minute
Drop app/webhook+api.ts in, verify the signature and timestamp, then upsert the post into Neon, Supabase, Turso or D1.
~15 minutes
Run npx expo export -p web && eas deploy --prod, then send the signed test delivery; a green check confirms the connection.
~3 minutes
Every generated article is delivered to your route on cadence and served by your blog pages.
Ongoing · zero clicks
FAQ
It publishes to the web deployment of your Expo project — the site served from your .expo.app domain or your custom domain. That is the surface search engines crawl. Your native app can read the same posts from the database the receiver writes to.
With web.output set to "server", Expo pre-renders your React routes to HTML at build time, so an article delivered by webhook after the deploy would be missing from the HTML a crawler reads. An API Route renders on each request, so a new article is indexable the moment it lands — no rebuild, no redeploy.
EAS Hosting runs on Cloudflare Workers, so there is no filesystem and no long-lived TCP socket. Use a database reachable over HTTP — Neon serverless driver, Supabase, Turso or Cloudflare D1 all work from an API Route.
Into an EAS environment variable without the EXPO_PUBLIC_ prefix — eas env:set --name DRAFTSEO_WEBHOOK_SECRET --visibility sensitive. Server code in a +api.ts file reads every variable, while the EXPO_PUBLIC_ prefix would inline the value into the browser bundle.
No card required. Signed test delivery in under a minute.