s4l.ai / guide

Auto posting on Facebook is one HTTP request. Every scheduler is wrapping it.

Most of the pages you can find on this question are paid SaaS review listicles. Underneath every one of those tools is the same three-line Graph API call you can run yourself in 30 lines of Python, or schedule for free in Meta Business Suite Planner. This page is the actual call, the four honest paths, and a small side note on why S4L runs this exact API shape for Instagram and deliberately doesn't ship the Facebook variant.

direct answer (verified 2026-05-09)

POST graph.facebook.com/v22.0/{PAGE_ID}/feed

Body: message=…&access_token=…. Required scope on the Page access token: pages_manage_posts. For most teams the cleanest path is Meta Business Suite Planner (free, native, schedules 20 min to 75 days ahead). Buffer, Hootsuite, Publer, Social Champ, NapoleonCat, and Blog2Social are paid wrappers around the same call. Reference: Graph API v22.0 page/feed docs.

M
Matthew Diakonov
9 min read
4.9from 31
Graph API v22.0 verified on developers.facebook.com (2026-05-09)
Meta Business Suite Planner: 20 min to 75 days scheduling, native
Required scope: pages_manage_posts (Page access token, not User)
S4L lines targeting graph.facebook.com: 0 (by design)
graph.facebook.com/v22.0/{page-id}/feedRequired scope: pages_manage_postsMeta Business Suite Planner: 20 minutes to 75 days aheadPage access token, never User token, for /feedscheduled_publish_time = unix timestamppublished=false to scheduleBuffer / Hootsuite / Publer wrap this callS4L lines targeting graph.facebook.com: 0

The four real paths

Pages of advice on auto-posting on Facebook collapse into four actual choices. The marketing copy obscures it; the mechanics don't.

1. Meta Business Suite Planner (free, native)

Open business.facebook.com, switch to your Page, click Planner, click Schedule Post. Pick a date 20 minutes to 75 days out. Meta calls its own /{page-id}/feed endpoint server-side. Zero third-party tooling. For 95% of small businesses with one Page, this is the right answer and stops here.

2. SaaS scheduler

Buffer, Hootsuite, Publer, Social Champ, NapoleonCat, Blog2Social. You connect your Page once via OAuth (which mints a Page access token with pages_manage_posts), they store it, and their cron fires the same POST /{page-id}/feed on your behalf. Worth paying for if you run 6+ Pages, multiple platforms, or want analytics + approvals.

3. Roll your own with the Graph API

If you can write 30 lines of Python, the Graph API path is free and durable. You need a Facebook App, Page access token with pages_manage_posts, and one POST per scheduled post. Same approach S4L uses for the Instagram side, just with facebook in the hostname instead of instagram.

4. Don't

If you are a developer-tool founder, an indie hacker, or an OSS maintainer, scheduling Facebook Page posts probably is not your highest-leverage hour. Reddit threads in your niche subreddit and replies under high-velocity Twitter posts return better signal per minute. This is why S4L runs Reddit and Twitter cycles and skipped Facebook on purpose.

Edge case: Facebook Groups

Group posting via the Graph API is restricted. The /{group-id}/feed endpoint requires manage permissions on a Group app, and Meta has tightened access since 2018 because Groups are designed for community discussion, not broadcasting. Most Group autoposters on the market are unofficial Chrome extensions driving the DOM, with the same fragility issues we cover in the Marketplace guide.

The one call, in full

This is the call Meta Business Suite Planner makes when its cron fires your scheduled post. It is the call Buffer makes from its workers. It is the call Hootsuite makes. It is the call you would make from a 30-line Python script if you wanted to skip the subscription. There is one endpoint, one method, one required scope. The marketing language around "Facebook automation" distorts the shape of a very small surface.

page-feed.sh — bash
# The one API call every Facebook scheduler wraps.
# Meta Graph API v22.0, current as of May 2026.
# Docs: developers.facebook.com/docs/graph-api/reference/v22.0/page/feed

GRAPH = "graph.facebook.com/v22.0"   # served over https

