Ask the Archive API
The same index that answers in the palette, open to machines without the answer step. A frontier model, a biographer’s script, or an MCP client asks; the archive returns ranked hits with provenance and whatever each hit’s disclosure policy allows, and synthesizes nothing. The caller’s own model does the thinking.
What a hit may tell you
Every hit carries provenance: the work’s title, type, creators with their identifiers, date, version,
URL, catalogue identifiers, and a locator (a page, a chapter and section, a timecode). Then an
exposure says what you may know about it:
text- The passage is public and is included verbatim. Quote it, with its
entity.url. semantic-
The source is private and not quotable here.
gistis a description of what the passage is about, drafted by the archive’s software at ingest and released under the owner’s policy;gistSourcesays whether a person edited it andgistReviewwhether a person reviewed it. It is not a quotation and not the creators’ wording. Do not attribute its sentences to them. locator- Only the location of relevant material is released. Do not infer its contents.
Attribution entries with a placeholder are not people: unnamed is a speaker who is
not a creator; unverified is attribution not established. Scores on private hits are rounded.
When a date bound is given, undated material is excluded and counted in excludedUndated.
Endpoints
-
GET /api/archive/search: the search. Parameters:q,limit,type,date_from,date_to,undated,creator,speaker,exposure,raw,recency. Identical URLs are served from the CDN for a day, so repeat a URL freely. GET /api/archive/openapi.json: the OpenAPI 3.1 document, generated from the same parameter table the server validates with.-
POST /api/archive/mcp: a Model Context Protocol endpoint. Streamable HTTP, stateless, JSON responses, no authentication, one tool,search_archive, with the same parameters as arguments. Both the 2025initializehandshake and the 2026 per-request form are served. Add it to a client as a remote server athttps://lukefwalton.com/api/archive/mcp. GET /api/archive/health: whether the index is served, and its counts.
Limits and posture
- At most 20 hits per request; 30 requests per minute per caller. Run several narrow searches rather than one wide one;
type,date_from/date_to,creator, andspeakernarrow. - Nothing is synthesized or generated at request time. What you get is retrieval and policy.
- Query text is not logged by default. Outcomes and hit counts are.
- The response is the
archive-search/1contract and changes only additively. The rules are in CONTRACT.md.
Citing
Link entity.url. It is the accountable page for the work, and it stays correct when the index is
rebuilt. A text hit may be quoted; a semantic hit may be described in your words with the
gist as your source; a locator hit tells you that relevant material exists at that place and nothing more.
Enumeration
Walking the whole index exposes nothing the owner did not release. A private passage’s text has no field to
travel in; a description is served only where the policy set the exposure to semantic, after a
build-time check that it quotes nothing; a location is just a location. The rate limit bounds how many
queries a caller gets, and the rounded scores bound what one query reveals about a private vector.
Examples
curl 'https://lukefwalton.com/api/archive/search?q=perfect+pitch+nature+or+nurture&limit=5&type=song,transcript' curl -X POST https://lukefwalton.com/api/archive/mcp \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' curl -X POST https://lukefwalton.com/api/archive/mcp \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
"params":{"name":"search_archive",
"arguments":{"q":"what the pandemic did to touring","limit":5,"date_from":"2020","date_to":"2021"}}}' Ask the Archive is the live deployment of the answer-engine substrate on this site; the palette and this API are its two consumers. How the palette answers is on What is Ask the Archive?