# YouTube API guide: uploading videos with the YouTube Data API

Canonical: https://status200uploads.com/platforms/youtube/api-guide

Checked on 26 October 2026.

The YouTube Data API uploads a video with one method, videos.insert, sent as a resumable upload of up to 256 GB. Since 1 June 2026, uploads have their own quota bucket: by default 100 videos.insert calls a day per project, each costing 1 unit. More quota needs YouTube's compliance audit, and an app that asks for sensitive scopes is limited to 100 new users until Google verifies it. This guide sums up Google's own pages, read on 15 October 2026.

Sources read on 15 October 2026.

## How an upload works: videos.insert

Every upload is a POST to https://www.googleapis.com/upload/youtube/v3/videos. Google lists "Maximum file size: 256GB" and "Accepted Media MIME types: video/*, application/octet-stream". [Y1]

The call needs one of four scopes: youtube.upload, youtube, youtubepartner or youtube.force-ssl. Google's own sample uses youtube.upload, which "allows an application to upload files to the authenticated user's YouTube channel, but doesn't allow other types of access". [Y1, Y7]

part names what you send, usually snippet,status. notifySubscribers tells subscribers about the new video: "The default value is True." [Y1]

YouTube does not accept service accounts: "YouTube does not support Service Accounts, and if you attempt to authenticate using a Service Account, you will get this error." The error is youtubeSignupRequired, which also comes back for a Google Account that has no channel. [Y8]

- Settable on upload: snippet.title, snippet.description, snippet.tags[], snippet.categoryId, snippet.defaultLanguage, localizations, status.embeddable, status.license, status.privacyStatus, status.publicStatsViewable, status.publishAt, status.selfDeclaredMadeForKids, YouTube's altered or synthetic content disclosure, and recordingDetails.recordingDate. [Y1]
- Since 7 July 2026, videos.insert also takes the brandPartner part. [Y9]

## Three different "verifications", and what each one changes

1. Google's OAuth app verification, on the Cloud console consent screen. Until an app is verified, users can see an "unverified app" screen, and "your app will be limited to 100 new users until it is verified". It applies if your app requests sensitive or restricted scopes. [Y13, Y12]
2. Sensitive-scope verification needs a demo video (uploaded to YouTube as Unlisted), verified domains, an accurate consent screen and links to your policies. Google: "The sensitive scope verification process typically takes 3-5 business days to complete." [Y12]
3. The YouTube API Services compliance audit, for more quota: "If you would like to request additional quota beyond the default allocation, you must first complete an audit to show that your project is in compliance with the YouTube API Services Terms of Service." You start it with the Audit and Quota Extension Form, and "A member of YouTube's API Services team will contact you as soon as possible." No time is given. Appeals, periodic audits and change-of-control forms exist too. [Y4]
4. Channel verification, on the creator's own account: "By default, you can upload videos that are up to 15 minutes long." Verified accounts can upload longer videos, and "The maximum file size you can upload is 256 GB or 12 hours, whichever is less." [Y15]

## Are uploads from an unverified project private?

Google's videos.insert and videos reference pages, updated on 8 October 2026, say under status.privacyStatus: "Videos uploaded from unverified API projects are not restricted to private viewing mode." [Y1, Y2]

Until then, Google's rule of 28 July 2020 applied: "All videos uploaded via the videos.insert endpoint from unverified API projects created after 28 July 2020 will be restricted to private viewing mode. To lift this restriction, each project must undergo an audit." That entry is still in the revision history (updated 30 September 2026), and no later entry withdraws it. [Y9]

Read the current reference before you rely on public uploads from a new project, and plan for the audit anyway if you need more than the default quota. [Y1, Y4]

## Quota in 2026: the upload bucket

Since 1 June 2026, "API calls to the videos.insert and search.list methods will be charged to their own respective quota buckets. API calls to all other methods will be charged to the existing quota bucket." [Y9]

videos.insert: "Quota impact: 100 calls per day. A call to this method has a quota cost of 1 unit in the Video Uploads quota bucket." A new project gets "100 search.list calls, 100 videos.insert calls, and 10,000 units per day combined for all other endpoints". "Daily quotas reset at midnight Pacific Time (PT)." [Y1, Y3, Y4, Y5]

- Other costs in the shared bucket: videos.update 50, thumbnails.set 50, videos.list 1, captions.insert 400. "All API requests, including invalid requests, incur a quota cost of at least one point." [Y3]
- Before the buckets: on 4 December 2025 the documented cost of an upload dropped "from approximately 1600 units to approximately 100 units". [Y9]
- Quota is not the only limit. "There's a limit to how many videos a channel can upload each day across desktop, mobile, and YouTube API." and "Limits may vary by country/region or channel history." Past it, the API answers uploadLimitExceeded: "This is a YouTube platform restriction and is entirely separate from your Google Cloud project's API quota." [Y16, Y8]

