# Facebook API for agents

> API for Agents · https://apiforagents.dev/platforms/facebook · HTML twin: https://apiforagents.dev/platforms/facebook

Pages, posts, reels, comments, reviews, ads, events and marketplace listings from Facebook.

Endpoint: `POST https://apiforagents.dev/v1/facebook`. One op per call. Quote first with `"estimateOnly": true`.

## Prices (USD per record, pay as you go)

| Record | Per record |
|---|---|
| comments | $0.0022 |
| reviews | $0.0022 |
| ads | $0.0045 |
| posts | $0.0045 |
| reels | $0.0045 |
| followers | $0.0067 |
| events | $0.009 |
| marketplace | $0.009 |
| pages | $0.009 |

## Operations

### pages

Page cards for up to ten pages by URL or handle. Followers, likes, talking-about, reviews and recommend %, category, contact, hours, ads status, social links.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-10 items) | Page URLs or vanity handles. |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| pageKey | string |
| pageId | string |
| pageUrl | string |
| pageName | string |
| username | string |
| category | string |
| intro | string |
| followers | integer |
| likes | integer |
| following | integer |
| talkingAbout | integer |
| wereHere | integer |
| reviewCount | integer |
| recommendPercent | number |
| phone | string |
| email | string |
| website | string |
| otherWebsites | list of string |
| address | string |
| addressMapUrl | string |
| businessHours | any |
| priceRange | string |
| services | string |
| profilePictureUrl | string |
| coverPhotoUrl | string |
| pageCreated | string |
| confirmedOwner | string |
| runningAds | boolean |
| adLibraryId | string |
| socialLinks | any |
| personalProfile | boolean |
| profilePhotoLink | string |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/facebook \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"pages","subjects":["nike","natgeo"]}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "pageName": "Brewlab Coffee",
    "username": "brewlabcoffee",
    "category": "Coffee shop",
    "followers": 21400,
    "likes": 19800,
    "recommendPercent": 96,
    "reviewCount": 412,
    "phone": "+1 512-555-0142",
    "website": "https://brewlab.example",
    "address": "210 Congress Ave, Austin, TX",
    "runningAds": true,
    "pageKey": "brewlab-coffee",
    "pageId": "2264557836",
    "pageUrl": "https://www.facebook.com/brewlab-coffee-1000",
    "addressMapUrl": "https://www.facebook.com/brewlab-coffee-1000",
    "profilePictureUrl": "https://img.facebook.com/brewlab-coffee.jpg",
    "coverPhotoUrl": "https://img.facebook.com/brewlab-coffee.jpg",
    "pageCreated": "2026-10-04",
    "adLibraryId": "1810680602",
    "profilePhotoLink": "https://img.facebook.com/brewlab-coffee.jpg",
    "details": {}
  },
  {
    "pageName": "Northfold",
    "username": "northfoldhq",
    "category": "Software company",
    "followers": 8400,
    "likes": 7900,
    "recommendPercent": null,
    "reviewCount": 0,
    "phone": null,
    "website": "https://northfold.example",
    "address": "London, United Kingdom",
    "runningAds": true,
    "pageKey": "northfold",
    "pageId": "4116075838",
    "pageUrl": "https://www.facebook.com/northfold-1001",
    "addressMapUrl": "https://www.facebook.com/northfold-1001",
    "profilePictureUrl": "https://img.facebook.com/northfold.jpg",
    "coverPhotoUrl": "https://img.facebook.com/northfold.jpg",
    "pageCreated": "2026-10-13",
    "adLibraryId": "3667530691",
    "profilePhotoLink": "https://img.facebook.com/northfold.jpg",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=facebook&op=pages (sign in first).

### posts

Recent posts of a page, profile or group. Text, reactions by type, comments, shares, views, media, mentions, top comments.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subject | yes | string (≤400 chars) | One page, profile or group URL or handle. |
| since | no | string (YYYY-MM-DD) |  |
| until | no | string (YYYY-MM-DD) |  |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| postUrl | string |
| postId | string |
| authorKey | string |
| author | any |
| text | string |
| postedAt | string |
| contentType | string |
| reactions | integer |
| reactionBreakdown | any |
| comments | integer |
| shares | integer |
| views | integer |
| media | any |
| videoDuration | string |
| hashtags | list of string |
| mentions | list of string |
| linkPreview | any |
| source | any |
| topComments | any |
| collaborators | any |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/facebook \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"posts","subject":"nike","since":"2026-10-01","limit":20}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "author": "Brewlab Coffee",
    "text": "New autumn menu is here 🍂",
    "postedAt": "2026-10-14T15:00:00Z",
    "contentType": "photo",
    "reactions": 1240,
    "comments": 86,
    "shares": 41,
    "views": null,
    "postUrl": "https://www.facebook.com/brewlab-coffee-1000",
    "postId": "3422847386",
    "authorKey": "3628227038",
    "details": {}
  },
  {
    "author": "Brewlab Coffee",
    "text": "Latte art night on the 24th, free entry.",
    "postedAt": "2026-10-10T18:00:00Z",
    "contentType": "event",
    "reactions": 610,
    "comments": 44,
    "shares": 58,
    "views": null,
    "postUrl": "https://www.facebook.com/brewlab-coffee-1001",
    "postId": "3041163862",
    "authorKey": "1879076958",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=facebook&op=posts (sign in first).

### reels

Recent reels of a page. Plays, audio, duration, video links.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subject | yes | string (≤400 chars) | One page URL or handle. |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| reelId | string |
| reelUrl | string |
| plays | integer |
| playsLabel | string |
| publishedAt | string |
| durationSec | number |
| audioTitle | string |
| audioArtist | string |
| audioTrack | string |
| audioTrackId | string |
| audioType | string |
| audioMuted | boolean |
| remixable | boolean |
| videoUrl | string |
| thumbnailUrl | string |
| dimensions | string |
| captionLanguages | list of string |
| dubbedAudioLanguages | list of string |
| captionsFileUrl | string |
| page | any |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/facebook \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"reels","subject":"natgeo","limit":10}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "plays": 184000,
    "playsLabel": "184K",
    "durationSec": 22,
    "audioTitle": "Original audio",
    "audioArtist": "Brewlab Coffee",
    "publishedAt": "2026-10-13",
    "remixable": true,
    "reelId": "2312965674",
    "reelUrl": "https://www.facebook.com/item-1000",
    "audioTrackId": "256678523",
    "videoUrl": "https://www.facebook.com/item-1000",
    "thumbnailUrl": "https://img.facebook.com/item.jpg",
    "captionsFileUrl": "https://www.facebook.com/item-1000",
    "details": {}
  },
  {
    "plays": 96000,
    "playsLabel": "96K",
    "durationSec": 31,
    "audioTitle": "Autumn Lo-fi",
    "audioArtist": "Sundays",
    "publishedAt": "2026-10-09",
    "remixable": true,
    "reelId": "3547752111",
    "reelUrl": "https://www.facebook.com/item-1001",
    "audioTrackId": "546944639",
    "videoUrl": "https://www.facebook.com/item-1001",
    "thumbnailUrl": "https://img.facebook.com/item.jpg",
    "captionsFileUrl": "https://www.facebook.com/item-1001",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=facebook&op=reels (sign in first).

### comments

Comments on up to five posts, reels or photos by permalink.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-5 items) | Post, reel or photo permalinks. |
| includeReplies | no | boolean | false: top-level comments only; true (default) also returns the replies nested under them. |
| sort | no | enum | top = Facebook's "most relevant"; threaded = all comments in thread order. Values: top, threaded, newest. |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| commentUrl | string |
| commentText | string |
| commenter | string |
| commenterId | string |
| commenterUrl | string |
| commenterPicture | string |
| likes | integer |
| replies | integer |
| replyDepth | integer |
| isReply | boolean |
| replyingTo | string |
| threadRootAuthor | string |
| commentDate | string |
| commentMediaType | string |
| commentMediaUrl | string |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/facebook \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"comments","subjects":["https://www.facebook.com/nike/posts/<post-id>"],"sort":"top","limit":50}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "commenter": "Ravi Kumar",
    "commentText": "Can't wait to try the pumpkin latte!",
    "likes": 24,
    "replies": 2,
    "commentDate": "2026-10-14",
    "isReply": false,
    "replyDepth": 0,
    "replyingTo": null,
    "commentUrl": "https://www.facebook.com/ravi-kumar-1000",
    "commenterId": "1050942139",
    "commenterUrl": "https://www.facebook.com/ravi-kumar-1000",
    "commentMediaUrl": "https://www.facebook.com/ravi-kumar-1000",
    "details": {}
  },
  {
    "commenter": "Lena Müller",
    "commentText": "Are you open on Sunday?",
    "likes": 6,
    "replies": 1,
    "commentDate": "2026-10-14",
    "isReply": false,
    "replyDepth": 0,
    "replyingTo": null,
    "commentUrl": "https://www.facebook.com/lena-m-ller-1001",
    "commenterId": "455822143",
    "commenterUrl": "https://www.facebook.com/lena-m-ller-1001",
    "commentMediaUrl": "https://www.facebook.com/lena-m-ller-1001",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=facebook&op=comments (sign in first).

### reviews

Reviews/recommendations on up to five pages.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-5 items) | Page URLs or vanity handles. |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| reviewId | string |
| reviewUrl | string |
| reviewText | string |
| recommended | boolean |
| reviewDate | string |
| reviewerName | string |
| reviewerAvatar | string |
| reviewerProfileUrl | string |
| likes | integer |
| commentCount | integer |
| photos | list of string |
| tags | string |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/facebook \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"reviews","subjects":["starbucks"],"limit":25}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "reviewerName": "Hannah Wright",
    "recommended": true,
    "reviewText": "Friendly staff and great coffee.",
    "reviewDate": "2026-10-11",
    "likes": 3,
    "commentCount": 0,
    "reviewId": "309363717",
    "reviewUrl": "https://www.facebook.com/hannah-wright-1000",
    "reviewerProfileUrl": "https://www.facebook.com/hannah-wright-1000",
    "photos": [
      "https://img.facebook.com/hannah-wright.jpg"
    ],
    "details": {}
  },
  {
    "reviewerName": "Arjun Shah",
    "recommended": true,
    "reviewText": "My favourite spot to work from.",
    "reviewDate": "2026-10-02",
    "likes": 1,
    "commentCount": 1,
    "reviewId": "3649534047",
    "reviewUrl": "https://www.facebook.com/arjun-shah-1001",
    "reviewerProfileUrl": "https://www.facebook.com/arjun-shah-1001",
    "photos": [
      "https://img.facebook.com/arjun-shah.jpg"
    ],
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=facebook&op=reviews (sign in first).

### followers

The followers OR following of up to three pages. Name, profile URL, bio. The dearest rows in the catalogue.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-3 items) | Page URLs or vanity handles. |
| direction | no | enum |  Values: followers, following. |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| profileId | string |
| followerName | string |
| profileUrl | string |
| avatarUrl | string |
| bio | string |
| relationship | string |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/facebook \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"followers","subjects":["natgeo"],"direction":"following","limit":25}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "followerName": "Ravi Kumar",
    "bio": "Coffee and cycling",
    "relationship": "follower",
    "profileId": "624155740",
    "profileUrl": "https://www.facebook.com/ravi-kumar-1000",
    "avatarUrl": "https://img.facebook.com/ravi-kumar.jpg",
    "details": {}
  },
  {
    "followerName": "Lena Müller",
    "bio": "Designer in Austin",
    "relationship": "follower",
    "profileId": "3527258922",
    "profileUrl": "https://www.facebook.com/lena-m-ller-1001",
    "avatarUrl": "https://img.facebook.com/lena-m-ller.jpg",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=facebook&op=followers (sign in first).

### ads

Every ad a page runs in Meta's Ad Library. Creative, headline, CTA, link, dates, platforms, advertiser and EU reach.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-5 items) | Page URLs or vanity handles. |
| status | no | enum | "active": ads running now; "inactive": ads that have stopped. Values: active, inactive. |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| libraryId | string |
| adUrl | string |
| pageUrl | string |
| advertiser | any |
| isActive | boolean |
| startDate | string |
| endDate | string |
| daysActive | integer |
| headline | string |
| bodyText | string |
| linkDescription | string |
| ctaText | string |
| destinationUrl | string |
| mediaType | string |
| mediaUrl | string |
| format | string |
| variantCount | integer |
| platforms | list of string |
| euReach | integer |
| reachBreakdown | any |
| cards | any |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/facebook \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"ads","subjects":["nike"],"status":"active","limit":25}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "advertiser": "Brewlab Coffee",
    "isActive": true,
    "startDate": "2026-10-01",
    "daysActive": 15,
    "headline": "20% off your first bag",
    "bodyText": "Small-batch beans, roasted every Monday.",
    "ctaText": "Shop now",
    "mediaType": "video",
    "format": "single",
    "variantCount": 2,
    "platforms": [
      "facebook",
      "instagram"
    ],
    "endDate": "2026-10-02",
    "libraryId": "2282493876",
    "adUrl": "https://www.facebook.com/item-1000",
    "pageUrl": "https://www.facebook.com/item-1000",
    "destinationUrl": "https://www.facebook.com/item-1000",
    "mediaUrl": "https://www.facebook.com/item-1000",
    "details": {}
  },
  {
    "advertiser": "Brewlab Coffee",
    "isActive": true,
    "startDate": "2026-09-20",
    "daysActive": 26,
    "headline": "Try the autumn menu",
    "bodyText": "Pumpkin spice, done right.",
    "ctaText": "Get directions",
    "mediaType": "image",
    "format": "single",
    "variantCount": 1,
    "platforms": [
      "facebook"
    ],
    "endDate": "2026-10-06",
    "libraryId": "1516528853",
    "adUrl": "https://www.facebook.com/item-1001",
    "pageUrl": "https://www.facebook.com/item-1001",
    "destinationUrl": "https://www.facebook.com/item-1001",
    "mediaUrl": "https://www.facebook.com/item-1001",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=facebook&op=ads (sign in first).

### events

Events by keyword. Name, date, venue, host, going/interested, tickets.

| Field | Required | Type | Meaning |
|---|---|---|---|
| query | yes | string (≤300 chars) |  |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| eventId | string |
| eventUrl | string |
| eventName | string |
| description | string |
| dateTime | string |
| startDate | string |
| duration | string |
| frequency | string |
| occurrences | any |
| category | string |
| venueName | string |
| venueUrl | string |
| address | string |
| street | string |
| city | string |
| country | string |
| latitude | number |
| longitude | number |
| isOnline | boolean |
| isPast | boolean |
| isCanceled | boolean |
| host | string |
| hosts | any |
| going | integer |
| interested | integer |
| tickets | any |
| externalLinks | list of string |
| coverImageUrl | string |
| imageCaption | string |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/facebook \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"events","query":"jazz festival","limit":20}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "eventName": "Latte Art Night",
    "startDate": "2026-10-24",
    "duration": "3 hours",
    "category": "Food & Drink",
    "venueName": "Brewlab Coffee",
    "city": "Austin",
    "country": "US",
    "isOnline": false,
    "going": 84,
    "interested": 412,
    "eventId": "1614687254",
    "eventUrl": "https://www.facebook.com/latte-art-night-1000",
    "venueUrl": "https://www.facebook.com/latte-art-night-1000",
    "isPast": false,
    "isCanceled": false,
    "coverImageUrl": "https://img.facebook.com/latte-art-night.jpg",
    "details": {}
  },
  {
    "eventName": "Cupping: New Harvest",
    "startDate": "2026-11-07",
    "duration": "2 hours",
    "category": "Food & Drink",
    "venueName": "Brewlab Coffee",
    "city": "Austin",
    "country": "US",
    "isOnline": false,
    "going": 26,
    "interested": 190,
    "eventId": "1747196447",
    "eventUrl": "https://www.facebook.com/cupping-new-harvest-1001",
    "venueUrl": "https://www.facebook.com/cupping-new-harvest-1001",
    "isPast": false,
    "isCanceled": false,
    "coverImageUrl": "https://img.facebook.com/cupping-new-harvest.jpg",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=facebook&op=events (sign in first).

### marketplace

Marketplace listings from a category or search URL. Title, price, condition, location, attributes, photos.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subject | yes | string (≤400 chars) | A Marketplace category or search URL. |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| listingId | string |
| listingUrl | string |
| listingTitle | string |
| description | string |
| price | string |
| priceValue | number |
| originalPrice | string |
| currency | string |
| condition | string |
| location | string |
| city | string |
| state | string |
| country | string |
| postalCode | string |
| latitude | number |
| longitude | number |
| listedAt | string |
| primaryPhoto | string |
| photos | any |
| videoUrl | string |
| attributes | any |
| deliveryOptions | list of string |
| mileage | string |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/facebook \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"marketplace","subject":"https://www.facebook.com/marketplace/nyc/bicycles","limit":20}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "listingTitle": "Road bike, 54 cm, barely used",
    "price": "$420",
    "priceValue": 420,
    "currency": "USD",
    "condition": "Used - like new",
    "city": "Austin",
    "state": "TX",
    "country": "US",
    "listedAt": "2026-10-14",
    "listingId": "770737849",
    "listingUrl": "https://www.facebook.com/road-bike-54-cm-barely-used-1000",
    "videoUrl": "https://www.facebook.com/road-bike-54-cm-barely-used-1000",
    "details": {}
  },
  {
    "listingTitle": "Gravel bike, 56 cm",
    "price": "$650",
    "priceValue": 650,
    "currency": "USD",
    "condition": "Used - good",
    "city": "Austin",
    "state": "TX",
    "country": "US",
    "listedAt": "2026-10-12",
    "listingId": "151623122",
    "listingUrl": "https://www.facebook.com/gravel-bike-56-cm-1001",
    "videoUrl": "https://www.facebook.com/gravel-bike-56-cm-1001",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=facebook&op=marketplace (sign in first).

### history (free)

Stored follower/likes series of pages already held. Free.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-10 items) |  |
| metric | no | enum |  Values: followers, likes, talking_about, review_count, recommend_percent. |
| days | no | integer (1-730) |  |

Request shape:

```json
{
  "op": "history",
  "subjects": [
    "example"
  ]
}
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=facebook&op=history (sign in first).

## Notes for the agent

Measured Facebook data, one operation per call. Pages are named by URL or vanity handle ("nike"); posts by permalink. Handles come from evidence, never typed from a name. ops: pages (cards for up to ten pages. Followers, likes, following, talking-about, reviews and recommend %, category, contact, address, hours, price range, ads status, social links), posts (recent posts of a page, profile or group. Text, reactions by type, comments, shares, views, media, top comments; since/until), reels (a page's reels. Plays, audio, duration), comments (comments on up to five posts by permalink, replies optional; sort top/threaded/newest), reviews (a page's reviews/recommendations), followers (a page's followers OR following, each with name, profile URL and bio), ads (every ad a page runs in the Ad Library. Creative, headline, CTA, link, dates, platforms, EU reach; active or inactive), events (events by keyword. Date, venue, host, going/interested, tickets), marketplace (listings from a Marketplace category or search URL. Price, condition, location, attributes), history (stored follower/likes series of pages already held, free). Ops are independent. Issue several as PARALLEL tool calls. Fresh fetches are charged per record; your own answer is free while fresh.
