YouTube Uploader Pro - Shorts avatar

YouTube Uploader Pro - Shorts

Pricing

from $550.00 / 1,000 short uploadeds

Go to Apify Store
YouTube Uploader Pro - Shorts

YouTube Uploader Pro - Shorts

Upload a vertical video from a URL to your own YouTube channel as a Short. You bring your own YouTube session cookies. Your login stays yours. It reads the frame size and length from the first megabyte. Bad files are refused before the rest is sent. This works where the host allows it.

Pricing

from $550.00 / 1,000 short uploadeds

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

19 hours ago

Last modified

Share

YouTube Uploader Pro for Shorts: publish a vertical MP4 to your own channel from a URL

Give it a direct link to a vertical .mp4 and a title. It opens YouTube Studio in a real browser, signs in with your own session, fills in the upload wizard and hands back the video id and the Shorts URL.

Two things to know before you spend anything. It signs in as you, using 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 whether YouTube files a clip as a Short is decided by the file, not by a tag. Square or taller, 180 seconds or less. #Shorts in the title changes nothing, and the decision cannot be undone after publishing, so the file is checked before it moves.

InputA public direct link to a vertical .mp4, a title, and your own YouTube session
OutputOne row per run, with the video id and the Shorts URL
Ceiling512 MB per file, 180 seconds, 1080 px short edge
Account neededYour own YouTube channel, signed in with your own cookies
Price$0.55 per published Short, plus $0.02 for each megabyte transferred

๐ŸŽฌ What YouTube Uploader Pro for Shorts does

It reads your file before it transfers it. Frame size, duration and container come off the first megabyte, so a landscape clip is turned away for a megabyte rather than five hundred. Three of those checks are yours to waive: a 1:1 source becomes a Short with roughly 40% of the frame as black bars, a short edge above 1080 px is quality nobody receives, and a Short over 60 seconds carrying somebody else's audio can be blocked worldwide by a claim after it is live. Each is refused by default, each has a box to tick.

Visibility defaults to private on purpose, and the run reads the radio button back off Studio before it presses Publish. If it cannot confirm the setting it saves a draft and refuses to publish, because clicking a radio and having it selected are two different things.

๐Ÿ“ฅ What you give it

{
"videoUrl": "https://cdn.example.com/clip.mp4",
"title": "The 64 sugar cubes puzzle",
"visibility": "private"
}
FieldDefaultWhat it is
videoUrlnoneA public https:// link to the file itself, not a page with a player on it. You host it.
titlenoneCut 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 Short called video.mp4.
descriptionnoneCut to 5,000 characters. Keep hashtags to 15 or fewer.
tags[]Optional. A minor signal on Shorts next to the title and the first few frames.
visibilityprivatepublic, unlisted or private.
madeForKidsfalseYouTube's COPPA audience declaration. It binds you, not this actor.
channelIdnoneThe 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 publishing to the wrong one.
thumbnailUrlnoneBest effort. Custom thumbnails need a phone-verified channel; on an unverified one the row reports thumbnailApplied: false rather than pretending.
allowSquarefalseUpload a 1:1 source instead of refusing it.
allowAboveTargetResolutionfalseUpload a source whose short edge is above 1080 px.
containsThirdPartyAudiofalseTick it when the audio is not yours. It turns a Short over 60 seconds into a refusal rather than a warning.
verifyShortsClassificationtrueAfter publishing, watches for up to 45 seconds to see whether YouTube filed it under /shorts/.
cookiesnoneYour session, pasted once. See below. Marked secret.
resetProfilefalseDeletes the saved session before anything reads it. Only does anything when you paste a fresh export in the same run.
proxyConfigurationApify network onThe 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.
demoModefalseForces 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 Short carries these:

FieldWhat it is
videoId, watchUrl, shortsUrl, studioEditUrlWhere the Short now lives
visibilityConfirmed, madeForKids, thumbnailApplied, tagsAppliedWhat was confirmed on the page, rather than what you asked for
durationSec, width, height, videoBytes, videoMegabytesWhat was read off your file
classifiedAsShort, classificationNoteWhether YouTube filed it under /shorts/. true or null, never false
warningsThings 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 message 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:31:23.917Z",
"title": "x",
"videoUrl": "https://httpbin.org/status/403",
"format": "short"
}

๐Ÿงพ Reading the output

RowHow to spot itWhat happened
A published Shortok: true with a videoId and a shortsUrlIt is on your channel
The sample row_sample and _demo, ids reading SAMPLE00000Nothing was uploaded
A refusalok: false with an errorCode, reason and hintNothing was published

The run itself still finishes as succeeded on a refusal, so read ok and errorCode rather than the run status. These are the codes about your file:

CodeWhat happened
SHORTS_TOO_LONGOver 180 seconds. Past that it stays long-form however you tag it.
SHORTS_NOT_VERTICALLandscape. It never becomes a Short at any length.
SHORTS_SQUARE_SOURCEExactly 1:1. Tick Allow square (1:1) source if you meant it.
SHORTS_ROTATION_METADATAStored landscape, vertical only by a rotation flag. YouTube reads the stored frame.
SHORTS_RESOLUTION_TOO_HIGHShort edge above 1080 px. Tick Allow above-target resolution to send it.
SHORTS_COPYRIGHT_CLIFFOver 60 seconds with Contains third-party audio ticked.
UNPROBEABLE_CONTAINERNot MP4 or MOV, so the duration and frame cannot be read. WebM, Matroska, AVI, FLV, Ogg, WMV and the MPEG streams all land here. Re-encode.
UNSUPPORTED_CONTAINERThe same verdict reached after the file arrived, when the first-megabyte probe could not run.
VIDEO_TOO_SMALL, NO_VIDEO_TRACKUnder 2 KB, or audio with no picture.
VIDEO_UNAVAILABLEThe file could not be fetched: a bad status, a timeout, zero bytes, or an HTML page where the video should be.
OVERSIZED_VIDEOAbove the 512 MB ceiling, or this run's Maximum total charge (USD) does not cover it. The message says which.
BAD_INPUTA 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:

