One API endpoint — signed articles land in your content store.
Astro renders the pages; DraftSEO supplies the content. A dynamic API endpoint at src/pages/webhook.ts (prerender = false) reads request.text() for the raw body, verifies the HMAC and stores the post. The one prerequisite is an SSR adapter — the route has to run server-side to receive a POST at all.
| Connection | An API endpoint — src/pages/webhook.ts, prerender = false, recipe provided |
|---|---|
| Security | HMAC-signed + timestamped — verified over ${timestamp}.${rawBody}, replay-window protected |
| Payload | Full article JSON — title, HTML, images, meta, slug, language |
| Images | DraftSEO CDN URLs — URLs ride in the payload; rehost to your own storage if you prefer |
| Framework fit | Needs SSR or hybrid output — add @astrojs/node or @astrojs/vercel so the endpoint runs server-side |
Who does what
Add an SSR adapter, paste the endpoint, verify the signature over request.text(), and store the post where your pages read it. After the test passes, nothing per article.
Your islands and layouts render the posts, not us.
Setup
Connect a site → Astro. You get a signing secret and the API-endpoint recipe.
~1 minute
Set an SSR adapter, add src/pages/webhook.ts with prerender = false, verify the HMAC and store the post — the recipe walks it through.
~10 minutes
DraftSEO fires a signed test event; a green check means the endpoint is live.
~1 minute
Every generated article is delivered to your Astro endpoint on cadence.
Ongoing · zero clicks
FAQ
A JSON body { event, deliveryId, data } — data carries the title, HTML article, slug, language, meta fields and image URLs, ready for you to persist and render in an Astro layout.
Every request is HMAC-signed over ${timestamp}.${rawBody} and stamped with a timestamp header; you recompute it from request.text() and reject anything beyond the 5-minute replay window.
The receiver endpoint itself must run server-side, so you need the SSR or hybrid output with an adapter. If your site is statically built, store incoming posts in your content source and trigger a rebuild — or serve /blog from the SSR/hybrid side while the rest stays static.
No card required. Signed test delivery in under a minute.