YouTube API 403 quota exceeded: real operation costs and how to request more
What each YouTube Data API operation actually costs, why uploads and searches run out on their own separate 100-calls/day allowance instead of the shared pool, and how to request a quota increase that gets approved.
YouTube Data API v3 projects get 10,000 units per day in a shared pool, plus separate fixed allowances of 100 calls per day each for videos.insert and search.list, all resetting at midnight Pacific Time. A 403 quotaExceeded means one of those buckets ran out — often the small upload or search bucket while the main pool sits untouched.
The YouTube Data API v3 returns a 403 with reason quotaExceeded, and the confusing part is that your request volume does not feel high. That is because YouTube does not meter the API by a single request count — most endpoints draw from a shared points pool where different operations cost different amounts, video uploads and searches are capped by their own separate daily allowance instead of that shared pool, and everything resets on a fixed clock, not a rolling window.
PostGate handles OAuth, publishing and delivery evidence for every network through one API. Start free or read the docs.
How does the quota actually work?
Every Google Cloud project using the YouTube Data API v3 gets a default quota allocation of 10,000 units per day, combined, for every endpoint except two — plus a separate, fixed allowance of 100 calls per day each for videos.insert and search.list, charged at 1 unit per call inside their own bucket rather than the shared pool. All of it resets at midnight Pacific Time, not on a rolling 24-hour window from your last request, per Google's quota documentation. Every call against the shared 10,000-unit pool draws down the same project-level total regardless of which end user or channel it is acting on behalf of, so exhausting it is a project-level problem even if only one customer's activity caused it — but a project can separately run out of its upload or search allowance while that main pool is untouched, which is exactly the kind of split that makes this error confusing to diagnose.
Costs across the shared pool are not uniform. Simple read operations (most other *.list calls) are cheap, typically a single unit each. Write operations — insert, update, delete — cost substantially more: captions.insert runs 400 units, for example, and most other insert/update/delete calls across playlists, comments, subscriptions, and channel resources run 50. Google publishes the full per-operation cost table (and a quota calculator) at the link above; treat any number you see repeated in a forum thread as a snapshot that can be out of date, and check the current published table before you budget against it.
Why do uploads and searches run out on their own schedule?
videos.insert — the operation behind every programmatic video upload — and search.list both draw from their own fixed 100-call-per-day bucket, separate from the general pool. That was not always the case, and the history matters if you are cross-referencing an older forum post or blog against current behavior: for years, a single videos.insert call cost roughly 1,600 units out of the shared pool on its own, so a default 10,000-unit project supported only a handful of uploads a day before it was exhausted, even with zero other API activity. Google lowered that per-call cost to roughly 100 units and later moved both videos.insert and search.list onto their own separate quota bucket entirely — see the dated entries in Google's YouTube Data API revision history for exactly when each change shipped.
The practical effect today: heavy general API activity (list calls, metadata reads, playlist management) can no longer starve out your ability to upload video, and uploading video can no longer starve out unrelated read calls. But the 100-calls-per-day ceiling on uploads and searches is itself a hard cap, and a project publishing at real volume can still hit it — a team provisioning for more than 100 uploads or more than 100 searches in a day will exhaust that specific bucket and see the exact same 403 quotaExceeded error, even though its general 10,000-unit pool sits untouched.
This split is the most common source of misdiagnosis in production: a team checks its overall unit consumption, sees plenty of headroom in the shared pool, and cannot understand why uploads are still failing — because the number that actually ran out was the separate, much smaller upload allowance, not the general quota.
Diagnose before you request an increase
- Check the Google Cloud Console's quota metrics for your project to see your actual unit consumption over time and which specific operations are driving it — and check the
videos.insertandsearch.listbuckets separately from the general pool, since they are tracked and exhausted independently. Do not guess. - Look for avoidable calls against the small, fixed-size buckets: repeated
search.listcalls that could be replaced with cached results, PubSub-style push notifications, or a cheaper*.listcall with known IDs; polling loops that re-check the same resource far more often than the data actually changes; or duplicate upload attempts triggered by client-side retry logic that does not check whether the original upload actually succeeded before retrying. - Confirm you are not accidentally running quota-expensive requests against every user's channel on a schedule (a nightly "refresh everything" job is a classic quota killer) when an event-driven approach would use a fraction of the units.
How do you request a quota increase that actually gets approved?
Google does not grant quota above the default automatically. Requests go through the YouTube API Services Audit and Quota Extension process, and any request for quota beyond the default allocation requires completing a compliance audit first — that is not reserved for unusually large requests, it is the standard path for every increase. A request that gets approved typically includes:
- A specific, calculated number of additional units, tied to a real breakdown of expected operations per day (uploads, list calls, etc.) — not a round number picked because it sounds sufficient.
- A clear description of what your application does and who uses it, since generic or vague use-case descriptions are a common reason for rejection or long review delays.
- Evidence that you have already optimized avoidable usage — reviewers are more receptive to a request from a project that is clearly not wasting quota on unnecessary calls.
- A completed compliance audit against YouTube's API Services Terms of Service; unresolved compliance issues will block an increase regardless of how well-justified the number is.
Expect this review to take real time, and request the increase well before a launch, not during one.
How does PostGate help here?
PostGate's structured error envelope surfaces YouTube's quota rejection as a distinct, platform-tagged error rather than a generic failure, and marks it appropriately for retry behavior so your integration does not hammer an already-exhausted quota. Because PostGate operates its own YouTube API project on your behalf for hosted connections, quota planning and increase requests are handled at the platform level — see Platform guides for how YouTube's provider app and quota model fit into PostGate's multi-tenant delivery.
Frequently asked questions
How much quota does the YouTube Data API give by default?
Every Google Cloud project gets a default allocation of 10,000 units per day, combined, for every endpoint except two — plus a separate, fixed allowance of 100 calls per day each for videos.insert and search.list, charged at 1 unit per call inside their own bucket rather than the shared pool. Everything resets at midnight Pacific Time, not on a rolling 24-hour window.
Why am I getting quotaExceeded when my overall usage looks low?
This is the most common misdiagnosis: teams check the shared 10,000-unit pool, see plenty of headroom, and cannot understand why uploads still fail. videos.insert and search.list draw from their own separate 100-call-per-day buckets, tracked and exhausted independently — so a project publishing more than 100 uploads or running more than 100 searches in a day sees the same 403 quotaExceeded even though its general pool is untouched.
How much do different YouTube API operations cost in quota units?
Costs are not uniform. Simple read operations — most *.list calls — are cheap, typically one unit each. Write operations cost substantially more: captions.insert runs 400 units, and most other insert/update/delete calls across playlists, comments, subscriptions, and channel resources run 50. Check Google’s published per-operation cost table before budgeting — numbers repeated in forum threads can be out of date.
When does YouTube API quota reset?
At midnight Pacific Time, on a fixed clock — not on a rolling 24-hour window from your last request. Both the shared 10,000-unit pool and the separate 100-call-per-day buckets for videos.insert and search.list reset on that same schedule.
How do I get a YouTube API quota increase approved?
Requests go through the YouTube API Services Audit and Quota Extension process, and any increase beyond the default requires completing a compliance audit first — that is the standard path, not an exception. Approved requests typically include a specific, calculated unit number tied to a real breakdown of expected daily operations, a clear description of the application and its users, and evidence you have already optimized avoidable usage. Request well before a launch, not during one.
