<!-- https://cutedyno.com/docs/platforms/facebook -->

# Facebook

Page posts, multi-photo feeds, Reels, and the options only Facebook has.

Facebook is the most permissive of the five: text, links, one image, several images, and video all work.

## Pages only

CuteDyno publishes to Facebook **Pages**, not personal profiles. Meta does not allow API posting to profiles, so there is nothing to configure.

The person connecting must have a content or admin role on the Page. If a Page is missing from the list after connecting, that is almost always the reason — Meta only returns Pages the user can act on.

## Text and links

```typescript
await cutedyno.posts.create({
  content: 'We wrote up how we source our beans.',
  accountIds: [facebookPageId],
});
```

Facebook is the only platform that publishes a text-only post. A link in the text is unfurled by Facebook into a preview card.

## Images

One image, or several in one feed post:

```typescript
await cutedyno.posts.create({
  content: 'Roastery day.',
  media: images.map((url) => ({ type: 'image', url })),
  accountIds: [facebookPageId],
  platforms: {
    facebook: {
      alt_text_custom: 'Coffee beans cooling in the roaster drum',
      place: '109637905730051',
    },
  },
});
```

Multi-photo posts upload each image separately and then attach them to a single feed post, so a post with eight images takes noticeably longer than one with one.

## Video becomes a Reel

```typescript
await cutedyno.posts.create({
  content: 'Sixty seconds inside the roastery.',
  media: [{ type: 'video', url: videoUrl }],
  accountIds: [facebookPageId],
});
```

Video is published as a Facebook Reel. Facebook downloads the file, processes it, and CuteDyno polls for about two minutes before reporting a timeout — long videos occasionally exceed that and land as a failure even though Facebook eventually publishes them. Check the Page before retrying.

## Options

| Option | Effect |
| --- | --- |
| `privacy` | `{ "value": "PUBLIC" \| "FRIENDS" \| "SELF" }`. Audience for the post. |
| `place` | Facebook Place ID to tag. |
| `alt_text_custom` | Alt text for the image. |
| `no_story` | Publish without also generating a story. |

`alt_text_custom` is worth setting. Facebook generates alt text automatically and it is usually poor; a caption written by you is better for the people relying on it.

## Failures worth handling

| Message | Meaning |
| --- | --- |
| Video processing failed | Facebook rejected the file, usually codec or length. |
| Video publishing timeout | Processing outlasted the polling window. Check the Page before retrying. |
| Access denied. Please check your permissions. | The connected user lost their Page role. |
| Authentication failed. Please reconnect your account. | Token revoked. Reconnect. |

## Analytics

Views, likes, comments, shares, and reach per post, for both feed posts and Reels, plus follower counts and audience demographics by country and city.

## Comments

Fully supported. Comments on Page posts arrive as `comment.received` webhooks, appear in [`GET /v1/comments`](/docs/api/list-comments), and can be replied to, hidden, or deleted.
