YouTube Video Uploader - Auto-Publish From a URL avatar

YouTube Video Uploader - Auto-Publish From a URL

Pricing

from $48.50 / 1,000 videos

Go to Apify Store
YouTube Video Uploader - Auto-Publish From a URL

YouTube Video Uploader - Auto-Publish From a URL

Upload a video to your own YouTube channel from a public file link, through the YouTube Data API and your own Google project. Sets title, description, tags, category, thumbnail and privacy, and can schedule the publish time. Returns the video ID, watch URL and stored privacy. $0.05 per upload.

Pricing

from $48.50 / 1,000 videos

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

1

Monthly active users

a day ago

Last modified

Share

Upload a video to your own YouTube channel from a link, through the YouTube Data API: point it at a public link to your video file, give it a title and your own Google OAuth credentials, and it uploads to your channel with the description, tags, hashtags, privacy, schedule and thumbnail set in the same run. It is built to be the publish step at the end of a pipeline: render somewhere, drop the file on a CDN, hand this actor the URL.

You bring your own Google Cloud project and your own OAuth refresh token, and that is where the awkward part sits. A new project starts in Testing mode, where Google expires your refresh token after seven days, so publish the consent screen before you rely on it. And YouTube decides the privacy it stores: it has held uploads from projects it had not reviewed at private, whatever was asked. The row reports privacyOverridden: true when YouTube overruled you, so you find out from the output rather than from your channel.

InputA public direct link to the file, a title, and your own Google OAuth credentials
OutputOne row per run, with the video id, the watch URL and the privacy YouTube actually stored
CeilingOne video per run, up to 30 tags
Account neededYour own YouTube channel and your own Google Cloud project
Price$0.05 per uploaded video on the free plan, down to $0.0485 on Business. The free plan's $5 a month covers about 83 uploads

🔍 What YouTube Video Uploader does

Before it downloads anything, it checks your credentials with Google: the refresh token has to give an access token, and that token has to carry an upload scope. A bad token stops the run there, so you never wait for a big file only to hear the token was dead. Then it downloads your file, calls videos.insert, and thumbnails.set if you gave it a thumbnail. Nothing about your channel is kept after the run, and your credentials are written nowhere.

Privacy fails closed. It defaults to private, so nothing goes public unless you ask for it. If you set a schedule on a public or unlisted video, the actor moves it to private and says so in the log, because YouTube only schedules private videos. Afterwards it reads back the privacy YouTube actually stored, which is how privacyOverridden gets filled in.

📋 What data you get from each upload

What you getField
Whether the upload went throughok
The video id and its watch linkvideoId, watchUrl
The privacy YouTube stored, what you asked for, and whether it was overruledprivacyStatus, requestedPrivacy, privacyOverridden
The publish time you scheduled, as storedscheduledFor
Whether the custom thumbnail tookthumbnailSet
The title you sent, and how long the run tooktitle, uploadSeconds
  1. In Google Cloud Console, create a project, enable the YouTube Data API v3, set up the OAuth consent screen and create an OAuth client.
  2. With that client, create a refresh token for your channel's Google account that carries the youtube.upload scope. Publish the consent screen so the token does not expire after a week.
  3. Open YouTube Video Uploader, paste the three fields under Your Google credentials, and put your file's link in Video URL.
  4. Fill in Video title, pick a Category ID, and leave Privacy on private for the first run.
  5. Click Start, then read videoId, watchUrl and privacyOverridden off the row.

Run it with no credentials at all and you get a preview row instead.

💰 How much does it cost to upload a video to YouTube?

$0.05 per uploaded video on the free plan. Paid plans pay a little less: $0.0495 on Starter, $0.049 on Scale and $0.0485 on Business. On the free plan, the $5 Apify gives you each month covers about 83 uploads.

The upload fee lands on uploads YouTube confirmed with a video id, not on attempts. A preview, a run refused at the checks, a failed download and a failed upload are not charged it. If the maximum cost you set for a run cannot pay for one upload, the run stops before it downloads anything.

Your Google quota is separate, and it is Google's: its documentation gives about 100 uploads a day per project.

📥 What you give it

