# Sources and limits

> Which links and files work where, why Instagram and sites that block servers work best from your own machine, and the size and length limits.

Page: https://scribiz.com/docs/sources-and-limits

Scribiz reads public videos and files you own. This page says what works where, and why.

> [!NOTE]
> The CLI column below is the command-line tool on npm, signed in to a free account or with your own Gemini key. It has been tested on macOS only. The Mac app is not out yet.

## Supported sources

| Source | Hosted (web, API, MCP) | CLI | Notes |
| --- | --- | --- | --- |
| Public YouTube video | Works | Works | Captions first. Without captions the model reads the link. |
| Direct audio or video file link | Works | Works | A link that ends in a media file, for example `.mp3` or `.mp4`. A podcast episode's media link from its RSS feed is the same thing. |
| A file you upload or drop | Works up to 100 MB | Works, no size limit | See [Files](#files). |
| TikTok, X, Vimeo, Facebook | Best effort | Best effort, from your connection | Read by `yt-dlp`. Sites change their rules often. |
| Instagram | Usually refused, with a way forward: upload the file | Works with login cookies | Instagram requires a login for most posts. |
| Spotify, Netflix and other DRM sources | No | No | Protected content cannot be read. |
| Private and login-walled videos | No | Only with your own browser login | Scribiz never takes your cookies off your machine. |

Why the columns differ: the hosted service fetches from a data center, and platforms often block those. The CLI fetches from your own connection and, if you allow it, your browser's login. `yt-dlp` does the fetching, so a link needs it, except a public YouTube link, which is read through Gemini without it, with approximate timing. "Best effort" means it may fail, and when it does you get the reason and a way forward.

Links to private addresses, such as `http://169.254.169.254/` or `http://localhost`, are refused on the hosted service with `url_unsupported`.

## When a link fails

The hosted service refuses a link it cannot read before any job starts, with a `422` and a code such as `source_unavailable`, `source_auth_required` or `source_live`. The `hint` says what to do. For a login wall it says to download the file and upload it. The CLI can fetch with your own browser login instead.

In the CLI the same failures use the exit code 4 and an error code such as `SOURCE_BLOCKED`, `SOURCE_UNAVAILABLE` or `SOURCE_AUTH_REQUIRED`. [CLI troubleshooting](https://scribiz.com/docs/cli/troubleshooting.md) has the fixes.

### Instagram and cookies

Instagram needs a login for most posts. The CLI can use your browser's session:

```bash
scribiz 'https://www.instagram.com/reel/REEL_ID/' --cookies-from-browser chrome
```

Cookies stay on your machine. A hosted request for an Instagram link usually answers `source_auth_required` and tells you to upload the file:

```json
{
  "error": {
    "code": "source_auth_required",
    "message": "Instagram needs a login to read this video.",
    "engineCode": "SOURCE_AUTH_REQUIRED",
    "hint": "Download the video or its audio yourself and upload the file instead.",
    "retryable": false,
    "stage": "resolve"
  }
}
```

## YouTube details

For a public YouTube link, Scribiz works in this order:

1. A stored result, if someone already ran the video.
2. The video's title, channel and length from `yt-dlp`. When `yt-dlp` cannot read the video (it is missing, blocked or slow), the title and channel come from YouTube's public oEmbed and the length is unknown.
3. The video's own captions. A manual track in the video's language, or the original-language automatic track when it passes a quality check.
4. If there are no usable captions and the audio cannot be downloaded, the model reads the video link directly. YouTube blocks the download from our server, so on the hosted service this is the usual path for Listen and Watch.

Step 4 only works for public videos. Unlisted and private videos fail. The transcript from step 4 has approximate timing and no speakers, and the Context carries the warning `DOWNLOAD_FALLBACK_URL_DIRECT`. Every result says how its transcript was made: from captions, or by listening.

Live streams are not supported (`SOURCE_LIVE`).

## Files

- You can drop audio and video files. Scribiz uses `ffprobe` to decide whether it can read a file, not the file extension.
- The hosted service takes a file up to 100 MB, as an upload to the API or in the web tool. Larger files are not accepted there. The CLI has no such size limit.
- In the web tool, your browser extracts the audio from a video file and uploads only that. It sends the audio as a WAV, 1.9 MB a minute, so a video is limited to about 50 minutes there however small the file is. The CLI has no such limit. The API accepts a whole media file, so send audio only if you do not want the picture to leave your machine. See [the API quickstart](https://scribiz.com/docs/api/quickstart.md#upload-a-file).
- In the CLI, only audio leaves your machine in Listen mode. For Watch and Both, a low-resolution copy of the video is built on your machine and uploaded. The original file is never uploaded. See [Privacy and data handling](https://scribiz.com/docs/privacy-and-data.md).
- A video with no audio track works in Watch. Auto switches to Watch on its own. Listen alone fails with `NO_AUDIO_STREAM`.

## Length limits

| Where | Longest video |
| --- | --- |
| Anonymous web | 15 minutes |
| Free account | 2 hours |
| Pro account | 6 hours |
| CLI with your own Gemini key | No limit from Scribiz, unless you pass `--max-duration` |
| CLI signed in to a Scribiz account | Your account's minutes. It stops when they are used up |
| Remote MCP | 15 minutes without a key, otherwise your plan's limit |

A video over the limit is rejected before any work starts, with `413` and the code `video_too_long`, and the message names the limit.

## Languages

Scribiz detects the spoken language. Pass a hint when you know it: `--language` in the CLI, `language` in the API. Summary and chapters are written in the language of the transcript.

## Rate limits

Anonymous use is limited by connection and by a daily minute budget. When all anonymous use together has spent its daily budget, the hosted service switches Listen and Watch off for anonymous callers for a while, and Auto falls back to captions. A request that needs Listen or Watch then answers `503` with `busy`. Accounts are not affected. The MCP server without a key has its own daily limit across all callers. It cannot use up the web tool's, and the web tool cannot use up its. [Errors and limits](https://scribiz.com/docs/api/errors.md) lists the numbers.

---

Checked against the Scribiz build on 2026-10-05.
