This page records customer-visible API changes and deprecations, newest first.

> Scope: entries begin at 2026-09-01. Earlier releases were not maintained in a
> customer-facing changelog.

## 2026-10-03 — Google Maps place details (v0.1.26)

`googlemaps.place` and `googlemaps.enrich` now return complete place details,
including opening hours and the review count, for listings that publish them,
instead of failing when the first response omitted those fields. `googlemaps.nearby`
can add an exclusion summary — the count of results outside the requested radius —
without claiming to list them all.

## 2026-10-03 — Google Maps search location inputs (v0.1.26)

`googlemaps.search` now refuses a request that supplies both a text `location`
and `lat`/`lng` at the same time, returning `invalid_input` that names the
conflict. Use one location mode: a text `location`, or a complete `lat`+`lng`
pair (with optional `zoom`). A single coordinate, or `zoom` without coordinates,
is still refused.

## 2026-10-03 — Facebook video detail from a page's Videos tab (v0.5.6)

`facebook.page-videos.list` returns each video's public URL. That exact URL now
works when sent to `facebook.video.get`, so a page's video list chains straight
into a video's details. No input or output fields changed.

## 2026-10-03 — Facebook API docs: backup routes removed

The Facebook OpenAPI document and LLM prompt no longer list the background-backup
endpoints or the board/pin wording, which do not apply to Facebook. Pinterest's
backup contract is unchanged.

## 2026-10-02: Carrefour pasted links, search query, coordinates and prices

**Carrefour API input and price handling**

- Product links accept a scheme-less storefront URL and ignore a copied tracking
  query or fragment for identity; the product is resolved from the trusted path
  only, never by following the link.
- `carrefourksa.products.search` requires an explicit `query`; an omitted query
  is refused instead of defaulting to milk.
- A single explicit latitude or longitude is refused (`invalid_input`); provide
  both or neither.
- Listing `price` is `null` when upstream gives no price; a genuine zero is kept.

## 2026-10-02: Blinkit missing values and merchant coverage; JioMart paging and inputs

**Blinkit API missing values and sampled merchant coverage**

- `price`, `mrp`, the promotions product price and `eta_in_minutes` are now
  `null` when Blinkit shows no value, instead of `0`. A real zero is unchanged.
  Check any sum, average or stock test that treated `0` as a real value.
- New capability `blinkit.merchant.coverage`: sampled serving-merchant coverage
  for a bounded area, one row per observed merchant; physical store addresses,
  radius and opening state are not offered.

**JioMart API pagination and input handling**

- Paging is repaired for numeric and cursor pages, including past-the-end pages,
  on search, products list, collection products and home.
- Location validation and product-output contracts are corrected; invalid input
  is refused before any upstream request.


## 2026-10-02: Swiggy Instamart filters, links and location inputs

The Swiggy Instamart API supports search and category filters, product and
category links as input, more ways to specify a delivery location, and
whole-number prices in paise. Existing requests keep working unless a line below
says otherwise.

**Check these if you use them.**

- Location: categories, category listings, search and product details take a
  `store_id`, a six-digit `pincode`, or both `lat` and `lng`. Sending only one
  coordinate is refused with `invalid_input`. A PIN code now wins over
  coordinates (a store still wins over both).
- `swiggy-instamart.location.serviceability` and `swiggy-instamart.eta`: an
  address Instamart does not serve now returns `serviceable: false` with no
  store or ETA, instead of an error. `address` is no longer required; give
  coordinates or a `pincode`.
- Errors: an unknown place, an unknown store and an empty suggestion list now
  return `not_found` instead of an upstream error.
- `swiggy-instamart.products.search`: each result has a `result_type`
  (`match`, `promoted`, `sold_out_collection` or `other`), and only `match`
  results get a rank `position`.