## Resumable uploads, step by step

1. Start a session: POST https://www.googleapis.com/upload/youtube/v3/videos?uploadType=resumable&part=PARTS with the video resource as JSON and the headers X-Upload-Content-Length and X-Upload-Content-Type. A 200 answer carries the session URI in its Location header. [Y6]
2. PUT the bytes to the session URI, whole or in chunks. "The chunk size must be a multiple of 256 KB." (the last chunk excepted), every chunk but the last the same size, each with its own Content-Range. [Y6]
3. 201 Created means the upload is done, and the body is the video resource. 308 Resume Incomplete means send the next chunk, starting after the Range header's end. [Y6]
4. After an interruption, or a 500, 502, 503 or 504, back off exponentially, then PUT with Content-Range: bytes */TOTAL to ask how much arrived. Google's Python sample retries these errors up to 10 times. "each resumable session URI has a finite lifetime and eventually expires"; an expired one answers 404 and you start over. [Y6, Y7]
5. Check the result on the video: status.uploadStatus (deleted, failed, processed, rejected, uploaded), status.failureReason (codec, conversion, emptyFile, invalidFile, tooSmall, uploadAborted) and status.rejectionReason (claim, copyright, duplicate, inappropriate, legal, length, termsOfUse, trademark, uploaderAccountClosed, uploaderAccountSuspended). [Y2]

