Railway builds and runs the service; your code catches each article.
Railway builds and runs services, but it keeps no posts: its API stops at projects, services, deployments, variables, domains and volumes, with no article resource among them. The blog lives in your service instead. Add one receiver route to whatever Railpack built — Next.js, Laravel, Django, Ruby on Rails, Go, Rust / Axum, Elixir / Phoenix, Java / Spring and more — and DraftSEO sends it each finished article as signed JSON while Railway carries on building and running the code.
| Railway content API | None — services, variables, volumes — projects, deployments and domains too, but no post, page or article resource |
|---|---|
| Receiving end | A route in your own service — Railpack builds every recipe stack except ASP.NET Core, which needs a Dockerfile |
| Signature | HMAC plus timestamp header — signed over ${timestamp}.${rawBody} with a 5-minute replay window |
| Public URL | Not until Generate Domain — Settings → Networking → Public Networking; register the https:// address |
| Files outside a volume | Lost on every deploy — store posts in Postgres, added from + New |
Who does what
Name the stack Railpack builds, drop in its receiver, check the signature and write each post to your database. After the green test, articles cost you nothing per post, and every page, route and template stays under your control.
Set up once — the service handles every article from then on.
Setup
Railpack works out the language for you, so setup starts with naming the stack you wrote.
Connect a site → Railway, then choose your stack: Next.js, Nuxt (Vue), Laravel, Django, FastAPI, Ruby on Rails, Go, Rust / Axum, Elixir / Phoenix, Java / Spring, Kotlin (Ktor) or ASP.NET Core. Its recipe arrives with your signing secret.
~1 minute
Listen on 0.0.0.0 and the PORT Railway injects — a localhost bind answers with a 502. Then Settings → Networking → Public Networking → Generate Domain: until you do, the service has no public URL. A static site gets the receiver as a second service.
~10 minutes
Service → Variables → New Variable, or run railway variable set DRAFTSEO_WEBHOOK_SECRET="<your signing secret>". Railway stages variable changes, so click Deploy to apply it.
~2 minutes
Paste the https:// address — Railway answers http:// with a 301, which turns the POST into a GET. Press Send test for a signed test delivery — and a deliberately invalid one, which your receiver must reject.
~1 minute
From here, every article DraftSEO writes lands in your Railway service on schedule, images and SEO metadata included.
Ongoing · zero clicks
FAQ
No. Railway holds no content to write into: its API covers projects, services, deployments, variables, domains and volumes, and has no post, page or article resource. What DraftSEO publishes into is the service you deployed on Railway — the code that serves your blog to readers.
Railpack, Railway’s default builder, detects the language of nearly every DraftSEO recipe: Next.js, Astro, SvelteKit, Nuxt (Vue), Expo, Node.js / Express, PHP (plain), Laravel, Django, FastAPI, Ruby on Rails, Go (net/http), Rust / Axum, Elixir / Phoenix, Java / Spring and Kotlin (Ktor). ASP.NET Core is the exception — Railway’s guide requires a Dockerfile, and Railway always builds from one it finds at the repository root. For Ktor, build a fat JAR, because Railpack starts the JAR in build/libs with java -jar.
Usually for one of two reasons. The app may be listening on localhost rather than 0.0.0.0 and the PORT Railway injects — the recipes read PORT already. Or Serverless is switched on under Settings → Deploy: the service sleeps after 5–10 idle minutes and its first request can fail with a 502 while it wakes, so press Send test again, or leave Serverless off, which is the default.
Railway serves a static site with Caddy, and there is no code of your own there to answer a POST. Add the receiver as a second service — the Node.js recipe needs no changes — and point the DraftSEO endpoint at that service instead.
In a database, because files written outside a volume are lost on every deploy. Add Postgres from + New, let the receiver upsert each article by its id, and have your pages read posts from that table.
No card required. Signed test delivery in under a minute.