This site publishes a read-only JSON API so agents, integrations, and curious developers can work with the content programmatically without scraping HTML. No authentication, no versioning, CORS open.

benmilne developer resources: benmilne API docs, benmilne OpenAPI spec, benmilne GraphQL API, benmilne MCP server (Streamable HTTP JSON-RPC), benmilne auth docs, benmilne agent instructions, benmilne machine catalog, and benmilne MCP server card.


Quick links


Authentication

There is no API key product. All endpoints are public and read-only. Make GET requests from any origin — no tokens, no headers, no sign-up.


Endpoints

Method Path Description
GET/apiThis page (HTML) or endpoint index (JSON)
GET/api/siteSite metadata and post count
GET/api/postsPaginated post list
GET/api/posts/:slugSingle post with full content and agent metadata
GET/api/search?q=Full-text search across posts
GET/api/categoriesAll categories with post counts
GET/api/tagsAll tags with post counts
GET/api/categories/:slugPosts filtered by category
GET/api/tags/:slugPosts filtered by tag

Posts

GET /api/posts returns a paginated list of posts. Each item is a slim summary — no content body. Use ?page= and ?per_page= (max 100) to paginate.

curl https://benmilne.com/api/posts?per_page=3

Single post

GET /api/posts/:slug returns the full post with rendered HTML, Markdown body (stored source when present, otherwise HTML converted to Markdown), and agent-rich metadata: extracted links, media references, section outline, and estimated reading time.

curl https://benmilne.com/api/posts/value-derivations

Search

GET /api/search?q= performs full-text search across all posts. Returns slim post summaries. Try: stablecoin, brale, bitcoin, value.

curl "https://benmilne.com/api/search?q=stablecoin"

Categories and tags

GET /api/categories and GET /api/tags list all taxonomies with post counts. Append a slug to filter posts: /api/categories/stablecoin-infrastructure.


Response envelope

Every response wraps data in a consistent shape with an attribution notice:

Collection

{
  "attribution": "Content provided by BenMilne.com. ...",
  "data": [ ... ],
  "pagination": {
    "page": 1,
    "per_page": 10,
    "total": 9,
    "total_pages": 1
  }
}

Single resource

{
  "attribution": "Content provided by BenMilne.com. ...",
  "data": { ... }
}

Post shapes

List item (slim)

Returned by /api/posts, /api/search, and taxonomy filters. No content body.

{
  "slug": "value-derivations",
  "title": "Value Derivations",
  "date": "2025-09-28T17:20:38+00:00",
  "modified": "2026-02-23T06:17:15+00:00",
  "author": "Ben Milne",
  "summary": "I use a simple model when...",
  "url": "https://benmilne.com/value-derivations",
  "featured_image": null,
  "categories": ["Payment Systems"],
  "tags": []
}

Detail (agent-rich)

Returned by /api/posts/:slug. Everything above, plus content and structured metadata designed for AI consumption:

{
  "slug": "value-derivations",
  "title": "Value Derivations",
  "content_html": "<p>...</p>",
  "content_markdown": "...",
  "reading_time": 4,
  "links": ["https://brale.xyz/blog/new-capital"],
  "media": [
    { "type": "image", "src": "https://..." },
    { "type": "video", "src": "https://youtube.com/..." }
  ],
  "structure": {
    "sections": [
      { "level": 3, "text": "Major Value Derivations" },
      { "level": 4, "text": "1. Stablecoins as Liquidity Derivations" }
    ]
  }
}

For AI agents

The post detail endpoint is designed for agent consumption. Each response includes structured metadata that helps LLMs understand content without parsing HTML:

  • links[] — Every external URL referenced in the post. Agents can follow these for deeper research.
  • media[] — Images and videos with type and source URL. Useful for multimodal agents or content summaries.
  • structure.sections[] — Heading-based outline (h2/h3/h4 hierarchy). Use for navigation, summarization, or table-of-contents generation.
  • reading_time — Estimated minutes. Helps agents gauge content depth.
  • content_markdown — Markdown body: original source when the post was authored in Markdown; otherwise derived from HTML so agents always receive a text-first representation.

Streaming (Server-Sent Events)

