Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Instagram Reel Uploader Pro icon

Instagram Reel Uploader Pro

Post Reels to Instagram from a public video URL. You get a confirmation and a permalink. The upload fee applies only when the post is confirmed.

53 runs on Apify $0.4 per reel uploaded ($400 / 1,000)
Run this in the cloudRun on Apify →

Developer & Research Tools

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust videoUrl, caption, sessionid (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.4 per reel uploaded = $400 per 1,000

You are charged forWhenPrice
Reel uploadedCharged once per Reel that Instagram 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.4
Video megabyteCharged per megabyte, rounded up, for the bytes a run actually moves, and charged on EVERY outcome, including a run that fails, hits a checkpoint or ends unconfirmed, 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 Instagram composer session, measured across this Actor’s own metered connection. The push of the file up to Instagram cannot be measured reliably, so it is not charged at all. Bytes that never moved are never charged, and the total never goes past the "maxTotalChargeUsd" you set. Runs that use your own proxy servers, or that switch the Apify proxy off, are not charged this. Picking a different proxy group does not remove it: this Actor chooses the connection itself and ignores the group you select.$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

FieldWhat it doesType
videoUrlPublic direct https URL to the video (.mp4) to upload as a Reel. Required for a real post; leave everything empty to get one free labelled sample row instead, which uploads nothing, moves no bandwidth and is charged nothing.string
captionThe Reel caption (include #hashtags here).string
sessionidYour Instagram "sessionid" cookie. In your browser: DevTools > Application > Cookies > https://www.instagram.com, find the row named sessionid and copy its Value column. Paste just the value.string
ds_user_idYour Instagram "ds_user_id" cookie, from the same Cookies list. It is the numeric account id, and it is also the run of digits at the very start of sessionid.string
cookiesOptional. Only needed if you would rather hand over the whole jar than the two fields above: paste a Cookie-Editor JSON export, or a raw "Cookie:" header. Leave blank if you filled in sessionid and ds_user_id.string
demoModeRun without credentials and return one clearly-labeled SAMPLE row without uploading anything. Nothing is downloaded and no connection is opened, so no upload is charged. Also auto-enabled when no cookies are supplied (e.g. a keyless try-it run).boolean

What you get

A structured dataset — each result includes fields like:

okchargedchargeStatusdemoplatformcaptionconfirmedreelUrlfinalUrlerrorCodeerrorhintnote

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

1 ready-to-run use cases

Auto Post Instagram Reels From a Public MP4 URL

Auto post instagram reels: give it an .mp4 link and a caption, it publishes to your own account and returns the permalink. You supply your 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 iconDeveloper & Research Tools

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.

18 use cases

Stack Overflow / Stack Exchange Scraper iconDeveloper & Research Tools

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.

2 use cases

Package Registry Scraper (npm + PyPI) iconDeveloper & Research Tools

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.

2 use cases

arXiv Scraper iconDeveloper & Research Tools

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.

2 use cases

OpenAlex Scholarly Works Scraper iconDeveloper & Research Tools

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.

2 use cases

Crossref Scholarly Works Scraper iconDeveloper & Research Tools

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.

2 use cases

See all Developer & Research Tools →

Instagram Reel Uploader Pro: post a Reel from a video URL, on your own account

Give it a public link to an .mp4, a caption, and your own Instagram session cookies, and it posts the Reel to your account. You get back one row saying whether Instagram confirmed the post, with the permalink when it can be read.

Read that middle part again, because it is the whole shape of this actor. It posts as you. No account is provided here. You export your own session from a browser where you are already signed in, and it is used for that run and nothing else. To see what it does before handing over anything, run it with no cookies and you get a labelled sample row instead.

InputA public .mp4 URL, a caption, and your own Instagram cookies
OutputOne row per run, with the confirmation and the link
CeilingOne Reel per run, video up to 600 MB
Account neededYours, as exported session cookies
Price$0.40 per confirmed Reel, plus $0.02 per megabyte moved

🔍 What Instagram Reel Uploader Pro does

Instagram publishes no upload API for personal accounts, so this drives the real Create composer on instagram.com: it checks your session is signed in, fetches your video, sets the file, walks the crop and edit steps, writes the caption, shares, then waits for Instagram's own confirmation before calling it posted. Nothing is reported as published until that confirmation appears.

The session check happens before the video is fetched, so a dead cookie costs you a quick check rather than a download. A file your run budget cannot cover is turned away on the host's own size header, before a single byte moves.

This is a best-effort method against a live web interface, which is the honest description. When Instagram changes the composer you get a LAYOUT_CHANGED row and a screenshot, not a silent wrong answer.

📥 What you give it

{
  "videoUrl": "https://cdn.example.com/reel.mp4",
  "caption": "behind the scenes #reels"
}
FieldDefaultWhat it is
videoUrlnoneA public https link that returns the .mp4 directly. You host it. Up to 600 MB.
captionnoneThe Reel caption. Put your #hashtags in here.
sessionidnoneYour Instagram sessionid cookie value. A secret field.
ds_user_idnoneYour ds_user_id cookie, from the same list. It is the run of digits at the start of sessionid.
cookiesnoneInstead of the two fields above: a Cookie-Editor JSON export or a raw Cookie: header. A secret field.
proxyConfigurationnone, the form starts on Apify's defaultPut servers of your own in proxyUrls inside it and the per-megabyte charge does not apply, because those bytes cross your connection rather than this one.
demoModefalseReturn a labelled sample row and upload nothing. It switches itself on when no cookies are supplied.

Fill in both sessionid and ds_user_id, or use cookies on its own. Filling in sessionid alone and leaving the rest in cookies is refused with BAD_INPUT.

To export them: sign in to instagram.com, open DevTools, then Application, Cookies, https://www.instagram.com, and copy the sessionid and ds_user_id values. Both are secret fields, used for that run's requests, and never written to the dataset or the log.

📤 What you get back

One row per run, except in the case at the end of the next section. A real refusal row from a real run, where the budget could not cover the file:

{
  "ok": false,
  "charged": false,
  "errorCode": "BAD_INPUT",
  "error": "This video needs more bandwidth than the budget you set for this run. Your \"maxTotalChargeUsd\" leaves room for 8 MB of the per-megabyte video charge that pays for pushing the file to Instagram, and this file is 21 MB. ...",
  "reason": "The input was invalid or incomplete. No Reel was published, so no upload fee was charged.",
  "platform": "instagram",
  "posted": false,
  "confirmed": false,
  "reelUrl": null,
  "finalUrl": null,
  "diagnosedAt": "2026-08-25T13:39:04.389Z",
  "caption": "attack-verify-size-refusal",
  "videoUrl": "https://download.samplelib.com/mp4/sample-30s.mp4",
  "chargeStatus": "not-charged",
  "chargeNote": "No Reel was published, so no flat \"instagram-upload\" fee was charged, and this run moved no measured megabytes."
}
FieldWhat it is
confirmedThe one that matters. true only after Instagram's own "has been shared" confirmation was seen.
postedShare was clicked. Not the same as confirmed.
reelUrlThe permalink when it can be read off the page. It is taken from the feed after posting, so it is not always your own Reel. Trust confirmed, then check the account for the link.
chargeStatusnot-charged, pending or settled. A success row is written before the charge fires, so it says pending and charged is null.
chargeNoteWhat you are being charged and why, in plain words.
bytesMovedOn a diagnostic row: what came in, what crossed this actor's connection, and how many megabytes of that are billable.
errorCode, error, hintWhat went wrong and what to do about it.

When a megabyte charge was made, the settled figures land in CHARGE_SUMMARY.json in the run's key-value store, alongside a screenshot and the page HTML from the failure point.

🧾 Reading the output

RowHow to spot itBilled
A confirmed postok: true and confirmed: truethe flat fee, plus megabytes moved
The sample row_demo: true and _sample: trueneither the flat fee nor megabytes
A diagnosticok: false and an errorCodemegabytes moved only

A run that cannot post does not fail. It writes the diagnostic row and ends as succeeded, because a red run tells you nothing about why.

CodeWhat happenedWhat to do
BAD_INPUTA field was missing or unusable, or the file will not fit your run budget.Fix the field named in error, or raise maxTotalChargeUsd.
VIDEO_UNAVAILABLEThe videoUrl did not download, or a slow host ran out of time.Open the link in a private window. It must return the .mp4 itself.
SESSION_INVALIDThe cookies are expired or were exported while signed out.Export them again while signed in.
SESSION_CHECKPOINTInstagram put a security check on the account.Clear it in a normal browser, then export the cookies again.
UPLOAD_REJECTEDInstagram refused the post.Wait a few hours and post less often.
UPLOAD_UNCONFIRMEDShare was clicked and no confirmation appeared.Check the account before retrying. A blind retry can double-post.
LAYOUT_CHANGEDThe composer no longer matches the steps this actor drives.Nothing on your side. Send us the run ID.
NETWORKA connection problem stopped the run reaching Instagram.Retry.
TIMED_OUTThe run hit its time budget and stopped itself.Check the account, then retry with a longer timeout.
ABORTEDYou aborted the run before Instagram confirmed anything.Check the account in case Share had already landed.
INTERNALSomething unexpected.Send us the run ID and the saved screenshot.

One run can write two rows: an ABORTED or TIMED_OUT row, then a _correction: true row when the Reel turned out to be live after all. The correction is the truth.

▶️ How to run it

1. Open Instagram Reel Uploader Pro and click Try for free. Run it once empty to see the sample row. 2. Put a direct link to your .mp4 in Video URL and your text in Caption. 3. Paste your own sessionid and ds_user_id into their fields. 4. Click Start. One Reel goes up per run. 5. Read the row: confirmed: true means Instagram acknowledged it.

💰 How much does it cost?

Two charges, flat on every Apify plan, no volume tiers.

ChargeAmountWhen
instagram-upload$0.40Once, and only after Instagram confirms the Reel is live.
video-megabyte$0.02 per megabyteFor the megabytes that actually crossed this actor's connection, on any outcome.

The second one is the part to read twice. Megabytes moved are billed whether or not the Reel goes live, because they were spent before anyone knew the answer. What counts is measured, never assumed: a transfer cut short at 4 MB is billed 4 MB, not the file's declared size, and an unmeasurable leg is billed as zero rather than estimated.

Put your own servers in proxyUrls and the per-megabyte charge does not apply at all, since none of those bytes cross this actor's connection. A demo run is charged neither the flat fee nor any megabytes.

💡 What people use it for

  • The publish step at the end of a faceless-content pipeline, once the video is rendered and

sitting on a CDN.

  • Posting the same cut to several platforms from one workflow, one actor per platform.
  • Scheduling from outside Instagram, by running this on a timer with a fresh video URL.
  • Keeping publishing off a laptop, so a 6am post does not need anyone awake.

🚧 What it does not do

  • Reels only, one per run. No photos, carousels, stories or feed videos.
  • No scheduling of its own. Use Apify's scheduler for that.
  • No account is provided. Without your cookies, all you get is the sample row.
  • Cookies expire. You get SESSION_INVALID and export them again.
  • reelUrl is not always your own Reel. Trust confirmed, take the link from the account.
  • Megabytes moved are billed on a failed run too. The flat fee is not.
  • A layout change on Instagram's side can break a step. You get a labelled row and a screenshot.
  • No editing, cover selection, tagging or music picker. Video, caption, post.
  • Do not blind-retry an UPLOAD_UNCONFIRMED row. Look at the account first.

🧭 Which uploader do you need?

If you wantUse
Post a Reel to InstagramThis one
Post to several platforms from one toolSocial Media Uploader Pro
Post to TikTokTikTok Video Uploader Pro
Post a Short to YouTubeYouTube Shorts Uploader Pro
Post a Reel to FacebookFacebook Reels Uploader
Read reels instead of posting themInstagram Reel Scraper

❓ Questions people ask

Do I have to give it my Instagram password? No. You export the session cookies from a browser you are already signed in to, and they go into secret fields.

Can I try it without that? Yes. Run it with nothing filled in and you get a labelled sample row. Nothing is uploaded and no bytes move.

Will it post twice if I run it again? It can, if the first run posted and could not confirm it. Hence the warning on UPLOAD_UNCONFIRMED.

Why was I charged for a run that did not post? For the megabytes it moved before Instagram refused. The $0.40 fee was not charged.

How do I avoid the per-megabyte charge? Put your own servers in proxyUrls.

What size of video can I send? Up to 600 MB, as a direct https link to the file itself rather than a page that plays it.

Is this allowed? You are automating your own account, with your own session, posting your own content. Instagram's terms govern what you may automate, so read them and post at a human rate. We are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the run ID and the errorCode from your row, and never your cookies. The screenshot and page HTML saved in the run's key-value store are usually enough to see what happened.