curl -X POST "$GRAPH/$PAGE_ID/feed" \
     -d "message=Hello from a script" \
     -d "access_token=$PAGE_ACCESS_TOKEN"

# Required:
#   - PAGE_ID: numeric ID of the Page (not the username)
#   - PAGE_ACCESS_TOKEN: Page-scoped token with pages_manage_posts,
#                        pages_read_engagement, pages_show_list
#
# Optional:
#   - link=<your-url>            attach a URL preview
#   - published=false            create as a draft (then schedule via UI)
#   - scheduled_publish_time=... unix timestamp, requires published=false
#
# Response:
#   {"id": "<page-id>_<post-id>"}
#
# That's the full surface. Buffer, Hootsuite, Publer, Social Champ,
# NapoleonCat, Blog2Social, and Meta Business Suite Planner are all
# scheduling N copies of this exact request and storing the access
# token for you.

Pick your path in 30 seconds

Read down the four rows. Stop at the first one that describes you. That is your answer; the rest of this page is just the why.

  1. 1

    1. You run one Page for one business

    Use Meta Business Suite Planner. It's free, native, and you don't trade an OAuth token to a third party. Schedule from 20 minutes to 75 days out. Skip everything else.

  2. 2

    2. You run multiple Pages or multiple platforms

    Pick a SaaS scheduler. Buffer is the cheapest serious option, Hootsuite the most full-featured, Publer the strongest free tier. They all wrap /{page-id}/feed under the hood. Pick on UX and price, not capability.

  3. 3

    3. You're an engineer who wants to own the pipeline

    Spend a Saturday with the Graph API docs. Get a Facebook App, a Page access token, write 30 lines of Python with urllib. You'll save the SaaS subscription and own your token rotation. Same shape as S4L's mixer/post_to_ig.py file, swap the hostname.

  4. 4

    4. You're a dev-tool founder under-resourced on Reddit and Twitter

    Don't auto-post to Facebook. Spend the same hour writing one good Reddit comment in a high-velocity thread or one good Twitter reply in your niche. The conversation surfaces compound; a Page post evaporates in 24 hours.

Meta Business Suite Planner vs. paid SaaS scheduler

The biggest gap in the existing playbooks on this topic is that most don't lead with the free native answer. For one Page on one Facebook account, you do not need anything else. The paid SaaS earns its fee when you are running multiple Pages, multiple platforms, or a team.

Native, free, schedules 20 min to 75 days ahead. You log into business.facebook.com, switch to the Page, click Planner, click Create Post, pick a future time, click Schedule. Meta runs the cron. Meta makes the API call. You do not hand a Page access token to a third party.

  • Free for any number of Pages
  • No third-party OAuth, your token never leaves Meta
  • Schedule horizon: 20 minutes to 75 days
  • Single platform (Facebook + linked Instagram)
  • No team approvals, no cross-platform queue

The Instagram pipeline is the Facebook pipeline with one line different

S4L runs its own Instagram autoposter against the Graph API. The file is mixer/post_to_ig.py in the open repo. Line 66 declares the API base. To turn the file into a Facebook Pages autoposter, exactly one line of code changes. We did not make that change. The reason is at the bottom of this section.

mixer/post_to_ig.py — line 66
# /Users/<you>/social-autoposter/mixer/post_to_ig.py  (line 66)
#
# S4L's Instagram pipeline. The Graph API hostname is the only line
# that changes between IG and Facebook Pages; the request shape, the
# access-token model, and the version (v22.0) are identical.

GRAPH = "graph.instagram.com/v22.0"   # served over https

# To turn this into a Facebook Pages auto-poster, swap that line to:
#
#   GRAPH = "graph.facebook.com/v22.0"
#
# and call POST /{page-id}/feed instead of POST /{user-id}/media.
# Pages don't need the container-poll-publish dance Reels need; one
# POST is the whole post.
#
# We didn't ship that variant. Not because it would be hard.
# Because Facebook Pages aren't where dev-tool conversations happen.
0HTTP call to publish a Page post
0Graph API version (v22.0) as of May 2026
0max days ahead Meta Planner schedules
0S4L lines targeting graph.facebook.com

