Facebook Reels Uploader
Pricing
from $350.00 / 1,000 reel published (browser)s
Facebook Reels Uploader
Publish a Reel to your Facebook Page or profile from a video URL. A Page token uses Meta's official Graph API. No browser is needed. For a profile you must use your own cookies. You pay the publish fee only when Facebook confirms the post. Bandwidth is billed per megabyte either way.
Pricing
from $350.00 / 1,000 reel published (browser)s
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
Facebook Reels Uploader: publish a Reel to your Page or profile from a video URL
Give it a public link to your MP4 and your own Facebook credentials, and it posts the Reel, waits until Facebook actually shows it, and hands back the reel id and its link.
The credentials are the part to settle first, because there is no way around them. Publishing to a Page wants a Page access token and goes through Meta's official API, which is the route to use if you can. Publishing to a personal profile is only possible with your own Facebook cookies, because Meta's API publishes Reels to Pages and nothing else, whatever token you hold. Run it with no credentials at all and you get a labelled sample row: nothing is uploaded, and no publish fee and no megabytes are charged.
| Input | A public direct link to your MP4, plus your own token or cookies |
| Output | One row per run, with the reel id and link once Facebook confirms it |
| Ceiling | One reel per run, video up to 500 MB |
| Account needed | Yes, your own: a Page access token, or your Facebook cookies |
| Price | $0.15 per reel through the API, $0.35 through the browser |
🔍 What Facebook Reels Uploader does
Two routes to the same job. Supplying a pageAccessToken picks the first one.
| Route | What it needs | Can publish to | Can schedule or draft | Per reel |
|---|---|---|---|---|
| Graph API | pageAccessToken and pageId | A Page you admin | Yes | $0.15 |
| Browser | Your c_user, xs and datr cookies | A Page, or your own profile | No, immediate only | $0.35 |
On the API route Meta fetches your videoUrl itself, so nothing large moves through the run. When
Meta cannot reach that URL the run downloads the file and pushes the bytes to Meta instead, rather
than failing.
The clip is checked before anything is transferred: 3 seconds or longer (3 to 90 on the API route),
540x960 or larger, 24 to 60 fps, and inside Meta's 16:9 to 9:16 shape band. Vertical 1080x1920,
H.264 with AAC sound, is what Meta documents. Anything outside that is refused with BAD_INPUT
before a byte moves.
A closed composer is not a published reel, and a 200 from Meta is not one either. Both
transcoding and review can reject a video minutes after the upload looked fine. So the run lists
the reels on the target first, publishes, then watches up to three minutes for a reel id that was
not there before. No new id means UPLOAD_UNCONFIRMED and no publish fee, and a list it cannot
read at all stops it instead of publishing blind. On the browser route the caption and the
Instagram toggle are read back first: a wrong caption, or a post to a platform you did not ask for,
is worse than no reel.
📥 What you give it
{"videoUrl": "https://example.com/my-reel.mp4","caption": "Behind the scenes from Tuesday #workshop","target": "page","pageId": "1234567890","pageAccessToken": "<your long-lived Page token>"}
| Field | Default | What it is |
|---|---|---|
videoUrl | none | A public https:// link to the file itself, not to a page that plays it. An S3 link, a CDN link or an Apify key-value store record all work. |
caption | empty | The reel description, hashtags included. Up to 2,200 characters. |
reelTitle | empty | Optional title, up to 255 characters. Separate from the caption and not shown everywhere. |
target | profile | profile or page. A Page needs pageId. |
pageAccessToken | none | A long lived Page token, not a user token, from someone with the CREATE_CONTENT task on the Page. Supplying it switches the run to the API route. |
pageId | none | The Page's numeric id, not its @username. Required for target: page. |
shareMode | now | now, schedule or draft. The last two are API route only, and anything but now is refused up front on the browser route rather than published immediately. |
scheduledPublishTime | none | ISO 8601, for schedule. Meta's window applies: more than 10 minutes out and within 29 days. |
crosspostToInstagram | false | Browser route only. The API has no equivalent and the run says so in the log. |
c_user, xs, datr | none | Your Facebook cookies, for the browser route. Secret fields: never written to the dataset, the store or the log, which reports only a length. |
cookies | none | Or paste the whole facebook.com jar as a Cookie-Editor export or a raw header, instead of the three fields. |
continueOnNonEnglishUi | false | Browser route. Off means a non-English interface stops the run with a clear message rather than guessing which button it is about to click. |
graphApiVersion | v25.0 | Pinned on purpose. Leave it unless Meta retires that version. |
proxyConfiguration | the default | Browser route only. Set its country to where your cookies were exported: a country jump is the single biggest cause of a security check on your account. |
proxyUrls | none | Optional. Your own servers, used exactly as given. There is no per megabyte charge on a run that uses them, and the video ceiling becomes 304 MB instead of 500 MB. |
demoMode | false | Force the labelled sample row even when credentials are filled in. |
📤 What you get back
One row per run. This is a real row from a real run whose cookies had expired, which is the shape you get when nothing was published. The message is cut short here:
{"ok": false,"platform": "facebook","lane": "browser","target": "profile","posted": false,"confirmed": false,"reelId": null,"reelUrl": null,"publishedAt": null,"errorCode": "SESSION_INVALID","error": "SESSION_INVALID: Your Facebook session is not logged in (Facebook redirected to the login page). Cookies are revoked by logging out, by \"Log out of all sessions\", and often by a password change. Re-export c_user, xs and datr from a browser where you are signed in. ...","caption": "billing audit run 2","videoUrl": "https://download.samplelib.com/mp4/sample-5s.mp4","warnings": [],"chargeStatus": "pending","chargeSummaryKey": "CHARGE_SUMMARY.json","debugScreenshot": "SESSION_INVALID.png","debugHtml": "SESSION_INVALID.html"}
| Field | What it is |
|---|---|
ok, posted, confirmed | Whether the run worked, whether it published, and whether Facebook then showed the reel. All three are true on a clean publish. |
reelId, reelUrl, publishedAt | The new reel's id, its link and the time, once confirmed. null otherwise. |
lane, target, pageId | Which route ran, and where it published. |
errorCode, error, warnings | What stopped it, in a code you can branch on and a sentence you can read. |
videoSizeMegabytes, videoMegabytes | The file's size, and the megabyte count the run asked to bill. On a failure row the second is the traffic already moved, not the file size. |
chargeStatus, chargeSummaryKey | The row is written before the charge settles, so treat these as a pointer, not a receipt. |
debugScreenshot, debugHtml | Keys in the run's store holding a picture and the page at the moment it stopped. |
🧾 Reading the output
Three places to look.
| Where | What is in it |
|---|---|
| The dataset | The one result row above. |
CHARGE_SUMMARY.json | The settled figures for the run, which is where to check what was actually billed. |
<CODE>.png and <CODE>.html | A screenshot and the page from the moment a browser run stopped, named after the error code. |
The codes worth knowing:
| Code | What happened |
|---|---|
BAD_INPUT | The clip failed a check, or the input cannot work: a token with target: profile, or schedule on the browser route. Nothing moved. |
SESSION_INVALID | Your cookies are no longer signed in. Re-export them. |
API_TOKEN_INVALID | The Page token was killed by a password change or a permissions change. Mint a new one. |
VIDEO_UNAVAILABLE, OVERSIZED_VIDEO | Your videoUrl would not serve the file, or it is over the ceiling. |
API_PROCESSING_FAILED | Meta took the upload and then rejected it while processing. No publish fee, nothing per megabyte. |
UPLOAD_UNCONFIRMED | No new reel appeared. Check the account before retrying so you do not double post. No publish fee. |
LAYOUT_CHANGED | The reel list could not be read, so the run refused to publish. |
COMPOSER_UNAVAILABLE | Facebook did not offer that account the reel composer. |
LOCALE_UNSUPPORTED | The interface is not in English and continueOnNonEnglishUi is off. |
API_RATE_LIMIT, ACTION_BLOCKED | Meta is holding you off. The message carries its own estimate of when to try again. |
▶️ How to run it
- For a Page, mint the token once. Create an app at developers.facebook.com as the account that
admins the Page, open the Graph API Explorer, add
pages_show_list,pages_read_engagementandpages_manage_posts, generate a token, switch the dropdown from User Token to Page Token, then extend it in the Access Token Debugger.GET /me/accounts?fields=id,name,tasksshould list your Page withCREATE_CONTENT. - For a profile, copy
c_user,xsanddatrfrom DevTools on a signed-infacebook.comtab, under Application, then Cookies. Values exactly as shown,%3Aincluded. - Open Facebook Reels Uploader, paste your
videoUrland caption, fill in the fields for your route. - Click Start, then read
reelUrlon the result row.
💰 How much does it cost?
$0.15 per reel through the API route, $0.35 through the browser route. Flat on every Apify plan. Either way the fee applies only when Facebook confirms the reel is up: a run that fails or cannot be confirmed pays no publish fee.
The browser route also costs $0.02 for each megabyte of video moved through this actor's own
connection, and those megabytes are billed whether the reel landed or not, because the traffic
already happened. Point proxyUrls at your own servers and there is no megabyte charge on that run.
The API route never charges per megabyte: Meta collects the file itself.
A demo run uploads nothing, so it pays no publish fee and nothing per megabyte.
💡 What people use it for
- Posting the day's clip to a Page from a pipeline, without anybody opening Business Suite.
- Scheduling a week of reels in one sitting on the API route, each with its own publish time.
- Publishing to a personal creator profile, which no API token can do.
- Pushing an approved edit straight from storage, by its link.
🚧 What it does not do
- It does not hold your credentials. You pass them per run, and the cookie fields stay out of the dataset, the store and the log.
- No personal profile through the API. Meta publishes Reels to Pages only, so a profile means cookies.
- No scheduling or drafts on the browser route. Anything but publish now is refused up front.
- One video per run. For a batch, run it once per clip.
- Meta allows 30 API reels per Page per 24 hours, which is Meta's published limit, not ours.
- It cannot see a music or rights takedown. A reel can publish cleanly and be muted or blocked minutes later over its audio, and Meta sends no signal for it. The run reports the publish it confirmed and nothing beyond that.
- Reach is not visible either. Whether anyone is shown the reel is outside anything an uploader can tell you.
- No editing, trimming or format conversion. The file you point at is the file that gets posted.
🧭 Which uploader do you need?
| If you want | Use |
|---|---|
| A Reel on a Facebook Page or profile | This one |
| A Reel on Instagram | Instagram Reel Uploader Pro |
| A video on TikTok | TikTok Video Uploader Pro |
| A Short on YouTube | YouTube Uploader Pro |
| To post from Claude, ChatGPT or n8n across platforms | Social Media Uploader Pro |
❓ Questions people ask
Do I need Meta's App Review? No. You admin the app and the Page, so the token you mint for yourself is enough. The setup above is a one-off and takes about ten minutes.
Why is the browser route more expensive? It runs a real session and a real composer, and the video passes through the run. The API route just hands Meta a URL.
What if my run says UPLOAD_UNCONFIRMED? Look at the account first. The reel may well be
there, in which case retrying would post it twice. No publish fee was charged either way.
Can I publish to a Page without cookies? Yes, and you should. The API route is the reliable one.
Is my session safe? The cookie fields are secret and never leave the run. Logging out everywhere, or changing the password, revokes them.
🆘 If something breaks
Open the Issues tab on the actor page. Include the run ID and the errorCode from the result
row. Never paste a cookie value or a token into an issue.