{
"videoUrl": "https://cdn.example.com/clips/episode-12.mp4",
"title": "How the Roman aqueducts actually worked",
"description": "A short breakdown of gravity-fed water systems.",
"tags": ["history", "engineering", "rome"],
"privacyStatus": "private",
"publishAt": "2027-06-15T14:00:00Z",
"categoryId": "27",
"clientId": "<your OAuth client id>",
"clientSecret": "<your OAuth client secret>",
"refreshToken": "<your refresh token>"
}
FieldDefaultWhat it is
videoUrlnoneA public direct link to the .mp4 or .mov. You host it, and it has to open without a login.
titlenoneTrimmed to YouTube's 100 characters.
descriptionnoneYour hashtags are added to the end of it.
tagsnoneUp to 30. Anything past 30 is dropped.
hashtagsnoneAdded to the description as #tag. Characters other than letters, digits and _ are stripped.
privacyStatusprivatepublic, unlisted or private.
publishAtnoneA future date and time for YouTube to publish the video. A date in the past, or one it cannot read, stops the run before anything is downloaded.
categoryId22People & Blogs by default. 24 Entertainment, 23 Comedy, 27 Education.
thumbnailUrlnoneOptional. Custom thumbnails need a verified channel; if YouTube refuses it, the upload still succeeds and thumbnailSet says false.
madeForKidsfalseThe COPPA audience declaration. It binds you, not this actor.
clientId, clientSecret, refreshTokennoneYour own Google OAuth credentials, the refresh token with the youtube.upload scope. Marked secret.
demoModefalseWrites the preview row instead of uploading.

📤 What you get back

One row per run. No real upload row has been published here yet, so rather than invent one, these are the fields and how to read them:

FieldHow to read it
oktrue once YouTube returned a video id.
watchUrlThe youtu.be link to the video.
privacyStatusThe privacy YouTube actually stored, read back after the upload.
requestedPrivacy, privacyOverriddenWhat you asked for, and whether YouTube overruled it.
scheduledForYour publishAt as stored, or null.
thumbnailSetWhether YouTube took the custom thumbnail.
uploadSecondsWall clock for the whole run, download included.

🧾 Reading the output

RowWhere it landsUpload fee
A real uploadThe dataset, ok: true with a videoIdyes
The preview rowThe run's key-value store under SAMPLE_AND_NOTICES, never the datasetno

A failure writes no row to the dataset. The run ends as failed, with a message naming the fix, and the same message goes into SAMPLE_AND_NOTICES:

What went wrongWhat the message says
The refresh token expired or was revokedUsually Testing mode and the seven-day expiry. Publish your consent screen and make a new token.
Client ID or secret not acceptedCopy both from the OAuth client the refresh token was made with.
No upload scope on the tokenMake a new token that includes youtube.upload.
No channel on the accountThe Google account has no channel to upload to.
Quota used upYour project's uploads for the day are spent.
The maximum cost cannot pay one uploadRaise the maximum cost. Nothing was downloaded.
The time limit was too shortGive the run a longer timeout. An upload YouTube did not confirm is not charged.

💡 What people use it for

  • The last step of a render pipeline, so the file never waits in a bucket for somebody to upload it.
  • Scheduling a batch: one run per video, each with its own publishAt, all private until their moment.
  • Re-publishing a back catalogue with consistent titles, tags and category from your own data.

From a raw clip to a scheduled upload, in two runs:

  1. Run Auto Caption Burner on your clip and take output.mp4Url from its row.
  2. Put that link in Video URL here with a title and a publishAt.
  3. Read privacyOverridden on the row before you count on the video going public at that time.

🚧 What it does not do

  • It uploads through your OAuth credentials only. There is no sign-in with exported YouTube cookies, and no shared app: the credentials, the project and the quota are yours.
  • It cannot change the privacy YouTube decides to store. The row tells you when YouTube overruled you.
  • It collapses your description onto one line. Line breaks do not survive the upload.
  • One video per run. There is no queue and no playlist step.
  • Your file has to download within about two minutes and fit on the run's disk. A large file on a slow host fails before it reaches YouTube.
  • It does not wait for HD processing. A video looks soft for a while after upload and sharpens on its own.
  • It does not check what is behind your videoUrl beyond the file type, so point it at links you control.
  • It is not an official YouTube tool. Dami's Studio is independent and is not affiliated with or endorsed by YouTube or Google, or by any other company named on this page.

🧭 Which YouTube tool do you need?

If you wantUse
To upload a video to your own channelThis one
To download a video, its audio or its subtitlesYouTube Downloader Pro
The videos a channel has already publishedYouTube Channel Scraper

❓ Questions people ask

Why did my public YouTube upload come out private?

YouTube decided the privacy it stored, and it has held uploads from Google projects it had not reviewed at private. privacyOverridden: true on the row tells you it happened.

Why did my refresh token stop working after a week?

The consent screen is still in Testing mode, where Google expires refresh tokens after seven days. Publish it, then make a new token.

Do I need to give you my Google account?

No. You create the OAuth client and hold the refresh token. It is marked secret in the input, used for the upload and written nowhere.

How many videos can I upload a day?

Google's quota decides, not this actor. Google's documentation gives about 100 uploads a day per project.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/youtube-video-uploader. Either way the run happens on your Apify account at the same price.

Whose rules apply to what I upload?

YouTube's Terms of Service, its Community Guidelines and Google's API terms apply to your uploads and to your Google project, the same as when you upload by hand. You are the publisher; this actor carries the file.

🆘 If something breaks

Open the Issues tab on the actor page with the run ID. The failure message usually names the fix already, and the same message is in the run's SAMPLE_AND_NOTICES record.