Curiosive API
Documentation for the Curiosive API: a public, read-only JSON API over everything published on https://curiosive.com, plus a Markdown representation of every page. No key, no sign-up.
Quickstart
Every read endpoint is public. There is nothing to sign up for and no key to send. Start at https://curiosive.com/api, which lists the current version and every operation.
curl -s https://curiosive.com/api
curl -s https://curiosive.com/api/v1/site
curl -s "https://curiosive.com/api/v1/posts?limit=1"
curl -s https://curiosive.com/api/v1/posts/{slug}curl -s -H "Accept: text/markdown" https://curiosive.com/blog
Base URL and versioning
The base URL is https://curiosive.com/api/v1. Pin the version in the path; that is the part of this contract you can rely on.
Responses carry `x-api-version: 1` and a `Link` header pointing at both the OpenAPI document and this page, so a client can find its way from any response.
- The stable base path is /api/v1. Pin it.
- The unversioned /api/... paths are an alias for the current major and may move when a new one ships.
- Within a major, fields are only ever added; nothing is removed or retyped.
- A breaking change ships as /api/v2 while /api/v1 keeps answering.
- An endpoint that is going away answers with Deprecation and Sunset headers for at least 6 months first, and a Link header pointing at its replacement.
curl -sI https://curiosive.com/api/v1/site | grep -i x-api-version curl -s https://curiosive.com/api/site
Deprecation policy
Nothing is deprecated today. When something is, you will know from the response before you know from anywhere else: a deprecated endpoint answers with a `Deprecation` header (RFC 9745) giving the date it was deprecated, a `Sunset` header (RFC 8594) giving the date it stops answering, and a `Link` header with `rel="deprecation"` pointing here and `rel="successor-version"` pointing at whatever replaces it.
The gap between those two dates is at least 6 months. A breaking change ships as a new major under a new path while the old one keeps answering for that period, so no integration breaks without warning.
HTTP/2 200 deprecation: Tue, 01 Sep 2026 00:00:00 GMT sunset: Sun, 01 Mar 2027 00:00:00 GMT link: <https://curiosive.com/developers>; rel="deprecation"; type="text/html", <https://curiosive.com/api/v2/site>; rel="successor-version"
Authentication
Every read endpoint is unauthenticated. Send no credentials; none are checked, and none are stored.
The one write endpoint, `POST /api/v1/revalidate`, purges the CMS cache and takes a bearer token held by the publishing pipeline. It is not something an integration needs.
curl -X POST https://curiosive.com/api/v1/revalidate \ -H "Authorization: Bearer $REVALIDATE_SECRET"
Endpoints
The full description, with request and response schemas, is the OpenAPI document at https://curiosive.com/openapi.json (also served as YAML at https://curiosive.com/openapi.yaml). This table is generated from it.
The surface is read-only. There are no webhooks and nothing to subscribe to: poll an endpoint, or read the RSS feed for new articles.
| Method | Path | What it returns |
|---|---|---|
| GET | /api | Curiosive API index: versions, endpoints and where the docs are |
| GET | /api/v1/site | Studio profile, services, pricing and machine-readable entry points |
| GET | /api/v1/projects | Products the studio has shipped that are live today |
| GET | /api/v1/posts | Published articles, newest first |
| GET | /api/v1/posts/{slug} | One article, including its full body as Markdown |
| GET | /api/v1/pages | Landing pages describing services, technologies and locations |
| GET | /api/v1/pages/{slug} | One landing page with its sections and FAQ |
| POST | /api/v1/revalidate | Purge the CMS query cache |
| GET | /md/{path} | Any page of the site rendered as Markdown |
| GET | /llms.txt | The whole site summarised for a language model (llmstxt.org) |
| GET | /sitemap.xml | Every indexable URL, in both languages |
| GET | /feed.xml | RSS feed of the English articles |
| GET | /developers | Curiosive developer portal: quickstart, authentication and the versioning policy |
| GET | /openapi.json | This document |
| GET | /openapi.yaml | This document, as YAML |
Errors
Every failure is JSON, never an HTML error page, including an unknown path and an unsupported method. The body always has the same shape: a stable machine-readable `code`, a `message` for a person, a `hint` saying what to do instead, and a link back to the spec.
The codes are fixed: bad_request, invalid_parameter, unauthorized, not_found, method_not_allowed, not_acceptable, server_error.
{
"error": {
"code": "not_found",
"status": 404,
"message": "No article with slug \"does-not-exist\" is published in \"en\".",
"hint": "List the available slugs at https://curiosive.com/api/v1/posts?locale=en.",
"documentation": "https://curiosive.com/openapi.json"
}
}Markdown and content negotiation
Every page on this site has two representations: HTML for people and Markdown for agents. Send `Accept: text/markdown` to any URL and you get the Markdown one, with `Vary: Accept` set so a cache cannot hand you the wrong variant. The same document is also at a stable URL: prefix the path with `/md`.
A request that accepts none of `text/html`, `text/markdown` or `text/plain` is answered with `406`, not with a representation it did not ask for.
curl -s -H "Accept: text/markdown" https://curiosive.com/ curl -s https://curiosive.com/md
Machine-readable files
| File | What it is |
|---|---|
| https://curiosive.com/api | Index of versions, endpoints and documents |
| https://curiosive.com/openapi.json | OpenAPI 3.1 description of the API |
| https://curiosive.com/openapi.yaml | The same document, as YAML |
| https://curiosive.com/llms.txt | The whole site summarised for a language model |
| https://curiosive.com/md | Any page of the site as Markdown |
| https://curiosive.com/sitemap.xml | Every indexable URL, in both languages |
| https://curiosive.com/feed.xml | RSS feed of the English articles |
| https://curiosive.com/robots.txt | Crawl policy |
MCP server
Curiosive runs Model Context Protocol servers for its own publishing tools, speaking Streamable HTTP. They can write, so the shared secret is part of the connector URL and they are not listed in the OpenAPI document — publishing the path would publish the credential.
They are not a public product. If you want an MCP surface over this content, write to hello@curiosive.com and say what you need from it.
Rate limits and fair use
No rate limit is enforced today, and no rate-limit headers are sent, because there is nothing to report. The endpoints are cached at the edge and cheap to serve.
If that changes, the limits will be published here and reported in `RateLimit` headers on every response before they are enforced. Until then: be reasonable, and prefer https://curiosive.com/llms.txt or a single /api/v1/posts call over crawling every page.
Support
Questions, bug reports and requests for an endpoint that does not exist yet: hello@curiosive.com. Replies come from the engineer who wrote it.