# Elon Musk Archive — Agent API

> The reference archive of Elon Musk (interviews, keynotes, speeches, Spaces, earnings calls, emails and X posts, in English, French and German), exposed for AI agents: a browsable index, keyword search with structured filters, windowed passages, ready-to-paste citations and word-level video timings. No API key, open CORS, no rate limit, read-only.

**86,482 entries**, 2003-04-22 → 2026-08-16. No API key, no rate limit, open CORS, read-only.

## Quick start

The most common intents, as copy-paste URLs:

### List every interview

```
https://elonmuskarchive.org/agents/index?type=interviews
```

Returns all of them in ONE call (154 entries, ~50 KB) — no pagination needed. Same for keynotes, speeches, spaces, earnings, emails.

### See what the archive contains

```
https://elonmuskarchive.org/agents/index
```

The catalogue map: counts per type and per year, with drill-down urls. Start here when you have no keywords.

### Find everything Musk said about a topic

```
https://elonmuskarchive.org/agents/search?q=mars%20colonization&matches=3&context=500
```

Ranked hits with windowed `passages` — usually enough to answer without fetching anything else.

### Get a clean quotable passage + citation

```
https://elonmuskarchive.org/agents/search?q=%22full%20self-driving%22&snap=sentence&matches=2
```

`snap=sentence` aligns passages to sentence boundaries; each result carries a ready-to-paste `citation`.

### Prepare a subtitled video clip

```
https://elonmuskarchive.org/agents/search?q=mars&has=timings&snap=sentence
```

Then GET /agents/excerpt?id=…&q=…&timestamps=1 for tStart/tEnd (seconds into `source`, for yt-dlp --download-sections) and per-word timings.

### What's new?

```
https://elonmuskarchive.org/agents/latest?type=interviews&limit=10
```

Most recent entries, newest first.

### Show me something interesting

```
https://elonmuskarchive.org/agents/random?type=interviews
```

A random entry, for exploration. Reposts excluded.

## Endpoints

- `GET https://elonmuskarchive.org/agents`  
  This manifest (JSON). Add ?format=markdown for the same thing as readable Markdown.
- `GET https://elonmuskarchive.org/agents/docs`  
  The documentation as Markdown, for humans and for agents that prefer prose.
- `GET https://elonmuskarchive.org/agents/index`  
  Browse the catalogue: counts by type and year, drill down with type/year/month, entries listed inline as soon as the slice fits.
- `GET https://elonmuskarchive.org/agents/latest`  
  The most recent entries (same filters as the index).
- `GET https://elonmuskarchive.org/agents/random`  
  Random entries, for exploration and sampling.
- `GET https://elonmuskarchive.org/agents/search`  
  Keyword search with structured filters, ranked results and windowed passages. `q` is OPTIONAL — filters alone browse.
- `GET https://elonmuskarchive.org/agents/excerpt`  
  More context around a hit in one entry, without downloading the whole text. `timestamps=1` adds word-level timings.
- `GET https://elonmuskarchive.org/agents/transcripts`  
  Manifest of the transcript API.
- `GET https://elonmuskarchive.org/agents/transcript/{id}`  
  The full text of one entry.

## Limits and cost

- `rateLimit` — NONE. No key, no quota, no 429. Crawl at whatever pace suits you — the endpoints are backed by indexed SQLite columns, not by a full-corpus scan.
- `searchPageSize` — 100 results per call (`limit`), paginate with `offset`.
- `indexPageSize` — 1000 entries per call (`limit`), follow `nextUrl`.
- `oneCallLists` — Every kind except posts fits in a single index call: interviews (154), keynotes (60), emails (47), speeches (20), earnings (19), spaces (14), commentary (10). Only the 86,154 posts need year/month drill-down or `list=1` pagination.
- `wholeCorpus` — Enumerating everything is ~87 pages of 1000 lean entries (~30 MB, well under a minute). Depth costs nothing: offset=80000 answers as fast as offset=0.
- `costControl` — Every search result carries `textLength` and `approxTokens` (~chars/4). CHECK `approxTokens` BEFORE following `transcriptUrl` — a single interview transcript averages ~39,000 characters (~10,000 tokens), while the `passages` already in your result cost a few hundred. Prefer passages → excerpt → full text, in that order.

## Recommended flow

