YouTube Uploader Pro - Videos
Pricing
from $550.00 / 1,000 video uploadeds
YouTube Uploader Pro - Videos
Publish a long-form video to your own YouTube channel from a URL. Set the title, description, tags, category, playlist, thumbnail, visibility and scheduling. You bring your own session cookies. It reads the file first where the host allows it. It refuses uploads YouTube would quietly ruin.
Pricing
from $550.00 / 1,000 video uploadeds
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
20 hours ago
Last modified
Categories
Share
YouTube Uploader Pro for Videos: publish long-form to your own channel from a URL
Give it a direct link to your video file and a title. It opens YouTube Studio in a real browser, signs in with your own session, fills in the whole wizard including category, playlist, thumbnail and scheduling, and hands back the video id and the watch URL.
Two things to know before you spend anything. It signs in as you, with cookies you export from your own browser, so the first run takes ten minutes of setup and the risk sits with your channel: driving Studio this way is against YouTube's terms. And YouTube decides some things from the file itself and will not take them back. A square-or-taller clip of three minutes or less is filed as a Short whatever you meant, and a channel that has not been phone verified is capped at 15 minutes and enforces it after accepting the whole upload. Both are checked before your file moves.
| Input | A public direct link to the video file, a title, and your own YouTube session |
| Output | One row per run, with the video id and the watch URL |
| Ceiling | 4,000 MB per file, 12 hours, 15 minutes on an unverified channel |
| Account needed | Your own YouTube channel, signed in with your own cookies |
| Price | $0.55 per uploaded video, plus $0.02 for each megabyte transferred |
🎬 What YouTube Uploader Pro for Videos does
It reads your file before it transfers it. Duration, frame size and container come off the first megabyte, so a clip YouTube would file as a Short, or one too long for an unverified channel, is turned away for a megabyte rather than four gigabytes.
Then it fills in Studio properly: title, description, tags, category, playlist, thumbnail, the kids declaration and the schedule. Each one is read back off the page afterwards, so the row says what landed rather than what was asked for. Visibility is the strict one. The run refuses to press Publish unless it can confirm the radio, and saves a draft instead, because a video that should have been private going public cannot be undone.
📥 What you give it
{"videoUrl": "https://cdn.example.com/episode-12.mp4","title": "Episode 12: the sugar cubes puzzle","categoryId": "27","visibility": "private"}
| Field | Default | What it is |
|---|---|---|
videoUrl | none | A public https:// link to the file itself, not a page with a player on it. You host it. |
title | none | Cut to YouTube's 100 characters, and the log says by how much. A blank one is refused: Studio pre-fills the box with your filename, so blank would publish a video called video.mp4. |
description | none | Cut to 5,000 characters. Past 60 hashtags across title and description YouTube ignores all of them, so the run warns you. |
tags | [] | Entered in the advanced pane, and the chips are read back, so tagsApplied tells you whether they took. |
visibility | private | public, unlisted or private. |
publishAt | none | RFC 3339 with an explicit offset, like 2026-09-01T14:00:00-07:00. Without the offset the schedule lands in whatever timezone Studio is showing, and YouTube prints dates in Pacific Time. A scheduled video is private until its moment, so visibility is set to private for you. |
categoryId | 22 | People & Blogs, Entertainment, Comedy or Education. |
playlistId | none | Best effort. Studio's playlist picker is a search box, so a playlist it cannot match is reported rather than guessed at. |
channelId | none | The UC... id, not an @handle. Use it when the account runs several channels: Studio redirects silently, so the run stops with WRONG_CHANNEL instead of uploading to the wrong one. |
thumbnailUrl | none | Best effort, under YouTube's own 2 MB limit. Custom thumbnails need a phone-verified channel; on an unverified one the row reports thumbnailApplied: false rather than pretending. |
madeForKids | false | YouTube's COPPA audience declaration. It binds you, not this actor. |
channelIsPhoneVerified | false | Tick it only if the channel finished verification at youtube.com/verify. It opens the path above 15 minutes. |
cookies | none | Your session, pasted once. See below. Marked secret. |
resetProfile | false | Deletes the saved session before anything reads it. Only does anything when you paste a fresh export in the same run. |
proxyConfiguration | Apify network on | The country is worth matching to where you exported. Your own servers in proxyUrls are used as given. Your video file is always fetched straight from your URL. |
demoMode | false | Forces the labelled sample row. Nothing is uploaded and no video bytes move. |
The twelve individual cookie fields underneath are a fallback. Anything in the cookies box wins.
📤 What you get back
One row per run, whatever happens. A published video carries these:
| Field | What it is |
|---|---|
videoId, watchUrl, studioUrl | Where the video now lives |
visibilityConfirmed, madeForKids, thumbnailApplied, tagsApplied | What was confirmed on the page, rather than what you asked for |
scheduled, publishAt, categoryId, playlistId | The settings that took |
durationSec, width, height, videoBytes | What was read off your file |
warnings | Things worth knowing that did not stop the run |
A refusal writes one row too. This is a real one from a real run, with the long messages cut short:
{"ok": false,"charged": null,"uploadFeeCharged": false,"errorCode": "SESSION_INCOMPLETE","error": "SESSION_INCOMPLETE: the cookies you supplied do not add up to a Studio session. ...","reason": "The cookies supplied do not add up to a YouTube Studio session. Nothing was uploaded, so no upload fee was charged ...","hint": "Export the WHOLE youtube.com cookie list, not a few fields. ...","platform": "youtube","posted": false,"confirmed": false,"videoId": null,"watchUrl": null,"finalUrl": null,"diagnosedAt": "2026-08-24T23:32:41.087Z","kind": "video","sourceUrl": "https://httpbin.org/status/403","title": "x","published": false,"egress": { "lane": "direct", "attached": false }}
🧾 Reading the output
| Row | How to spot it | What happened |
|---|---|---|
| A published video | ok: true with a videoId and a watchUrl | It is on your channel |
| The sample row | _sample and _demo, ids reading SAMPLE00000 | Nothing was uploaded |
| A refusal | ok: false with an errorCode, reason and hint | Nothing was published |
The run still finishes as succeeded on a refusal, so read ok and errorCode, not the run status.
Codes about your file:
| Code | What happened |
|---|---|
WOULD_BECOME_SHORT | Square or taller and three minutes or under. YouTube files that as a Short with no flag to turn off. Send it to the Shorts actor, or letterbox it. |
UNVERIFIED_CHANNEL_15MIN | Over 15 minutes with Channel is phone-verified unticked. Verify at youtube.com/verify, then tick the box. |
VIDEO_TOO_LONG | Over 12 hours, which is YouTube's own ceiling. |
VIDEO_TOO_SMALL, NO_VIDEO_TRACK | Under 2 KB, or audio with no picture. |
UNSUPPORTED_CONTAINER | The opening bytes name a container this actor does not upload. It takes MP4, MOV, Matroska and WebM; AVI, FLV, Ogg, WMV and the MPEG streams are refused on the first megabyte. |
VIDEO_UNAVAILABLE | The file could not be fetched: a bad status, a timeout, zero bytes, or an HTML page where the video should be. An expired signed link answers 200 with an error page, which is why the magic bytes are checked and not the content type. |
OVERSIZED_VIDEO | Above the 4,000 MB ceiling, or this run's Maximum total charge (USD) does not cover it. The message says which. |
BAD_INPUT | A missing or non-https videoUrl, a missing title, a channelId that is not a UC... id, or unreadable cookies. |
And these are about your session or Studio:
| Code | What happened |
|---|---|
SESSION_INCOMPLETE | The pasted cookies do not add up to a Studio session. |
SESSION_INVALID, SESSION_EXPIRED | The cookies were not accepted, or Google served its sign-in page. Re-export both sets and run within a few minutes. |
SESSION_CHECKPOINT | Google served a "verify it's you" challenge. Clear it in your own browser, then re-export. |
BROWSER_GATE | Google's sign-in form refused the browser. The session was not accepted, so re-export that. |
WRONG_CHANNEL | The session landed on a channel other than the channelId you asked for. |
VISIBILITY_UNCONFIRMED | The visibility could not be read back, so a draft was saved instead of publishing. |
DAILY_LIMIT | The channel's own 24-hour upload cap. |
UPLOAD_REJECTED | YouTube refused the file after it arrived, quoting its own sentence. |
UPLOAD_UNCONFIRMED | Publish was clicked and Studio never confirmed. Look in Studio before retrying: a blind retry can double-post. |
LAYOUT_CHANGED | A step in Studio answered no selector this actor knows. Tell us. |
NETWORK, TIMED_OUT, INTERNAL | The run could not reach YouTube, ran out of time, or hit something unexpected. |
▶️ How to run it
- Open YouTube Uploader Pro for Videos and put your file where it is served as a file: S3, a CDN, an Apify key-value store record.
- Export your cookies, following the four rows below exactly. This is the step people lose an hour to.
- Paste both exports into YouTube session cookies, fill in Title, pick a Category, set Visibility, and start within a few minutes.
- Read the row: a watch URL on success, an
errorCodeand ahinton a refusal. - After that leave the cookie box empty: the session is saved and refreshed on every run. Paste again only to switch account, or when a run says the session stopped.
| Step | What to do | Why |
|---|---|---|
| 1 | Install Cookie-Editor in Chrome, open chrome://extensions, Details, set access to On all sites | Without it the export silently omits SID, HSID and APISID, and still looks complete |
| 2 | Sign in to the right channel, go to https://www.youtube.com/robots.txt, Export to JSON | A plain text page cannot re-mint a cookie between your export and your paste |
| 3 | Go to https://myaccount.google.com/ in the same window, Export to JSON again | The extension only ever exports the tab's own domain, and the upload passes through both |
| 4 | Paste both blocks in the one box and start within a few minutes | Two cookies in the jar are re-minted about every ten minutes |
💰 How much does it cost?
$0.55 per uploaded video, plus $0.02 for each megabyte the run transfers.
Megabytes are counted on every attempt, so a transfer that breaks and restarts can bill more megabytes than the file holds. The upload fee is only charged once YouTube confirms it.
A vertical two-minute clip, an 18-minute cut on an unverified channel, an AVI: each is turned away on that first megabyte. No video bytes move on the sample row, or on a refusal that lands there, so neither carries megabytes or the upload fee.
💡 What people use it for
- Publishing the render at the end of an editing pipeline, instead of leaving it in a bucket.
- Scheduling a back catalogue: one run per episode, each with its own
publishAt, all private until their moment. - Posting to a second channel you manage, named by
channelIdso it cannot land on the wrong one. - Keeping metadata consistent: category, tags and playlist come from your data.
🚧 What it does not do
- It cannot answer Google's "verify it's you" screen. That run stops at
SESSION_CHECKPOINTand publishes nothing. Clear the challenge in your own browser, then re-export. - No Data API lane. Studio in a browser is the only path, for the reason below.
- Matroska and WebM skip the Short and 15-minute checks, because the duration cannot be read from them. Those two land on YouTube's judgement rather than ours. MP4 is the safe choice.
- Playlists are matched on the title, not on the
PL...id, since the picker is a search box. - The altered-content question is always answered No. If your video needs a yes, set it in Studio yourself afterwards.
- It does not wait for HD processing. A video looks soft for a while after publishing and sharpens on its own.
- One shape of file is judged only after the whole transfer: an MP4 with its
moovatom at the end, on a host that ignores a range request. The refusal arrives with the megabytes already billed. Serve a faststart MP4:ffmpeg -i in.mp4 -c copy -movflags +faststart out.mp4. - Your saved session lives in a store called
youtube-uploader-sessionsin your own Apify account, and no cookie value ever reaches a dataset row.
🧭 Which YouTube actor do you need?
| If you want | Use |
|---|---|
| To publish long-form, with category, playlist and scheduling | This one |
| To publish a vertical clip as a Short | YouTube Uploader Pro for Shorts |
| A plainer upload from a URL | YouTube Video Uploader |
| To download a video, its audio or its subtitles | YouTube Downloader Pro |
| The videos a channel has already published | YouTube Scraper |
❓ Questions people ask
Can I use the official API instead? Not usefully. A video uploaded through videos.insert from
an unverified API project created after 28 July 2020 is locked to private forever, with no appeal on
YouTube's own help pages. That is why there is no API mode here.
Why was my vertical video refused? At three minutes or under YouTube would have filed it as a Short, server-side, with no way back except deleting it. Use the Shorts actor, or letterbox it.
Where do my cookies go? Into your own Apify account, in the store named above, and into the browser this actor drives.
Can I try it first? Tick demoMode, or run it with no cookies on an account with no saved
session. You get one labelled sample row, no upload and no video bytes.
How do I switch channels? Paste the new account's export. Anything you paste wins, and the saved session is not read on that run.
🆘 If something breaks
Open the Issues tab with the run id and the row's errorCode. A LAYOUT_CHANGED row means
Studio moved something and we need to hear about it.