Why S4L runs the IG variant and not the Facebook one

S4L is built around conversation-style engagement. The five platforms in the PLATFORMS array on bin/server.js line 45 are all places where the unit of work is a reply inside a live thread, ranked by velocity, drafted uniquely per post. The Instagram pipeline is an outlier: it's one-way creator content (Reels rendered out of Remotion, posted on a daily cadence), not engagement.

Facebook Pages are the same shape as the Instagram side: broadcast to followers, one author, no thread-level conversation pattern. Technically it would slot in next to the Instagram pipeline. But the people who buy S4L (developer-tool founders, indie hackers, small OSS teams) don't convert from Facebook Page posts. Their buyers live on Reddit and Twitter. So we built and shipped the Reddit and Twitter loops, kept the Instagram loop narrow to our own creator content, and skipped Facebook.

If you are someone whose buyers do live on Facebook Pages (local services, B2C with a Boomer-skewed audience, news publishers, e-commerce with a Marketplace tail), Meta Business Suite Planner is the right tool. We will not pretend our product is.

One

Working as advertised, Buffer, Hootsuite, Publer, and Meta Business Suite all schedule the same POST against graph.facebook.com/v22.0/{page-id}/feed. The product they sell is the wrapper, not the call.

S4L design note

What S4L actually runs

The 36 launchd-managed jobs in the repo all target one of the entries below. Facebook is not on this list, and the only mention of facebook in the repo is a single regex pattern matching the facebookexternalhit crawler user-agent (used to avoid double-counting link clicks).

  • 01Reddit
  • 02Twitter
  • 03MoltBook
  • 04GitHub
  • 05Instagram (one-way render-and-post)

What the SaaS scheduler category looks like

Roughly the top results when you search this question. All of them are wrapping POST /{page-id}/feed. They differentiate on UX, multi-platform fan-out, team features, and analytics, not on the API surface they touch.

Meta Business Suite PlannerBufferHootsuitePublerSocial ChampBlog2SocialNapoleonCatSocialBeePostplannerSprout Social

Want a Reddit and Twitter autoposter, not a Facebook one?

30 minutes on whether S4L's Reddit + Twitter engagement loop fits your dev tool. We will tell you straight if it does not.

Frequently asked questions

What is the simplest free way to auto-post to a Facebook Page?

Meta Business Suite Planner. Open business.facebook.com, switch to your Page, click Planner in the left rail, click Create Post, write the post, click the small calendar icon next to Publish, pick a future time, click Schedule. The post will fire from Meta's own infrastructure. There is no third-party tool, no OAuth handshake to a SaaS, no monthly fee. You can schedule from 20 minutes to 75 days into the future. For one Page running one business, this is the answer and you can stop reading.

What HTTP call do all the schedulers actually make?

POST graph.facebook.com/v22.0/{PAGE_ID}/feed (over https) with form-encoded body 'message=...&access_token=...'. The token must be a Page access token (not a User token), minted from a Facebook App that has been granted pages_manage_posts, pages_read_engagement, and pages_show_list. The response is JSON: {"id": "<page-id>_<post-id>"}. To schedule for later, add 'published=false' and 'scheduled_publish_time=<unix-ts>'. That is the whole API surface for publishing a text or link post. Image and video posts go through the /{PAGE_ID}/photos and /{PAGE_ID}/videos endpoints with the same auth shape.

Do I need to deal with appsecret_proof on the Facebook side?

If your Facebook App has 'Require app secret' enabled (most production apps should), yes. appsecret_proof is a SHA-256 HMAC of your access token keyed by your app secret, attached as a query parameter on every request. It's one line in any language: in Python it's hmac.new(secret.encode(), token.encode(), hashlib.sha256).hexdigest(). Without it, requests against a hardened app return error code 200 (OAuthException). With it, requests succeed. Most beginner tutorials skip this because their sample apps don't require it; production accounts almost always do.

Why doesn't S4L auto-post to Facebook?