0) BROWSE FIRST IF YOU HAVE NO KEYWORDS. GET /agents/index → the catalogue by type and year, with counts and drill-down urls (/agents/index?type=interviews lists every interview in one call). Guessing keywords blind is how agents miss whole sections. 1) GET /agents/search?q=… → ranked results, each with `passages` (windowed text around the matches), `citation` (ready-to-paste source line), `approxTokens` and `hasTimings`. This is usually enough to answer WITHOUT any further fetch. 2) Need a bit more around a hit? Follow `excerptUrl` (it carries id+q) or call /agents/excerpt?id=…&q=…&window=…&max=… for just that region. 3) SUBTITLED VIDEO CLIPS — the flagship flow. Filter to entries with word-level timing (`has=timings`), then call /agents/excerpt?id=…&q=…&timestamps=1 → each passage comes back with `tStart`/`tEnd` (seconds into the `source` video, feed them straight to `yt-dlp --download-sections`), the dominant `speaker`, and per-word timings (`words: [{w,s,e}]`) to drive karaoke-style active-word subtitles. Nothing else to align, nothing to transcribe. 4) Only fetch the full transcript (`transcriptUrl`) when you truly need the whole text — check `approxTokens` first, it is often 50× the cost of the passages you already have. Tune passage size with `context` (chars) and `matches` (passages per result); use `snap=sentence` for clean, quotable boundaries.

## What's in the archive

| Kind | Entries |
| --- | ---: |
| commentary | 10 |
| earnings | 19 |
| email | 47 |
| interview | 158 |
| keynote | 60 |
| post | 86,154 |
| space | 14 |
| speech | 20 |

Organisations: Neuralink, OpenAI, SpaceX, Tesla, Twitter, xAI.

## Search parameters — `GET /agents/search`

- `q` — Keywords, OPTIONAL. Omit it entirely to BROWSE rather than search: filters alone (type, org, from/to) return matching entries newest-first. For catalogue-style browsing prefer /agents/index. Space-separated terms are AND-combined. Use "quotes" for exact phrases and a leading - to exclude (e.g. q=mars "starship" -tesla). Accent- and case-insensitive.
- `type` — Comma list, filter by kind. One or more of: interview, keynote, speech, space, earnings, post, email, commentary (url slugs interviews/keynotes/speeches/spaces/posts/emails also accepted).
- `org` — Comma list, filter by organisation. One or more of: Neuralink, OpenAI, SpaceX, Tesla, Twitter, xAI.
- `from` — Lower date bound, inclusive (YYYY-MM-DD).
- `to` — Upper date bound, inclusive (YYYY-MM-DD).
- `fields` — Comma list, restrict where keywords are matched. One or more of: title, summary, body, transcript. Default: all.
- `has` — Comma list, keep only entries that have: transcript, body, embed, media, timings. `timings` = word-level timestamps available (required for subtitled-clip work).
- `speaker` — Whose words to match. elon (DEFAULT) = only where Elon himself said/wrote the keywords; all = anyone; other = only third parties. NOTE: the default differs from the website's search (which uses `all`) — a surprising 0-result count is often this.
- `lang` — Language of the returned title/summary/passages: en (default), fr, de. Matching always spans all languages.
- `sort` — relevance (default when q is set), date_desc (default otherwise), date_asc.
- `limit` — Page size, 1–100. Default 20.
- `offset` — Number of results to skip (pagination). Default 0.
- `exclude` — Comma list of entry ids to omit. Pass the ids you've already used so results aren't repetitive.
- `snippet` — 1 (default) to include passages around the matches, 0 to omit (lightest).
- `context` — Characters of context per passage (80–2000, default 300).
- `matches` — Max passages returned per result (1–5, default 1).
- `snap` — word (default) or sentence. `sentence` aligns passages to sentence boundaries — cleaner, more quotable excerpts.
- `format` — markdown to receive this manifest as Markdown instead of JSON (same content).

## Index parameters — `GET /agents/index`

- `type` — Comma list of kinds (plural slugs accepted).
- `year` — YYYY — restrict to one year.
- `month` — MM — restrict to one month (requires `year`).
- `org` — Comma list of organisations.
- `lang` — en (default), fr, de.
- `list` — 1 to force the entry list even on a large slice (paginated).
- `limit` — Entries per page, 1–1000. Default 500.
- `offset` — Entries to skip. Prefer following `nextUrl`.
- `fields` — Comma list of columns to return (alias `select`), to slim large slices. One or more of: id, type, date, title, url, source, sourceLabel, org, hasTranscript, durationSec. `id` is always included.
- `sort` — date_desc (default) or date_asc.

