API and MCP

The archive’s search, for your code: free during the beta

The same search the site runs, as a read-only REST API and as an MCP server for AI assistants. Every count, time and citation matches what the site shows.

Quick start

REST
https://api.govtube.us/v1
MCP
https://api.govtube.us/mcp (streamable HTTP)
Reference
https://api.govtube.us/docs
Key
No key needed during the beta.
curl 'https://api.govtube.us/v1/search?q=appropriations&max_videos=1&max_instances_per_video=1'

Endpoints

Six public GET endpoints. All are read-only and return JSON.

EndpointReturnsParametersLimits
GET /v1/searchEvery instance of a query, grouped by video, newest firstq (required); speaker, source, from, to (dates); max_videos; max_instances_per_video; sort; cursorq up to 200 characters and 12 tokens; max_videos 1–25 (default 10); max_instances_per_video 1–20 (default 5); sort newest (default) or most_instances
GET /v1/videos/{video_id}One video: metadata, playback asset, rights and use restrictionsvideo_id—
GET /v1/videos/{video_id}/instancesPage through one video’s matches by passageq (required); offset; limit; speakeroffset ≥ 0 (default 0); limit 1–100 (default 20); both count passages
GET /v1/videos/{video_id}/transcriptSpeaker turns in a time windowfrom_ms, to_ms (both required)at most 5 minutes per request
GET /v1/citations/{citation_id}Resolve a citation: status after corrections, quoted words, contextcitation_id (gt2.… or gd2.…; older gt1.… and gd1.… still work)—
GET /v1/coverageWhat the archive holds: sessions, totals, last update, gapsnone—

Connect an AI assistant (MCP)

GovTube works as a connector in Claude, ChatGPT and coding tools. No sign-in or key is needed. Every tool only reads from the archive, so it is safe to allow and to retry.

Claude (web, desktop and mobile)

  1. Open Customize, then Connectors.
  2. Choose Add custom connector.
  3. Paste https://api.govtube.us/mcp as the server URL.
  4. If you’re asked how people sign in, choose No sign-in.
  5. Choose Add. In a chat, turn GovTube on from the + menu, under Connectors.

On Team and Enterprise plans an Owner adds it first, under Organization settings, Connectors. The free plan allows one custom connector.

ChatGPT

  1. On chatgpt.com, open Plugins and choose the + button, then Add custom MCP server.
  2. Name it GovTube and paste https://api.govtube.us/mcp as the URL.
  3. For authentication, choose No authentication.
  4. Confirm the warning, then choose Create as a plugin.

Custom servers depend on your plan and workspace settings. On some accounts this is under Settings, Apps, with developer mode turned on.

Claude Code

claude mcp add --transport http govtube https://api.govtube.us/mcp

Or share it with a project in .mcp.json:

{
  "mcpServers": {
    "govtube": {
      "type": "http",
      "url": "https://api.govtube.us/mcp"
    }
  }
}

Cursor

Add to Cursor

Or add it to ~/.cursor/mcp.json:

{
  "mcpServers": {
    "govtube": {
      "url": "https://api.govtube.us/mcp"
    }
  }
}

VS Code

Add it to .vscode/mcp.json in your workspace, or run MCP: Add Server from the Command Palette and choose HTTP:

{
  "servers": {
    "govtube": {
      "type": "http",
      "url": "https://api.govtube.us/mcp"
    }
  }
}

Any other client

URL
https://api.govtube.us/mcp
Transport
Streamable HTTP
Sign-in
None

If we gave you an API key for higher limits, send it as Authorization: Bearer gtk_…. Keep it out of prompts and shared files.

Try asking

  • Using GovTube, find every time “no tax on tips” was said on the House floor this year. Quote each one exactly and link to the moment.
  • What was said about tariffs in Congress last week? Use GovTube, give the speaker and time for each quote, and say which speakers are confirmed.
  • Is this GovTube citation still accurate after corrections? gt2.…
  • What does GovTube cover right now, and when was it last updated?
ToolPurposeKey arguments and limits
govtube_search_instancesSpoken instances of a query, grouped by video, one small page at a timequery; speaker (confirmed speakers; include_unreviewed to add on-screen-name matches), source, date_from, date_to; detail compact (default: 5 videos × 3 passages) or full (10 × 5, up to 25 × 20); max_videos; max_instances_per_video; sort newest (default) or most_instances; cursor
govtube_list_video_instancesPage through one video by passagevideo_id, query, offset, limit 1–100 (default 10; both count passages); speaker, include_unreviewed; detail
govtube_get_transcript_windowSpeaker turns around a momentvideo_id, start_ms, end_ms (at most 5 minutes)
govtube_get_videoMetadata, speakers, playback asset, rights and use restrictionsvideo_id
govtube_resolve_citationCheck a cited instance after corrections; returns context and a share linkcitation_id (gt2.… or gd2.…; older gt1.… and gd1.… still work)
govtube_get_coverageTotals by source, date range, last update, items awaiting review, gapsnone
govtube_list_sessionsThe indexed sessions, newest first, one page at a timesource, date_from, date_to; limit 1–100 (default 25); cursor

Before you build

Counts and paging

counts covers the whole result set. When counts.exact is false, the numbers are lower bounds: show “at least”.

Videos come newest first. Pass next_cursor back as cursor to continue; it only works with the same query and sort. Page inside one video with /instances, by passage.

Playback and citations

play_from_ms is 5 seconds before the words. When playable is false, the timing isn’t verified: don’t play it, but you can still show and cite it.

Every instance id is a durable citation. /v1/citations/{id} says whether it is still exact after corrections. Signed ids (gt2.…, gd2.…) come only from GovTube. Older unsigned ids (gt1.…, gd1.…) keep working: their answer has signed false, shows only words found in the current transcript, and gives a canonical_id to share instead.

Official transcripts have no timing (timing_granularity is document): their times are null, position gives the paragraph and word, document_url links the text, document_highlight_url (when not null) opens it at the matched words, and their ids start with gd2. (unsigned: gd1.).

Show the rights

/v1/videos/{id} returns rights: the source, its rights in a few words, and its use_restrictions.

Show them next to any clip you publish. House floor video, for example, may not be used for any political purpose.