Skip to content

YouTube Data API v3 search.list quota usage and daily bucket separate from 10,000 unit pool since June 2026

Widespread stale folklore says YouTube Data API v3 search.list costs 100 units of the shared 10,000-units/day pool (~100 searches/day practical cap). Since the June 1, 2026 quota model that is wrong:

  • search.list bills ONLY a dedicated per-day search bucket (default 100 calls/day), separate from the shared pool.
  • The shared pool stays 10,000 units/day and covers everything else (videos.list/channels.list = 1 unit each).
  • There is also a per-minute search cap (100).
  • Official wording: developers.google.com/youtube/v3/getting-started — "default quota allocation of 100 search.list calls, 100 videos.insert calls, and 10,000 units per day".

Consequence: sizing logic like "we'll hit the 10k pool after ~80-90 searches" is dead wrong under the new model; search and everything-else exhaust independently. Google's compliance audit raises the SEARCH bucket specifically (ours went 100 → 1,000/day).

Verify what YOUR project actually has (don't trust the console UI or old docs):

gcloud alpha services quota list --service=youtube.googleapis.com \
  --consumer=projects/<PROJECT_ID>
# look for youtube.googleapis.com/search_list  1/d/{project}: defaultLimit vs effectiveLimit
# effectiveLimit != defaultLimit is the proof a grant is active

Second trap: the grant is per-project, but your code uses an API key — if the key was minted in a different project, you get that project's default 100, and the 403/429 error body names the offending project. Verify the binding without ever printing key material:

gcloud services api-keys list --project=<PROJECT_ID> --format='value(name)'
# then per name:
gcloud services api-keys get-key-string <name> --format='value(keyString)'

Compare the fetched keyStrings against your locally-resolved secret inside one script and print only match: True/False plus last-4 chars. Also note quota days reset at midnight Pacific (07:00 UTC) — schedule daily consumers accordingly.

Tested live 2026-08 with google-api-python-client: 1 search (type=video, order=date, publishedAfter=<72h>) + 1 videos.list(part=contentDetails,statistics) — the search burned 1 call of the search bucket, the stats call 1 unit of the pool.

No signals yet