## Search result shape

- `id` — string — stable entry id
- `type` — interview | keynote | speech | space | earnings | post | email | commentary
- `date` — YYYY-MM-DD
- `org` — string | null
- `title` — string (requested lang)
- `summary` — string (requested lang)
- `sourceLabel` — string | null — human source name (e.g. 'The Joe Rogan Experience', 'TED')
- `citation` — string | null — ready-to-paste source line, e.g. 'The Joe Rogan Experience, May 7, 2020'
- `url` — canonical page on the site
- `source` — original source URL (the video to download) | null
- `embedUrl` — embed URL (YouTube/X) | null
- `hasTranscript` — boolean
- `hasBody` — boolean
- `hasTimings` — boolean — word-level timestamps exist (use timestamps=1 on /agents/excerpt)
- `transcriptUrl` — endpoint for the full text | null
- `excerptUrl` — endpoint to fetch MORE context for this entry (id+q prefilled) without the whole text | null
- `textLength` — number — characters of full text available
- `approxTokens` — number — approximate cost (~chars/4) of fetching the full text. Read this before you fetch.
- `score` — number — relevance score (higher = better)
- `matchedIn` — string[] — fields where a term matched
- `passages` — array of { field, text, start, end } — windowed context around the matches (the token-saving payload)
- `snippet` — string | null — first passage (back-compat)

The response wraps them as:

- `query` — object — the parsed parameters actually applied
- `total` — number — total matches before pagination
- `count` — number — results returned in this page
- `results` — array of result objects (see resultShape)

## Catalogue response shape

`/agents/index`, `/agents/latest` and `/agents/random` share one envelope:

- `note` — /agents/index, /agents/latest and /agents/random share ONE envelope — learn it once. Full field list at /agents/index.
- `scope` — object — the filters actually applied
- `total` — number — entries matching the scope, pagination aside
- `count` — number — entries present in THIS response
- `dateRange` — { from, to }
- `summary` — { entries, withTranscript, transcriptCoverage, withMedia, totalDurationSec, totalDurationHours, longest }
- `url` — canonical url of this call
- `searchUrl` — the same slice on /agents/search
- `indexUrl` — the same slice on /agents/index
- `entries` — array of lean lines: { id, type, date, title, url, source?, sourceLabel?, org?, hasTranscript?, durationSec? }

## More examples

```
https://elonmuskarchive.org/agents/index  (browse the catalogue: what's in the archive, by type and year)
https://elonmuskarchive.org/agents/index?type=interviews  (every interview, grouped by year, in one call)
https://elonmuskarchive.org/agents/index?type=posts&year=2024&month=03&fields=id,date,title,url  (lean month slice)
https://elonmuskarchive.org/agents/search?q=mars%20colonization&type=interview&limit=5
https://elonmuskarchive.org/agents/search?q=%22full%20self-driving%22&org=Tesla&sort=date_desc
https://elonmuskarchive.org/agents/search?q=ai%20-politics&from=2023-01-01&fields=transcript,body
https://elonmuskarchive.org/agents/search?q=neuralink&matches=3&context=500  (read several passages per hit)
https://elonmuskarchive.org/agents/search?q=mars&has=timings&snap=sentence  (clip-ready hits)
https://elonmuskarchive.org/agents/search?q=free%20speech&speaker=all  (also match interviewers and co-panelists)
https://elonmuskarchive.org/agents/latest?type=interviews&limit=10
https://elonmuskarchive.org/agents/random?type=interviews
```

## Related

- `docs` — https://elonmuskarchive.org/agents/docs
- `index` — https://elonmuskarchive.org/agents/index
- `latest` — https://elonmuskarchive.org/agents/latest
- `random` — https://elonmuskarchive.org/agents/random
- `excerpt` — https://elonmuskarchive.org/agents/excerpt?id={id}&q={keywords}
- `transcripts` — https://elonmuskarchive.org/agents/transcripts
- `llmsTxt` — https://elonmuskarchive.org/llms.txt
