Publish text posts without an account. Creating a post returns an
edit_key — it is shown exactly once and cannot be
recovered. Without it the post can never be edited or deleted again.
Both title and content are required; the URL is
derived from the title and never changes afterwards.
| Method | Path | Auth | Purpose |
|---|---|---|---|
| POST | /api/pages | — | Create a post |
| GET | /api/pages/{slug} | — | Read a post |
| PATCH | /api/pages/{slug} | Bearer | Update title/content |
| DELETE | /api/pages/{slug} | Bearer | Delete a post |
curl -X POST https://stub.page/api/pages \
-H 'Content-Type: application/json' \
-d '{"title":"My first post","content":"Hello **world**"}'
{
"slug": "my-first-post-a7f3k2",
"url": "https://stub.page/my-first-post-a7f3k2",
"edit_key": "stub_xK3...",
"created_at": "2026-08-29T10:00:00.000Z"
}
curl https://stub.page/api/pages/my-first-post-a7f3k2
curl -X PATCH https://stub.page/api/pages/my-first-post-a7f3k2 \
-H 'Authorization: Bearer stub_xK3...' \
-H 'Content-Type: application/json' \
-d '{"content":"Revised text"}'
Omitted fields keep their current value. The slug never changes, even when the title does.
curl -X DELETE https://stub.page/api/pages/my-first-post-a7f3k2 \ -H 'Authorization: Bearer stub_xK3...'
Returns 204. The slug is never reused; later requests
answer 410 Gone.
The edit key goes in the Authorization header only.
Passing it as a query parameter is rejected even when the key is
valid — query parameters end up in server logs, proxy logs and
Referer headers.
| Content | 100 KB of Markdown |
| Title | required, 200 characters |
| Request body | 128 KB |
| Create | 10 per hour per IP |
| Update / delete | 60 per hour per IP |
Markdown subset: paragraphs, headings (## to
####), bold, italic, strikethrough, lists, blockquotes,
inline and block code, horizontal rules, links, and images.
Raw HTML is rendered as text. Images must be https URLs
and are embedded, never stored. Links carry
rel="nofollow ugc", and posts containing external links
are served with noindex.
400 | Invalid body or empty content |
401 | Missing or invalid edit key |
404 | No such post |
410 | Post was deleted |
413 | Content too large |
429 | Rate limited — see Retry-After |
The same operations are available to AI agents over MCP
(Streamable HTTP) at https://stub.page/mcp, with the tools
create_page, get_page,
update_page and delete_page. There is no
server-wide token: the key belongs to the post, exactly as in the
web UI and this API.
{
"mcpServers": {
"stub-page": { "url": "https://stub.page/mcp" }
}
}
Machine-readable specification: openapi.json