TikTok Video Uploader Pro
Post videos to TikTok automatically from a public URL. Set the caption and privacy. Upload fee only on a confirmed post. Bandwidth billed per megabyte.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
videoUrl,caption,privacy(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.55 per video uploaded = $550 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Video uploaded | Charged once per video that TikTok confirms was published. A run that publishes nothing is never charged this fee, though it is still charged for the megabytes it moved before it stopped, under "Video megabyte". | $0.55 |
| Video megabyte | Charged per megabyte, rounded up, for the bytes a run actually moves, and charged on EVERY outcome, including a run that fails, times out or is aborted, because that traffic is paid for the moment it happens and cannot be handed back. Two things are counted: your video file, which is pulled straight from your URL, and the TikTok Studio session, which runs over this Actor’s own metered connection. Bytes that never moved are never charged. The total is never more than a confirmed publish of the same run would have cost, and never more than the "maxTotalChargeUsd" you set. Runs that use your own proxy servers, or no proxy at all, are not charged this. | $0.02 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-22, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
videoUrl | Public direct URL to the video file (.mp4) to upload. Must be a non-expired direct link (S3/CDN/key-value store). Required for a real upload; leave it blank for a keyless demo run. | string |
caption | The TikTok caption (include #hashtags here). | string |
privacy | Who can watch the video. | string |
sessionid | Your TikTok "sessionid" cookie. In your browser: DevTools > Application > Cookies > https://www.tiktok.com, find the row named sessionid and copy its Value column. Paste just the value. | string |
sid_tt | Your TikTok "sid_tt" cookie, from the same Cookies list. Paste just the value. | string |
cookies | The most reliable way to authenticate: paste a Cookie-Editor JSON export of the entire tiktok.com cookie list, or a raw "Cookie:" header. TikTok’s upload page often needs more than the two named cookies above, and a whole-list export cannot miss one. Fill in either this field or the two above, if both are given, this one wins. | string |
demoMode | Force a labeled SAMPLE run that uploads nothing, moves no video bytes and is charged no upload or megabytes, even if cookies are provided. A keyless run (no cookies) is automatically demo mode. | boolean |
What you get
A structured dataset — each result includes fields like:
okplatformvideoUrlvideoIdcaptionprivacyprivacyAppliedpostedAterrorExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
2 ready-to-run use cases
TikTok Private Post: Upload an Only-Me Draft First
Uploads to your own account set to Only me. If it cannot read that privacy setting back, it refuses to post rather than risk publishing in public.
Upload Video to TikTok From a URL, Hands Off
Give it a public .mp4 and a caption; it posts to your own account and waits for TikTok to confirm. You bring your own exported session cookies.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
TikTok Video Uploader Pro: post a video to TikTok from a link, on your own account
Give it a direct link to an .mp4, a caption and a privacy setting, and it signs in as you and posts the video. You get one row back saying whether the post was confirmed, with the privacy TikTok actually applied.
Two things to settle before you start. This runs on your own TikTok session cookies. There is no API key path and no account is supplied for you, so you paste your own cookies into the secret fields below. And bytes are billed on any outcome, including a run that fails after moving them, because those bytes were already moved. A run with no cookies is a labelled demo that uploads nothing.
| Input | A direct .mp4 link, a caption, and your own TikTok cookies |
| Output | One row saying whether the post went through |
| Ceiling | One video, to one account, per run |
| Account needed | Yours. Your own TikTok cookies, pasted in |
| Price | $0.55 when a post is confirmed, plus $0.02 for each megabyte moved |
📲 What TikTok Video Uploader Pro does
It opens TikTok Studio with your session, pulls the file from your link, puts it on the upload page, sets the caption and the privacy, and presses Post. Then it waits for TikTok to confirm the post before it calls the job done.
Privacy is checked rather than assumed. If you asked for private and the control could not be confirmed, it refuses to post rather than risk putting your video out publicly.
📥 What you give it
{
"videoUrl": "https://your-bucket.s3.amazonaws.com/clip.mp4",
"caption": "new one is up #fyp",
"privacy": "public"
}
| Field | Default | What it is |
|---|---|---|
videoUrl | empty | A public, non-expired direct link to the .mp4. An Apify key-value store link, S3 or any CDN works. Leave it empty for a demo run. |
caption | empty | The caption, hashtags included. |
privacy | public | public, friends or private. |
cookies | empty | Secret. The whole tiktok.com cookie list, as a Cookie-Editor JSON export or a raw Cookie: header. This is the reliable one, because the upload page wants more than two cookies. |
sessionid | empty | Secret. Just the value of your sessionid cookie. |
sid_tt | empty | Secret. Just the value of your sid_tt cookie, from the same list. |
proxyConfiguration | a metered connection | The connection the upload session uses, and what the per-megabyte charge pays for. Put your own servers in it and they are used exactly as given, with no per-megabyte charge. |
demoMode | false | Force a labelled demo run that uploads nothing, even with cookies filled in. |
Fill in cookies, or the two named cookies, not both. If sessionid has anything in it, that is what gets used and the pasted jar is ignored, which is the opposite of what you would expect. A whole-list export on its own is the shape that works most often.
Your cookies are as good as your password for that account. Use an account you are comfortable exposing, expect them to stop working when you log out, and never save them into a task you publish.
📤 What you get back
A real row from a real confirmed post, with the byte accounting block trimmed off:
{
"ok": true,
"platform": "tiktok",
"caption": "heello",
"privacy": "private",
"postedAt": "2026-08-23T06:04:24.380Z",
"runId": "OPjdapVheI4YTjVs1",
"posted": true,
"videoId": null,
"videoUrl": null,
"privacyApplied": true,
"finalUrl": "https://www.tiktok.com/tiktokstudio/content"
}
| Field | What it is |
|---|---|
ok, posted | The two you judge a run by. Both true means TikTok confirmed the post. |
privacyApplied | Whether the privacy you asked for was set on the page before posting. |
postedAt, finalUrl | When it went out, and the page TikTok left the session on. |
videoId, videoUrl | Best effort. They are read from the newest video link on the account after posting, so they can be null, as they are above, or point at an older post. Check the account if you need the exact link. |
chargeStatus | pending while a charge is still settling, not-charged when no upload or megabytes will be billed. |
chargeNote | A plain sentence saying what this run will be billed for. |
bytesMoved | What actually crossed the wire: the video file, what was pushed to TikTok, and the session traffic. |
error | On a failure row, what went wrong, in a sentence you can act on. |
CHARGE_SUMMARY.json in the run's key-value store holds the settled figures, and a screenshot of the page at the moment a run gave up lands there too.
🧾 Reading the output
The run exits successfully whatever happens, so judge it by the row, not the run status.
| Row | How to spot it | What it means |
|---|---|---|
| A confirmed post | ok: true and posted: true | The video is live on the account. |
| The demo row | _demo: true and a _notice | No cookies were supplied, so nothing was uploaded. |
| A failure | ok: false and an error | Nothing was confirmed. Read the sentence. |
The failure sentences are written to be acted on: the cookies are not a signed-in session, the link would not download, the Post button never enabled, the privacy control could not be confirmed.
One case deserves its own line. If the post is submitted but the confirmation never arrives, the row says ok: false and the video may still be live. Check the account before running it again, or you will post twice.
▶️ How to run it
1. Put the video behind a direct .mp4 link that downloads without a login. 2. Export your tiktok.com cookies, signed in to the account you want to post from. 3. Open TikTok Video Uploader Pro and run it once with the cookie fields empty. You get the demo row and nothing is posted. 4. Paste the export into TikTok session cookies, fill in Video URL, Caption and Privacy, then click Start. 5. Read the row. ok and posted both true means it is up.
💰 How much does it cost?
Two charges, and they are separate.
$0.55 when a post is confirmed. If nothing is published, that fee does not fire.
$0.02 for each megabyte the run moves, on any outcome, including a failed one, because the bytes were already moved. chargeNote on the row gives you the figure.
Bytes that cross your own servers are never billed per megabyte, so putting them into proxyConfiguration removes that charge on success and failure alike. Use a connection in the same country as the account your cookies come from: a mismatch is the usual reason TikTok puts a check in front of the session.
A demo run uploads nothing and moves no video bytes, so neither charge fires. And if the run's maximum cost cannot cover the upload fee, it stops before moving a single byte and charges nothing.
💡 What people use it for
- Publishing finished clips from a pipeline, so the last step is not somebody opening the app.
- Posting the same cut to several accounts, one run per account.
- Putting a video up as
privatefirst, checking it, then making it public by hand. - Wiring a post into a workflow that already made the file, in n8n, Make or a script.
🚧 What it does not do
- It cannot get past a challenge. If TikTok puts a check in front of the session, the run says so
and stops. Cookies from a country matching the connection make that less likely.
- One video, one account, one run. No queue and no scheduling of its own. Apify's scheduler can
run it repeatedly.
- It does not host your video. You supply a link that downloads without a login.
- No editing. No trimming, resizing, music, covers or stickers. The file goes up as it is.
videoIdandvideoUrlare not guaranteed. They can benullor name an older post.- Cookies expire. A session that worked last week can fail today, and the row will say so.
- A submitted post with no confirmation reads as a failure even though the video may be live.
- The upload fee only fires on a confirmed post, but the bytes are billed either way.
🧭 Which uploader do you need?
| If you want | Use |
|---|---|
| To post a video to TikTok from a link | This one |
| To post a Reel to Instagram | Instagram Reel Uploader Pro |
| To publish to YouTube | YouTube Uploader Pro |
| To post from Claude, ChatGPT or n8n | Social Media Uploader Pro |
| To pull a TikTok video down instead | TikTok Video Downloader |
❓ Questions people ask
Why does it need my cookies? TikTok has no public posting route for a normal account, so a signed-in session is the only way in, and that session is yours.
Which cookie field do I fill in? The whole-list export in cookies. Leave sessionid and sid_tt empty when you use it, because a filled sessionid wins over the jar.
Can I try it without posting anything? Yes. Run it with the cookie fields empty for the demo row.
Can I schedule daily posts? Use Apify's scheduler, one run per post.
Why was I billed on a run that failed? The bytes had already moved. The $0.55 upload fee is not charged in that case.
Is automating posts allowed? TikTok's terms apply to you and your account, and automation carries real risk to it. Post your own content, keep the volume sane, and treat the risk as yours.
🆘 If something breaks
Open the Issues tab on the actor page. Send the run ID and the error sentence from the row.