Instagram Reel Uploader Pro - Auto-Post Reels
Pricing
from $400.00 / 1,000 reel uploadeds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
18 hours ago
Last modified
Categories
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.
| Input | A public .mp4 URL, a caption, and your own Instagram cookies |
| Output | One row per run, with the confirmation and the link |
| Ceiling | One Reel per run, video up to 600 MB |
| Account needed | Yours, 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"}
| Field | Default | What it is |
|---|---|---|
videoUrl | none | A public https link that returns the .mp4 directly. You host it. Up to 600 MB. |
caption | none | The Reel caption. Put your #hashtags in here. |
sessionid | none | Your Instagram sessionid cookie value. A secret field. |
ds_user_id | none | Your ds_user_id cookie, from the same list. It is the run of digits at the start of sessionid. |
cookies | none | Instead of the two fields above: a Cookie-Editor JSON export or a raw Cookie: header. A secret field. |
proxyConfiguration | none, the form starts on Apify's default | Put 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. |
demoMode | false | Return 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."}
| Field | What it is |
|---|---|
confirmed | The one that matters. true only after Instagram's own "has been shared" confirmation was seen. |
posted | Share was clicked. Not the same as confirmed. |
reelUrl | The 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. |
chargeStatus | not-charged, pending or settled. A success row is written before the charge fires, so it says pending and charged is null. |
chargeNote | What you are being charged and why, in plain words. |
bytesMoved | On a diagnostic row: what came in, what crossed this actor's connection, and how many megabytes of that are billable. |
errorCode, error, hint | What 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
| Row | How to spot it | Billed |
|---|---|---|
| A confirmed post | ok: true and confirmed: true | the flat fee, plus megabytes moved |
| The sample row | _demo: true and _sample: true | neither the flat fee nor megabytes |
| A diagnostic | ok: false and an errorCode | megabytes 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.
| Code | What happened | What to do |
|---|---|---|
BAD_INPUT | A field was missing or unusable, or the file will not fit your run budget. | Fix the field named in error, or raise maxTotalChargeUsd. |
VIDEO_UNAVAILABLE | The 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_INVALID | The cookies are expired or were exported while signed out. | Export them again while signed in. |
SESSION_CHECKPOINT | Instagram put a security check on the account. | Clear it in a normal browser, then export the cookies again. |
UPLOAD_REJECTED | Instagram refused the post. | Wait a few hours and post less often. |
UPLOAD_UNCONFIRMED | Share was clicked and no confirmation appeared. | Check the account before retrying. A blind retry can double-post. |
LAYOUT_CHANGED | The composer no longer matches the steps this actor drives. | Nothing on your side. Send us the run ID. |
NETWORK | A connection problem stopped the run reaching Instagram. | Retry. |
TIMED_OUT | The run hit its time budget and stopped itself. | Check the account, then retry with a longer timeout. |
ABORTED | You aborted the run before Instagram confirmed anything. | Check the account in case Share had already landed. |
INTERNAL | Something 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
- Open Instagram Reel Uploader Pro and click Try for free. Run it once empty to see the sample row.
- Put a direct link to your
.mp4in Video URL and your text in Caption. - Paste your own
sessionidandds_user_idinto their fields. - Click Start. One Reel goes up per run.
- Read the row:
confirmed: truemeans Instagram acknowledged it.
💰 How much does it cost?
Two charges, flat on every Apify plan, no volume tiers.
| Charge | Amount | When |
|---|---|---|
instagram-upload | $0.40 | Once, and only after Instagram confirms the Reel is live. |
video-megabyte | $0.02 per megabyte | For 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_INVALIDand export them again. reelUrlis not always your own Reel. Trustconfirmed, 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_UNCONFIRMEDrow. Look at the account first.
🧭 Which uploader do you need?
| If you want | Use |
|---|---|
| Post a Reel to Instagram | This one |
| Post to several platforms from one tool | Social Media Uploader Pro |
| Post to TikTok | TikTok Video Uploader Pro |
| Post a Short to YouTube | YouTube Shorts Uploader Pro |
| Post a Reel to Facebook | Facebook Reels Uploader |
| Read reels instead of posting them | Instagram 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.


