Publish a long-form video to your own YouTube channel from a URL: 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, and refuses uploads YouTube would silently ruin.
Public https direct URL to the long-form video file (.mp4/.mov) to upload. Must be a non-expired direct link (S3/CDN/key-value store) that returns the file itself, not a landing page. Required for a real upload. To see the sample row instead, run it with the cookie fields blank on an account that has no saved session yet, or tick "demoMode".
Type:string
Title
title
Optional
The video title, capped at YouTube's 100 characters (a longer one is cut and the run logs exactly how many characters were dropped, never silently). Required for a real upload: YouTube pre-fills the title box with the video's filename, so a blank title publishes a video called "video.mp4".
Type:string
Description
description
Optional
The video description. YouTube's limit is 5000 characters; anything longer is cut to 5000 and logged. Over 60 hashtags across the title and description makes YouTube ignore ALL of them on the video, so the run warns above that.
Type:string
Tags
tags
Optional
Video tags. They are entered into Studio's advanced pane and the chips are read back afterwards, so the result row can say whether they actually landed. YouTube caps the combined tag string at 500 characters.
Type:array
Default:
[]
Visibility
visibility
Optional
Who can watch the video. Defaults to private on purpose: the run refuses to press Publish unless it can read the chosen option back off the radio, because a video that should have been private going public cannot be undone.
Type:string
Default:private
Options:
publicunlistedprivate
Made for kids
madeForKids
Optional
Set this only if the video is directed to children. This is the COPPA audience declaration and it is legally binding on you, not on this Actor. It is also the one answer that gates Studio's Next button, so it is always set explicitly and read back.
Type:boolean
Default:false
Channel ID
channelId
Optional
Optional. The UC… channel id to upload to, e.g. UCXXXXXXXXXXXXXXXXXXXXXX. Not the @handle and not the Brand-account id. If the signed-in account does not manage this channel, Studio silently redirects to the account's default channel — the run detects that and stops instead of uploading to the wrong place. Leave blank to use the session's default channel.
Type:string
Custom thumbnail URL
thumbnailUrl
Optional
Optional. Public https direct URL to a JPG/PNG/WEBP thumbnail, under YouTube's own 2 MB limit. Best-effort: custom thumbnails require a phone-verified channel, and on an unverified channel Studio accepts the click and silently does nothing. The result row reports whether it was applied.
Type:string
Channel is phone-verified
channelIsPhoneVerified
Optional
Tick this only if the channel has completed phone verification at youtube.com/verify. Without verification YouTube caps uploads at 15 minutes — and it accepts the whole file first and rejects it for length afterwards, so a 4 GB transfer can be paid for and thrown away. With this unticked, anything over 15 minutes is refused — normally on the first megabyte, read over a range request before the transfer, though a container the probe cannot read is checked after the transfer instead. One phone number can only verify 2 channels per year.
Type:boolean
Default:false
Schedule publish at
publishAt
Optional
Optional. RFC 3339 timestamp WITH an explicit UTC offset, e.g. 2026-09-01T14:00:00-07:00. The offset is mandatory: without one the schedule lands in whatever timezone Studio happens to be showing, and YouTube renders published dates in Pacific Time on the watch page, so an ambiguous time reads back as the wrong day. A scheduled video is private until its publish moment, so visibility is set to private for you and the log says what it will become and when.
Type:string
Category
categoryId
Optional
The YouTube category for the video. Set in Studio's advanced pane.
Type:string
Default:22
Options:
22242327
Playlist ID
playlistId
Optional
Optional. Add the video to this playlist. Best-effort — Studio's playlist picker is a search dropdown, so if the playlist cannot be matched the upload still completes and the result row says so.
Type:string
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 the refreshed cookie jar 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 what was saved. 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, or the password changed. It deletes the saved cookie jar for this channel — the one record this Actor stores — 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.