# Facebook

Canonical: https://monsterapi.co/docs/facebook

The Facebook API returns information available to a guest who isn’t signed in.
Choose an endpoint by the object, the information needed, and the response fields. Similar endpoints can return overlapping information.

## Pages and profiles

### Profile information

- **Page information.** [GET /page/render](https://monsterapi.co/docs/api/facebook-page#facebook-page-profile-and-previews) accepts a page’s vanity `name` or numeric `id`. It returns identity, introduction, pictures, sections, and available previews.
- **Person’s profile.** [GET /user/render](https://monsterapi.co/docs/api/facebook-people#facebook-person-profile-and-previews) accepts the profile’s vanity `name`. It returns profile information and available previews.
- **Page header.** [GET /page/header](https://monsterapi.co/docs/api/facebook-page#facebook-page-identity-by-profile-id) accepts the profile identifier as `user_id`. It returns `data` and the named `page` record.
- **Contacts.** [GET /page/render/contact](https://monsterapi.co/docs/api/facebook-page#facebook-page-contact-details) accepts the page’s vanity `name`. It returns email addresses, phone numbers, websites, address, and other available contact fields.
- **Transparency.** [GET /page/render/transparency](https://monsterapi.co/docs/api/facebook-page#facebook-page-ownership-and-ads) accepts the page’s vanity `name`. It returns available ownership, administration, and disclosure information.
- **Owner, name history, and managers.** [GET /page/transparency](https://monsterapi.co/docs/api/facebook-page#facebook-page-owner-history-and-managers) accepts the classic page ID as `page_id`. It returns the organization that Facebook confirmed as responsible for the page, the page’s name history, the countries of its managers, and its ad status.
- **About section.** [GET /profile/about](https://monsterapi.co/docs/api/facebook-page#facebook-profile-about-section) accepts the vanity `name` of a page or a person and a `section` key. It returns the headings and fields of that section of the About tab.
- **Page picture.** [GET /page/picture](https://monsterapi.co/docs/api/facebook-page#facebook-page-profile-picture) accepts the page’s `id` and an optional size `type`. It returns the picture URL, width, height, and `is_silhouette`.

Page information and the page header overlap, but their avatars and covers can differ. Keep each response’s values together.
Page information can also include introductory information and navigation sections. The header remains a separate response variant.

`GET /page/transparency` takes `page_id` from `page_id` in `GET /page/render/transparency`, from `page.classic_id` in `GET /page/header`, or from `route.classic_id` of a page’s videos path. A profile identifier, such as `route.id`, returns `404` `not_found`.
If Facebook names no organization for the page, `page.owner` is null.

### Contact information

Page and person-profile responses can include `emails`, `websites`, `website_details`, `phones`, `address`, `hours`, `hours_status_text`, and `other`.
Each `website_details` record contains `id`, `text`, `url`, and `expanded_url` when provided. `url` is the link as Facebook gives it, through its redirect. `expanded_url` is the website address that the redirect leads to.
Additional information in `other` uses `id`, `type`, `value`, `label`, `url`, and `data`.

`hours` describes opening times. `hours_status_text` describes an open or closed status rather than a schedule.
The separate contact endpoint remains available. Read the fields of each response. Overlapping information does not make the responses interchangeable.

### Profile identifiers

Resolve a page name with [GET /route](https://monsterapi.co/docs/api/facebook-route#facebook-path-identifiers), such as `route=/NASA`, and take `route.id`.
Alternatively, request [GET /page/render](https://monsterapi.co/docs/api/facebook-page#facebook-page-profile-and-previews), such as `name=NASA`. Name its returned profile `profile` and take `profile.id`.
Pass that profile identifier unchanged as `user_id` to [GET /page/header](https://monsterapi.co/docs/api/facebook-page#facebook-page-identity-by-profile-id) or [GET /page/timeline](https://monsterapi.co/docs/api/facebook-page#facebook-page-posts-by-profile-id).

The same profile’s `profile.classic_id` has a separate purpose: it supplies `page_id` for the video-list endpoints below.
Do not substitute it for the profile identifier used by the header or timeline.

### Path identifiers

[GET /route](https://monsterapi.co/docs/api/facebook-route#facebook-path-identifiers) also names the identifiers of other Facebook paths. Pass each one to the endpoint that takes it:

- **`route.classic_id`** of a page’s videos path, such as `route=/NASA/videos`, is the `page_id` of [GET /page/videos](https://monsterapi.co/docs/api/facebook-page#facebook-page-videos-first-page), [GET /page/videos/page](https://monsterapi.co/docs/api/facebook-page#facebook-page-videos-with-pagination), and `GET /page/transparency`.
- **`route.section_token` and `route.collection_token`** of a section path, such as `/NASA/photos_by`, go to [GET /page/section](https://monsterapi.co/docs/api/facebook-page#facebook-page-section-contents) with `route.id` as `user_id`. If `route.collection_token` is null, as for `/NASA/photos`, omit `collection_token`.
- **`route.group_id`** of a group path, such as `/groups/pythondevelopers`, is the `id` of [GET /group/render](https://monsterapi.co/docs/api/facebook-groups#facebook-group-details-and-posts), [GET /group/mobile](https://monsterapi.co/docs/api/facebook-groups#facebook-group-link-preview), and [GET /group/post/render](https://monsterapi.co/docs/api/facebook-groups#facebook-group-post-details).
- **`route.post_id`** of a group post path is the `post_id` of `GET /group/post/render`, with `route.group_id` as `id`.
- **`route.story_id`** of a post path is the `story_id` of [GET /post/dialog](https://monsterapi.co/docs/api/facebook-post#facebook-post-details-by-story-id).
- **`route.topic_id` and `route.section_id`** of a video topic path, such as `route=/watch/topic/947722281917040/`, are the `topic_id` and `section_id` of [GET /watch/topic](https://monsterapi.co/docs/api/facebook-watch#facebook-video-topic-sections). For other paths, both are null.

A path without its leading `/`, such as the `redirect_url` value `SF`, is read as `/SF`.
A section that Facebook does not show guests, such as NASA’s reels, returns `404` `not_found` from `GET /page/section`.

### About sections

[GET /profile/about](https://monsterapi.co/docs/api/facebook-page#facebook-profile-about-section) returns one section of the About tab of a page or a person, such as `about_details` or `about_work_and_education`. Pass the vanity `name` and the `section` key.
The response holds the section’s headings in `field_sections`, each with its `fields`. Content that is not a list of fields, such as life events, is in `other`.

To find the keys of the sections that a profile shows:

1. Request [GET /route](https://monsterapi.co/docs/api/facebook-route#facebook-path-identifiers) for an About path, such as `route=/NASA/about_details`.
2. Pass `route.section_token` and `route.collection_token` to [GET /page/section](https://monsterapi.co/docs/api/facebook-page#facebook-page-section-contents), with `route.id` as `user_id`.
3. Take the last segment of each `section.collections[].url`. It is the key of one section.

In one request, `sections[].collections[].key` of the section whose `key` is `about` in [GET /page/render](https://monsterapi.co/docs/api/facebook-page#facebook-page-profile-and-previews) or [GET /user/render](https://monsterapi.co/docs/api/facebook-people#facebook-person-profile-and-previews) gives the keys too. This list can include sections that the profile does not show. Such a section returns `404` `not_found`.

Fields keep the phrases that Facebook writes, dates included, such as `February 4, 2004 - Present`.

### Reviews and rating

[GET /page/reviews](https://monsterapi.co/docs/api/facebook-page#facebook-page-reviews-first-page) returns the first reviews of a page in `reviews` and an optional `next_cursor`. A review has the fields of a post, such as `text`, `author`, `created_time`, and its counts.
Pass the page’s profile identifier as `user_id`: `route.id` of a page path, such as `route=/Meta/reviews/`, or `page.id` in `GET /page/header`.

To read more reviews, pass `next_cursor` as `cursor` to [GET /page/reviews/page](https://monsterapi.co/docs/api/facebook-page#facebook-page-reviews-with-pagination), with the same `user_id`. Continue with each response’s `next_cursor`. This endpoint requires `cursor`.
A page without public reviews returns `200` with an empty `reviews` list.

[GET /page/reviews/rating](https://monsterapi.co/docs/api/facebook-page#facebook-page-rating) accepts the same `user_id`. It returns `rating`, from 0 to 5, and `reviews_count`, the number of people whose reviews and recommendations the rating is based on. For a page without a rating, both fields are null.

`recommendation_text` is Facebook’s sentence that tells whether the author recommends the page, such as `<author>  recommends Logitech.` or `<author>  doesn't recommend Logitech.` Facebook chooses the language of the sentence. If a review has no such sentence, the field is null.

### Posts, reels, and videos

#### Timeline posts

[GET /page/timeline](https://monsterapi.co/docs/api/facebook-page#facebook-page-posts-by-profile-id) accepts `user_id` and returns `posts` and an optional `next_cursor`. A response usually holds up to three posts.
Return that `next_cursor` as `cursor` to the same endpoint, keeping `user_id` and any time filters.

To start with a page’s name:

1. Request [GET /page/render/timeline](https://monsterapi.co/docs/api/facebook-page#facebook-page-post-previews) with the page’s vanity `name`. It returns `posts` and an optional `next_cursor`.
2. Take `profile.id` from [GET /page/render](https://monsterapi.co/docs/api/facebook-page#facebook-page-profile-and-previews) for the same page.
3. When `next_cursor` is present, pass it as `cursor` to [GET /page/timeline](https://monsterapi.co/docs/api/facebook-page#facebook-page-posts-by-profile-id), using `profile.id` as `user_id`.
4. Continue with each response’s `next_cursor` at `GET /page/timeline`, keeping the same `user_id`.

`since` and `until` on `GET /page/timeline` are inclusive Unix timestamps in seconds. A `since` value later than `until` returns `400` `bad_request`.
To request posts newer than one already held, use that post’s `created_time` plus one as `since`.

#### Post identifiers and shared posts

Each post names its own `story_id` and `feedback_id` when Facebook provides them.
Pass `story_id` to [GET /post/dialog](https://monsterapi.co/docs/api/facebook-post#facebook-post-details-by-story-id) for the post’s details. Pass `feedback_id` unchanged to [GET /comments/root](https://monsterapi.co/docs/api/facebook-comments#facebook-post-comments-first-page) for its comments.
A post that shares another post holds that post in `shared`, with its own author, text, links, and media.
If the sharing post has no text of its own, its `text` is null and its `ranges` list is empty. The shared text is in `shared.text`.

#### Reels

[GET /page/render/reels](https://monsterapi.co/docs/api/facebook-page#facebook-page-reel-previews) accepts the page’s vanity `name` and returns `collection_id`, `reels`, and an optional `next_cursor`.
Pass that `collection_id` and `next_cursor` as `collection_id` and `cursor` to [GET /page/collection/reels](https://monsterapi.co/docs/api/facebook-page#facebook-page-reel-collection).
For later pages, keep the same `collection_id` and return each response’s `next_cursor` as `cursor` to `GET /page/collection/reels`.

Some pages do not show their reels tab to guests. For such a page, `GET /page/render/reels` returns `404` `not_found`. Its reels remain available from `GET /page/videos` and [GET /reel](https://monsterapi.co/docs/api/facebook-post#facebook-reel-details).
`GET /reel` returns no play or view counts. [GET /video/hero](https://monsterapi.co/docs/api/facebook-post#facebook-video-details-by-id) returns them for the same `video_id`.

#### Videos

[GET /page/videos](https://monsterapi.co/docs/api/facebook-page#facebook-page-videos-first-page) accepts `page_id` and returns `videos` and an optional `next_cursor`.
Return that cursor to [GET /page/videos/page](https://monsterapi.co/docs/api/facebook-page#facebook-page-videos-with-pagination), keeping the same `page_id`.
For both video-list endpoints, take `page_id` from `route.classic_id` of the page’s videos path, or from `profile.classic_id` in the [GET /page/render](https://monsterapi.co/docs/api/facebook-page#facebook-page-profile-and-previews) response.
A profile identifier, such as `route.id`, returns `404` `not_found` from both endpoints.

Use query parameters and URL-encode each cursor without changing its value.

#### Photos of a post

[GET /photo](https://monsterapi.co/docs/api/facebook-post#facebook-photo-details-and-neighbors) accepts a photo’s `fbid` and an optional `set`.
For the photos of an album post, pass `set=pcb.{post_id}`: the `mediaset_token` of that post in `GET /post/dialog`.
In this set, `prev_id` and `next_id` form a ring, and the last photo’s `next_id` is the first photo. Stop when an identifier repeats.

#### Albums

[GET /album](https://monsterapi.co/docs/api/facebook-post#facebook-album-details-and-photos) accepts an album `set` of the form `a.{album_id}`. It returns the album in `album`, its first photos in `photos`, and the posts that added them in `posts`.
Take `set` from [GET /page/collection/list](https://monsterapi.co/docs/api/facebook-page#facebook-page-albums-and-profiles): it is the `set` query value of `items[].url` for an item whose `type` is `Album`.

To read more photos, pass `next_cursor` as `cursor` to [GET /album/photos](https://monsterapi.co/docs/api/facebook-post#facebook-album-photos-with-pagination), with the same `set`. Continue with each response’s `next_cursor`. Without `cursor`, `GET /album/photos` returns the first photos of the album.

For a photo, pass its `id` as `fbid` to `GET /photo`, with the same `set`. Pass `album.feedback_id` to [GET /comments/root](https://monsterapi.co/docs/api/facebook-comments#facebook-post-comments-first-page) for the album’s comments.
The response has no creation time of the album. The date that Facebook shows for the album is `posts[].created_time`.

## Groups

- **Group information.** [GET /group/render](https://monsterapi.co/docs/api/facebook-groups#facebook-group-details-and-posts) accepts a numeric group `id` or group slug. It returns identity, description, privacy, member counts, available posts, and a `next_cursor` for later posts.
- **Group posts.** [GET /group/feed](https://monsterapi.co/docs/api/facebook-groups#facebook-group-posts-by-group-id) accepts the numeric group `id` and an optional `cursor`. It returns up to three posts per call.
- **Group history, rules, and activity.** [GET /group/render/about](https://monsterapi.co/docs/api/facebook-groups#facebook-group-history-rules-and-activity) accepts the same forms of `id` as `GET /group/render`. It returns the group’s creation time, history, rules, and activity counts, and no posts.
- **Group summary.** [GET /group/mobile](https://monsterapi.co/docs/api/facebook-groups#facebook-group-link-preview) accepts the same forms of `id`. It returns `id`, title, description, URL, and image fields.
- **Group post.** [GET /group/post/render](https://monsterapi.co/docs/api/facebook-groups#facebook-group-post-details) accepts the group’s `id` and a `post_id`. It returns the named post record. Take both values from `route.group_id` and `route.post_id` of the group post path.

To read a group’s posts page by page:

1. Request `GET /group/render` with the group’s `id` or slug. Take `id` and `next_cursor` from the response.
2. Pass them as `id` and `cursor` to `GET /group/feed`.
3. Continue with each response’s `next_cursor` at `GET /group/feed`, keeping the same `id`.

For a private group, `GET /group/feed` returns an empty list.

Group information can be available even when the group’s posts are private. Read the returned `privacy_text` when present.
A metadata response does not imply access to the group’s posts or members. Similar group responses are separate variants. Use the fields each one actually returns.

When available, group information also includes `privacy_label`, `privacy_description`, `visibility_text`, and `visibility_description`.
For a public group, `GET /group/render` returns `created_time`, `history_text`, `rules`, `members_total_text`, `new_members_text`, `posts_last_day_count`, and `posts_last_month_count` as null. `GET /group/render/about` returns these values. For a private group, `GET /group/render` returns them too.
Additional group information appears in `other` records with `type` and `value`. An empty `other` list means no additional records were supplied.

## Video search

[GET /search/videos/render](https://monsterapi.co/docs/api/facebook-search#facebook-video-search-previews) and [GET /search/videos](https://monsterapi.co/docs/api/facebook-search#facebook-video-search-with-pagination) return videos that match the search term `q`. Continue with `next_cursor` at `GET /search/videos`, keeping the same `q`.

Facebook returns some results as compact previews. A compact preview has `id`, `url`, `thumbnail`, its author or owner, and `metadata_text`.
In `GET /search/videos`, it also has `title`, `text`, and `duration_text`, the duration as Facebook shows it, such as `2:06`. Its other fields are null.
If the video has no title, `title` has the same value as `text`.

For the publication time, exact duration, and counts of a compact preview, request [GET /video/hero](https://monsterapi.co/docs/api/facebook-post#facebook-video-details-by-id) with its `id` as `video_id`. It also gives the title for a compact preview of `GET /search/videos/render`.

## Video topics

[GET /watch/topics](https://monsterapi.co/docs/api/facebook-watch#facebook-video-topics) returns the video topics in `topics`, each with `id`, `name`, and `icon`, and the names of the trending hashtags in `hashtags`. It takes no parameters.

[GET /watch/topic](https://monsterapi.co/docs/api/facebook-watch#facebook-video-topic-sections) returns one topic in `topic`, its `subtopics`, and its video `sections`. To request it:

1. Take a topic `id` from `GET /watch/topics`.
2. Request [GET /route](https://monsterapi.co/docs/api/facebook-route#facebook-path-identifiers) for the topic path `/watch/topic/{id}/`, such as `route=/watch/topic/947722281917040/`.
3. Pass `route.topic_id` as `topic_id` and `route.section_id` as `section_id`.

The topic comes from `topic_id`, and the videos come from `section_id`. Take both values from the same `GET /route` response.

To read more videos, pass `next_cursor` as `cursor` to [GET /watch/section](https://monsterapi.co/docs/api/facebook-watch#facebook-video-feed-section-videos). As `section_id`, use the `id` of the first section in `sections` that holds videos. Videos can repeat between pages. Compare their IDs.

A `topic_id` that names no topic returns `500` `upstream_shape`. This code does not show whether the topic exists.

## Marketplace

[GET /marketplace/search](https://monsterapi.co/docs/api/facebook-marketplace#facebook-marketplace-listing-search) returns listings that match a search term `q` or a `category`. [GET /marketplace/browse](https://monsterapi.co/docs/api/facebook-marketplace#facebook-marketplace-nearby-listings) returns listings around a point. Continue either list with its `next_cursor`, keeping the same filters. A listing can appear on more than one page of either list. Compare `listings[].id` to count each listing once.

- **Area.** Give `lat` and `lng` together, in degrees. Without them, Facebook chooses the area, and the area can differ between requests. [GET /marketplace/location/render](https://monsterapi.co/docs/api/facebook-marketplace#facebook-marketplace-location-details) gives the coordinates of a Marketplace location.
- **Radius.** `radius` is in kilometers, `0` or more. Without `radius`, the default radius of Facebook applies. Facebook can return listings outside the radius: on `GET /marketplace/browse`, on a search by `q`, and on a search by some categories, such as `vehicles`. The description of `radius` on `GET /marketplace/search` lists the categories that stayed near the radius and those that did not. For a strict area, compare the coordinates of each listing with the center.
- **Price filters.** On `GET /marketplace/search`, `min_price` and `max_price` are amounts in the currency of the search, such as US dollars for a search in the United States. They are not converted. Each is a number from `0` to `2147483647` in steps of `0.01`, such as `50` or `49.99`.
- **Listing age.** On `GET /marketplace/search`, `days` is a whole number of days from `0` to `365`. With `q`, Facebook keeps listings of the current day and the previous `days` days by its own day boundary, which is not midnight UTC. Some listings can be older. With `category`, the result depends on the category: with `days=1`, `vehicles` returned listings up to 5.2 days old, but `toys` returned listings up to 210 days old. For a strict age window, compare each listing’s `created_time` with the window.
- **Property categories.** `propertyforsale` returns `501` `requires_auth`, because Facebook shows this category to guests as unavailable. If Facebook shows another category of its Marketplace navigation as unavailable, that category gets the same refusal. `propertyrentals` returned rentals together with other listings, such as sofas and handyman services. Each listing’s category is `marketplace_listing_category_id` in `data.marketplace_search.feed_units.nodes[].listing`.
- **Listing prices.** `price` is the exact amount as a decimal string. `price_text` is the formatted price with its currency symbol. Neither is converted.

A negative `radius`, a `min_price` above `max_price`, a `days` value above `365`, or only one of `lat` and `lng` returns `400` `bad_request`. On `GET /marketplace/location/render`, an `id` that names no Marketplace location, such as a page profile ID or a group ID, returns `404` `not_found`.

## Ad Library filters

[GET /ads/library](https://monsterapi.co/docs/api/facebook-ads#facebook-ad-summaries) and [GET /ads/library/page](https://monsterapi.co/docs/api/facebook-ads#facebook-ad-summaries-with-pagination) accept optional filters. The filters narrow a search by `q` or `page_id` and take the values of the Facebook Ad Library:

- **`active_status`**: `all` (default), `active`, or `inactive`.
- **`media_type`**: `all` (default), `image`, `meme`, `image_and_meme`, `video`, or `none` for ads without an image or a video.
- **`publisher_platforms`**: `facebook`, `instagram`, `audience_network`, `messenger`, `whatsapp`, or `threads`, comma-separated, such as `facebook,instagram`.
- **`content_languages`**: up to 50 lowercase language codes, comma-separated, such as `en,es`.
- **`page_ids`**: up to 50 advertiser page IDs, comma-separated. Take them from `ads[].author.id` in `GET /ads/library`.
- **`date_min` and `date_max`**: impression dates, `YYYY-MM-DD`. The range includes `date_min` and does not include `date_max`. For a range that ends on October 16, 2026, give `2026-10-17`.

The cursor does not carry the filters. With each `cursor`, pass the same `q`, `page_id`, or `ad_id`, the same `country`, and the same filters to `GET /ads/library/page`.

These filter values return `400` `bad_request`:

- a value that does not match the description of its parameter
- a repeated or empty value in a list
- a list longer than its limit
- a day that does not exist
- a `date_min` that is not earlier than `date_max`
- on `GET /ads/library` with `ad_id`, a `country` or a filter other than the defaults `country=ALL`, `active_status=all`, and `media_type=all`

A language code that Facebook does not know, such as `zz`, returns an empty list. Facebook can ignore a date range outside the last seven years and return the list without the date filter.

## Picture sizes

Picture `width` and `height` are reported in pixels. A requested size category does not guarantee fixed dimensions. Read the returned values.
The page picture’s `type` defaults to `large`. A page’s vanity name, such as `id=NASA`, identifies the page for this request.

## Comments and replies

[GET /comments/root](https://monsterapi.co/docs/api/facebook-comments#facebook-post-comments-first-page) returns the first page of comments of a post or video. [GET /comments/page](https://monsterapi.co/docs/api/facebook-comments#facebook-post-comments-with-pagination) continues it with `next_cursor`. Both return comments with `feedback_id` and `expansion_token`.
[GET /comments/replies](https://monsterapi.co/docs/api/facebook-comments#facebook-comment-replies) returns replies in the same form.
Pass the chosen comment’s `feedback_id` and `expansion_token` to `GET /comments/replies`, together with the `feed_location` used for the original comments request.

- **Use a fresh token.** An expired token or a token for another comment returns `400` `bad_request`. Request the comments again and use that comment’s new token.
- **Read reply relationships.** A reply to the comment has `depth: 1`. A reply to a reply has `depth: 2`. Its `parent_id` identifies the reply it answers.
- **Read reaction kinds.** `reactions_text` is the reaction count as a phrase, such as `1.2K`. `top_reactions` contains each listed kind’s `id` and whole `count`.

The listed reaction kinds can add up to less than the total. A kind’s `id` identifies it. `1635855486666999` represents `Like`.

### Comment views

`intent_token` on `GET /comments/root` and `GET /comments/page` selects the comment view. If you omit it, the view is Newest: all comments that Facebook shows guests, newest first (`REVERSE_CHRONOLOGICAL_UNFILTERED_INTENT_V1`).
Facebook offers guests two other views:

- **Most relevant** (`RANKED_FILTERED_INTENT_V1`) shows comments of friends and the most engaging comments first. Facebook removes some comments from this view.
- **All comments** shows all comments, including potential spam. For posts and videos of pages, its value is `RANKED_UNFILTERED_CHRONOLOGICAL_REPLIES_INTENT_V1`, a ranked view. For group posts, its value is `CHRONOLOGICAL_UNFILTERED_INTENT_V1`, oldest first. Facebook accepts this value for posts and videos of pages too.

Ranked views can repeat or skip comments between pages. Use each comment’s `id` to find and remove duplicates.
A `next_cursor` keeps the view of the response that gave it. A value that Facebook does not accept returns `400` `bad_request`.
`GET /video/hero` returns a page of comments and its `next_cursor` in the view that Facebook chooses: Most relevant for videos of pages. For all comments, newest first, start at `GET /comments/root` with `video.feedback_id`.

### Comment totals

`comments` in `GET /comments/root` is the total that Facebook gives for the post or video, replies included. `video.comments` in `GET /video/hero` gives the same total for a video.
The total can include comments that Facebook does not show guests, so a complete walk can return fewer comments. The walk is complete when a response has no `next_cursor`. `GET /comments/page` returns no total.

## Value formats

- **`created_at`** expresses the same time as `created_time` in ISO 8601, in UTC, such as `2026-09-10T09:26:54Z`.
- **`duration_seconds`** expresses video duration in seconds. `duration_ms` expresses it in milliseconds.
- **`cover_offset_x` and `cover_offset_y`** locate the cover’s focus point as percentages of its width and height.
- **`ranges`** marks the linked spans of `text`. `offset` and `length` count Unicode code points, not UTF-16 code units. In JavaScript, `Array.from(text).slice(offset, offset + length).join('')` selects a span.
- **Missing fields** are `null` when the endpoint’s schema declares them optional. A valid empty value stays empty.

## Guest limits and absent objects

A guest sees no edit time, so posts, videos, and reels carry none. `created_time` and `publish_time` describe different moments.
Forward continuation uses `next_cursor`. The timeline does not offer a `before` parameter.
Endpoints that take `cursor` ignore `limit`, but a `limit` that is not a whole number, or that is more than `200`, returns `400` `bad_request`. The number of records can differ between responses.
`user_likes` and `can_remove` are not returned for comments. A guest has not liked a comment and cannot remove it.

An absent object, or one that Facebook does not show guests, returns `404` `not_found`. The code does not tell these cases apart.
A list endpoint returns `200` with an empty list when a page of an existing object holds no records. If the response has `next_cursor`, continue with that cursor. If not, the list has ended.
These endpoints return `500` `upstream_shape` instead of an empty list: `GET /page/render/timeline`, `GET /page/render/reels`, `GET /events/place/render`, `GET /search/videos/render`, and `GET /search/people`.
A `404` is billed like other platform `4xx` responses. See [Pricing](https://monsterapi.co/docs/pricing).

A `location_id` that isn’t a city page, such as a page profile ID or an ID that doesn’t exist, returns `500` `upstream_shape` from `GET /events/place/page`. `GET /events/place/render` returns `503` `upstream_error` for such an ID, and in every measurement, a repeated request got the same refusal. Pass the ID of a city page.

For a page picture, use the page’s vanity name, such as `id=NASA`.
A person named by numeric identifier receives a placeholder picture with `is_silhouette: true`. A person named by vanity name, such as `id=zuck`, returns `404`.

## Limits and retries

Three limits can refuse a request. Each one has its own code.

- **The rate limit of your account.** One limit covers all API keys of your account and all platforms. If your account sends requests faster than its limit, the gateway returns `429` `too_many_requests`. Wait for the seconds in `Retry-After`: the whole seconds until the request fits the limit, never less than one. Then repeat the request. A refused request doesn’t count against the limit.
- **The limit of simultaneous requests of the service.** If the service handles too many requests at the same time, it returns `503` `overloaded`. This is rare. Repeat the request after a short pause, or send fewer requests at the same time.
- **Facebook’s limits.** Facebook limits how often a guest can get some information. At times, Facebook also asks a guest to sign in, even for public information. Both return `429` `rate_limited` with `Retry-After`: the wait that Facebook names, or `60` seconds. Repeat the request after that wait. Facebook doesn’t publish numbers for these limits, and they don’t depend on the rate limit of your account.

A page name that doesn’t exist can also return `rate_limited`, and each request for that name is billed. [GET /route](https://monsterapi.co/docs/api/facebook-route#facebook-path-identifiers) returns `404` `not_found` for such a name.

In the 30 days to October 15, 2026, these endpoints met Facebook’s limits most often: `GET /page/timeline`, `GET /page/header`, `GET /page/collection/list`, `GET /page/videos/page`, `GET /ads/library/page`, and the Marketplace endpoints.

The gateway returns `503` `unavailable` when it cannot complete its check, the account is suspended, or the platform does not answer. Repeat the request later, after `Retry-After` when the gateway sends it. If the refusal persists, contact support through the customer account.

Facebook’s `429` `rate_limited` is billed like other platform `4xx` responses. The gateway’s refusals and `503` `overloaded` aren’t billed. See [Errors](https://monsterapi.co/docs/errors) and [Pricing](https://monsterapi.co/docs/pricing).

Set the timeout of your client to at least 60 seconds. The service ends each request within about 45 seconds.
If your client closes the connection after the gateway let the request through, the request is billed.

### Response times

These response times were observed in production in the 30 days to October 15, 2026. They are not guarantees.

- **`GET /page/render/timeline`**: typically 4 to 5.5 seconds, 95th percentile about 17 seconds. A response held about 20 posts.
- **`GET /page/timeline`**: typically 1 to 1.5 seconds, 95th percentile about 6 seconds. A response holds up to three posts.
- **Other page and profile previews** (`GET /page/render`, `GET /page/render/reels`, `GET /page/render/contact`, `GET /page/render/transparency`, `GET /user/render`): typically 1.5 to 3.5 seconds, 95th percentile 6 to 8.5 seconds.
- **Video search** (`GET /search/videos`, `GET /search/videos/render`): typically about 3.5 seconds, 95th percentile 8 to 9 seconds.
- **Comments** (`GET /comments/root`, `GET /comments/page`): typically about 1.5 seconds, 95th percentile 3 to 5 seconds.
- **Most other endpoints**: typically 1 to 2 seconds, 95th percentile 4 to 7.5 seconds.

## Public examples

Use the [API reference](https://monsterapi.co/docs/api) for ready-made public inputs and response examples.
Read [Examples](https://monsterapi.co/docs/examples) for provenance, preparation costs, task recipes, and pagination stop rules.
