---
title: "Facebook"
description: "Publishing to Facebook Pages via the Octopost API"
---

# Facebook

Facebook supports text posts, images (up to 10), videos, and link previews -- but **only to Pages, not personal profiles**. This is a Facebook API restriction, not an Octopost limitation. Octopost handles OAuth, Page token exchange, multi-photo assembly, and resumable video uploads automatically -- you just send us your content.

## Content Limits

| Constraint | Limit |
|---|---|
| Post text | **63,206 characters** (effectively unlimited) |
| Images per post | **10** |
| Image formats | JPEG, PNG, GIF, BMP, TIFF |
| Image max size | **10 MB** per image |
| Video formats | MP4, MOV, AVI, WMV, FLV |
| Video max size | **10 GB** |
| Video max duration | **240 minutes** |

## Good to Know

- **Pages only, no personal profiles.** This is the single most important thing to know. The Facebook Graph API does not allow posting to personal timelines. Users must connect a Facebook Page in their Octopost account settings -- not a personal profile. There is no workaround for this.
- **Users must be a Page admin or editor.** The connected account needs sufficient permissions on the Page they want to post to.
- **Link previews are cached aggressively.** If you update the page a URL points to, Facebook may show stale preview data. Use the [Facebook Sharing Debugger](https://developers.facebook.com/tools/debug/) to clear the cache before posting.
- **URLs in post text generate link preview cards.** Including a URL in your text will automatically create a preview card with title, description, and thumbnail. No extra configuration needed.
- **Scheduled posts are supported.** Facebook Pages support native scheduling. Set a future timestamp and Octopost will schedule the post on Facebook's side (must be 10 minutes to 6 months in the future).
- **Facebook accepts both image URLs and uploads.** Unlike Instagram and Threads, Facebook can handle direct image uploads. Octopost uses whichever method is most reliable for your media.

## Platform-Specific Features

### Text Posts

Plain text posts with optional link previews:

```json
{
  "content": "Exciting update from our team!",
  "platforms": ["facebook"]
}
```

### Image Posts

Single or multi-image posts (up to 10):

```json
{
  "content": "New product photos",
  "platforms": ["facebook"],
  "media": {
    "images": [
      "https://example.com/photo1.jpg",
      "https://example.com/photo2.jpg"
    ]
  }
}
```

Octopost assembles multi-photo posts using Facebook's `attached_media[]` system behind the scenes.

### Video Posts

Single video per post:

```json
{
  "content": "Behind the scenes footage",
  "platforms": ["facebook"],
  "media": {
    "video": "https://example.com/bts.mp4"
  }
}
```

Octopost uses resumable uploads for large video files so you don't have to manage chunked transfers.

### Scheduled Posts

Set a future publish time:

```json
{
  "content": "This will go live tomorrow morning",
  "platforms": ["facebook"],
  "scheduled_for": "2026-04-04T09:00:00Z"
}
```

The timestamp must be between 10 minutes and 6 months in the future. Octopost validates this before sending.

## Rate Limits

Facebook uses a dynamic rate limit system based on your app's call volume and the ratio of valid to invalid calls. Octopost tracks your usage and paces requests to maintain healthy limits.

## Things Octopost Handles for You

You don't need to worry about any of this, but in case you're curious:

- **OAuth and token exchange.** Facebook uses a two-layer token system. The user authenticates with a user token, then Octopost exchanges it for a long-lived Page access token. This Page token is what's actually used for publishing. Octopost manages the full flow including token refresh.
- **Page access token lifecycle.** Page tokens can expire or be invalidated. Octopost automatically exchanges for long-lived tokens during connection and handles refresh when needed. If re-authentication is required, Octopost reports it clearly.
- **Multi-photo post assembly.** Facebook's API requires multi-image posts to use `attached_media[]` references, where each image is uploaded separately and then attached to the post. Octopost does all of this from your flat list of image URLs.
- **Resumable video upload.** Large video files use Facebook's resumable upload protocol with chunked transfers. Octopost manages the upload session, chunking, and completion so you just provide a video URL.
- **Permission scopes.** Octopost requests `pages_manage_posts`, `pages_show_list`, and `pages_read_engagement` during OAuth. Facebook requires app review for these permissions -- Octopost has already completed this review.
- **Content validation.** Octopost validates character limits and media constraints before sending anything to Facebook, giving you immediate feedback.
- **Error reporting.** If something fails -- Page not connected, token expired, permission missing, rate limit hit -- Octopost reports a clear error describing the issue and whether it's retryable.

## Example

```json
{
  "content": "We just shipped something big. Details in the link below.",
  "platforms": ["facebook"],
  "media": {
    "images": ["https://example.com/announcement.jpg"]
  }
}
```

That's it. Octopost takes care of the rest.