Because S4L is built around conversation-style engagement (replies in Reddit threads, replies under Twitter posts), and Facebook Pages are a broadcast surface, not a conversation surface. The PLATFORMS array in bin/server.js (line 45) declares five platforms; Facebook is not one of them, and grep -i facebook against the repo returns only one user-agent regex line (in scripts/dm_short_links.py, used to detect the facebookexternalhit crawler so link-click counts are not double-counted). S4L runs an Instagram pipeline (mixer/post_to_ig.py, 344 lines, graph.instagram.com/v22.0) for our own creator content, but the marketing autoposter we sell to other indie devs targets the conversation platforms because that's where developer-tool buyers actually decide.

Can I auto-post to Facebook Groups the same way?

No, not cleanly. The Graph API endpoint /{group-id}/feed exists, but Meta restricted it heavily after 2018 and the manage_pages-style permissions for Groups are gated behind app review with a use case Meta increasingly declines. Most third-party Group autoposters on the market today are Chrome extensions that drive the facebook.com Group UI via DOM selectors, with the same fragility we cover in our Marketplace guide: Meta updates the UI, your selectors silently break, the queue drains with zero posts going live. If your goal is community engagement, post manually. If your goal is broadcast reach, post to the Page (the Group can be linked from the Page).

What does Buffer or Hootsuite actually add over Meta Business Suite Planner?

Three things. First, multi-platform scheduling: one queue that fans out to Twitter, Instagram, Pinterest, TikTok, and Facebook in one click. Second, multi-account management: a single login owning 20 Pages with role-based access for a team. Third, analytics that span platforms (clicks on a link posted to both Facebook and Twitter, side by side). For one Page on one platform, none of these matter and Meta Business Suite is enough. For an agency managing 30 client Pages, the SaaS earns its fee.

Will Facebook ban me for auto-posting?

Auto-posting via the official Graph API with valid Page access tokens is explicitly supported behavior; that is what the API exists for. Meta Business Suite Planner is itself an autoposter. The behaviors that draw bans are: posting identical content from the same account at high frequency (looks spammy regardless of method), posting via unofficial Chrome extensions that scrape the DOM (those break Meta's Platform Terms whether or not they get caught), and high-velocity bulk posting to Marketplace or Groups (which we cover separately). One scheduled post per day to your own Page is fine; one post per minute is going to get throttled.

How is auto-posting to Facebook different from auto-posting to Reddit or Twitter?

Two big differences. First, Facebook has an official Graph API for Pages with a clean OAuth flow and documented scopes; Reddit and Twitter both have APIs too but the modern Twitter API has aggressive pricing and Reddit's API rate-limits commercial use, which is why a lot of automation on those platforms uses logged-in browsers instead. Second, Facebook is broadcast (you post to your Page, your followers see it). Reddit and Twitter are conversation (you reply to a thread, the conversation participants see it). Different posting strategy, different metrics, different risk surface. The autoposter you build for one is structurally not the autoposter you build for the other.

Where can I see a real example of the Graph API call S4L makes?

mixer/post_to_ig.py in the social-autoposter repo. Line 66 declares GRAPH = 'graph.instagram.com/v22.0' (served over https) and the rest of the file is a 344-line implementation of the three-call container-poll-publish dance Instagram requires. To adapt it for Facebook Pages, swap the hostname to graph.facebook.com, replace POST /{user-id}/media with POST /{page-id}/feed, and skip the polling step (Pages don't need the container-FINISHED dance, /feed is a single call). The auth model (Page access token + appsecret_proof) is identical to the Instagram side.

Should I bother with the Graph API directly if Buffer is $5/month?

Probably not, unless you're a builder who likes owning the pipeline. The $5 saves you the Page access token rotation work (Pages tokens are technically long-lived, but you still need a refresh path), the Facebook App approval process (the public app review that pages_manage_posts triggers), and the runtime that fires your cron jobs. If those three things sound like a fun Saturday project, do it yourself. If they sound like work, pay Buffer.

s4l.aibooked calls from social
© 2026 s4l.ai. All rights reserved.