# What changed in TubeTranscript?

This changelog lists **technical changes** to the TubeTranscript extraction pipeline, **REST API**, **MCP servers** and machine-readable documentation, newest first. Each entry is dated in **ISO 8601** format (**YYYY-MM-DD**) and names affected endpoints, response fields or engines, so AI agents and integrators can detect **behavior changes** without reading source code.

## 2026-10-04

### Rate limits
- Guests (no account) now get **10 transcripts per 24 hours** per IP (was 3). At most **5** of them may use **Whisper** (videos without captions); a Whisper job counts only once it completes. When the Whisper allowance is used up, such a job fails with a `CaptionsNotFound` message instead of transcribing.
- Signed-in **free accounts** now get **24 transcripts per 24 hours** per team (was 3), with no separate Whisper cap.

## 2026-10-01

### MCP servers
- **Breaking:** `extract_hooks`, `create_mindmap` and `generate_brand_voice_blog` on **`/api/mcp/tools`** now take **`job_id`** (UUID) instead of `video_id`. Calls with `video_id` return HTTP 400 `INVALID_ARGUMENTS`. Unknown or foreign jobs return `JOB_NOT_FOUND`; jobs still being transcribed return `JOB_NOT_READY`.
- **`get_transcript`** on **`/api/mcp`** stores the transcript as a job of the API key's team and returns **`structuredContent`** `{ video_id, status, job_id, transcript }`, plus a `job_id: …` text block after the transcript. Repeat calls for the same video return the same `job_id`.
- Videos without captions no longer fail: `get_transcript` starts an audio (Whisper) transcription job and returns `status: "processing"` with its `job_id`; call again after about 60 s. The REST form **`/api/mcp/transcript`** returns HTTP **202** with `Retry-After: 60` in that case, and now includes `job_id` and `status`.
- Concurrent `get_transcript` calls for the same new video share one caption fetch; each stores its own job, so they return different `job_id`s with the same transcript.
- Requests to `/api/mcp*` without an API key now return 402 `reason: MISSING_API_KEY` and no longer spend the guest IP quota.

## 2026-09-30

### Documentation
- Added **`/llms.txt`**, an index of machine-readable docs for AI crawlers, served as `text/plain; charset=utf-8` with a 1-hour cache.
- Published Markdown docs under **`/docs/`**: [`quickstart.md`](https://tubetranscript.io/docs/quickstart.md), [`api.md`](https://tubetranscript.io/docs/api.md), [`mcp.md`](https://tubetranscript.io/docs/mcp.md), [`prompts.md`](https://tubetranscript.io/docs/prompts.md), [`security.md`](https://tubetranscript.io/docs/security.md).
- `robots.txt` explicitly allows `/llms.txt` and `/docs/` for `GPTBot`, `OAI-SearchBot`, `ClaudeBot`, `Claude-Web` and `PerplexityBot`.

## 2026-09-28

### Extraction engine
- **Apify fast path** is now Tier 1 for extraction jobs: captions are fetched through an Apify actor, with **Whisper** audio transcription as the fallback when no transcript is returned.
- Jobs record the engine that produced the transcript in a new **`source_engine`** field: `apify` (Tier 1) or `whisper` (Tier 2).
- Background jobs wait up to **30 s** for Apify (configurable); synchronous caption fetches keep a **12 s** budget.
- Caption language is reported as a language code (`en`) instead of a display name (`English`).
- Video metadata (title, channel, publish date, duration, thumbnail) still comes from the **YouTube Data API v3**, falling back to yt-dlp.

## 2026-09-24

### REST API
- Launched **`POST /api/v1/extract`**: transcript plus optional `hooks`, `mindmap` and `action_items` in one synchronous call, Pro API key required. See [API Reference](https://tubetranscript.io/docs/api.md).

## 2026-09-23

### MCP servers
- Launched **`/api/mcp`** (Streamable HTTP, stateless) with the **`get_transcript`** tool.
- Launched **`/api/mcp/tools`** with **`extract_hooks`**, **`create_mindmap`** and **`generate_brand_voice_blog`** for videos with a completed job. See [MCP Setup](https://tubetranscript.io/docs/mcp.md).