CodeWhat happened
SESSION_INCOMPLETEThe pasted cookies do not add up to a Studio session.
SESSION_INVALID, SESSION_EXPIREDThe cookies were not accepted, or Google served its sign-in page. Re-export both sets and run within a few minutes.
SESSION_CHECKPOINTGoogle served a "verify it's you" challenge. Clear it in your own browser, then re-export.
BROWSER_GATEGoogle's sign-in form refused the browser. The session was not accepted, so re-export that.
WRONG_CHANNELThe session landed on a channel other than the channelId you asked for.
VISIBILITY_UNCONFIRMEDThe visibility could not be read back, so a draft was saved instead of publishing.
DAILY_LIMITThe channel's own 24-hour upload cap.
UPLOAD_REJECTEDYouTube refused the file after it arrived, quoting its own sentence.
UPLOAD_UNCONFIRMEDPublish was clicked and Studio never confirmed. Look in Studio before retrying: a blind retry can double-post.
LAYOUT_CHANGEDA step in Studio answered no selector this actor knows. Tell us.
NETWORK, TIMED_OUT, INTERNALThe run could not reach YouTube, ran out of time, or hit something unexpected.

โ–ถ๏ธ How to run it

  1. Open YouTube Uploader Pro for Shorts and put your .mp4 where it is served as a file: S3, a CDN, an Apify key-value store record.
  2. Export your cookies, following the four rows below exactly. This is the step people lose an hour to.
  3. Paste both exports into YouTube session cookies, fill in Title, set Visibility, and start within a few minutes.
  4. Read the row: a Shorts URL on success, an errorCode and a hint on a refusal.
  5. 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 working.
StepWhat to doWhy
1Install Cookie-Editor in Chrome, open chrome://extensions, Details, set access to On all sitesWithout it the export silently omits SID, HSID and APISID, and still looks complete
2Sign in to the right channel, go to https://www.youtube.com/robots.txt, Export to JSONA plain text page cannot re-mint a cookie between your export and your paste
3Go to https://myaccount.google.com/ in the same window, Export to JSON againThe extension only ever exports the tab's own domain, and the upload passes through both
4Paste both blocks in the one box and start within a few minutesTwo cookies in the jar are re-minted about every ten minutes

๐Ÿ’ฐ How much does it cost?

$0.55 per published Short, plus $0.02 for each megabyte of video 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 publish fee is only charged once YouTube confirms the upload.

A landscape clip, a WebM or a file over 180 seconds 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 publish fee.

๐Ÿ’ก What people use it for

  • Posting the vertical cut of something you already made, without opening Studio.
  • Ending an editing pipeline with the upload itself, rather than a file in a bucket.
  • Publishing to a schedule of your own from Apify, with visibility left private until you look.
  • Posting to a second channel you manage, named by channelId so it cannot land on the wrong one.

๐Ÿšง What it does not do

  • It cannot answer Google's "verify it's you" screen. That run stops at SESSION_CHECKPOINT and publishes nothing. Clear the challenge in your own browser, then re-export.
  • No scheduling, no category, no playlist. Those are deliberately left out here.
  • MP4 and MOV only. WebM included in the refusals.
  • One file per run.
  • A rotation-flag vertical is refused, because YouTube reads the stored frame and would publish it as a normal video with no warning.
  • classifiedAsShort resolves within 45 seconds or reports null, since YouTube decides that on its own clock. The video is live either way.
  • One shape of file is judged only after the whole transfer: an MP4 whose moov atom sits at the end, served by a host that ignores a range request. A SHORTS_* refusal then arrives with the megabytes already billed. Serve a faststart MP4 instead: ffmpeg -i in.mp4 -c copy -movflags +faststart out.mp4.
  • Your saved session lives in a key-value store called youtube-uploader-sessions in your own Apify account. No cookie value ever reaches a dataset row or the run's output store.

๐Ÿงญ Which YouTube actor do you need?

If you wantUse
To publish a vertical clip as a ShortThis one
To publish long-form, with category, playlist and schedulingYouTube Uploader Pro for Videos
A plainer upload from a URLYouTube Video Uploader
To download a video, its audio or its subtitlesYouTube Downloader Pro
The Shorts a channel has already publishedYouTube Shorts 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.

Where do my cookies go? Into your own Apify account, in the store named above, and into the browser this actor drives. Never to us.

Can I try it before pasting a session? Yes. Tick demoMode, or run it with no cookies on an account that has 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 outright and the saved session is not consulted on that run. Forget the saved session is a recovery hatch, not the way to switch.

Does deleting the saved session sign me out of Google? No. For that, sign the device out from Google's own Security page, which kills every copy of that session.

๐Ÿ†˜ If something breaks

Open the Issues tab on the actor page with the run id and the row's errorCode. A LAYOUT_CHANGED row means Studio moved something and we need to hear about it.