recap.at

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.

URL
https://recap.at/{year}/{slug}.md
Command
curl -H "Accept: text/markdown" https://recap.at/1969/apollo-11.md
Response
---
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.

URL
https://recap.at/{year}/{slug}.yaml
Command
curl -H "Accept: application/yaml" https://recap.at/1969/apollo-11.yaml
Response
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.

URL
https://recap.at/{year}/{slug}.json
Command
curl -H "Accept: application/ld+json" https://recap.at/1969/apollo-11.json
Response
{
  "@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.

URL
https://recap.at/feed.xml
Command
curl https://recap.at/feed.xml
Response
<?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).

URL
https://recap.at/{decade}s/feed.xml
Command
curl https://recap.at/1960s/feed.xml
Response
<channel>
  <title>Recap.at - 1960s</title>
  <link>https://recap.at/1960s</link>
</channel>

Per-country feed

Recaps tagged to a specific country.

URL
https://recap.at/country/{slug}/feed.xml
Command
curl https://recap.at/country/united-states/feed.xml
Response
<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).

URL
https://recap.at/{category}/feed.xml
Command
curl https://recap.at/war/feed.xml
Response
<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).

URL
https://recap.at/sitemap-index.xml
Command
curl https://recap.at/sitemap-index.xml
Response
<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.

URL
https://recap.at/llms.txt
Command
curl https://recap.at/llms.txt
Response
# 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.

URL
https://recap.at/robots.txt
Command
curl https://recap.at/robots.txt
Response
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.

URL
https://recap.at/embed/{year}/{slug}
Command
<iframe src="https://recap.at/embed/1969/apollo-11" width="100%" height="400" frameborder="0" style="border-radius: 8px;"></iframe>
Response
<!-- 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.

URL
https://recap.at/api/v1/openapi.json
Command
curl https://recap.at/api/v1/openapi.json
Response
{
  "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.

URL
https://recap.at/api/v1/recaps?limit=50&offset=0&year=&country=&category=
Command
curl -H "Authorization: Bearer rcp_live_..." \
  "https://recap.at/api/v1/recaps?limit=10&year=1969"
Response
{
  "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 }.

URL
https://recap.at/api/v1/recaps/{year}/{slug}
Command
curl -H "X-API-Key: rcp_live_..." \
  https://recap.at/api/v1/recaps/1969/apollo-11
Response
{
  "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.

URL
https://recap.at/api/v1/search?q={query}&limit=10&offset=0
Command
curl "https://recap.at/api/v1/search?q=berlin%20wall&limit=10"
Response
{
  "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.

URL
https://recap.at/api/mcp
Command
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"}'
Response
{
  "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.