Publish a vertical video to your own YouTube channel as a Short, from a URL. You bring your own session cookies, so your login stays yours. Reads the frame size and duration from the first megabyte where the host allows it, so most bad files are refused before the rest transfers.
Public direct https:// URL to the vertical .mp4 to publish as a Short (S3, CDN, key-value store — anything that serves the file itself, not an HTML landing page). Required for a real upload. To see the sample row instead, run it with the cookie field blank on an account that has no saved session yet, or tick "demoMode". The file is checked first: it must be square or taller and 180 seconds or less, or YouTube will not file it as a Short. That check normally runs on the first megabyte, read over a range request before the transfer. A container the probe cannot read, or a host that answers a ranged request with the whole file, is checked after the transfer instead — see the README.
Type:string
Title
title
Optional
The Short's title, capped at YouTube's 100 characters (a longer one is cut and the cut is reported in the log, never silently). Required for a real upload: YouTube pre-fills the title box with the video's filename, so a blank title publishes a Short called "video.mp4". You do not need #Shorts — classification is decided by aspect ratio and duration, not by the title.
Type:string
Description
description
Optional
The Short's description, capped at YouTube's 5000 characters. Keep hashtags to 15 or fewer: past 60 hashtags across the title and description YouTube ignores all of them and can drop the video from search.
Type:string
Tags
tags
Optional
Optional keyword tags. YouTube caps the whole tag field at 500 characters, so the list is joined and trimmed to fit. Tags are a minor ranking signal on Shorts — the title and the first frames matter far more.
Type:array
Default:
[]
Visibility
visibility
Optional
Who can see the Short. Defaults to Private on purpose, so nothing is ever published publicly by accident. The actor reads the selected radio back off Studio before it presses Publish; if it cannot confirm the setting it saves a draft and refuses to publish rather than risk a private video going public.
Type:string
Default:private
Options:
publicunlistedprivate
Made for kids
madeForKids
Optional
YouTube's COPPA audience declaration. Leave unticked for content not made for children. This is a legal declaration about your own content — the actor sets what you choose here and verifies the radio took.
Type:boolean
Default:false
Channel ID
channelId
Optional
Optional. The UC... id of the channel to upload to (24 characters starting with UC — not an @handle, not a Brand-account id). Use it when the signed-in account manages several channels: Studio silently redirects to the account's default channel when it does not manage the one you asked for, and the actor stops with WRONG_CHANNEL rather than uploading to the wrong place. Leave blank to use the channel the session lands on.
Type:string
Custom thumbnail URL
thumbnailUrl
Optional
Optional, best-effort. Public https:// URL to a JPG/PNG thumbnail. Custom thumbnails require a phone-verified channel; on an unverified channel Studio silently ignores the upload, and the result row reports thumbnailApplied: false instead of pretending it worked.
Type:string
Allow square (1:1) source
allowSquare
Optional
A 1:1 video DOES become a Short — YouTube's criteria say "square or vertical" — but it plays with roughly 40% of the Shorts frame as black bars. A square source is refused by default so that the black bars are something you chose rather than something you find on the published Short, and the refusal normally lands on the first megabyte, before the transfer. Tick this to upload it as-is.
Type:boolean
Default:false
Allow above-target resolution
allowAboveTargetResolution
Optional
YouTube states "You can upload Short videos with a maximum resolution of 1080p". A source whose short edge is above 1080 px is refused by default, because every pixel above that is bandwidth you are billed for and quality no viewer receives. Tick this to upload it anyway.
Type:boolean
Default:false
Contains third-party audio
containsThirdPartyAudio
Optional
Tick this if the Short uses music or audio you did not create. Over 60 seconds, YouTube's rule is absolute: any Short with an active copyright claim of any type — including manual claims — is blocked GLOBALLY, after publishing. With this ticked, a Short longer than 60 seconds is refused, normally on the first megabyte and before the transfer. With it unticked, the run continues and logs the risk.
Type:boolean
Default:false
Verify Shorts classification after publishing
verifyShortsClassification
Optional
After publishing, poll the watch URL for up to 45 seconds to see whether YouTube has redirected it to /shorts/. Classification happens asynchronously with no published timing guarantee, so an unresolved poll reports null rather than a failure. The video is published either way.
Type:boolean
Default:true
YouTube session cookies — paste both exports, then leave empty
cookies
Optional
PASTE THIS THE FIRST TIME, THEN LEAVE IT EMPTY. Anything you paste here WINS: the run signs in with it and does not read the saved session at all. Leave the field empty and the run uses the session saved by an earlier run instead. With nothing pasted AND no saved session, the run returns the labelled sample row and uploads nothing. Paste again whenever you want to switch Google account or recover — a paste always overrides what is stored, so a saved session can never publish to an account you did not just name. HOW TO EXPORT: paste TWO Cookie-Editor JSON exports here, one after the other (order does not matter, and you do not need to merge them yourself). (1) On https://www.youtube.com/robots.txt while signed in: Cookie-Editor > Export > JSON. robots.txt because it is a plain text page with nothing loading behind it, so no background request can re-mint a cookie between the export and the paste. (2) On https://myaccount.google.com/ in the same window: Export > JSON again. BOTH are needed — Cookie-Editor can only ever export the domain of the tab you are on, and the upload flow passes through accounts.google.com, so a youtube.com-only export arrives there with nothing to show and Google draws its sign-in page. Chrome is the tested path: before exporting, set the extension to "On all sites" in chrome://extensions > Cookie-Editor > Details, or it silently omits every non-Secure cookie (SID, HSID, APISID). Export and run within a few minutes: Google re-mints the rotating cookies about every 10 minutes, and an export is good for one use only — do not test the same jar elsewhere first. Close the window afterwards, but do NOT sign out; signing out kills the session for every copy. WHAT GETS SAVED: once a run authenticates AND reads back which channel it is signed into, this Actor stores that session — the refreshed cookie jar plus a gzipped copy of the Chrome profile directory (cookies, Local Storage, IndexedDB, service workers, device identifiers) — in a key-value store named "youtube-uploader-sessions" in YOUR OWN Apify account, never the developer's and never in a run's output store. A run that signs in and cannot read the channel back saves nothing and says so in the log. Later runs open Chrome on it already signed in. It does not expire; to delete it, tick "Forget the saved session" (resetProfile) together with a fresh export, or delete that store in Apify Console > Storage — which does not sign the Google account out.
Type:string
Forget the saved session
resetProfile
Optional
A RECOVERY HATCH, not the way to switch accounts. To switch accounts you only need to paste the new account's export — anything you paste already wins over the saved session, which is never consulted on a run that supplies cookies. Tick this box only when the SAVED session itself has gone bad and you want it gone: the account was signed out everywhere, the password changed, or the profile was written by a Chrome build this image cannot open. It deletes BOTH saved records for this channel — the browser profile and the rolling cookie jar — before the run reads anything. YOU MUST PASTE A FRESH COOKIE EXPORT IN THE SAME RUN. Ticking this on its own does nothing at all: that run would have no session to sign in with, so it returns the sample row and deletes nothing — a run that never opens a browser must not be able to destroy your saved session. Untick the box and empty the cookies field again afterwards.
Type:boolean
Default:false
YouTube "SID" cookie
SID
Optional
In your browser: DevTools > Application > Cookies > https://www.youtube.com, find the row named SID and copy its Value column. Paste just the value. It must come from the .youtube.com list, NOT the .google.com one — Studio never receives google.com cookies.
Type:string
YouTube "HSID" cookie
HSID
Optional
From the same .youtube.com Cookies list. This one is HttpOnly, so a JavaScript/console cookie dump will not contain it — you need a cookie-manager extension (Cookie-Editor / Cookie Quick Manager).
Type:string
YouTube "SSID" cookie
SSID
Optional
From the same .youtube.com Cookies list. HttpOnly, like HSID, so a console cookie dump will not contain it either.
Type:string
YouTube "APISID" cookie
APISID
Optional
From the same .youtube.com Cookies list. Paste just the value.
Type:string
YouTube "SAPISID" cookie
SAPISID
Optional
Load-bearing beyond page load: Studio's own JavaScript derives the Authorization: SAPISIDHASH header from this value, and every Studio request 401s without it even though the page renders.
Type:string
YouTube "__Secure-1PSID" cookie
__Secure-1PSID
Optional
The first-party session id. HttpOnly.
Type:string
YouTube "__Secure-3PSID" cookie
__Secure-3PSID
Optional
The third-party-context session id. Studio specifically needs this one — an export filtered to first-party cookies only produces a session that looks complete and still bounces to the sign-in page.
Type:string
YouTube "LOGIN_INFO" cookie
LOGIN_INFO
Optional
YouTube's own logged-in-identity cookie. Studio bounces to a sign-in without it even when the whole SID family is intact. It is also the cheapest single proof that your export came from a real cookie API rather than a console dump — it is HttpOnly, so a document.cookie paste can never contain it.
Type:string
YouTube "__Secure-1PSIDTS" cookie
__Secure-1PSIDTS
Optional
The rotating freshness partner of __Secure-1PSID (TS = timestamp). Google re-mints it roughly every 10 minutes. Its absence makes Google treat the session id as unbound — i.e. stolen-looking — and redirect to sign-in. Export it fresh, minutes before the run.
Type:string
YouTube "__Secure-3PSIDTS" cookie
__Secure-3PSIDTS
Optional
The same, for __Secure-3PSID. Google re-mints it roughly every 10 minutes, and a session id with no matching PSIDTS is treated as unbound. Export it fresh, minutes before the run.
Type:string
YouTube "__Secure-1PAPISID" cookie
__Secure-1PAPISID
Optional
Backs the SAPISID1PHASH Authorization scheme.
Type:string
YouTube "__Secure-3PAPISID" cookie
__Secure-3PAPISID
Optional
Backs the SAPISID3PHASH Authorization scheme. YouTube falls back to this when SAPISID is missing.
Type:string
Proxy
proxyConfiguration
Optional
Egress for the Studio session. The proxy GROUP you pick here is IGNORED — this Actor chooses its own datacenter lane in code so a run can never be redirected onto a metered group. Two things here do take effect: (1) the COUNTRY, which is worth matching to where you exported your cookies, though that is no guarantee — a full run through an exit in the account's own country met the same verification challenge, so what actually triggers it is not established; and (2) your OWN servers in "Proxy URLs", which are used exactly as given. Switching the Apify proxy off with no servers of your own keeps the run direct. The video file itself is never fetched through this connection — it is downloaded straight from the URL you gave.
Type:object
Default:
{
"useApifyProxy":true,
"apifyProxyGroups":[
"BUYPROXIES94952"
]
}
Demo mode (no upload)
demoMode
Optional
Force a labelled SAMPLE run that uploads nothing and moves no video bytes, even with a session available. A run with no cookies pasted AND no saved session is a sample run too. Once a session is saved, two things reach the sample row: this box, or "Forget the saved session" ticked with the cookie box left empty.