> Searlo API Docs — Changelog
> Source: https://searlo.tech/docs#changelog
> Full docs: https://searlo.tech/docs/full.md

# Changelog

Changes to the API's behaviour and contract, newest first. Additive fields are listed too, so a strict client knows what to expect.

### 2026-10-20

- **Pricing may change during November–December 2026.** What it costs us to serve some requests changes at the turn of the year, so we may adjust prices in those two months. Any change is announced in advance here and by email. Credits you have already bought keep working, and packs stay valid for 12 months from purchase.
- **Full SERP: rendered AI Overview costs 8 from 2026-11-01.** `GET /serp`, `GET /search/serp`, `POST /serp/batch` and async `serp` tasks cost 3 credits per page as today, or 8 when the AI Overview had to be completed by rendering the page in a browser. The response says `aioverview.rendered: true` when that happened (live now, so you can see which of your calls it affects). A page whose overview arrives complete, or a request with `aioverview=false`, stays 3. `GET /serp/features` stays 3 and never renders; `GET /serp/html` stays 2 (8 with `js=true`).
- **Web data: a page that needed a browser costs 5 from 2026-11-01.** On `POST /scrape`, `GET|POST /search/webpage`, `POST /extract`, `POST /search-and-scrape`, `POST /crawl` and `POST /scrape/batch`, a page that had to be rendered (`render: true`, `actions`, or automatic rendering when a plain fetch returns no usable content, such as a JavaScript-only page) costs 5 credits instead of 1. Pages fetched without a browser stay 1. Responses already say `via: "browser"` or `via: "http"`. A cached copy costs the same as the page it copies, a failed fetch is never charged, and the live-fetch surcharge (`maxAge` or `cache: false`) still applies on top. A crawl's `maxCredits` ceiling allows for the browser price unless the job sets `render: false`. `POST /map` is unchanged.
- **Accounts that have never bought credits.** Every endpoint works on the sign-up credits, but the automatic browser fallback is off (an explicit `render: true` or `actions` still renders) and a web search that comes back thin is not topped up with live results. Both switch on with the first purchase. In effect now.

### 2026-10-15

- **Place details menus from Google Search.** Google Maps now shows signed-out visitors a reduced place record without the menu, so `menu` came back `null`. For a place that serves food, `GET /search/place-details` reads the menu (`url`, `sections` of items with prices) from the place's Google Search panel. Adds `place.menuStatus` (`found`, `none`, `pending`, `unavailable`) and the parameter `menu=false` to skip the lookup. `menu.photos` is empty for now. Same price.

### 2026-10-04 to 2026-10-05

