# Upload and schedule YouTube videos

Canonical: https://status200uploads.com/platforms/youtube

Checked on 26 October 2026.

Status 200 Uploads uploads your videos to YouTube with the title, description, privacy, category and tags you set, now or at a scheduled time. Send them from the dashboard, the REST API, Python, n8n or an AI app such as Claude. You sign in on Google, and the upload goes through our own YouTube app, so you never create a Google Cloud project or ask for an API quota.

## Quick facts

- **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. [File limits of every network](https://status200uploads.com/docs/file-limits)
- **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.
- **Plans:** YouTube is on every plan, Free included. [Pricing](https://status200uploads.com/pricing)
- **How it connects:** You sign in on YouTube itself (OAuth), so we never see your YouTube password.
- **Your own Google project:** Not needed. Uploads count against our YouTube app, not a quota of yours.

## What you can post

### Videos

One video per post, up to 5 GB. Without youtube.title the post text becomes the title; when the text is too long for one, its first line is the title and the whole text becomes the description, unless you send youtube.description. If neither text nor title is sent, the video is called "Untitled" and the answer says so.

### Shorts

A Short is the same upload as any other video. Send a short vertical clip and YouTube shows it as a Short when it meets YouTube's own Shorts rules; there is no separate switch to set.

## Settings

| Setting | Dashboard | REST field | AI connector option | What it does |
| --- | --- | --- | --- | --- |
| Title | Video title (optional) | youtube.title | title | Up to 100 characters on one line. A longer title is shortened at the end of a word and the answer says so (title_shortened). |
| Description | Video description (optional) | youtube.description | description | Up to 5,000 bytes; a longer one is shortened at the end of a word (description_shortened). |
| Privacy | Privacy | youtube.privacyStatus | privacy_status | Public, unlisted or private. Through the REST API a video sent without it is uploaded as private; the AI connector asks you every time. |
| Category | Category | youtube.categoryId | category_id | The YouTube category id; the account's posting options list the categories by name. |
| Tags | Tags (comma-separated) | youtube.tags | tags | A list of tags, up to 500 characters in all as YouTube counts them. A longer list is refused before the upload starts. |
| Notify subscribers | Notify Subscribers | youtube.notifySubscribers | notify_subscribers | Turn it off to publish without YouTube telling your subscribers about the new video. |

## Automatic changes

- `unknown_field`: A field we do not read is not used, and the answer says so (with the field name we think you meant, when there is one). The post still goes out.
- `field_not_used`: A field we read but could not use for this post (for example another network's block, or a setting that does not apply to this kind of post) is named in the answer. The post still goes out.
- `options_outside_post`: An option sent next to "post" instead of inside it is not used, and the answer says where it belongs.
- `title_shortened`: A title longer than YouTube allows is shortened at the end of a word, and the answer says to how many characters.
- `description_shortened`: A description longer than YouTube allows is shortened at the end of a word, and the answer says so.
- `characters_removed`: YouTube does not allow < or > in a title or a description, so they are removed, and the answer says how many.
- `text_partly_used`: When the title is made from the post text and a description was sent, the rest of the text is not used, and the answer says how to keep it.
- `title_missing`: A video sent with no text and no title is uploaded with the title "Untitled", and the answer says so.
- `media_url_not_kept`: A scheduled post that names its media by web address fetches the file when it goes out, and we keep no copy: the answer reminds you the file must still be there then.
- `posts_close_together`: The answer warns when another YouTube post of the account is scheduled within 20 seconds: leave at least a minute between them.
- `moved_to_next_day`: When the daily limit of the profile is reached while a scheduled post is going out, the networks that did not fit move to the next day as a scheduled post of their own, and the post read back says so.
- `queued_for_next_day`: On a plan with a daily limit, a post over the day's limit is queued for the next day instead of failing (answer 202), and the answer gives the time.

## Your way to post

### From the dashboard

1. Under Connections, connect YouTube: you sign in with the Google account that owns the channel.
2. In Schedule, add the video, then open the YouTube settings for the title, description, privacy, category and tags.
3. Upload now or pick a date and time; History shows the video's link once YouTube has processed it.

[Connect YouTube](https://status200uploads.com/connections)

### From the REST API

Upload a video as public, with a title and tags (POST /api/v2/posts)

```bash
curl -X POST 'https://status200uploads.com/api/v2/posts' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer rl_your_api_key' \
  -H 'Idempotency-Key: launch-video-youtube' \
  -d '{
    "post": {
      "accountId": "@yourchannel",
      "platform": "youtube",
      "content": {
        "text": "How we film our product videos",
        "mediaID": ["YOUR_FILE_ID"]
      },
      "youtube": {
        "title": "How we film our product videos",
        "privacyStatus": "public",
        "tags": ["behind the scenes", "filming"]
      }
    }
  }'
```

[Full page](https://status200uploads.com/integrations/rest-api)

### From Python

Schedule an unlisted upload with the status200uploads package

```python
from datetime import datetime, timezone
from status200uploads import Status200

s200 = Status200()  # STATUS200_API_KEY holds your rl_ key

video = {
    "accountId": "@yourchannel",
    "platform": "youtube",
    "content": {"text": "Weekly update", "mediaID": ["YOUR_FILE_ID"]},
    "youtube": {"privacyStatus": "unlisted", "categoryId": "26"},
}
result = s200.publish(video, scheduled_for=datetime(2026, 11, 2, 15, 0, tzinfo=timezone.utc))
print(result.code)  # "scheduled"

s200.cancel(result.status200.scheduled_post_id)  # only if you change your mind
```

[Full page](https://status200uploads.com/integrations/python)

### From n8n

1. Use an HTTP Request node with the method POST and the address https://status200uploads.com/api/v2/posts.
2. Add the headers Authorization (Bearer rl_your_key) and Content-Type (application/json), plus an Idempotency-Key such as {{ $json.id }}-youtube so a retried run uploads once.
3. Send the body below. The answer is 202 processing: add a Wait node and a GET of /api/v2/posts/{id} if a later step needs the video link.

The HTTP Request body

```json
{
  "post": {
    "accountId": "@yourchannel",
    "platform": "youtube",
    "content": {
      "text": "{{ $json.title }}",
      "mediaID": ["{{ $json.fileId }}"]
    },
    "youtube": {
      "privacyStatus": "private",
      "description": "{{ $json.description }}"
    }
  }
}
```

[Full page](https://status200uploads.com/integrations/n8n)

### From an AI app

Prompt: "Upload my latest video to YouTube tomorrow at 9:00 with the title "Studio tour" and the tags studio and tour."

The app finds the video with status200_list_media and asks whether it should be public, unlisted or private: the connector refuses a YouTube post without a privacy status, before anything is sent. It then schedules the upload with status200_schedule_post and gives you the scheduled post's id, which status200_update_scheduled_post or status200_cancel_scheduled_post can change or stop.

[Full page](https://status200uploads.com/integrations/mcp)

## Errors

| HTTP | Code | Meaning | Fix |
| --- | --- | --- | --- |
| 400 | youtube_tags_too_long | The tags add up to more than 500 characters as YouTube counts them. Nothing was uploaded. | Remove the tags the answer lists in remove_tags, or shorten them, and send it again. |
| 413 | MEDIA_TOO_LARGE | The video is larger than YouTube takes through us. | Use a file of at most 5 GB. |
| 404 | media_not_found | The mediaID is not a file of your account: never uploaded, deleted, or removed after 7 days. | Upload or import the video again and send its new mediaID. |
| 409 | media_processing | The video you imported is still being fetched. | Wait the seconds in Retry-After and send the post again. |
| 400 | scheduled_for_invalid | post.scheduledFor has no time zone, cannot be read as a date and time, or is more than 365 days ahead. | Send an ISO 8601 time with its zone, such as 2026-11-02T15:00:00Z. |
| 500 | platform_error | YouTube answered with an error of its own that named no code. | Send it again once, with the same Idempotency-Key. |

## Questions

### Can I upload to YouTube through an API?

Yes. Upload or import the video, then send a POST to https://status200uploads.com/api/v2/posts with platform youtube and a youtube block for the title, privacy and tags. It works on every plan, Free included, with no Google Cloud project or API quota of your own.

### Why did my YouTube video upload as private?

Through the REST API, a video sent without youtube.privacyStatus is uploaded as private, so only you can see it. Send public or unlisted; a dry run warns you when the privacy is missing, and the dashboard and the AI connector ask you to choose.

### Why does a YouTube post answer 202 processing?

Every YouTube upload goes on in the background after we answer, because large videos take minutes. The answer carries our post id; read the post back with GET /api/v2/posts/{id}, or open History, to get its final status and the video link.

### How long can a YouTube title and description be?

A title can have 100 characters on one line and a description 5,000 bytes. Longer text is shortened at the end of a word, YouTube's forbidden < and > are removed, and the answer names each change.

### Can I post YouTube Shorts?

Yes. A Short is uploaded like any video: send a short vertical clip and YouTube decides whether it appears as a Short, by its own rules.

### How many tags can a YouTube video have?

As many as fit in 500 characters, counted YouTube's way. A longer list is refused with youtube_tags_too_long before the upload starts, and the answer says which tags to drop.

### Can I schedule a YouTube upload for later?

Yes, up to 365 days ahead: pick a time in the dashboard, or add post.scheduledFor to the API request. Until it goes out you can change or cancel the scheduled post.

## More on YouTube

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

## Related

- [TikTok](https://status200uploads.com/platforms/tiktok)
- [Instagram](https://status200uploads.com/platforms/instagram)
- [Facebook](https://status200uploads.com/platforms/facebook)
- [REST API](https://status200uploads.com/integrations/rest-api)
- [Python](https://status200uploads.com/integrations/python)
- [n8n](https://status200uploads.com/integrations/n8n)
- [AI agents (MCP)](https://status200uploads.com/integrations/mcp)
- [Claude](https://status200uploads.com/integrations/claude)
- [Schedule and cancel in the API reference](https://status200uploads.com/docs/api#post-schedule)
- [File limits of every network](https://status200uploads.com/docs/file-limits)
- [Pricing](https://status200uploads.com/pricing)
