Instagram Reel Uploader - Auto-Post Reels From URL avatar

Instagram Reel Uploader - Auto-Post Reels From URL

Deprecated

Pricing

Pay per event

Go to Apify Store
Instagram Reel Uploader - Auto-Post Reels From URL

Instagram Reel Uploader - Auto-Post Reels From URL

Deprecated

Turn a finished MP4 into a live Instagram Reel automatically. Give it a video URL, a caption with hashtags and your own exported session cookies, and it drives the real Instagram composer end to end. Your login stays yours. Run it with no cookies first for a labeled sample and zero upload.

Pricing

Pay per event

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

3 days ago

Last modified

Share

Instagram Reel Uploader

Posts a Reel to your own Instagram account from a URL. You give it the video, a caption, and your own exported session cookies, and it drives a headless browser through Instagram's web composer to publish the Reel. It's built to be the publish step of a faceless-content or scheduling pipeline.

How it works

It downloads your video, launches a headless Chromium routed through your proxy, loads your exported Instagram cookies into the session, opens the Create composer on instagram.com, sets the file, advances through the crop and edit steps, writes the caption, and shares. There is no shared login. You bring your own session each run, exported from a browser where you're already signed in.

Try it with no login (demo / sample mode)

Run it with no cookies (or set demoMode: true) and it returns one clearly-labeled sample row and uploads nothing — a try-before-you-export preview. The sample row carries _demo: true and a _notice explaining that no credentials were supplied. To post for real, supply your own session (below).

Input

FieldRequiredNotes
videoUrlfor real postsPublic https direct URL to the .mp4 to post as a Reel. You host it. Max 600 MB.
cookiesfor real postsYour own Instagram session, exported as Cookie-Editor JSON from a browser where you're logged in. Must include sessionid and ds_user_id. Stored as a secret.
captionnoThe Reel caption. Put your #hashtags here.
proxyConfigurationnoLeave on the default. The Actor supplies (and pays for) its own residential connection, because Instagram checkpoints datacenter addresses; the proxy group you pick is ignored. Your own servers in proxyUrls are used verbatim, and unticking "Use Apify Proxy" connects directly.
demoModenoReturn a labeled sample row without uploading. Auto-enabled when no cookies are given.

How to export your Instagram cookies

  1. Log in to instagram.com in Chrome/Edge.
  2. Install the Cookie-Editor extension and open it on the Instagram tab.
  3. Click Export → Export as JSON (this copies a cookies array including sessionid and ds_user_id).
  4. Paste that JSON into the cookies field. It is automating your own logged-in session — nothing is shared.

Output

Exactly one dataset record per run, always.

  • Demo run: { _demo: true, _sample: true, _notice, ok: true, demo: true, charged: false, reelUrl: ".../reel/SAMPLE/", ... } — nothing uploaded.
  • Real success: { ok: true, charged: true, platform, caption, posted: true, confirmed: true, reelUrl, finalUrl }confirmed is only true after Instagram's "has been shared" confirmation is actually seen, and reelUrl is the real permalink when it can be read.
  • Anything else: { ok: false, charged: false, errorCode, error, reason, hint } — a diagnostic row naming what went wrong and what to do about it, plus a debug screenshot + page HTML saved in the run's key-value store and named in the row.

A run that cannot post does not fail — it returns the diagnostic row and ends as SUCCEEDED. A failed run and a succeeded run cost you the same platform start fee, so crashing would charge you the same and tell you less. The instagram-upload charge fires only on the confirmed-success path.

Error codes

errorCodeWhat happenedWhat to do
BAD_INPUTvideoUrl or cookies was missing or unusable.Fix the field named in error.
VIDEO_UNAVAILABLEThe videoUrl did not download.Open it in a private window; it must return the .mp4 directly.
SESSION_INVALIDThe cookies are expired or were exported logged out.Re-export with Cookie-Editor while signed in.
SESSION_CHECKPOINTInstagram put the account behind a security check.Clear it in a normal browser, then re-export the cookies.
UPLOAD_REJECTEDInstagram refused the post (action block, rate limit, file rejected).Wait a few hours, post less often, use a residential proxy in your country.
UPLOAD_UNCONFIRMEDShare was clicked but no confirmation appeared.Check the account before retrying — a blind retry can double-post.
LAYOUT_CHANGEDInstagram's composer no longer matches the steps this Actor drives.Nothing on your side; report the run so the selectors can be updated.
NETWORKA network or proxy error stopped the run reaching Instagram.Retry, or switch proxy country.
TIMED_OUTThe run hit its time budget and stopped itself.Check the account, then retry with a longer timeout.
INTERNALUnexpected error.Report the run id with the saved screenshot.