- **Credit balance.** `GET /credits/balance` returns `{ success, credits: { available, reserved?, expiresAt?, expiringCredits? } }` for an API key or a dashboard login. Free. `available` is the balance `GET /user/profile` shows ([Account & Utilities](#account)).
- **API keys.** A key is for the data API and read-only views of its account. Creating or deleting keys, data export, account deletion and payments need a dashboard login (`403` `API_KEY_SCOPE_FORBIDDEN`); `GET /user/profile` stays open to keys. Keys are stored hashed, and lists show a masked preview.
- **Errors.** One table of every status and code ([Error Handling](#errors)). New: `400` `PAGE_OUT_OF_RANGE`, `DATE_FILTER_UNAVAILABLE` and `INVALID_IDEMPOTENCY_KEY`, `422` `TARGET_UNREACHABLE`, `429` `4203` (`CONCURRENCY_LIMIT`), `503` `CREDIT_SYSTEM_UNAVAILABLE` and `REVIEWS_WITHHELD`. A switched-off endpoint answers `403` `FEATURE_NOT_AVAILABLE` (was `503`); a site that refuses the fetch answers `422` `TARGET_REFUSED` (was `503`). No `502` or `504` leaves the API: both are answered as `503` JSON. None of these is charged.
- **Idempotency keys** are bound to the request they came with: the same key and request replays the stored response (`Idempotent-Replayed: true`, no charge), the same key with a different request is `422` `IDEMPOTENCY_KEY_REUSED`.
- **SafeSearch on the SERP.** `safe=active` or `off` (and `true` or `false`) is accepted on `GET /serp` and `GET /search/serp`. `POST /serp/batch` and `GET /serp/features` honour `safe`, which they ignored before.
- **Date filter.** `dateRestrict` (`d7`, `w2`, `m1`, `y1`) works on `GET /search/web` together with `gl` and `hl`, on `GET /search/news` and on `GET /search/advanced`. Combined with search operators it returns `400` `DATE_FILTER_UNAVAILABLE`, not charged.
- **Fresh answers.** `cache=false` forces a fresh answer on web, image, news, maps and places search. Same credits.
- **Web search pages.** A page that starts past result 101 returns `400` `PAGE_OUT_OF_RANGE` with `maxPage` at once, instead of a slow failure.
- **Image search.** Results carry `width`, `height`, `thumbnailUrl` with its size, `link` and `sourceUrl` (the page the image is on), `source`, `domain`, `format` and `imageId`. `size` (also `imgSize`), `imgType`, `imgColorType` and `imgDominantColor` now take effect.
- **Maps, places and place details.** New `businessStatus` (`OPERATIONAL`, `CLOSED_TEMPORARILY`, `CLOSED_PERMANENTLY` or `null`) and `openNow`. `openState` comes back in the language of `hl`. With no `ll`, `gl` sets where the search looks (51 countries). A `lite` answer is never cached.
- **Reviews.** The first page of reviews (about eight) comes back in any language, with `hasMore`. New `timestamp` (Unix seconds); an owner's reply carries `date` and `language`. A place Google sent without its reviews answers `503` `REVIEWS_WITHHELD`, not charged.
- **Extract.** URLs are fetched in parallel inside one time budget. A failed row carries `errorCode` and `retryable`; `partial` says the budget ran out before every URL was fetched; `llmSkipped` says the model was not asked. One credit per page fetched; failed rows are free.
- **Web data.** `scrape`, `map`, `crawl`, `scrape/batch` and `extract` accept internationalised domain names (`https://www.löschwagen.com`). A malformed URL, or one with a control character, is a `400`.
- **Searches in flight.** An account can have a limited number of web, image, site, advanced and batch searches running at once; past it, `429` `4203` ([Rate Limiting](#rate-limiting)).
- **No charge for nothing.** An answer with no results is free on every endpoint, SERP pages are billed per page delivered, and a failed row inside a `200` `POST /serp/batch` costs nothing.

### 2026-10-02

- **Place details.** `GET /search/place-details` returns one place's full record by `placeId` (`ChIJ…`), `featureId`, `cid` or `q`: every maps field plus all of Google's attributes and the menu (`url`, `sections` of items with prices, `photos`). 1 credit.
- **Attributes on maps and places.** `GET /search/maps` and `GET /search/places` add `attributes`, Google's "About" list keyed by Google's own ids (`attributes.payments.requires_cash_only`).
- **Reviews by Place ID.** `GET /search/reviews` accepts `placeId`.
- **Opening date on maps and places.** `GET /search/maps` and `GET /search/places` add `openingDate` (`2026-11-01`) and `openingDateText` (`Opens 1 Nov`, in your `hl`) to a place listed before it opens; `null` otherwise. Same price.
- **SERP HTML price.** `GET /serp/html` costs 2 credits per page (was 1), and 8 per page with `js=true` (was 4). Failed calls are still refunded.
- **Full SERP AI Overview from the served page.** `GET /serp` reads the AI Overview in full from the page as Google served it, so most overviews no longer wait for a rendered page: about 2 s instead of 8-10 s. An overview Google loads after the page comes back as `pending: true` and is still read from the rendered page. Overview sources come back resolved (`url` the cited page, `redirectUrl` the `/goto`, `resolved: true`). Same price.

### 2026-09-30

- **Credits are valid for one year per grant** (was 90 days) on accounts created after the policy launch; existing credits were moved to one year from when they were granted. `GET /credit/balance` reports `expiry.durationDays: 365`. Legacy accounts keep unlimited credits.
- **Google News results page from the live page.** `GET /search/news/serp` (and the `news/serp` async task and the Cloro-compatible news monitor) is fetched live and parsed like Full SERP: about a second per page, cards with title, source, date, snippet, thumbnail and resolved article links.
- **Location.** `location` takes a country by name or two-letter code on every Google endpoint and applies it as `gl`; a country's `uule` is applied the same way. City- and state-level `location`, and any other `uule`, return `400` `CITY_LOCATION_UNAVAILABLE` and are not charged: Google no longer localizes results by `uule` ([Location](#full-serp)). `GET /serp/html` accepts a country `location`. `GET /search/states` adds `targeting: false`.
- **Error codes.** Error bodies carry a stable `code` on search, SERP, SERP HTML, AI answer, rank check and validation errors ([Error Handling](#errors)). Failed batch rows carry the same `code`.
- **Async tasks.** Errors in the request itself (a location, a domain, a query shape) fail at once and are refunded, instead of being retried.
- **Full SERP.** Each page is fetched live and parsed; the AI Overview is read in full from the rendered page, and `aioverview.complete` says whether it was. `aiModeAvailable` reports the page's AI Mode tab. A multi-page request with a failed page is no longer cached.
- **SERP HTML.** `aio.showAll` (`pressed`, `absent`, `complete`, `failed`) and `show-all` in `X-Searlo-Aio`.
- **Web data.** `POST /search/webpage` accepts `excludeSelectors`; a page whose plain fetch returns no usable content is rendered.

### 2026-09-29

- **SERP HTML** (`GET /serp/html`): Google's results page as served (1 credit at launch; 2 since 2026-10-02) or rendered with the AI Overview opened out (`js=true`, 4 credits at launch; 8 since 2026-10-02), desktop or iOS, as JSON or `format=raw`.
- **AI answer snapshots:** `html=true` on `GET /search/ai/{engine}` adds the answer page's HTML (`html`, `pageUrl`) at no extra charge.
- **Full SERP:** `rawHtml=true` returns the page alongside the JSON (+1 credit).
- **Account & Utilities:** `GET /credit/balance`, `GET /search/capabilities`, `GET /search/countries`, `GET /search/states` documented.
- **MCP:** all 16 tools documented.

---
*From https://searlo.tech/docs — see full docs at https://searlo.tech/docs/full.md*