API + integration
Recap.at as a data source.
Every recap is available in markdown, YAML, and JSON-LD. RSS feeds cover the root + every decade / country / category. There's a REST API (OpenAPI 3.1) and an MCP server at /api/mcp for LLM agents - one key works for both; see /pricing. AI crawlers discover the corpus through llms.txt and sitemap-index.xml. Third-party sites can embed any recap as a card via iframe.
Per-recap data formats
Every recap is reachable in three machine-readable formats at predictable URLs. Use any of them as a data source - no scraping required.
Markdown
Plain markdown with YAML frontmatter. Suitable for ingestion by LLM tooling, Pandoc pipelines, static-site importers.
https://recap.at/{year}/{slug}.mdcurl -H "Accept: text/markdown" https://recap.at/1969/apollo-11.md
--- title: "Apollo 11" year: 1969 country: "United States" canonical: "https://recap.at/1969/apollo-11" --- # Apollo 11 > An eight-day round trip to a place no human had ever stood. ## Summary ...
YAML
Full recap object serialized to YAML 1.2 with block-literal strings preserving paragraph breaks. Hand-rolled stringifier - no external dependency drift.
https://recap.at/{year}/{slug}.yamlcurl -H "Accept: application/yaml" https://recap.at/1969/apollo-11.yaml
slug: apollo-11
canonicalUrl: "https://recap.at/1969/apollo-11"
title: Apollo 11
year: 1969
summaryLong: |-
Apollo 11 launched from Kennedy Space Center on July 16, 1969...
keyFacts:
- label: "Launch date"
value: "1969-07-16"JSON-LD (Schema.org Article + Event)
Schema.org @graph with Article + Event + Place + GeoCoordinates + Citation nodes cross-referenced by @id. Eligible for Google rich results, AI Overview aggregation, knowledge-graph builders.
https://recap.at/{year}/{slug}.jsoncurl -H "Accept: application/ld+json" https://recap.at/1969/apollo-11.json
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Article",
"@id": "https://recap.at/1969/apollo-11#article",
"headline": "Apollo 11 (1969)",
"about": { "@id": "https://recap.at/1969/apollo-11#event" }
}
]
}RSS feeds
RSS 2.0 across the corpus and per-lobby slices. Each item carries title, link, GUID, pubDate, description, and the country as the category field.
Root feed
RSS 2.0 of the 50 most recently promoted recaps across the entire archive.
https://recap.at/feed.xml
curl https://recap.at/feed.xml
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Recap.at</title>
<link>https://recap.at/</link>
<item>...</item>
</channel>
</rss>Per-decade feed
Recaps within a single decade (1860s through 2020s).
https://recap.at/{decade}s/feed.xmlcurl https://recap.at/1960s/feed.xml
<channel> <title>Recap.at - 1960s</title> <link>https://recap.at/1960s</link> </channel>
Per-country feed
Recaps tagged to a specific country.
https://recap.at/country/{slug}/feed.xmlcurl https://recap.at/country/united-states/feed.xml
<channel> <title>Recap.at - United States</title> </channel>
Per-category feed
Recaps tagged to one of the 10 closed-set categories (war, election, festival, disaster, tech-launch, sports, award, launch, protest, revolution).
https://recap.at/{category}/feed.xmlcurl https://recap.at/war/feed.xml
<channel> <title>Recap.at - war</title> </channel>
Discovery for AI + search
Standard discovery endpoints. AI crawlers should hit llms.txt first; search engines walk the sitemap.
Sitemap
Sitemap index that points at 7 sub-sitemaps (recaps, years, decades, countries, categories, core pages, taxonomy).
https://recap.at/sitemap-index.xml
curl https://recap.at/sitemap-index.xml
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <sitemap><loc>https://recap.at/sitemaps/recaps.xml</loc></sitemap> <sitemap><loc>https://recap.at/sitemaps/countries.xml</loc></sitemap> </sitemapindex>
llms.txt
Per the llmstxt.org spec. AI crawlers (Claude, GPT, Gemini, Perplexity) read this for a structured site overview + recap index.
https://recap.at/llms.txt
curl https://recap.at/llms.txt
# Recap.at > A historical archive of major events, occasions, and cultural moments - reconstructed from structured public sources. ## Featured recaps - [Apollo 11 (1969)](https://recap.at/1969/apollo-11): The Moon landing.
robots.txt
Allows GPTBot, ClaudeBot, Google-Extended, PerplexityBot, and 11 other named AI crawlers alongside the default *. Admin paths disallowed.
https://recap.at/robots.txt
curl https://recap.at/robots.txt
User-agent: * Allow: / User-agent: GPTBot Allow: / User-agent: ClaudeBot Allow: / Sitemap: https://recap.at/sitemap-index.xml
Embed widget
A lightweight iframe-friendly card view. Drop this snippet into a blog post, lesson plan, journalism platform, or knowledge base.
Embed widget
Iframe-friendly minimal recap card. Third-party sites embed via the snippet below. No chrome, no JS, fast, crawlable.
https://recap.at/embed/{year}/{slug}<iframe src="https://recap.at/embed/1969/apollo-11" width="100%" height="400" frameborder="0" style="border-radius: 8px;"></iframe>
<!-- The embedded card renders: --> <a href="https://recap.at/1969/apollo-11"> <img alt="Apollo 11" src="...hero..." /> <p>1969 · United States</p> <h1>Apollo 11</h1> <p>An eight-day round trip to a place no human had stood.</p> <span>Read on Recap.at →</span> </a>
REST API + MCP server
OpenAPI 3.1 REST surface for structured queries, plus an MCP server for LLM agents. One API key works for both; pass it as Authorization: Bearer or X-API-Key. Tier limits + per-call pricing at /pricing.
OpenAPI spec
OpenAPI 3.1 spec for the v1 REST API. Feed it into openapi-generator, openapi-typescript, Postman, or any SDK builder to get a typed client. Authorization is Bearer / X-API-Key; the same key works for the MCP server below. Pricing and tier limits are at /pricing.
https://recap.at/api/v1/openapi.json
curl https://recap.at/api/v1/openapi.json
{
"openapi": "3.1.0",
"info": { "title": "Recap.at API", "version": "1.0.0" },
"servers": [{ "url": "https://recap.at/api/v1" }],
"paths": {
"/recaps": { "get": { ... } },
"/recaps/{year}/{slug}": { "get": { ... } },
"/on-this-day": { "get": { ... } },
"/journeys": { "get": { ... } },
"/search": { "get": { ... } }
}
}List recaps
Paginated list with filters by year, country slug, or category slug. The HTML response surface (/browse, decade lobbies, country lobbies) walks the same projection.
https://recap.at/api/v1/recaps?limit=50&offset=0&year=&country=&category=
curl -H "Authorization: Bearer rcp_live_..." \ "https://recap.at/api/v1/recaps?limit=10&year=1969"
{
"data": [
{
"slug": "apollo-11",
"year": 1969,
"title": "Apollo 11",
"links": {
"md": "/1969/apollo-11.md",
"yaml": "/1969/apollo-11.yaml",
"json": "/1969/apollo-11.json",
"html": "/1969/apollo-11"
}
}
],
"meta": { "total": 4, "limit": 10, "offset": 0, "returned": 4 }
}Get recap detail
Full structured recap by year + slug. Same payload as the .json export at /{year}/{slug}.json, wrapped in { data, meta }.
https://recap.at/api/v1/recaps/{year}/{slug}curl -H "X-API-Key: rcp_live_..." \ https://recap.at/api/v1/recaps/1969/apollo-11
{
"data": { "slug": "apollo-11", "year": 1969, "title": "Apollo 11", ... },
"meta": { "generatedAt": "2026-05-29T00:00:00.000Z" }
}Free-text search
Weighted substring scoring across title, subtitle, summaryShort, and summaryLong. Same engine the /search HTML page uses.
https://recap.at/api/v1/search?q={query}&limit=10&offset=0curl "https://recap.at/api/v1/search?q=berlin%20wall&limit=10"
{
"data": [
{
"slug": "fall-of-berlin-wall",
"year": 1989,
"title": "Fall of the Berlin Wall",
"links": { ... }
}
],
"meta": { "query": "berlin wall", "total": 3, "limit": 10, "offset": 0, "returned": 3 }
}MCP server (JSON-RPC 2.0)
Model Context Protocol server for LLM agents. Single POST endpoint speaking JSON-RPC 2.0; supports initialize, tools/list, tools/call. Tools today: search_recaps / recap_search, get_recap / recap_get, recap_list, on_this_day, get_journey. Same API key as REST.
https://recap.at/api/mcp
curl -X POST https://recap.at/api/mcp \
-H "Authorization: Bearer rcp_live_..." \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [
{ "name": "search_recaps", "description": "...", "inputSchema": { ... } },
{ "name": "recap_list", "description": "...", "inputSchema": { ... } },
{ "name": "recap_get", "description": "...", "inputSchema": { ... } }
]
}
}Schema.org affordances
Every recap page embeds a Schema.org @graph containing Article, Event, BreadcrumbList, and Citation nodes cross-referenced by @id. Auto-discoverable alternates are advertised through <link rel="alternate"> in the page <head>: markdown, YAML, JSON-LD, RSS. No additional handshake required - viewers and crawlers find everything from one HTML page.