YouTube Video Uploader - Auto-Publish From a URL
Pricing
from $48.50 / 1,000 videos
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
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
1
Monthly active users
a day ago
Last modified
Categories
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.
| Input | A public direct link to the file, a title, and your own Google OAuth credentials |
| Output | One row per run, with the video id, the watch URL and the privacy YouTube actually stored |
| Ceiling | One video per run, up to 30 tags |
| Account needed | Your 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 get | Field |
|---|---|
| Whether the upload went through | ok |
| The video id and its watch link | videoId, watchUrl |
| The privacy YouTube stored, what you asked for, and whether it was overruled | privacyStatus, requestedPrivacy, privacyOverridden |
| The publish time you scheduled, as stored | scheduledFor |
| Whether the custom thumbnail took | thumbnailSet |
| The title you sent, and how long the run took | title, uploadSeconds |
▶️ How to upload a video to YouTube from a link
- In Google Cloud Console, create a project, enable the YouTube Data API v3, set up the OAuth consent screen and create an OAuth client.
- With that client, create a refresh token for your channel's Google account that carries the
youtube.uploadscope. Publish the consent screen so the token does not expire after a week. - Open YouTube Video Uploader, paste the three fields under Your Google credentials, and put your file's link in Video URL.
- Fill in Video title, pick a Category ID, and leave Privacy on
privatefor the first run. - Click Start, then read
videoId,watchUrlandprivacyOverriddenoff 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>"}
| Field | Default | What it is |
|---|---|---|
videoUrl | none | A public direct link to the .mp4 or .mov. You host it, and it has to open without a login. |
title | none | Trimmed to YouTube's 100 characters. |
description | none | Your hashtags are added to the end of it. |
tags | none | Up to 30. Anything past 30 is dropped. |
hashtags | none | Added to the description as #tag. Characters other than letters, digits and _ are stripped. |
privacyStatus | private | public, unlisted or private. |
publishAt | none | A 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. |
categoryId | 22 | People & Blogs by default. 24 Entertainment, 23 Comedy, 27 Education. |
thumbnailUrl | none | Optional. Custom thumbnails need a verified channel; if YouTube refuses it, the upload still succeeds and thumbnailSet says false. |
madeForKids | false | The COPPA audience declaration. It binds you, not this actor. |
clientId, clientSecret, refreshToken | none | Your own Google OAuth credentials, the refresh token with the youtube.upload scope. Marked secret. |
demoMode | false | Writes 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:
| Field | How to read it |
|---|---|
ok | true once YouTube returned a video id. |
watchUrl | The youtu.be link to the video. |
privacyStatus | The privacy YouTube actually stored, read back after the upload. |
requestedPrivacy, privacyOverridden | What you asked for, and whether YouTube overruled it. |
scheduledFor | Your publishAt as stored, or null. |
thumbnailSet | Whether YouTube took the custom thumbnail. |
uploadSeconds | Wall clock for the whole run, download included. |
🧾 Reading the output
| Row | Where it lands | Upload fee |
|---|---|---|
| A real upload | The dataset, ok: true with a videoId | yes |
| The preview row | The run's key-value store under SAMPLE_AND_NOTICES, never the dataset | no |
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 wrong | What the message says |
|---|---|
| The refresh token expired or was revoked | Usually Testing mode and the seven-day expiry. Publish your consent screen and make a new token. |
| Client ID or secret not accepted | Copy both from the OAuth client the refresh token was made with. |
| No upload scope on the token | Make a new token that includes youtube.upload. |
| No channel on the account | The Google account has no channel to upload to. |
| Quota used up | Your project's uploads for the day are spent. |
| The maximum cost cannot pay one upload | Raise the maximum cost. Nothing was downloaded. |
| The time limit was too short | Give 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:
- Run Auto Caption Burner on your clip and take
output.mp4Urlfrom its row. - Put that link in Video URL here with a title and a
publishAt. - Read
privacyOverriddenon 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
videoUrlbeyond 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 want | Use |
|---|---|
| To upload a video to your own channel | This one |
| To download a video, its audio or its subtitles | YouTube Downloader Pro |
| The videos a channel has already published | YouTube 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.
