Developers

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.

What is here
curl -s https://curiosive.com/api
The studio, its services and its prices
curl -s https://curiosive.com/api/v1/site
An article, body included, as Markdown
curl -s "https://curiosive.com/api/v1/posts?limit=1"
curl -s https://curiosive.com/api/v1/posts/{slug}
Any page of the site as Markdown
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.
Both of these reach the same handler
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.

What a deprecated endpoint would answer
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.

The only authenticated call
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.

MethodPathWhat it returns
GET/apiCuriosive API index: versions, endpoints and where the docs are
GET/api/v1/siteStudio profile, services, pricing and machine-readable entry points
GET/api/v1/projectsProducts the studio has shipped that are live today
GET/api/v1/postsPublished articles, newest first
GET/api/v1/posts/{slug}One article, including its full body as Markdown
GET/api/v1/pagesLanding pages describing services, technologies and locations
GET/api/v1/pages/{slug}One landing page with its sections and FAQ
POST/api/v1/revalidatePurge the CMS query cache
GET/md/{path}Any page of the site rendered as Markdown
GET/llms.txtThe whole site summarised for a language model (llmstxt.org)
GET/sitemap.xmlEvery indexable URL, in both languages
GET/feed.xmlRSS feed of the English articles
GET/developersCuriosive developer portal: quickstart, authentication and the versioning policy
GET/openapi.jsonThis document
GET/openapi.yamlThis 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.

GET /api/v1/posts/does-not-exist
{
  "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.

The same document, two ways
curl -s -H "Accept: text/markdown" https://curiosive.com/
curl -s https://curiosive.com/md

Machine-readable files

FileWhat it is
https://curiosive.com/apiIndex of versions, endpoints and documents
https://curiosive.com/openapi.jsonOpenAPI 3.1 description of the API
https://curiosive.com/openapi.yamlThe same document, as YAML
https://curiosive.com/llms.txtThe whole site summarised for a language model
https://curiosive.com/mdAny page of the site as Markdown
https://curiosive.com/sitemap.xmlEvery indexable URL, in both languages
https://curiosive.com/feed.xmlRSS feed of the English articles
https://curiosive.com/robots.txtCrawl 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.