Reference

YouTube Search API

One POST resolves a keyword search into a page of YouTube videos, each with a url the transcript and batch endpoints accept as-is. YouTube is the default platform, and it is the one platform where the search takes filters: upload date, duration, captions only, and sort by relevance or views. type finds channels or playlists instead of videos. No YouTube Data API key, quota or OAuth is involved.

1 credit per page of resultsView pricing

Each page of results is one credit, however many videos it lists; pass next_cursor back as cursor for the next page. Failed requests are free.

On this platform

  • upload_date, duration, captions and sort filter and order YouTube video results; type channel or playlist returns a channel_list or playlist_list instead.
  • captions true keeps only videos with a caption track, whose transcripts will come from captions rather than audio transcription.
  • One page costs 1 credit; pass next_cursor back as cursor for the next page.
POST/api/v2/transcripts/searchidempotent

Search for videos, channels or playlists

Resolve a keyword search into a paginated list of videos (metadata only). Searches YouTube by default; set platform to search TikTok or Instagram instead. Every video row carries a url the transcript endpoint accepts unchanged, plus duration and publish time where the source provides them. On YouTube, upload_date, duration and captions filter the videos and sort orders them, and type finds channels (data.kind channel_list) or playlists (data.kind playlist_list) instead, whose rows' urls the channel and playlist endpoints accept as-is.

Body parameters

querystringrequired
Keyword search query.
Example
platformstring (enum)optional
Where to search: youtube (default), tiktok, or instagram. Every video result's url is accepted by the transcript and batch endpoints as-is. The type, upload_date, duration, sort and captions options search YouTube only.
Example
type"video" | "channel" | "playlist"optional
YouTube only. What to search for: video (the default), channel or playlist. Channels come back as data.kind channel_list, each row's url accepted by the channel endpoint; playlists as data.kind playlist_list, each row's url accepted by the playlist endpoint. A channel row carries the @handle, subscriber count and description; its videoCount is null, because YouTube's channel results no longer show one.
Example
upload_date"hour" | "today" | "week" | "month" | "year"optional
YouTube video search only. Keep videos uploaded within the last hour, today, this week, this month or this year.
duration"short" | "medium" | "long"optional
YouTube video search only. Keep short (under 4 minutes), medium (4 to 20 minutes) or long (over 20 minutes) videos.
sort"relevance" | "views"optional
YouTube only. Result order: relevance (the default) or views (most viewed first). YouTube search no longer sorts by upload date or rating, so neither is offered; for recent videos, filter with upload_date.
Example
captionsbooleanoptional
YouTube video search only. true keeps only videos with subtitles or closed captions, whose transcripts come from captions rather than audio transcription. Defaults to false: no filter.
Example
limitinteger (1–50)optional
Max items to return per page: videos, or the playlists or channels some listing options return. Defaults to 5.
Example
cursorstringoptional
Opaque pagination cursor from a previous response's next_cursor (max 256 characters). Omit for the first page. Cursors are scoped to the listing that issued them, so send the same platform and listing options with each page. Offset-based sources cannot page past the first 2000 items.

Request example

curl https://transcriptfetch.com/api/v2/transcripts/search \
  -H "Authorization: Bearer $TRANSCRIPTFETCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"how transformers work","limit":10}'

Responses

SuccessExample response envelope
{
  "ok": true,
  "request_id": "req_…",
  "data": {
    "kind": "video_list",
    "source": "search",
    "platform": "youtube",
    "videos": [
      {
        "videoId": "Hq3Lz8pVt2K",
        "url": "https://www.youtube.com/watch?v=Hq3Lz8pVt2K",
        "title": "Transformers, explained step by step",
        "duration": 1580,
        "channel": "Example Channel",
        "publishedAt": "2026-09-08T00:00:00Z",
        "stats": {
          "plays": 184000
        }
      }
    ],
    "next_cursor": "eyJvIjoxMH0"
  },
  "usage": {
    "credits_spent": 1,
    "balance": 656,
    "bytes": 0
  }
}

Every YouTube endpoint

Frequently asked questions

Is this the YouTube Data API's search.list?
No. It is TranscriptFetch's own search endpoint: no Google project, API key, OAuth or daily quota. One page of results costs 1 credit, and every row's url can go straight to the transcript endpoint.
Which filters does YouTube search support?
upload_date (hour, today, week, month, year), duration (short, medium, long), captions (true keeps only captioned videos) and sort (relevance or views). These are YouTube-only; TikTok and Instagram search take the query alone.
Can I search for channels or playlists rather than videos?
Yes. Send type channel or type playlist. The response's data.kind becomes channel_list or playlist_list, and each row's url is accepted by the channel or playlist endpoint as-is.
How do I page through results?
Each response carries data.next_cursor. Send it back as cursor to get the following page; limit sets the page size, up to 50. Stop when next_cursor is null.