Instagram Reel Uploader Pro - Auto-Post Reels avatar

Instagram Reel Uploader Pro - Auto-Post Reels

Pricing

from $400.00 / 1,000 reel uploadeds

Go to Apify Store
Instagram Reel Uploader Pro - Auto-Post Reels

Instagram Reel Uploader Pro - Auto-Post Reels

Post a Reel to Instagram from any public video URL. You get the caption, a confirmation and a permalink. The upload fee applies only when the post is confirmed. Bytes moved are billed per megabyte, even if the upload fails. Your own proxy is never billed per MB.

Pricing

from $400.00 / 1,000 reel uploadeds

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

18 hours ago

Last modified

Share

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": "Nothing was charged for this run beyond the platform's own start fee: no Reel was published, so no flat \"instagram-upload\" fee, 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.