/v1/pages
Create a page in a website. Returns the created page with the id you will use for every follow-up request.
| Field | Type | Required | Notes |
|---|---|---|---|
| website_id | integer | Yes | The site the page belongs to. |
| title | string | Yes | Max 255 characters. Used for the browser tab. |
| slug | string | No | Derived from the title when omitted. Unique per website. |
| blocks | array | No | Up to 500 block objects with id and html. |
{
"id": 412,
"website_id": 16,
"title": "Careers",
"slug": "careers",
"status": "draft",
"url": "/page/careers?website_id=16",
"created_at": "2026-10-12T09:14:22Z"
}
401 Unauthorized
Missing or expired token. Refresh and retry once.
422 Unprocessable
A slug collision or a field over its length limit. The body names the field.
The same request in four languages. Pick the one your team actually runs.
curl https://api.northwind.co/v1/pages -H "Authorization: Bearer $NORTHWIND_TOKEN" -H "Accept: application/json"
const res = await fetch('https://api.northwind.co/v1/pages', {
headers: { Authorization: 'Bearer ' + process.env.NORTHWIND_TOKEN }
});
const pages = await res.json();
$pages = Http::withToken(env('NORTHWIND_TOKEN'))
->get('https://api.northwind.co/v1/pages')
->json();
import os, requests
pages = requests.get(
"https://api.northwind.co/v1/pages",
headers={"Authorization": f"Bearer {os.environ['NORTHWIND_TOKEN']}"},
).json()
Rate limits
600 requests per minute per token, with a 429 and a Retry-After header when you exceed it.
You are reading v3.2. Pages for older versions stay online and are not updated with new features.
Not at all. Every section is drag and drop, and text is edited inline. Code is optional, never required.
Yes. Connect any domain in a couple of clicks and we provision SSL automatically.
Always. Build and preview for free, upgrade only when you publish your own domain.
Yes. Export clean, static HTML and CSS at any time. Your work is never locked in.