One Nitro server route — signed articles arrive under /api.
Nuxt renders the blog; DraftSEO delivers the posts. A Nitro server route at server/api/webhook.post.ts uses readRawBody() so the exact bytes survive for the HMAC check, then stores the article. Nuxt server routes live under /api, so your webhook URL ends in /api/webhook.
| Connection | A server route — server/api/webhook.post.ts, 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 | Nitro-native — readRawBody() gives the exact bytes; endpoint sits under /api |
Who does what
Paste the Nitro server route, verify the HMAC over readRawBody(), then persist the post for your Vue pages to fetch. Once the test is green, nothing more per article.
Your components and useAsyncData own the rendering.
Setup
Connect a site → Nuxt. You get a signing secret and the server-route recipe.
~1 minute
Add server/api/webhook.post.ts, read readRawBody(), verify the signature, store the post — the recipe shows it all.
~10 minutes
DraftSEO sends a signed test event to /api/webhook; a green check means connected.
~1 minute
Every generated article is delivered to your Nitro route on cadence.
Ongoing · zero clicks
FAQ
A JSON body { event, deliveryId, data } — data holds the title, HTML article, slug, language, meta fields and image URLs, so a single handler can store a complete post.
Each request is HMAC-signed over ${timestamp}.${rawBody} with a timestamp header; you recompute it from readRawBody() and reject anything older than the 5-minute replay window.
Yes — the receiver is a standard Nitro server route (server/api/webhook.post.ts) using defineEventHandler and readRawBody. Because server routes are namespaced under /api, your public webhook URL ends in /api/webhook.
No card required. Signed test delivery in under a minute.