Method & reliability

This is a best-effort browser-automation method: it drives Instagram's real web "Create" composer (there is no official Reels upload API for personal accounts). It checks your session is logged in before downloading your video, selects Reel where offered, advances through the crop/cover/edit steps with explicit waits and several fallback selectors per step, verifies the file registered and the caption took, then watches for either Instagram's "has been shared" confirmation or an explicit refusal for up to 3 minutes.

Because it depends on Instagram's live UI, a layout change on their side can break a step. When that happens you get a LAYOUT_CHANGED row and a screenshot, not a silent wrong result and not a charge.

Example

{
"videoUrl": "https://cdn.example.com/reel.mp4",
"caption": "behind the scenes #reels",
"cookies": "[{\"name\":\"sessionid\",\"value\":\"...\",\"domain\":\".instagram.com\",\"path\":\"/\"}]"
}

Pricing

$0.35 per successful upload, plus a $0.000025 run-start fee — the start fee is billed once per GB of run memory, so at the default 2 GB a run start costs $0.00005.

This price takes effect on 31 August 2026. Runs before that date still bill the previous $0.10 per successful upload; runs from 31 August 2026 onward bill $0.35. The run-start fee is unchanged.

The upload charge fires only after Instagram confirms the Reel is live. Any run that ends in ok: false — bad input, dead cookies, a checkpoint, an action block, an unconfirmed share — pays the start fee and nothing else. Demo/sample runs are not charged for an upload either.

Proxy bandwidth is not billed to you. The Actor routes through its own residential connection and absorbs that cost. That absorbed bandwidth is what the 31 August 2026 rate covers, and it is also why a video sent over it is capped at 100 MB — a Reel is normally well under that. If you need the full 600 MB allowance, put your own proxy servers in proxyConfiguration.proxyUrls; they are used exactly as given and the cap lifts.

FAQ

Is there an official Instagram Reels upload API? No. Meta's Content Publishing API only covers Instagram Business and Creator accounts connected to a Facebook Page, and it needs an app review. This Actor drives the normal instagram.com web composer with your own logged-in session instead, so it works with a personal account.

Do you get my Instagram password? No. You paste session cookies, not credentials, and the field is stored as a secret. Log out of that Instagram session to revoke them.

Why did my run come back with SESSION_INVALID? Instagram session cookies expire, and they are also invalidated when you log out or change your password. Re-export them with Cookie-Editor from a tab where you are signed in.

Will I be charged if the Reel does not post? No. The instagram-upload event ($0.10 until 31 August 2026, $0.35 from that date) fires only after Instagram's own "has been shared" confirmation. Everything else returns an uncharged diagnostic row.

Can it post to a Story, a carousel, or a feed photo? No. Reels only, one video per run.

Why does it need a proxy? Instagram treats a datacenter address logging into your account as suspicious, so the Actor routes through a residential connection by default and pays for that bandwidth itself. You do not need to configure anything. Choosing a different proxy group in the input has no effect; supplying your own servers in proxyUrls, or turning the proxy off entirely, does.

What this does not do

  • It does not create or find your video. You host the .mp4 and pass a public https URL.
  • It does not schedule. One run posts one Reel, immediately.
  • It does not manage multiple accounts in one run. One session, one Reel.
  • It cannot clear a checkpoint or an action block for you. Those need a real browser on the account.
  • It does not guarantee delivery when Instagram changes its composer. That is reported as LAYOUT_CHANGED with a screenshot, never as a silent success.

Notes

This automates your logged-in Instagram session, which Meta's terms discourage, so run it on your own account at your own discretion. Automating a session from a new device/IP is a pattern Instagram may flag with a temporary action-block or checkpoint — a residential proxy in your own country reduces (but does not eliminate) this. Cookies expire, so re-export them when you see a "not logged in" error. Because it drives Instagram's actual web UI, a layout change on their side can break a selector and need an update — failures are surfaced clearly with a saved screenshot, never as a silent success.