Start a resumable upload session (YouTube's API, not ours)

```bash
curl -i -X POST 'https://www.googleapis.com/upload/youtube/v3/videos?uploadType=resumable&part=snippet,status' \
  -H 'Authorization: Bearer {user_access_token}' \
  -H 'Content-Type: application/json; charset=UTF-8' \
  -H 'X-Upload-Content-Length: 50000123' \
  -H 'X-Upload-Content-Type: video/*' \
  -d '{
    "snippet": { "title": "Behind the scenes", "description": "A day in the studio", "categoryId": "22" },
    "status": { "privacyStatus": "private" }
  }'
# The Location header of the answer is the session URI: PUT the file there.
```

## Metadata rules

| Field | Google's rule |
| --- | --- |
| Title | "maximum length of 100 characters and may contain all valid UTF-8 characters except < and >" |
| Description | "maximum length of 5000 bytes", no < or >. Clickable links need "platform-level requirements, such as channel verification or having Advanced Features enabled". |
| Tags | "The property value has a maximum length of 500 characters." Commas count, and a tag with a space counts its quotation marks: Foo-Baz is 7 characters, Foo Baz is 9. |
| Privacy | private, public or unlisted. "If you don't specify a value for this property, the uploaded video's privacy status defaults to public. Certain uploads might default to private based on creator account settings". |
| Scheduling | status.publishAt, only while the video is private and has never been published. A time in the past publishes at once. |
| Made for kids | status.selfDeclaredMadeForKids is what the channel owner declares; status.madeForKids is YouTube's result. |
| Altered or synthetic content | A disclosure on insert and update since 30 October 2024, for realistic altered or synthetic content such as a real person shown saying or doing something they did not. |
| Licence, embedding, stats | license (youtube or creativeCommon), embeddable, publicStatsViewable. |

Sources: [Y2, Y1, Y9]

## Shorts and made for kids

- Shorts: "You can now create YouTube Shorts up to three minutes in length." Videos uploaded on or after 15 October 2024 "with a square or vertical aspect ratio up to three minutes in length will be categorized as Shorts" (Official Artist Channels from 8 December 2025). [Y14]
- There is no Shorts field on videos.insert. A Short is an ordinary upload that meets those rules. [Y1, Y14]
- Shorts over one minute with an active Content ID claim are blocked worldwide. [Y14]
- Made for kids: "Regardless of your location, we require you to tell us whether or not your videos are made for kids", under YouTube's agreement with the US Federal Trade Commission and COPPA. In the API that is status.selfDeclaredMadeForKids. [Y18, Y2]
- A made-for-kids video loses personalized ads, comments, the notification bell, the Miniplayer, Save to playlist and Watch later, end screens and more. [Y19]

## Formats and size limits

| Item | Google's rule |
| --- | --- |
| Formats | .MOV, .MPEG-1, .MPEG-2, .MPEG4, .MP4, .MPG, .AVI, .WMV, .MPEGPS, .FLV, 3GPP, WebM, DNxHR, ProRes, CineForm, HEVC (H.265) |
| Largest file | 256 GB through the API; YouTube Help says 256 GB or 12 hours, whichever is less |
| Longest video | 15 minutes until the account is verified; longer after |
| MIME types | video/* or application/octet-stream |

Sources: [Y17, Y15, Y1]

## Errors YouTube returns

The Data API answers with an HTTP status and a reason. The reason, not the status, tells you what to fix: two different 403s can mean that the quota is used up or that a privacy setting is not allowed. [Y8]

| HTTP | Reason | What it means |
| --- | --- | --- |
| 403 | quotaExceeded | The project used up its quota for the day. |
| 400 | uploadLimitExceeded | The channel reached its own daily upload limit. |
| 403 | forbiddenPrivacySetting | The privacy setting is not allowed. |
| 403 | forbiddenLicenseSetting | The licence setting is not allowed. |
| 400 | invalidTitle | An invalid or empty video title. |
| 400 | invalidDescription, invalidTags | The description or the tags are invalid (see the rules above). |
| 400 | invalidCategoryId, invalidPublishAt | The category id or the publish time is invalid. |
| 400 | invalidFilename, mediaBodyRequired | The file name is invalid, or the request carries no video. |
| 400 | defaultLanguageNotSet | No default language is set. |
| 401 | youtubeSignupRequired | The account has no channel, or it is a service account. |
| 403 | insufficientPermissions | The token's scopes are too narrow. |
| 404 | (resumable) | The upload session expired: start a new one. |

Sources: [Y8, Y1, Y6]

- Refresh tokens stop working when the user revokes access, when "The refresh token has not been used for six months.", after 7 days for an app in "Testing" status, or when a Google Account has more than 100 refresh tokens for one client id (the oldest is invalidated). [Y11]

## What changed in 2025 and 2026

- 26 March 2025: Shorts views count every start or replay, from 31 March 2025. 4 December 2025: the documented upload cost fell from about 1,600 to about 100 units. 8 December 2025: three-minute Shorts for Official Artist Channels. [Y9, Y14]
- 1 June 2026: separate quota buckets for videos.insert and search.list. 3 June 2026: videos.batchGetStats, with its own bucket of 10,000 units a day. 7 July 2026: the brandPartner part on videos.insert, update and list. [Y9]
- 27 August 2026: public views counted when playback begins, in every format. 14 September 2026: the largest custom thumbnail for thumbnails.set went from 2 MB to 50 MB. [Y9]
- 8 October 2026: the videos.insert and videos pages were updated, with the upload quota text and the sentence about unverified projects. [Y1, Y2]

## Gotchas developers hit

- You can have quota left and still get uploadLimitExceeded: the channel's daily limit and the project's quota are separate. [Y8, Y16]
- Send no privacy status and YouTube makes the video public. [Y1]
- An app in "Testing" status gets refresh tokens that expire after 7 days. [Y11]
- Titles and descriptions refuse < and >, and the description is counted in bytes, not characters. [Y2]
- publishAt works only for a private video that has never been published. [Y2]
- Google's Developer Policies ask you to re-check authorization every 30 days for stored data, to delete the data of users whose tokens cannot be refreshed within 30 days, and never to collect YouTube login credentials. [Y10]

## Posting to YouTube through Status 200 Uploads

Status 200 Uploads uploads to YouTube with its own Google project: you sign in on Google's own page and never create a Google Cloud project, go through Google's app verification or apply for the compliance audit above. The facts below are the ones our YouTube page shows, as checked on that page's own date.

- **What you can post:** One video per post. YouTube itself decides whether a short vertical video is shown as a Short.
- **Largest video:** 5 GB per file.
- **Video length:** As long as your channel allows: YouTube limits channels it has not verified to 15 minutes per video.
- **Title and description:** A title of up to 100 characters on one line, and a description of up to 5,000 bytes (a letter with an accent takes 2, an emoji 4).
- **Tags:** Up to 500 characters of tags in all, counted the way YouTube counts them (a tag with a space counts its quotes too).
- **After the upload:** Every YouTube post answers 202 with the status processing: the upload goes on in the background, and reading the post back gives the video's link once YouTube has it.
- **Scheduling:** Schedule a post up to 365 days ahead, or send it now.
- **Your own Google project:** Not needed. Uploads count against our YouTube app, not a quota of yours.

Settings you can choose: Title, Description, Privacy, Category, Tags, Notify subscribers.

## Questions

### How much quota does a YouTube video upload cost?

Since 1 June 2026, uploads have their own quota bucket: by default 100 videos.insert calls a day, each costing 1 unit. Other methods share 10,000 units a day.

### How many videos can I upload per day with the YouTube API?

By default 100 videos.insert calls per project per day. On top of that, every channel has its own daily upload limit across desktop, mobile and the API, which can vary by country or channel history.

### Are videos uploaded from an unverified API project private?

Google's reference, updated 8 October 2026, says they are not restricted to private viewing mode. The 28 July 2020 rule that made them private until an audit is still in the revision history with no entry withdrawing it, and a video can also default to private through the creator's account settings.

### How do I get more YouTube Data API quota?

Complete the YouTube API Services compliance audit, which starts with the Audit and Quota Extension Form. Google states no turnaround time.

### How do I upload a YouTube Short with the API?

There is no Shorts field. Upload a square or vertical video of up to three minutes, and YouTube categorizes it as a Short.

### What is the largest video I can upload with the YouTube API?

256 GB. YouTube Help says 256 GB or 12 hours, whichever is less, and 15 minutes until the account is verified.

### Can I upload to YouTube with a service account?

No. YouTube does not support service accounts; trying answers youtubeSignupRequired.

### Why does my YouTube refresh token expire after 7 days?

Your app's OAuth consent screen is in "Testing" status, and Google issues refresh tokens that expire in 7 days to such apps.

## More on YouTube

- [YouTube](https://status200uploads.com/platforms/youtube)
- [YouTube errors](https://status200uploads.com/platforms/youtube/errors)

## Related

- [TikTok](https://status200uploads.com/platforms/tiktok)
- [Instagram](https://status200uploads.com/platforms/instagram)
- [REST API](https://status200uploads.com/integrations/rest-api)
- [Python](https://status200uploads.com/integrations/python)
- [AI agents (MCP)](https://status200uploads.com/integrations/mcp)
- [The API reference](https://status200uploads.com/docs/api)
- [File limits of every network](https://status200uploads.com/docs/file-limits)

## YouTube's own pages

Sources read on 15 October 2026.

- Y1. [Videos: insert](https://developers.google.com/youtube/v3/docs/videos/insert) (last updated Last updated 2026-10-08 UTC)
- Y2. [Videos resource](https://developers.google.com/youtube/v3/docs/videos) (last updated Last updated 2026-10-08 UTC)
- Y3. [Quota costs](https://developers.google.com/youtube/v3/determine_quota_cost) (last updated Last updated 2026-10-08 UTC)
- Y4. [Quota and Compliance Audits](https://developers.google.com/youtube/v3/guides/quota_and_compliance_audits) (last updated Last updated 2026-09-14 UTC)
- Y5. [YouTube Data API overview](https://developers.google.com/youtube/v3/getting-started) (last updated Last updated 2026-09-14 UTC)
- Y6. [Resumable uploads](https://developers.google.com/youtube/v3/guides/using_resumable_upload_protocol) (last updated Last updated 2026-09-14 UTC)
- Y7. [Upload a video](https://developers.google.com/youtube/v3/guides/uploading_a_video) (last updated Last updated 2026-09-14 UTC)
- Y8. [Errors](https://developers.google.com/youtube/v3/docs/errors) (last updated Last updated 2026-09-14 UTC)
- Y9. [Revision history](https://developers.google.com/youtube/v3/revision_history) (last updated Last updated 2026-09-30 UTC)
- Y10. [YouTube API Services Developer Policies](https://developers.google.com/youtube/terms/developer-policies) (last updated Last updated 2026-09-14 UTC)
- Y11. [Google Identity: OAuth 2.0 for Google APIs](https://developers.google.com/identity/protocols/oauth2) (last updated Last updated 2026-05-26 UTC)
- Y12. [Sensitive scope verification](https://developers.google.com/identity/protocols/oauth2/production-readiness/sensitive-scope-verification) (last updated Last updated 2026-08-19 UTC)
- Y13. [Unverified apps (Google Cloud Help)](https://support.google.com/cloud/answer/7454865)
- Y14. [Understand three-minute YouTube Shorts](https://support.google.com/youtube/answer/15424877)
- Y15. [Upload videos longer than 15 minutes](https://support.google.com/youtube/answer/71673)
- Y16. [Upload YouTube videos](https://support.google.com/youtube/answer/57407)
- Y17. [Supported YouTube file formats](https://support.google.com/youtube/troubleshooter/2888402)
- Y18. [Determining if your content is "made for kids"](https://support.google.com/youtube/answer/9528076)
- Y19. [Set your channel or video's audience](https://support.google.com/youtube/answer/9527654)