- Paging: pass `next_offset` back unchanged with the same location, store,
  query, sort and filters; a changed context refuses the continuation. Search
  and home skip products already returned on earlier pages, and stop with
  `pagination_status: "limited"` and `pagination_reason: "history_limit"` when
  that history is full. Old `page:items` category offsets work only without
  sort or filters.

**New.**

- `swiggy-instamart.products.search` and
  `swiggy-instamart.category.products.list`: `sort`, and filters `brands`,
  `types` and `min_rating`. Numeric sorts order the products within each page;
  they do not reorder across pages. Listings can add `available_filters` and
  `result_count` when Instamart provides them.
- Product and category links as input: `product_url` on
  `swiggy-instamart.product.get`, `category_url` on
  `swiggy-instamart.category.products.list`. A category listing no longer needs
  `category_name` and `taxonomy_type`: a link, or a name alone, is enough.
- `pincode` on `swiggy-instamart.home.list`, `swiggy-instamart.search.suggestions`,
  `swiggy-instamart.location.serviceability` and `swiggy-instamart.eta`; `lat`
  and `lng` on categories, category listings, search and product details.
  `swiggy-instamart.home.list` now works with coordinates alone.
- Products add whole-number prices in paise (`offer_price_paise` and
  `mrp_paise`, where a zero price is kept and an unknown one is left out;
  `discount_paise` appears only when there is a discount), a numeric
  `rating_value` (0 to 5), and links `product_url`, `image_url` and, on
  variations, `image_urls`.

## 2026-10-02: Zepto search and category listings

Zepto (`zepto-scraper` v0.1.28) is live with filters, cursors and clearer
location context. Existing requests keep working unless a line below says
otherwise.

**Check these if you use them.**

- Location: send either a `pincode` or both `latitude` and `longitude`, or
  neither for the default store. A PIN code together with coordinates, or only
  one coordinate, is now refused with `invalid_input`. Coordinates must be in
  range (−90 to 90, −180 to 180).
- `zepto.category.products`: `page` now means a slice of matching products
  (`page` × `limit` rows in), not Zepto's own page. Deep pages can run out of
  pages to read before they return rows. To walk a category in order, pass the
  `next_cursor` from each response as `cursor`.
- `zepto.search` and `zepto.category.products`: `page` and `page_number` no
  longer default to a value; leave both out for the first page. Search pages
  go up to 99999, category pages up to 100000.
- Links must be HTTPS links on zepto.com or zeptonow.com (a link without a
  scheme is read as HTTPS); other hosts, explicit ports and credentials are
  refused. IDs must be well formed. Both fail with `invalid_input`.
- A malformed `cursor` is refused before any upstream request. A cursor whose
  page has changed since you received it is refused with `invalid_input`;
  start the listing again. Catalog cursors issued before this version may also
  be refused.

**New.**

- `zepto.search` and `zepto.category.products`: filter by `brand_ids` or
  `brand_names`, `min_price_paise`, `max_price_paise`, `min_discount` and
  `in_stock`, and continue with `cursor`. `zepto.search` also accepts a Zepto
  search `url`.
- `sort: price_asc` or `price_desc` orders only the products returned in each
  response (`sort_scope: bounded_sample`), not the whole listing.
- Listing responses add `next_cursor`, `stop_reason` (why the listing
  stopped), `applied_filters`, `rows_scanned`, `sample_size` and `sort_scope`.
- `context` (`store_id`, `source`: the store that answered) is added to
  `zepto.search`, `zepto.category.products`, `zepto.categories`,
  `zepto.catalog`, `zepto.product`, `zepto.ads` and `zepto.search.facets`.
  `zepto.eta` adds `eta_available`.
