---
title: Changelog
description: Every visible change to the API, the SDKs, and the dashboard. Newest first. Breaking changes are flagged; we give 14 days of notice.
order: 90
---

# Changelog

Breaking API changes are announced 14 days in advance via email + this page. In-flight requests are always settled under the old contract.

---

## 2026-06-11

**Docs**

- Restructured the docs around the one-request-shape model. New pages: [Core concepts](/docs/core-concepts) (how the API works, dedicated endpoints vs the Universal scraper, the credit model) and [Endpoint reference](/docs/endpoint-reference) (how 453 endpoints share one shape and how to find any of them).
- New [Universal Web Scraper API](/docs/endpoints/universal) page: scrape any URL to JSON, HTML, or text via `/api/v1/universal/get`.
- Getting started rewritten to lead with the generic `{site}/{resource}` pattern and a non-marketplace-specific path. Error codes and billing generalized across all verticals (not just commerce).
- The full browsable catalogue of all endpoints now lives at [/scraper-api](/scraper-api).

---

## 2026-05-19

**API**

- New error code: `404 product_not_found`. When a target site returns a 404 for the requested item (delisted, ID malformed, or never existed in the chosen region), the API now returns a clean `404` with `{"error":"product_not_found","retryable":false}` instead of the misleading `502 target_unreachable` it returned before. SDK consumers should treat 404 as a terminal failure; the item won't come back.
- Skip the redundant retry strategy on confirmed 404s. Saves 1 paid-residential rotation per delisted item.
- See updated [error codes table](/docs/guides/errors) and [billing policy](/docs/guides/billing) (404s remain free).
- Bot-manager interstitial detection (rolled out on the Amazon search target first): the extractor now recognizes the Akamai bot-manager interstitial (a 2-3 KB JS shell carrying a `bm-verify` token and a `triggerInterstitialChallenge` script). Previously these silent challenges slipped past the captcha detector, the extractor saw zero results, and the request returned `502 extraction_failed`. They now trigger the standard residential-IP rotation; you weren't charged before and still aren't, but the failure is now both rarer (rotation almost always recovers) and more honest when it does happen.
- Search endpoints add an optional `no_results: true` flag (with `total_results: 0`) for the rare case where a site returns a real search page with zero matches. Pre-patch this surfaced as `502 extraction_failed`; it now correctly returns HTTP 200 with an empty `products` array.
- Marketplace search field-extraction fixes (5 fields on every result card; shipped on the Amazon target):
  - `reviews_count`: now populated. Pre-fix this was always `null`; the extractor was looking at a markup class the site hadn't shipped in months. Source of truth is now the `aria-label` of the rating wrapper ("5,054 ratings"), which gives the precise integer rather than the rounded "(5K)" display value. Coverage on a typical search page: ~95-100%; `null` only when the site hides reviews on brand-new listings.
  - `price_strikethrough`: no longer captures per-unit prices. The historic bug surfaced as `0.23` on a cologne card (which is the `$0.23/milliliter` per-unit price, not a list price). The fix requires a strikethrough marker and rejects any candidate whose surrounding text contains `/fluid ounce`, `/milliliter`, `/Fl Oz`, `/Count`, `/Pound`, `/Ounce`, `/Each`, `/Pack`, etc. Strikethrough is now `null` when the product isn't on sale, and strictly greater than the current price when it is.
  - `highest_price`: mirrors the fixed strikethrough on search cards (real multi-tier ranges only surface on product pages).
  - `sales_volume`: now populated. Returns the verbatim site string (`"5K+ bought in past month"`, `"200+ bought in past week"`). Coverage on popular categories: ~80-100%; `null` when the site doesn't surface a velocity badge (low-traffic categories).
  - `organic_position`: guaranteed 1-indexed across non-sponsored cards. Sponsored cards get `sponsored_position` instead. The first organic card after any run of sponsored cards still gets position 1.

---

## 2026-04-21

**Dashboard**

- `/app/settings/billing`: PAYG top-up calculator now updates the "Credits you'll get" and "Basic scrapes" fields live as you type.
- Loading skeletons added to dashboard home, billing, usage, and API keys routes - no more blank flash on first navigation.
- Sidebar "Documentation" link now points at the new `/docs` site.

**Docs**

- Launched `/docs` on the marketing site: Getting started, endpoint pages (product / search / batch), guides (auth, errors, rate limits, SDKs, billing, country & language), and this changelog.
- Added `/docs/llms.txt`, `/docs/llms-full.txt`, and an `.md` variant for every doc URL so LLMs / coding agents can ingest the full corpus cheaply.

**SDKs**

- `chocodata` (Node) v0.1.4 - README updated with 5-credit pricing, removed claims about "no credit system".
- `chocodata` (Python) v0.1.4 - same.
- `chocodata-go` v0.1.4 - same.

---

## 2026-04-16

**API**

- Credit rebase: 1 basic scrape is now priced at **5 credits** (was 1). Plan allowances and PAYG packages scaled x5 accordingly - your dollar-cost-per-scrape is unchanged. The "1 credit = 1 scrape" pre-launch shorthand only applied to internal testing.
- Headers prefix changed from `Spb-*` to `Asa-*`. Old prefix will keep returning values for 90 days, then be removed.

**Dashboard**

- Live credit balance now read from authoritative ledger on every page load - no more stale numbers from cached mirrors.
- Monthly usage graph restyled with visible bars even on zero-credit days.

---

## 2026-04-10

**API**

- Shipped production success-rate improvements for the Amazon target's latest A/B layout. Measured SR jumped from ~87% to ~97% on a 30-query mixed international set.
- Parser hardening: gift-card and subscription-plan product templates now extract correctly instead of hitting `extraction_failed`.

---

## 2026-04-01

**API**

- `render_js` and `screenshot` query params reserved. Passing either returns `501 not_implemented` today; the real implementation is on the roadmap for Q3.
- New response header `Asa-Attempts` reports how many internal retries we used to fetch your page.

**Billing**

- Non-2xx responses are now *guaranteed* free - no edge case where a partial 502 is charged. See [Billing policy](/docs/guides/billing).

---

## Earlier

Older entries predate the public launch and aren't preserved here. If you need historical info (old behaviour of a specific endpoint), email <hello@chocodata.com> and we'll pull it from internal records.

## Related

- [Getting started](/docs/getting-started)
- [Billing policy](/docs/guides/billing)
