# Breaking changes

Canonical: https://monsterapi.co/docs/breaking-changes

MonsterAPI launched on October 10, 2026. This page lists changes to its public API.

## October 20, 2026

### Facebook 17.0.0

- **Facebook’s limits and sign-in prompts return 429 `rate_limited`.** If Facebook limits a guest or asks a guest to sign in, every Facebook operation now returns `429` `rate_limited`. Before, it returned `503` `rate_limited`, as other platforms still do. The `code`, the message, and `Retry-After` don’t change: `Retry-After` gives the wait that Facebook names, or `60` seconds. Repeat the request after that wait. If your client detects this refusal by its status, check Facebook responses for `429` instead of `503`.
- **A Facebook `rate_limited` is now billed.** The `429` is billed like other platform `4xx` responses, and the `503` wasn’t. 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. See [Pricing](https://monsterapi.co/docs/pricing).
- **The gateway’s 429 is a different refusal.** If your account sends requests faster than its rate limit allows, the gateway returns `429` `too_many_requests`. This refusal isn’t billed. Its `Retry-After` gives the whole seconds until the request fits the limit. Facebook’s limits don’t depend on the rate limit of your account. Tell the two refusals apart by `code`.
- **The specification declares both 429 refusals.** In the [API reference](https://monsterapi.co/docs/api), the `429` response of every Facebook operation now has two models: `FacebookTooManyRequestsBody` for `rate_limited` and `GatewayErrorBody` for `too_many_requests`. A response carries one of them. The `503` response no longer lists `rate_limited`. Regenerate clients that you build from the specification.
- **Requests remain unchanged.** Routes, parameters, and cursor rules don’t change.

### Facebook 16.0.0

- **A Facebook server error returns 503 `upstream_error`.** If Facebook answers with a server error, every endpoint now returns `503` `upstream_error` with `Retry-After: 5`. Before, it returned `500` `upstream_shape`. Repeat the request after five seconds. A `500` `upstream_shape` now means only that the service couldn’t read Facebook’s answer.
- **Some requests for absent objects return 404 `not_found`.** These requests now return `404` `not_found` instead of `500` `upstream_shape`. Handle the `404` as an absent object, and don’t repeat the request. The `404` is billed like other platform `4xx` responses, and the `500` wasn’t. See [Pricing](https://monsterapi.co/docs/pricing).
  - [GET /photo](https://monsterapi.co/docs/api/facebook-post#facebook-photo-details-and-neighbors) with the ID of a page profile, a video, or an occurrence of a recurring event as `fbid`
  - [GET /route](https://monsterapi.co/docs/api/facebook-route#facebook-path-identifiers) for some paths that Facebook shows as unavailable, such as `/NASA/reviews/`
  - [GET /marketplace/location/render](https://monsterapi.co/docs/api/facebook-marketplace#facebook-marketplace-location-details) with an `id` that names no Marketplace location, such as an ID that doesn’t exist, a page profile ID, or a group ID
- **Place events refuse an ID that isn’t a city page.** For a `location_id` that isn’t a city page, such as a page profile ID, these endpoints now return an error. Pass the ID of a city page.
  - [GET /events/place/page](https://monsterapi.co/docs/api/facebook-events#facebook-place-events-with-pagination) returns `500` `upstream_shape`. Before, it returned `200` with `events` set to null. A city page without events still returns `200` with an empty `events` list.
  - [GET /events/place/render](https://monsterapi.co/docs/api/facebook-events#facebook-place-details-and-event-previews) returns `503` `upstream_error`, because Facebook answers such an ID with a server error. Before, it returned `500` `upstream_shape`. In every measurement, a repeated request with such an ID got the same refusal. If the refusal repeats, check that `location_id` names a city page.
- **Ad lookups by `ad_id` refuse search filters.** With `ad_id`, [GET /ads/library](https://monsterapi.co/docs/api/facebook-ads#facebook-ad-summaries) takes no `country` and no filter other than the defaults `country=ALL`, `active_status=all`, and `media_type=all`. Any other value returns `400` `bad_request`. Before, the lookup ignored these values and returned the ad. Remove them from lookups by `ad_id`. [GET /ads/library/page](https://monsterapi.co/docs/api/facebook-ads#facebook-ad-summaries-with-pagination) doesn’t change.
- **`propertyforsale` returns 501 `requires_auth`.** [GET /marketplace/search](https://monsterapi.co/docs/api/facebook-marketplace#facebook-marketplace-listing-search) with `category=propertyforsale` now returns `501` `requires_auth`, because Facebook shows this category to guests as unavailable. Before, it returned `200` with listings of other categories or without listings. If Facebook shows another category of its Marketplace navigation as unavailable, that category gets the same refusal. Leave such a category out of your searches. A category that the navigation doesn’t list, such as `bicycles`, works as before.
- **Marketplace search pages can repeat listings.** The description of `cursor` on `GET /marketplace/search` now says that a listing can appear on more than one page. The search works as before. In six walks of three pages by category around San Francisco and London, nine of 402 listings repeated a listing of an earlier page. To count each listing once, compare `listings[].id`.
- **Routes and parameters remain the same.** No route or parameter is added or removed. Cursor rules don’t change.

### Facebook 15.5.0

- **Category searches continue to later pages.** [GET /marketplace/search](https://monsterapi.co/docs/api/facebook-marketplace#facebook-marketplace-listing-search) now accepts the `next_cursor` of a search by `category` as `cursor`. Before, in 15.3.0 and 15.4.0, such a request returned `400` `bad_request`.
- **Marketplace descriptions state measured results.** `category`, `radius`, `days`, and the cursor of `GET /marketplace/browse` work as before. Their descriptions now say this:
  - On `GET /marketplace/search` with `category`, the effect of `radius` depends on the category. Listings of some categories, such as `toys`, stayed near the radius. `vehicles`, `classifieds`, `office-supplies`, `pets`, and `propertyforsale` returned listings far outside it. For example, with `radius=1`, `vehicles` returned a listing 62 km from the center. Before, the description said that Facebook applies `radius` to category searches.
  - With `category`, the effect of `days` depends on the category too. With `days=1`, `vehicles` returned listings up to 5.2 days old, and `toys` returned listings up to 210 days old. Before, the description said that Facebook doesn’t apply `days` to category searches.
  - `propertyforsale` returned no property for sale. Around San Francisco, it returned listings of other categories and repeated some of them on the same page. Around London, it returned no listings. `propertyrentals` returned rentals together with other listings, such as sofas and handyman services.
  - A listing can appear on more than one page of [GET /marketplace/browse](https://monsterapi.co/docs/api/facebook-marketplace#facebook-marketplace-nearby-listings). To count each listing once, compare `listings[].id`.
- **Requests remain unchanged.** Routes and parameters don’t change. Searches by `q` and `GET /marketplace/browse` take their cursors as before.

### Facebook 15.4.0

- **Category searches around US locations no longer fail.** [GET /marketplace/search](https://monsterapi.co/docs/api/facebook-marketplace#facebook-marketplace-listing-search) with `category` no longer returns `500` `upstream_shape` for an area in the United States. Before, about two thirds of these searches returned this error, and some of the others took about 10 seconds.
- **Requests remain unchanged.** Routes, parameters, and cursor rules don’t change.

## October 19, 2026

### Facebook 15.3.0

- **Category searches return the requested category.** [GET /marketplace/search](https://monsterapi.co/docs/api/facebook-marketplace#facebook-marketplace-listing-search) with `category` now returns listings of that category for each category that Facebook’s Marketplace navigation lists, except `propertyforsale`. The description of `category` lists them. Before, searches for categories such as `home` and `toys` returned listings of the `electronics` category.
- **Nearby listings have their titles, places, and photos.** In [GET /marketplace/browse](https://monsterapi.co/docs/api/facebook-marketplace#facebook-marketplace-nearby-listings), every listing now has `title`, `currency`, `location`, `city`, `region`, `location_id`, and `thumbnail` when Facebook gives them. Before, some listings had only `id` and their creation time, and these fields were null. The other fields of these listings stay null, including `price` and `price_text`.
- **Price and radius descriptions are clarified.** The fields and the filter work as before. The descriptions now say this:
  - `price` is null when Facebook gives no decimal price for a listing, and `price_text` is null when Facebook gives no formatted price. For example, some listings of `GET /marketplace/browse` have their price only in `data.marketplace_home_feed.nodes[].data.price`, as `amount_with_offset` `200000` for $2,000.00.
  - On `GET /marketplace/browse`, Facebook can return listings outside the radius. For a strict area, compare the coordinates of each listing with the center.
- **Requests remain unchanged.** Routes, parameters, and cursor rules don’t change.

### Facebook 15.2.0

- **Video search returns titles of compact previews.** In [GET /search/videos](https://monsterapi.co/docs/api/facebook-search#facebook-video-search-with-pagination), compact previews now have `title` and `text`. Before, both were null. If a video has no title, `title` has the same value as `text`. Compact previews of [GET /search/videos/render](https://monsterapi.co/docs/api/facebook-search#facebook-video-search-previews) still have no title.
- **Compact video previews have another form in `data`.** In `data` of `GET /search/videos`, compact previews now come in Facebook’s list form instead of its grid form. Their `rendering_strategy.__typename` is `SearchVideoRenderingStrategy` instead of `SearchVideoGridViewRenderingStrategy`, and their thumbnails come in another size. The list form keeps the fields of the grid form and adds others. If your client selects compact previews by `__typename`, accept the new value.
- **New fields.** This release adds these fields:
  - Results of `GET /search/videos` have `duration_text`, the duration as Facebook shows it, such as `2:06`. It’s null when the result shows no duration. For the exact duration, request [GET /video/hero](https://monsterapi.co/docs/api/facebook-post#facebook-video-details-by-id).
  - Listings of [GET /marketplace/search](https://monsterapi.co/docs/api/facebook-marketplace#facebook-marketplace-listing-search) and [GET /marketplace/browse](https://monsterapi.co/docs/api/facebook-marketplace#facebook-marketplace-nearby-listings) have `city`, `region`, and `location_id`. `city` and `region` give the city and the state or region of the listing. `location_id` is the ID of the Marketplace location named in `location`, which can differ from `city`. Pass it as `id` to [GET /marketplace/location/render](https://monsterapi.co/docs/api/facebook-marketplace#facebook-marketplace-location-details) for the coordinates of that location. In [GET /marketplace/item](https://monsterapi.co/docs/api/facebook-marketplace#facebook-marketplace-listing-details), the three fields are null.
- **Marketplace filter descriptions are clarified.** The filters work as before. The descriptions now say how Facebook applies them on `GET /marketplace/search`:
  - With `category`, Facebook applies `radius`. With `q`, it can return listings far outside the radius.
  - With `q`, Facebook applies `days` by its own day boundary and can add older listings. With `category`, it doesn’t apply `days`.
  - For a strict area or age window, check each listing. Compare its `created_time` with the window. In the results of `GET /marketplace/search` and `GET /marketplace/browse`, `latitude` and `longitude` are null. `GET /marketplace/location/render` gives the coordinates of the location that `location_id` names, and `GET /marketplace/item` gives the coordinates of one listing.
- **Requests remain unchanged.** Routes, parameters, and cursor rules don’t change.

### Facebook 15.1.0

- **An occurrence of a recurring event has its own URL.** For an occurrence of a recurring event, `event.url` in [GET /events/header](https://monsterapi.co/docs/api/facebook-events#facebook-event-identity-and-schedule) is the URL of that occurrence, which opens its date. Before, it was the URL of the series with `event_time_id`, which opened another date. For a single event and for a series, the value doesn’t change. The URL of the series stays in `data`.
- **New fields.** This release adds these fields:
  - Reviews in [GET /page/reviews](https://monsterapi.co/docs/api/facebook-page#facebook-page-reviews-first-page) and [GET /page/reviews/page](https://monsterapi.co/docs/api/facebook-page#facebook-page-reviews-with-pagination) have `recommendation_text`: Facebook’s sentence that tells whether the author recommends the page. Posts of other endpoints have the field too, and it’s always null there.
  - [GET /route](https://monsterapi.co/docs/api/facebook-route#facebook-path-identifiers) names `topic_id` and `section_id` for a video topic path. Pass both to [GET /watch/topic](https://monsterapi.co/docs/api/facebook-watch#facebook-video-topic-sections).
  - [GET /page/section](https://monsterapi.co/docs/api/facebook-page#facebook-page-section-contents) names the collections of a section in `section.collections`, each with `id`, `name`, and `url`.
- **Requests remain unchanged.** Routes, parameters, and cursor rules don’t change.

### Facebook 15.0.0

- **Comments default to the Newest view.** Without `intent_token`, [GET /comments/root](https://monsterapi.co/docs/api/facebook-comments#facebook-post-comments-first-page) and [GET /comments/page](https://monsterapi.co/docs/api/facebook-comments#facebook-post-comments-with-pagination) return all comments that Facebook shows guests, newest first. Before, Facebook chose the view: Most relevant for posts and videos of pages, and oldest first for group posts in the `GROUP_PERMALINK` context. To keep a previous view, pass `RANKED_FILTERED_INTENT_V1` or `CHRONOLOGICAL_UNFILTERED_INTENT_V1` as `intent_token`. A complete walk can take more pages than before.
- **A comment view that Facebook refuses returns an error.** If Facebook does not accept `intent_token`, both endpoints return `400` `bad_request`. Before, they returned `200` without comments. If Facebook does not accept the default view, they return `500` `upstream_shape`.
- **The first page of comments has its own model.** `GET /comments/root` returns `FacebookFirstCommentPage`, which adds the total in `comments`. `GET /comments/page` keeps `FacebookCommentPage`. Regenerate clients that use these model names.
- **An empty page returns 200.** A page of an existing object without records returns `200` with an empty list. Before, such a page without `next_cursor` returned `404` `not_found`. A `404` now means that the object is absent. End a walk when a response has no `next_cursor`. This applies to these endpoints:
  - `GET /page/timeline`, `GET /page/section`, `GET /page/videos`, `GET /page/videos/page`, `GET /page/collection/photos`, `GET /page/collection/reels`, and `GET /page/collection/list`
  - `GET /comments/root`, `GET /comments/page`, and `GET /comments/replies`
  - `GET /watch/section`, `GET /search/videos`, and `GET /search/events`
  - `GET /ads/library` and `GET /ads/library/page`
  - `GET /marketplace/browse`, `GET /marketplace/search`, and `GET /events/place/page`
- **Sign-in prompts return 503 `rate_limited`.** If Facebook asks a guest to sign in, every endpoint returns `503` `rate_limited` with `Retry-After`. Before, it returned `501` `requires_auth`. The same change applies when Facebook answers with HTTP `429` or blocks guest access for a time. `Retry-After` gives the wait that Facebook names, or `60` seconds. Repeat the request after that wait. A page name that does not exist can also return `rate_limited`. [GET /route](https://monsterapi.co/docs/api/facebook-route#facebook-path-identifiers) returns `404` `not_found` for such a name.
- **A videos page of a profile returns 404.** [GET /page/videos/page](https://monsterapi.co/docs/api/facebook-page#facebook-page-videos-with-pagination) with an identifier that is not a page, such as a profile identifier, returns `404` `not_found`. Before, it returned `200` without videos.
- **Shared posts keep their own text.** A post that shares another post holds that post in the new `shared` field, with its author, text, links, and media. The `text` and `ranges` of the sharing post are its own. Without a text of its own, `text` is null and `ranges` is empty. Before, they showed the text or the links of the shared post. This applies to `GET /page/timeline`, `GET /page/render/timeline`, `GET /page/render`, `GET /user/render`, `GET /group/render`, `GET /group/post/render`, and `GET /post/dialog`.
- **Ad lookups by `ad_id` report a missing ad.** If Facebook states that the ad does not exist, [GET /ads/library](https://monsterapi.co/docs/api/facebook-ads#facebook-ad-summaries) with `ad_id` returns `404` `not_found`. If Facebook answers without that ad, the response is `500` `upstream_shape`. Before, each case returned either `404` or `200` with `ad` set to null.
- **Marketplace price filters are amounts.** [GET /marketplace/search](https://monsterapi.co/docs/api/facebook-marketplace#facebook-marketplace-listing-search) reads `min_price` and `max_price` in the currency of the search, such as `50` for 50 US dollars. Before, the value was in hundredths of that amount, so `5000` meant 50 US dollars. If your client sent hundredths, divide its values by 100. These prices return `400` `bad_request`:
  - a price with a sign
  - a price without a digit before or after its decimal point, such as `.5` or `5.`
  - a price that is not a multiple of `0.01`
  - a price above `2147483647`
  - a price longer than 32 characters
- **Marketplace filters are checked before the search.** `days` is a whole number from `0` to `365`, and the specification declares it as an integer. Other values return `400` `bad_request`. Before, a request with `days` returned `503` `upstream_stale`. A negative `radius` on [GET /marketplace/browse](https://monsterapi.co/docs/api/facebook-marketplace#facebook-marketplace-nearby-listings) or `GET /marketplace/search` returns `400` `bad_request`. On `GET /marketplace/search`, so does a `min_price` above `max_price`. Before, Facebook answered such requests with listings that nobody asked for.
- **The event header has its own model.** [GET /events/header](https://monsterapi.co/docs/api/facebook-events#facebook-event-identity-and-schedule) returns `event` as `FacebookEventHeader` instead of `FacebookEventCard`. The model adds `current_start_time` and `current_start_text`: the occurrence that Facebook shows for a recurring event. Regenerate clients that use these model names.
- **The specification declares the accepted parameter values.** Parameters declare their patterns, lengths, bounds, and examples, so a client generated from the specification can refuse a value before it sends the request. `feed_location`, `type` of `GET /page/picture`, and `video_menu_location` are enumerations: in such a client, they take only the listed values. The declarations themselves do not change the values that the service accepts. Other items of this release describe the changes to accepted values.
- **New endpoints and fields.** This release adds these endpoints, fields, and parameters:
  - [GET /group/feed](https://monsterapi.co/docs/api/facebook-groups#facebook-group-posts-by-group-id) continues the posts of [GET /group/render](https://monsterapi.co/docs/api/facebook-groups#facebook-group-details-and-posts), which now returns `next_cursor`. [GET /group/render/about](https://monsterapi.co/docs/api/facebook-groups#facebook-group-history-rules-and-activity) returns the history, rules, and activity of a group.
  - [GET /page/transparency](https://monsterapi.co/docs/api/facebook-page#facebook-page-owner-history-and-managers) returns the owner, the name history, and the managers of a page.
  - [GET /profile/about](https://monsterapi.co/docs/api/facebook-page#facebook-profile-about-section) returns one About section of a page or a person.
  - [GET /page/reviews](https://monsterapi.co/docs/api/facebook-page#facebook-page-reviews-first-page), [GET /page/reviews/page](https://monsterapi.co/docs/api/facebook-page#facebook-page-reviews-with-pagination), and [GET /page/reviews/rating](https://monsterapi.co/docs/api/facebook-page#facebook-page-rating) return the reviews and the rating of a page.
  - [GET /album](https://monsterapi.co/docs/api/facebook-post#facebook-album-details-and-photos) and [GET /album/photos](https://monsterapi.co/docs/api/facebook-post#facebook-album-photos-with-pagination) return an album and its photos.
  - [GET /watch/topics](https://monsterapi.co/docs/api/facebook-watch#facebook-video-topics) and [GET /watch/topic](https://monsterapi.co/docs/api/facebook-watch#facebook-video-topic-sections) return the video topics and the video sections of a topic.
  - `GET /ads/library` and `GET /ads/library/page` accept the filters `active_status`, `media_type`, `publisher_platforms`, `content_languages`, `page_ids`, `date_min`, and `date_max`.
  - `GET /route` names `classic_id`, `group_id`, `post_id`, `section_token`, and `collection_token`, and accepts a path without its leading `/`.
  - Posts name `story_id` and `feedback_id`. Videos and reels name `feedback_id` too: `video.feedback_id` in `GET /video/hero`, `reel.feedback_id` in `GET /reel`, and `reels[].feedback_id` in `GET /page/render/reels` and `GET /page/collection/reels`.
  - `GET /comments/root` and `GET /video/hero` give the comment total. `website_details` records add `expanded_url`.
  - `GET /photo` accepts `set=pcb.{post_id}`. `GET /marketplace/search` accepts `lat` and `lng`. `GET /page/section` accepts a request without `collection_token`.

## October 13, 2026

### Pinterest 0.1.3

- **The Pinterest API is available.** The platform adds 21 GET operations that read public profiles, pins, boards, comments, search results, pages, and media. Read the routes, parameters, response fields, and prices in the [API reference](https://monsterapi.co/docs/api).

## October 10, 2026

### Facebook 14.3.0

- **Video search includes more available details.** [Video search](https://monsterapi.co/docs/api/facebook-search#facebook-video-search-with-pagination) and [video previews](https://monsterapi.co/docs/api/facebook-search#facebook-video-search-previews) include metadata text, author details, engagement counts and labels, and video properties.
- **Unavailable values remain null.** Metadata text can contain rounded counts. Use `view_count` for exact views. `play_count` remains available as a compatibility counter.
- **Publication times retain their meaning.** `created_time` uses the post publication time, with video publication time as its fallback. `video.publish_time` gives the video publication time.
- **Requests remain unchanged.** Existing routes, parameters, operation IDs, and cursor rules remain unchanged.

### YouTube 0.4.0

- **Update response readers for the new resource contract.** The existing YouTube operations now return resource objects. The `data` property is removed. Text values are plain strings. Read resource fields and business record types from the [API reference](https://monsterapi.co/docs/api).
- **Requests and prices remain unchanged.** The 13 GET routes retain their parameters, cursor rules, and prices. Links, mentions, authors, badges, records, and metadata remain available in the documented resource fields.

### YouTube 0.3.0

- **The response omits selected display and logging settings.** Named fields, links, images, identifiers, mentions, pinned state, records, and cursors remain available. Text values retain complete text parts, links and mention information when available.

### TikTok 0.9.21

- User list pagination uses the supplied continuation cursor.

### TikTok 0.9.20

- **Incomplete Full feed responses return 503.** [GET /mobile/full/feed](https://monsterapi.co/docs/api/tiktok-publications#tiktok-for-you-publications) returns `503` `upstream_error` for an incomplete response. This response does not end the feed.

### TikTok 0.9.19

- **Likes counts retain valid values.** If a valid integer or decimal string is available, the `named` likes-count fields retain that value. Values keep their source type.

### TikTok 0.9.16

- **Empty Full feed pages now return 503.** [GET /mobile/full/feed](https://monsterapi.co/docs/api/tiktok-publications#tiktok-for-you-publications) returns `503` `upstream_error` for an empty first page or continuation page. This response does not end the list.