- A selling price, available quantity (including ads' `items_left`), discount
  percent or `eta_minutes` that Zepto reports as zero is now returned as zero
  instead of being dropped; unknown values are still left out.

## 2026-10-02: Platform updates released since 21 September

A catch-up of the scraper changes that reached the live API between 21
September and 2 October. Most are new optional inputs and new capabilities;
existing requests keep working unless a line below says otherwise. Each
capability's page in these docs has the full current inputs and outputs.

**Check these if you use them.**

- Are.na `arena.search`: `type` no longer accepts `blocks`; use `all`,
  `channels` or `users`. `arena.channel.blocks-list` now returns one page per
  call, with new `page` and `limit` inputs.
- Instagram `instagram.highlights.list` returns at most 10 highlights per call
  and no longer takes `cursor`.
- Internshala `internshala.internships.list` and `internshala.jobs.list` accept only the stipend and
  salary values the site offers (for example `min_stipend` 0, 2000, 4000,
  6000, 8000 or 10000); other values are refused with `invalid_input`.
- Zomato `zomato.restaurants.all` no longer takes `concurrency`, `max_cells`
  or `step_km`. `zomato.restaurant.reviews` needs `limit` of at least 5.
- YouTube list capabilities (`channel-videos`, `channel-shorts`,
  `channel-live`, `channel-playlists`, `channel-community`, `comments.list`,
  `playlist.get`, `search.query`) now default to `limit` 100 and `max_pages` 5
  when you leave them out. Set them to get more.
- Temporarily unavailable while we restore them: `bluesky.feed.search_posts`,
  `builtwith.domain.profile`, `tiktok.shop.product.get` and
  `web.page.screenshot`.

**Renamed, with the old names still working.** Requests that use the old
name are served by the new one.

- Meesho: `catalog.search`, `catalog.categories`, `catalog.filters`,
  `catalog.popular_searches`, `catalog.search_suggestions` and
  `product.reviews` are now `meesho.catalog.search` and so on, and
  `meesho.product.reviews`.
- Swiggy Instamart: the `instamart.*` capabilities are now
  `swiggy-instamart.*` (for example `swiggy-instamart.home.list`).
- Google Maps: `enrich.google-maps` is now `googlemaps.enrich`.

**New capabilities.**

- Facebook: `facebook.event.get`, `facebook.group.get`,
  `facebook.page-about.get`, `facebook.page-events.list`,
  `facebook.page-photos.list` and `facebook.video-transcript.get`.
- Flipkart: `flipkart.category.products`.
- JioMart: `jiomart.fulfillment.get` and `jiomart.product.availability.scan`.
- LinkedIn: `linkedin.company.posts`, `linkedin.company.search` and
  `linkedin.post.transcript.get`.
- Swiggy Instamart: search, product, categories, category products, delivery
  time and serviceability (`swiggy-instamart.products.search`,
  `.product.get`, `.categories.list`, `.category.products.list`, `.eta`,
  `.location.serviceability`).
- Zepto: `zepto.catalog`, `zepto.catalog.multi_location`, `zepto.eta`,
  `zepto.search.facets` and `zepto.search.multi_location`.
- Zomato: `zomato.restaurant.delivery`, `zomato.restaurant.menu_images` and
  `zomato.restaurant.offers`.
- Instagram: `instagram.highlights.list`, `instagram.profile-posts.list` and
  `instagram.reels.list` are available again.

**New optional inputs.**

- Amazon: `marketplace` on product and search.
- ASDA: `include_raw`, and `active_only` on search, category products and
  promotions.
- Blinkit: every capability accepts a `pincode` or a `location_query` instead
  of coordinates (coordinates are checked to be valid latitude and longitude);
  product and category links as input (`product_url`, `category_url`);
  `brand`/`brands` filters on search and category products; `include` to add
  optional detail; `category_id` on categories; and promotion filters
  (`deal_type`, including `any_promotion`, `min_discount_percent`,
  `max_price`, `query`, `subcategory_id`, `max_scan`).
- Facebook: `active_status` and `country` on `facebook.ads-library.search`;
  `view` on `facebook.page-videos.list`.
- Flipkart: `sort`, `filters`, `min_price` and `max_price` on search
  listings; `include_filters` and `max_filter_values` on search categories.
- Google Trends: `category_id` on `google_trends.trending.list`.
- Greenhouse: `location` on job search; `include_pay_transparency` on job
  details.
- Instahyre: `max_pages` and `offset` on company jobs;
  `include_experience` and `max_detail_requests` on job search;
  `include_page_metadata` on job details.
- Instagram: `recent_posts_limit` on profiles; higher limits on comments
  (`limit` up to 2,000, `max_pages` up to 150) and trending reels
  (`max_pages` up to 25); topics report `media_count` and `source`.
- Internshala: `max_results` on internships and jobs.
- JioMart: product details by `product_id` or `url`.
- LinkedIn: company jobs by `company_name`, `company_url` or `keywords`, with
  `max_pages`; `max_pages` on job search, and both report `pages_fetched`,
  `pages_attempted`, `stop_reason` and `page_error`; `max_comments` on posts;
  `include_structured_data` on jobs; articles report `published_text` and
  `published_at_precision`; newsletters report `author_url`.
- Swiggy: menus by `restaurant_url`.
- YouTube: comment `sort`, and replies with `parent_comment_id` and
  `replies_continuation`.
- Zepto: `pincode` on every location-aware capability; `page` on search and
  category products.
- Zomato: `restaurant_id` on restaurant capabilities; `latitude` and
  `longitude` on search and restaurant lists; `cursor` on search; `sort`,
  `filter` and `page` on reviews.

Several other platforms received reliability fixes with no change to their
inputs or outputs.

Module versions now live: `amazon` v0.3.0, `arena` v0.6.3, `asda` v0.3.1, `ashby` v0.1.2, `blinkit` v0.7.8, `bluesky` v0.1.4, `builtwith` v0.1.6, `chatgpt` v0.2.12, `ebay` v0.5.3, `facebook-ads` v0.4.7, `facebook` v0.5.5, `flipkart` v0.3.0, `gemini` v0.3.16, `google-ads` v0.1.15, `google-trends` v0.1.8, `googlemaps` v0.1.21, `greenhouse` v0.3.0, `ikea` v0.1.10, `instagram` v1.5.7, `instahyre` v0.1.8, `internshala` v0.1.7, `jiomart` v0.2.4, `lidl` v0.2.7, `linkedin` v1.6.0, `linktree` v0.3.2, `meesho` v0.5.5, `mmt` v0.3.5, `morrisons` v0.2.2, `nana` v1.3.9, `ninja` v0.2.2, `parkwhiz` v0.2.2, `pepperfry` v0.3.6, `producthunt` v0.1.13, `reddit` v0.3.0, `redfin` v0.2.5, `spothero` v0.2.2, `swiggy-instamart` v0.2.4, `swiggy` v0.1.12, `tata-1mg` v0.2.6, `tesco` v0.2.1, `threads` v0.4.1, `tiktok-ads` v0.3.7, `tiktok` v1.2.4, `trustpilot` v0.2.2, `tumblr` v0.6.3, `uniqlo` v0.1.4, `universal-web` v0.9.21, `x` v0.1.13, `youtube` v1.1.6, `zepto` v0.1.23, `zomato` v0.4.3.

## 2026-10-01: Google Trends unknown country codes (v0.1.8)

`google_trends.trending.list` now rejects an unknown or unassigned two-letter
country code, such as `XX`, before contacting Google. It returns a terminal
`invalid_input` that names the `country` field, so a bad code is not retried as
a temporary upstream failure. Assigned ISO 3166-1 alpha-2 codes (and `XK` for
Kosovo) remain accepted by validation; Google Trending Now data availability can
still vary by country.

## 2026-10-01: Pinterest v1.4.25 and background backups

Nothing was removed or renamed, and responses only gained fields. Two changes
are worth a look in an existing integration: some errors are now more specific,
and links are checked before a job starts.

**Clearer errors for missing and private accounts.** When Pinterest confirms
that a board's or profile's owner does not exist, or that the account is
private, the job now says so instead of failing with `upstream_error`:

- account not found: HTTP `404`, `error.code: "not_found"`;
- private account: HTTP `403`, `error.code: "forbidden"` with
  `error.reason: "account_private"`;
- Pinterest asks for sign-in: HTTP `403`, `error.code: "login_required"`.

Treat these as final for that link and stop retrying it. Retry `upstream_error`
as before.

**The board you ask for is the board you get.** Board capabilities now confirm
that the returned board matches the requested URL and fail rather than return
another board found on the same page. `pinterest.user.get` reports a profile as
private only when Pinterest says it is.

**Links are checked up front.** Every Pinterest `url` must be an `http` or
`https` link on `pinterest.com`, including country subdomains such as
`uk.pinterest.com`, or a `pin.it` short link. Other links, including other
Pinterest domains such as `pinterest.ph` and links without `https://`, are
refused with HTTP `422` `invalid_input` and no job is created. A `pin.it` link
that redirects away from Pinterest is refused too.

**New and optional.**

- `pinterest.user.get` accepts `/_saved/` and `/_created/` profile links and
  returns the same profile.
- `pinterest.user-boards.get` accepts `page_mode: true` with `cursor` to list
  boards one page at a time, with `pagination` and `outcome` in the response.
  Without `page_mode`, it returns every board at once as before.
- Example outputs are published for `pinterest.board-full.get`,
  `pinterest.board-pins.list`, `pinterest.pin.get` and `pinterest.section.get`.
- [Background backups](/docs/guides/backups): `POST /backups` with a profile,
  board or pin link and a credit budget collects every board in the
  background, resumes after interruptions, and exports results as CSV or
  JSON Lines.

## 2026-09-21 — Additive API changes: error envelope, credit ceiling, `/v1`

Every change here is additive. No field, status code or error code was removed
or renamed, and existing integrations need no change.

- Validation failures (HTTP `422`) now also carry the standard envelope:
  `error.code: "invalid_input"`, `error.message` and `error.fields`. The original
  top-level `errors` map is unchanged and stays.
- `POST /execute` accepts an optional credit ceiling, `max_credits` in the body
  or an `X-Max-Credits` header. A job priced above it is refused with
  `credit_limit_exceeded` before acceptance.
- Every REST path is also served under `/v1` (for example `POST /v1/execute`).
  The unversioned paths remain supported.
- A capability that cannot be served at admission now returns HTTP `503`
  `temporarily_unavailable` instead of `500 internal_error`. MCP reports it with
  `retryable: false`.
- MCP calls without an `operation_key` are deduplicated by request ID for about
  15 minutes rather than indefinitely, so a later session that reuses a small
  request ID starts a new job. Calls with an `operation_key` are unchanged.

## 2026-09-01 — Durable results and fail-fast execution status

- Results containing escaped NUL characters now save successfully.
- A result that cannot be saved produces a terminal failure instead of leaving
  the job marked as running.
- Polling and `Prefer: wait=N` return `execution_lost` promptly when a request
  ends without a result.
- Automatic retry recovery prevents duplicate execution and unintended cancellation.

This platform-wide change applies to every scraper and requires no pagination
or storage workaround in customer code.

## 2026-09-01 — Pinterest section backups (v1.4.11)

- Added `pinterest.section-pins.list` for bounded, resumable section downloads.
- `pinterest.section.get` now fails closed for sections above 1,000 pins instead
  of returning a potentially incomplete result as successful.
- Section pages accept Pinterest's verified maximum of 50 raw records and expose
  `pagination.next_cursor`, `pagination.has_more`, `pagination.retrieved_total`,
  and an explicit completion `outcome`.
- If Pinterest ends a large traversal at its observed ~2,000-item ceiling, the
  last page is marked `outcome.status: incomplete` instead of complete.

Existing integrations using `pinterest.section.get` for large sections must
move to `pinterest.section-pins.list` and continue until `has_more` is false.
