Quick reference
| Limit / capability | Value |
|---|---|
| Character limit | 63,206 graphemes |
| Images per post | up to 10 (multi-photo via attached_media) |
| Image formats | jpeg, png, gif, webp |
| Image size | 4,000,000 bytes (4 MB) |
| Video formats | mp4, mov |
| Video size | 4,000,000,000 bytes (4 GB) |
| Mixed image + video | Rejected — one media kind per post |
| Post types supported | text, single image, multi-image, single video, link share |
| Scheduling | Yes (via scheduledAt) |
| Reply / thread support | Not supported in v1 |
| First comment | Not supported in v1 |
| Inbox / DM | Not supported in v1 |
| Analytics | Not supported in v1 |
Connect an account
POST /v1/accounts/connect/facebook. Standard Facebook Login for Business OAuth. After complete, the provider calls GET /me/accounts and creates one platform_accounts row per Page the user manages, each carrying its own Page Access Token (the non-expiring token used for publishing, distinct from the User Access Token).
If the user manages no Pages: facebook.pages.none. Personal profiles cannot publish via the Graph API and are out of scope for v1.
Scopes
extended adds insights / engagement scopes (pages_read_user_content, pages_manage_engagement).
Token lifecycle
The User Access Token from the OAuth handshake is short-lived; the provider swaps it for a long-lived (~60-day) user token, then derives a Page Access Token per Page via/me/accounts. Page Access Tokens are non-expiring as long as the user token stays fresh; refresh runs on schedule. token.expiring fires before expiry on the user token.
Post types
Text post
text.json
POST /{page-id}/feed with message.
Single image
single-image.json
POST /{page-id}/photos with caption.
Multi-image (up to 10)
multi-image.json
published=false via POST /{page-id}/photos, then creates the wall post with POST /{page-id}/feed carrying attached_media: [{ media_fbid }].
Single video
video.json
POST /{page-id}/videos with the media URL. Only one video per post; mixing image + video on the same post is rejected upfront.
Wisdom (platform-specific things that bite)
Common errors
| Error rule | What it means | How to fix |
|---|---|---|
facebook.text.required | Empty text and no media | Provide text or attach media[]. |
facebook.text.max_graphemes | Message > 63,206 graphemes | Trim under the cap. |
facebook.media.image_video_exclusive | Attached both images and a video | Split into separate posts. |
facebook.media.count_max | More than one video, or more than 10 photos | One video per post; ≤10 photos per multi-image post. |
facebook.media.mime_allowed | Unsupported image/video mime | Images: jpeg/png/gif/webp. Videos: mp4/mov. |
facebook.media.image_size_max | Image > 4 MB | Re-encode under 4,000,000 bytes. |
facebook.media.video_size_max | Video > 4 GB | Compress under 4,000,000,000 bytes. |
facebook.pages.none | Connect-time: user manages no Pages | The user must own/manage a Page in Business Manager before connecting. |
What you can’t do (yet)
- Posting to a personal profile (Meta’s Graph API doesn’t expose write access to user feeds).
- First comment / threaded replies as the Page.
- Story posts, Reels (Facebook Reels live behind a separate publishing surface not in v1).
- Tagging users or co-authors.
- Targeted post audience (Facebook geo/demographic targeting).
- Reading comments, reactions, or insights (those scopes are
extendedand the read APIs aren’t wired in v1).
API reference
POST /v1/posts— primary publish.POST /v1/media— upload images/videos formediaIdreferences.POST /v1/accounts/connect/facebook— start a Facebook OAuth flow.