Real-time search results via SSE. Connect with Accept: text/event-stream or use the dedicated streaming endpoint:

curl -N "https://benmilne.com/api/stream/search?q=payments"

Events: status (search phase), result (individual post match), done (completion summary), error (failure).

NLWeb streaming is also available via POST /ask with "streaming": true:

curl -N -X POST https://benmilne.com/ask \
  -H "Content-Type: application/json" \
  -d '{"query":"payments","streaming":true}'

SSE events follow the NLWeb spec: start, result, complete.


Rate limits

Every JSON response includes rate-limit headers:

HeaderDescription
X-RateLimit-LimitRequests per window (1000)
X-RateLimit-RemainingRemaining requests in current window
X-RateLimit-ResetUnix timestamp when the window resets

Cloudflare edge caching serves most reads. Use exponential backoff on 429 responses.


Developer resources

Resource URL Purpose
API docs/apiThis page (human-readable)
OpenAPI spec/openapi.jsonOpenAPI 3.0.3 schema for all endpoints
MCP server card/.well-known/mcp/server-card.jsonMCP tool discovery and transport info
MCP endpointPOST /mcpStreamable HTTP JSON-RPC (initialize, tools/list, tools/call)
MCP SSE/mcp/sseMCP Server-Sent Events transport
Agent instructions/agents.mdDiscovery pointers for coding agents
NLWeb endpointPOST /askNatural-language query (JSON or SSE)
Sandbox/sandboxCanned test data for integration testing
LLMs.txt/llms.txtSite catalog for LLMs (posts + search)
Node.jsnpm install -g benmilne-apiCLI and Node.js client (npm)
Pythonpip install benmilne-apiCLI and Python client (PyPI)
GitHubbenmilne-com/agentsPublic agent discovery repo
RSS/feed.xmlFeed of all published posts

Content negotiation

This page serves HTML to browsers and JSON to programmatic clients. Any post URL on the site also supports content negotiation:

# JSON
curl -H "Accept: application/json" https://benmilne.com/value-derivations

# Markdown
curl -H "Accept: text/markdown" https://benmilne.com/value-derivations

# HTML (default)
curl https://benmilne.com/value-derivations

CORS

All API responses include Access-Control-Allow-Origin: *. Call from any origin — browser, server, agent.


Errors

Unknown paths return 404 with a JSON body. Missing required parameters return 400. All errors follow the same shape:

{ "error": "Not found" }           // 404
{ "error": "Query parameter ?q= is required" }  // 400

Multilingual API

All content endpoints support translated responses via the ?lang= query parameter. English is the default.

Supported languages

en, es, zh, ar, pt-br, fr, ja, de, ru, id, hi, ko, tr, vi

Language metadata

curl https://benmilne.com/api/languages

Translated posts

curl "https://benmilne.com/api/posts?lang=es"

Translated post detail

curl "https://benmilne.com/api/posts/better-funds-flows?lang=es"

Translated search

curl "https://benmilne.com/api/search?q=stablecoin&lang=zh"

Fallback

If a translated post is unavailable, the API returns 404 by default. Add ?fallback=en to receive the English version instead, clearly marked as a fallback:

curl "https://benmilne.com/api/posts/better-funds-flows?lang=es&fallback=en"

Unsupported language

Requesting an unsupported language returns 400 with the list of supported codes:

GET /api/posts?lang=xx  →  400 { "error": "Unsupported language", ... }

Translations are automated (DeepL) and may contain errors. English is always the source of truth.


RSS feeds

LanguageFeed URL
English (canonical)/feed.xml
Español/es/feed.xml
简体中文/zh/feed.xml
العربية/ar/feed.xml
Português/pt-br/feed.xml
Français/fr/feed.xml
日本語/ja/feed.xml
Deutsch/de/feed.xml
Русский/ru/feed.xml
Bahasa Indonesia/id/feed.xml
हिन्दी/hi/feed.xml
한국어/ko/feed.xml
Türkçe/tr/feed.xml
Tiếng Việt/vi/feed.xml

Webhooks

Not provided. This site offers request/response HTTP APIs and RSS. There is no outbound webhook product. Pull the RSS feed on your schedule.