Skip to main content

Quick reference

The image/video size caps above are Postbreeze’s server-side ingest limits. Facebook’s own publish-time caps are tighter (Reels must be 9:16 and 3–90s, max 30 Reels per Page per 24h, etc.) — exceed those and the publish step returns an error from Meta even though the upload succeeded.

Before you start

You can only publish to Facebook Pages you administer. Personal-profile publishing isn’t exposed by the Graph API. The OAuth flow enumerates the Pages on your account during connect — pick the Page you want to publish to from that list.
Required scopes:
  • pages_show_list — read the list of Pages you administer.
  • pages_manage_posts — create posts on your Pages.
  • pages_manage_engagement + pages_read_engagement — first-comment + inbox replies.
  • pages_read_user_content — inbox comments-on-your-posts feed.
Reels require Meta App Review with the Reels use-case enabled. Before review approval, video posts work fine but kind: "REEL" will return FB_REEL_NOT_APPROVED.

Quick start

Workspace is inferred from your API key — no workspaceId argument and no workspace in the URL. Use the flat shape (content + platforms) for the common case; drop to the nested shape at the bottom of this page only when a power-user workflow demands it.
See Platform settings → Facebook for the full platformOptions reference and Media uploads for the two ways to attach images and video.

Content types

kind: "FEED". Pure text post, optionally with a link whose OG preview Facebook auto-generates. When you attach media to a FEED post, the server auto-normalizes it to PHOTO (1 image) or PHOTO_CAROUSEL (2–10) — you don’t have to set kind yourself.

Photo (single image)

kind: "PHOTO". Send exactly one image, either by mediaIds (the presign flow) or by mediaItems (URL ingest).
Node.js — pre-uploaded media
Node.js — URL ingest (alternative)
mediaItems accepts any reachable URL — Postbreeze fetches the asset through an SSRF-guarded ingest path. Use mediaIds when you’ve already uploaded the file via the presign flow. kind: "PHOTO_CAROUSEL". Mixed photo + video is not allowed on organic Page posts — that surface is ads-only.

Video

kind: "VIDEO". Single video file. Up to 4 hours of runtime; the server-side ingest cap is 5 GB.
Node.js

Reel

kind: "REEL". 9:16, 3–90 seconds, video-only. Optionally pass reelTitle — it’s prepended to the description on the Reel surface (not the Feed).
Node.js

Media requirements

Images

Videos

Platform-specific fields

That’s the complete schema — there is no pageId, geoRestriction, or story support on Facebook today. The firstComment field is not inside platformOptions; it lives one level up as a sibling of platformOptions on each platforms entry (see below).

First comment

Pass firstComment on the platforms entry — sibling of platformOptions, not nested inside it. Facebook publishes the comment as the Page (not as a personal user). No delay needed — Facebook accepts immediate comments after publish.
Node.js
Limit: 8,000 characters per Page comment. First comments are supported on every Facebook surface except Reels — Meta’s Reels API rejects programmatic first comments.

Analytics

Refresh cadence: every 14 days. The 2026 metric names above (page_follows, page_media_view, etc.) replaced the pre-June-2026 page_impressions family. Postbreeze emits the new names directly — no migration needed.

Common errors

What you can’t do

  • ❌ Publish to personal Facebook profiles
  • ❌ Schedule via Facebook’s native scheduler (we use our own queue)
  • ❌ Mix video and image in one carousel (ads-only feature)
  • ❌ Live video / Live Reels
  • ❌ Stories (planned for v2)
  • ❌ Tag specific users in caption text
  • ❌ Add location tags (Meta removed this from the Graph API)
  • ❌ Cross-post to Instagram in the same call (use two entries in platforms)
  • ❌ First comment on Reels (Meta API limitation)

Full control: nested shape

The flat shape (content + platforms) above is the canonical entry point and covers every Facebook use case. Postbreeze also accepts an equivalent nested shape (caption + targets) for callers porting from older internal tooling — the two shapes produce identical posts.
Field mapping flat ↔ nested: Prefer the flat shape for all new integrations.