# Chocodata - full documentation corpus > Single-file concatenation of every page at https://chocodata.com/docs. > For the manifest (URL list) only, see https://chocodata.com/docs/llms.txt. > For an individual page as Markdown, append `.md` to the URL. --- # Getting started _Source: https://chocodata.com/docs/getting-started_ # Getting started Chocodata is one scraping API for the whole web: a single REST request returns structured JSON from 235 sites and 453 endpoints. You will have a working scrape in under 2 minutes. ## 1. Create an API key 1. Sign in at [app.chocodata.com](https://app.chocodata.com) (Google sign-in or email, no card required for the free tier). 2. Open **API keys** in the left sidebar. 3. Click **Create key**, name it (for example `local-dev`), and copy the value. It is only shown once. Your key looks like `cd_live_xxxxxxxxxxxxxxxxxxxxxxxx`. Treat it like a password. The free tier gives you 1,000 requests a month to try everything below. ## 2. The one request shape Every endpoint follows the same pattern. You change the site and the resource; everything else stays the same: ```http GET https://api.chocodata.com/api/v1/{site}/{resource}?api_key=YOUR_KEY ``` `{site}` is the target (`walmart`, `ebay`, `google`, `indeed`, ...), `{resource}` is what you want from it (`product`, `search`, `job`, ...), and `api_key` is your key as a query parameter. That is the only authentication you need. ## 3. Your first request - cURL Let's pull a product from Walmart: ```bash curl "https://api.chocodata.com/api/v1/walmart/product?api_key=YOUR_KEY&query=5085206428" ``` You get back clean JSON: ```json { "id": "5085206428", "title": "LEGEND COOKWARE 5-Ply Stainless Steel Cookware Set", "price": 299.99, "currency": "USD", "rating": 4.7, "reviews_count": 2481, "images": ["https://cdn.example.com/images/cookware-set-71..."], "brand": "LEGEND COOKWARE", "category": [], "offers": [] } ``` The exact same pattern works for any of the 235 sites and 453 endpoints: ```bash # Keyword search on a search engine curl "https://api.chocodata.com/api/v1/google/search?api_key=YOUR_KEY&query=wireless+headphones" # A marketplace search curl "https://api.chocodata.com/api/v1/ebay/search?api_key=YOUR_KEY&query=mechanical+keyboard" # A single job posting curl "https://api.chocodata.com/api/v1/indeed/job?api_key=YOUR_KEY&query=https://www.indeed.com/viewjob?jk=abc123" ``` Average response time: **~2.6 s median**, **~6 s p95**. ## 4. The same call in Python ```python import requests r = requests.get( "https://api.chocodata.com/api/v1/walmart/product", params={"api_key": "cd_live_YOUR_KEY", "query": "5085206428"}, ) r.raise_for_status() product = r.json() print(product["title"], "-", product["price"], product["currency"]) ``` ## 5. The same call in Node.js ```javascript const res = await fetch( "https://api.chocodata.com/api/v1/walmart/product?query=5085206428&api_key=cd_live_YOUR_KEY" ); const product = await res.json(); console.log(product.title, "-", product.price, product.currency); ``` Prefer a typed client? We publish official [SDKs for Node, Python, Go, a CLI, and an MCP server](/docs/guides/sdks). ## What about sites without a dedicated endpoint? There are two surfaces: - **Dedicated endpoints** return clean, validated JSON for a supported site and page type (the call above). Browse all of them in the [scraper directory](/scraper-api). - **The [Universal Web Scraper API](/docs/endpoints/universal)** fetches any other URL and returns JSON, HTML, or text. ```bash # Scrape any URL the directory does not cover yet curl "https://api.chocodata.com/api/v1/universal/get?api_key=YOUR_KEY&url=https://example.com&parse=auto" ``` [Core concepts](/docs/core-concepts) explains how to choose between the two. ## What costs a credit? **Only successful (HTTP 2xx) responses.** Errors, target-site challenge pages, timeouts, and `404`s never touch your balance. One request costs 5 credits; plans are sized in requests. See [Billing](/docs/guides/billing) and [pricing](https://chocodata.com/pricing) for the full policy. ## Common errors | HTTP | Body contains | What it means | What to do | |---|---|---|---| | 400 | `invalid_params` | Query or `domain` malformed | Check your `query` value and that `domain` (if used) is supported for the target | | 401 | `unauthorized` | API key missing or wrong | Verify your `?api_key=` value | | 429 | `rate_limited` | Too many requests from your key | Back off and respect `Retry-After` | | 404 | `not_found` | The item is delisted, malformed, or does not exist on this site | No retry; drop the item or try a different region | | 502 | `target_unreachable` / `extraction_failed` | The target blocked us on all retries, or served a page we could not parse | Retry in ~30 s; usually transient | Full list with retry semantics: [Error codes](/docs/guides/errors). ## Where to go next - [Core concepts](/docs/core-concepts) - how the API works, dedicated vs Universal, credits. - [Endpoint reference](/docs/endpoint-reference) - resource types and how to find any endpoint. - [Product endpoint](/docs/endpoints/product) and [Search endpoint](/docs/endpoints/search) - the two canonical patterns. - [Scraper directory](/scraper-api) - browse all 453 endpoints. - [Country + content language](/docs/guides/country-and-language) - regional storefronts and languages. --- # Core concepts - how the API works _Source: https://chocodata.com/docs/core-concepts_ # Core concepts Chocodata is one web-scraping API for the whole web. Instead of learning a different API for every site, you learn a single request shape and point it at whichever site and resource you need. Today that covers 235 sites, 453 endpoints, and 17 categories, with 210 dedicated specific-item endpoints and 250+ endpoints returning validated, structured JSON. Anything without a dedicated endpoint is still scrapable through the Universal Web Scraper API. This page explains the model. Once you have it, every endpoint in the [scraper directory](/scraper-api) works the same way. ## The one request shape Every dedicated endpoint is a GET request in exactly this form: ```http GET https://api.chocodata.com/api/v1/{site}/{resource}?api_key=YOUR_KEY ``` - `{site}` is the target, for example `walmart`, `ebay`, `google`, `indeed`, `zillow`, `github`, `youtube`. - `{resource}` is what you want from that site, for example `product`, `search`, `job`, `property`, `profile`, `video`. - `api_key` is your key, passed as a query parameter. That is the only authentication mechanism. See [Authentication](/docs/guides/authentication). Most resources take a `query` parameter (an identifier, a URL, or a keyword) plus optional modifiers like `domain`, `language`, or `pages`. The same envelope holds across every site, so once you have called one endpoint you can call all of them. ```bash # A job listing on Indeed curl "https://api.chocodata.com/api/v1/indeed/job?api_key=YOUR_KEY&query=https://www.indeed.com/viewjob?jk=abc123" # A repository on GitHub curl "https://api.chocodata.com/api/v1/github/repository?api_key=YOUR_KEY&query=facebook/react" # A keyword search on Bing curl "https://api.chocodata.com/api/v1/bing/search?api_key=YOUR_KEY&query=best+running+shoes" ``` ## Two ways to scrape: dedicated endpoints vs Universal There are two surfaces, and you choose based on whether the site and page type have a dedicated parser. ### 1. Dedicated specific-item endpoints (structured JSON) A dedicated endpoint targets one site and one page type and returns clean, validated, structured JSON: named fields, correct types, no HTML to parse. Chocodata ships 210 dedicated specific-item endpoints (product, article, job, profile, listing, video, and more), and 250+ endpoints in total return validated JSON. Use a dedicated endpoint when one exists for your target. You get a typed object instead of raw markup, and the parser is maintained for you when the site changes its layout. ```http GET /api/v1/{site}/{resource}?api_key=YOUR_KEY&query=... ``` Browse every dedicated endpoint in the [scraper directory](/scraper-api): cards marked **JSON** return structured data. ### 2. The Universal Web Scraper API (any URL) For pages without a dedicated parser (or any arbitrary URL you want to fetch), use the Universal Web Scraper API. You hand it a URL, it handles proxies and anti-bot, and returns the page in the format you ask for: raw HTML, plain text, or auto-extracted JSON. ```http GET /api/v1/universal/get?api_key=YOUR_KEY&url=https://example.com&parse=auto ``` In the [scraper directory](/scraper-api), cards marked **via Universal** route through this endpoint. Full details on the [Universal Web Scraper API](/docs/endpoints/universal) page. | | Dedicated endpoint | Universal Web Scraper API | |---|---|---| | Path | `/api/v1/{site}/{resource}` | `/api/v1/universal/get` | | Input | `query` (id, URL, or keyword) | `url` (any web page) | | Output | Validated structured JSON | HTML, text, or auto-parsed JSON | | Best for | Supported site + page type | Any other URL, or full-page HTML | ## Resources, not sites The catalogue is organized by resource type, not by an exhaustive page-by-page list. A handful of resource types appear across hundreds of sites: | Resource | What it returns | Example sites | |---|---|---| | `search` | Ranked results for a keyword query | `google`, `bing`, `walmart`, `ebay`, `youtube` | | `product` | A single product page | `walmart`, `ebay`, `target`, `bestbuy`, `etsy` | | `article` | A single news or blog article | `bbc`, `reuters`, `techcrunch`, `medium` | | `job` | A single job posting | `indeed`, `linkedin`, `glassdoor` | | `property` | A real-estate listing | `zillow`, `redfin`, `realtor` | | `profile` | A public profile page | `github`, social sites, directories | | `quote` | A finance quote | `yahoo-finance`, `tradingview` | | `video` | A single video page | `youtube`, `vimeo` | Learn the request/response shape for one resource and it carries to every site that exposes it. The [Endpoint reference](/docs/endpoint-reference) explains this model and how to find the exact resource for any site. ## Credits and what a request costs Usage is metered in credits. The conversion is simple: | Action | Credits | |---|---| | One request (dedicated endpoint or Universal) | 5 | | JavaScript rendering (when shipped, opt-in add-on) | +10 | | Screenshot (when shipped, opt-in add-on) | +10 | Plans are sized in requests (1 request = 5 credits). The Free plan, for example, is 1,000 requests per month, which is 5,000 credits. Credits are the internal accounting unit; your plan and PAYG pricing are quoted in requests. See [Billing](/docs/guides/billing) for the full policy and [pricing](https://chocodata.com/pricing) for plan limits. > `render_js` and `screenshot` are reserved today and return `501 not_implemented`. They never cost anything until they ship. ## You only pay for successful responses **Only successful (HTTP 2xx) responses are billed.** Errors, anti-bot challenge pages, timeouts, and `404`s never touch your balance. If we could not return usable data, you do not pay for it. Our orchestrator retries internally and bills at most once per request, only on a final 2xx. The full breakdown is in the [Billing policy](/docs/guides/billing). ## The response envelope Every dedicated endpoint returns a flat JSON object of named fields for that resource. Successful responses also carry a small set of informational headers: - `Asa-Cost` - credits spent (`5` for a standard request, `0` for any non-2xx). - `Asa-Resolved-Url` - the final target URL after redirects. - `Asa-Source-Status` - the target site's own HTTP status. - `Asa-Attempts` - how many internal attempts it took to fetch the page. - `Asa-Extractor-Version` - the parser version, for example `walmart@1.0.0`. Errors share one body shape across every endpoint, with a machine-readable `error` code, a `request_id`, and a `docs_url`. See [Error codes](/docs/guides/errors). ## Where to go next - [Getting started](/docs/getting-started) - your first call in under 2 minutes. - [Endpoint reference](/docs/endpoint-reference) - the resource model and how to find any endpoint. - [Universal Web Scraper API](/docs/endpoints/universal) - scrape any URL to JSON, HTML, or text. - [Scraper directory](/scraper-api) - browse all 453 endpoints. - [Dashboard playground](https://app.chocodata.com) - run any endpoint live and copy the request. --- # Endpoint reference _Source: https://chocodata.com/docs/endpoint-reference_ # Endpoint reference Chocodata exposes 470 endpoints across 237 sites and 17 categories. They are not 470 different APIs. They are one API, parameterized by `{site}` and `{resource}`, so this page documents the shared shape once and points you to the browsable directory for the specifics of any single endpoint. If you have read [Core concepts](/docs/core-concepts), you already know the request shape. This page is the map: what the resource types are, what the shared request and response look like, and where to look up an exact endpoint. ## The shared request shape Every dedicated endpoint is the same GET: ```http GET https://api.chocodata.com/api/v1/{site}/{resource}?api_key=YOUR_KEY&query=... ``` | Part | Meaning | Examples | |---|---|---| | `{site}` | The target site | `walmart`, `ebay`, `indeed`, `zillow`, `github`, `youtube` | | `{resource}` | The page type on that site | `product`, `search`, `job`, `property`, `profile`, `video` | | `query` | The identifier, URL, or keyword | a product ID, a job URL, `"running shoes"` | Common optional parameters that many endpoints accept: | Param | Type | Description | |---|---|---| | `domain` | enum | Regional storefront / locale where the site has one (`com`, `co.uk`, `de`). Supported values vary by site. See [Country, region & language](/docs/guides/country-and-language). | | `language` | string | Content language as `xx_YY` (`en_US`, `de_DE`). | | `pages` | int | For search resources, number of consecutive result pages to fetch (each page counts as a request). | | `add_html` | boolean | Attach the raw page HTML under `html` in the response. | ## Resource types Rather than memorize 470 endpoints, learn the resource types. A small set of resources covers the vast majority of endpoints, and each behaves consistently wherever it appears. | Resource | Returns | Typical sites | |---|---|---| | `search` | Ranked results for a keyword query (web results or commerce cards, depending on the site) | search engines, marketplaces, job boards, app stores | | `product` | A single product / item page with price, variants, ratings, images | e-commerce sites | | `article` | A single news or blog article with body, author, dates | news and media sites | | `job` | A single job posting with title, company, location, description | job boards | | `property` | A single real-estate listing | real-estate portals | | `profile` | A public profile page | social, developer, and directory sites | | `quote` | A finance quote / instrument page | finance and crypto sites | | `video` | A single video page with metadata | video platforms | | `post` | A single social or forum post | social and community sites | | `package` | A single package / library page | developer registries | | `listing` | A single classifieds or directory listing | classifieds and local directories | Categories you will see in the directory include: AI, Automotive, B2B & Companies, Developer, E-commerce, Finance & Crypto, Food, Jobs, Knowledge & Academic, Local & Directories, News & Media, Real Estate, Reviews, Search Engines, Social, and Travel. ### The two flavors of `search` `search` is the most widely available resource, and its response adapts to the site: - On a **search engine** (`google`, `bing`, ...), each result carries web fields: `title`, `url`, `snippet`, `position`. - On a **marketplace or board** (`walmart`, `ebay`, `indeed`, ...), each card carries domain fields: price, rating, sponsored flags, or job metadata. Both share the same request shape. See the [Search endpoint](/docs/endpoints/search) for the full request and both response shapes. ## The shared response shape Dedicated endpoints return a flat JSON object of named fields for the requested resource. The exact field set depends on the resource (a `product` has `price` and `variations`; an `article` has `articleBody` and `author`), but the conventions are constant: - Field names are stable and typed. Numbers are numbers, not strings. - A field is `null` when the site did not publish it, not when extraction failed. You still get a valid object. - Search-style resources return an array (`products` or `results`) plus pagination metadata. Every successful response also carries informational headers (`Asa-Cost`, `Asa-Resolved-Url`, `Asa-Source-Status`, `Asa-Attempts`, `Asa-Extractor-Version`). Errors share one body shape with a machine-readable `error` code. See [Error codes](/docs/guides/errors). We document two resources in depth as the canonical pattern: - [Product endpoint](/docs/endpoints/product) - the specific-item pattern (one identifier in, one rich object out). - [Search endpoint](/docs/endpoints/search) - the list pattern (a keyword in, ranked results out). Read those two and you can read any endpoint, because every other dedicated endpoint is a variation on one of them. ## App Stores Dedicated endpoints for the Apple App Store (`appstore`) and Google Play (`googleplay`). Search a storefront, pull a single app's full listing, or page through user reviews. Every call is the same `GET https://api.chocodata.com/api/v1/{target}/{resource}?api_key=YOUR_KEY&...` shape. For a guided tour see [Scraping Social Media & App Stores](/docs/guides/social-and-app-stores). ### `appstore.search` Search the Apple App Store by keyword and get ranked app cards. ```http GET https://api.chocodata.com/api/v1/appstore/search?api_key=YOUR_KEY&term=whatsapp&country=us&limit=5 ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `term` | string | ✅ yes | - | Search keywords | | `country` | enum | - | `us` | Two-letter App Store storefront (`us`, `gb`, `de`, `jp`, ...) | | `limit` | int | - | `10` | Number of result cards to return | ```json { "query": "whatsapp", "page": 1, "total_results": 5, "results": [ { "position": 1, "id": "310633997", "track_id": "310633997", "bundle_id": "net.whatsapp.WhatsApp", "title": "WhatsApp Messenger", "seller_name": "WhatsApp Inc.", "primary_genre": "Social Networking", "genres": ["Social Networking", "Utilities"], "price": 0, "formatted_price": "Free", "currency": "USD", "rating": 4.68698, "reviews_count": 18082844, "content_advisory_rating": "12+", "version": "26.22.76", "release_date": "2009-05-04T02:43:49Z", "minimum_os_version": "15.1", "url": "https://apps.apple.com/us/app/whatsapp-messenger/id310633997" } /* 4 more cards */ ] } ``` ### `appstore.product` Full listing for a single Apple App Store app by numeric ID. ```http GET https://api.chocodata.com/api/v1/appstore/product?api_key=YOUR_KEY&id=310633997&country=us ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `id` | string | ✅ yes | - | The numeric App Store track ID | | `country` | enum | - | `us` | Two-letter App Store storefront | ```json { "id": "310633997", "track_id": "310633997", "bundle_id": "net.whatsapp.WhatsApp", "title": "WhatsApp Messenger", "seller_name": "WhatsApp Inc.", "primary_genre": "Social Networking", "genres": ["Social Networking", "Utilities"], "price": 0, "formatted_price": "Free", "currency": "USD", "rating": 4.68698, "rating_current_version": 4.68698, "reviews_count": 18082844, "content_advisory_rating": "12+", "version": "26.22.76", "current_version_release_date": "2026-06-07T16:47:53Z", "release_date": "2009-05-04T02:43:49Z", "release_notes": "We update the app regularly to fix bugs…", "file_size_bytes": 370200576, "minimum_os_version": "15.1", "description": "WhatsApp from Meta is a free messaging and calling app…", "artwork_url": "https://is1-ssl.mzstatic.com/image/thumb/…", "screenshot_urls": [], "supported_devices": ["iPhone5s-iPhone5s", "iPadAir-iPadAir"], "languages": ["AR", "BN", "EN"], "advisories": ["Infrequent/Mild Profanity or Crude Humor"], "kind": "software", "url": "https://apps.apple.com/us/app/whatsapp-messenger/id310633997?uo=4", "seller_url": "http://www.whatsapp.com/", "artist_view_url": "https://apps.apple.com/us/developer/whatsapp-inc/id310634000?uo=4" } ``` ### `appstore.reviews` A page of user reviews for a single Apple App Store app. ```http GET https://api.chocodata.com/api/v1/appstore/reviews?api_key=YOUR_KEY&id=310633997&country=us&page=1&sort=mostRecent ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `id` | string | ✅ yes | - | The numeric App Store track ID | | `country` | enum | - | `us` | Two-letter App Store storefront | | `page` | int | - | `1` | Review page to fetch | | `sort` | enum | - | `mostRecent` | `mostRecent` · `mostHelpful` | ```json { "id": "310633997", "country": "us", "page": 1, "sort": "mostRecent", "total_results": 50, "reviews": [ { "id": "14181597952", "author": "Arale soto aguilar", "author_url": "https://itunes.apple.com/us/reviews/id1642272657", "rating": 3, "title": "The new glitch", "body": "It is happening to me when I try to text the screen turns black…", "version": "26.22.76", "date": "2026-06-14T05:37:59-07:00", "vote_sum": 0, "vote_count": 0 } /* 49 more reviews */ ] } ``` ### `googleplay.product` Full listing for a single Google Play app by package ID. ```http GET https://api.chocodata.com/api/v1/googleplay/product?api_key=YOUR_KEY&id=com.whatsapp ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `id` | string | ✅ yes | - | The Android package ID (e.g. `com.whatsapp`) | | `country` | enum | - | `us` | Two-letter Play storefront | | `language` | string | - | region default | Content language as `xx_YY` | ```json { "id": "com.whatsapp", "package_id": "com.whatsapp", "title": "WhatsApp Messenger", "developer": "WhatsApp LLC", "developer_url": "http://www.whatsapp.com/", "description": "Simple. Reliable. Private.", "category": "COMMUNICATION", "operating_system": "ANDROID", "content_rating": "Everyone", "price": 0, "currency": "USD", "is_free": true, "rating": 4.661951065063477, "reviews_count": 236991524, "icon": "https://play-lh.googleusercontent.com/Gqxk4T0uZsDwFp07DE-508hkyvcNmgF…", "screenshots": [ "https://play-lh.googleusercontent.com/OBVqgRK7eerY0GPfK8AOzitu5oE9ecC6kG4kURTCb1K41gpqVsN0WjmJwJh-wX8…", "https://play-lh.googleusercontent.com/GQF4h3VL-kklOrVS_f1QRAJJZa2zQyVNcFbKdOIkvI_Pcu1op0Sy3uiry…" ], "url": "https://play.google.com/store/apps/details?id=com.whatsapp" } ``` ### `googleplay.search` Search Google Play by keyword and get ranked app cards. ```http GET https://api.chocodata.com/api/v1/googleplay/search?api_key=YOUR_KEY&q=whatsapp ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `q` | string | ✅ yes | - | Search keywords | | `country` | enum | - | `us` | Two-letter Play storefront | | `language` | string | - | region default | Content language as `xx_YY` | ```json { "query": "whatsapp", "page": 1, "total_results": 20, "results": [ { "position": 1, "id": "com.whatsapp", "package_id": "com.whatsapp", "title": "WhatsApp Messenger", "currency": "USD", "url": "https://play.google.com/store/apps/details?id=com.whatsapp" } /* 19 more cards */ ] } ``` ## Social Media Dedicated endpoints across Reddit, YouTube, TikTok, X (Twitter), Instagram, Facebook, and LinkedIn. Pull posts and their scores, video metadata, transcripts, comments, profiles, company pages, and job postings. Every call is the same `GET https://api.chocodata.com/api/v1/{target}/{resource}?api_key=YOUR_KEY&...` shape. See the [Scraping Social Media & App Stores guide](/docs/guides/social-and-app-stores) for an overview. ### `reddit.subreddit` A page of posts from a subreddit, in a chosen sort order. ```http GET https://api.chocodata.com/api/v1/reddit/subreddit?api_key=YOUR_KEY&subreddit=news&sort=hot&limit=5 ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `subreddit` | string | ✅ yes | - | Subreddit name without the `r/` prefix | | `sort` | enum | - | `hot` | `hot` · `new` · `top` · `rising` | | `t` | enum | - | site default | Time window for `top` (`hour` · `day` · `week` · `month` · `year` · `all`) | | `limit` | int | - | `25` | Number of posts to return | ```json { "subreddit": "news", "sort": "hot", "total_results": 5, "posts": [ { "id": "t3_1u6hmvz", "title": "Jeffco Public Schools says 61 boys found on girls' sports rosters were mascots, managers", "score": 13360, "num_comments": 352, "upvote_ratio": 0.9787, "awards": 0, "author": "HazyDavey68", "author_id": "t2_ayj7l5o9", "subreddit": "news", "permalink": "https://www.reddit.com/r/news/comments/1u6hmvz/…", "external_url": "https://www.denverpost.com/2026/06/13/…", "domain": "denverpost.com", "created": "2026-06-15T14:06:56.173000+0000" } /* 4 more posts */ ] } ``` ### `reddit.post` A single Reddit post plus its comment tree, with scores. ```http GET https://api.chocodata.com/api/v1/reddit/post?api_key=YOUR_KEY&subreddit=news&post_id=1u6hmvz ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `subreddit` | string | ✅ yes | - | Subreddit name without the `r/` prefix | | `post_id` | string | ✅ yes | - | The post's base-36 ID (with or without the `t3_` prefix) | | `sort` | enum | - | `top` | Comment sort: `top` · `new` · `best` · `controversial` · `old` | ```json { "post": { "id": "t3_1u6hmvz", "title": "Jeffco Public Schools says 61 boys found on girls' sports rosters were mascots, managers", "score": 13367, "num_comments": 353, "upvote_ratio": 0.9787, "author": "HazyDavey68", "subreddit": "news", "permalink": "https://www.reddit.com/r/news/comments/1u6hmvz/…", "external_url": "https://www.denverpost.com/2026/06/13/…", "domain": "denverpost.com", "body": null, "created": "2026-06-15T14:06:56.173000+0000" }, "comments_count": 13, "sort": "top", "comments": [ { "id": "t1_orsif6b", "parent_id": null, "depth": 0, "score": 4561, "author": "ByRWBadger", "body": "…", "created": "2026-06-15T14:12:53.614000+0000", "permalink": "https://www.reddit.com/r/news/comments/1u6hmvz/comment/orsif6b/" } /* 12 more comments */ ] } ``` ### `reddit.user` A user's public profile plus their recent posts and comments. ```http GET https://api.chocodata.com/api/v1/reddit/user?api_key=YOUR_KEY&username=spez ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `username` | string | ✅ yes | - | Reddit username without the `u/` prefix | ```json { "profile": { "username": "spez", "profile_url": "https://www.reddit.com/user/spez", "bio": "Reddit CEO", "icon": "https://www.redditstatic.com/icon.png/", "title": "overview for spez" }, "total_results": 25, "items": [ { "type": "comment", "id": "t1_optfyql", "short_id": "optfyql", "title": "/u/spez on Steve, Jen, and Drew here - Ask Us Anything!", "subreddit": "RDDT", "body": "…", "permalink": "https://www.reddit.com/r/RDDT/comments/1tvs5jj/…/optfyql/", "created": "2026-06-05T00:51:55+00:00" } /* 24 more items */ ] } ``` ### `reddit.search` Keyword search across Reddit. Results may be posts, comments, or subreddits. ```http GET https://api.chocodata.com/api/v1/reddit/search?api_key=YOUR_KEY&q=climate ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `q` | string | ✅ yes | - | Search keywords | | `subreddit` | string | - | - | Restrict the search to one subreddit | | `sort` | enum | - | `relevance` | `relevance` · `hot` · `top` · `new` · `comments` | | `t` | enum | - | site default | Time window (`hour` · `day` · `week` · `month` · `year` · `all`) | ```json { "query": "climate", "subreddit": null, "sort": "relevance", "total_results": 25, "results": [ { "position": 1, "id": "t5_2qhx3", "short_id": "2qhx3", "result_type": "subreddit", "title": "Information about the world's climate", "permalink": "https://www.reddit.com/r/climate/" } /* 24 more results */ ] } ``` ### `youtube.video` Metadata for a single YouTube video: title, description, view and like counts, channel, and related videos. ```http GET https://api.chocodata.com/api/v1/youtube/video?api_key=YOUR_KEY&video_id=dQw4w9WgXcQ ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `video_id` | string | ✅ yes | - | The 11-character YouTube video ID | ```json { "video_id": "dQw4w9WgXcQ", "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "type": "video", "title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)", "description": "The official video for “Never Gonna Give You Up”…", "view_count": 1783154138, "like_count": 19157745, "duration_seconds": 213, "keywords": ["rick astley", "never gonna give you up"], "category": "Music", "is_live": false, "is_family_safe": true, "publish_date": "2009-10-24T23:57:33-07:00", "channel_id": "UCuAXFkgsw1L7xaCfnd5JJOw", "channel_name": "Rick Astley", "channel_handle": "http://www.youtube.com/@RickAstleyYT", "channel_url": "https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw", "thumbnail": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hq720.jpg", "related_count": 12 } ``` ### `youtube.channel` A channel's profile and a page of its recent uploads. ```http GET https://api.chocodata.com/api/v1/youtube/channel?api_key=YOUR_KEY&channel=@MrBeast ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `channel` | string | ✅ yes | - | A channel handle (`@MrBeast`), channel ID (`UC…`), or channel URL | ```json { "channel": "MrBeast", "channel_id": "UCX6OQ3DkcsbYNE6H8uQQuVA", "channel_name": "MrBeast", "handle": "@MrBeast", "vanity_url": "http://www.youtube.com/@MrBeast", "url": "https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA", "avatar": "https://yt3.googleusercontent.com/nxYrc_1_2f77DoBadyxMTmv7ZpRZapHR5jbuYe7…", "is_family_safe": true, "subscriber_count": 501000000, "subscriber_count_text": "501M subscribers", "video_count": 987, "videos": [ { "position": 1, "id": "__fmDj0ZJ1Q", "title": "50 YouTube Legends Fight For $1,000,000", "url": "https://www.youtube.com/watch?v=__fmDj0ZJ1Q", "thumbnail": "https://i.ytimg.com/vi/__fmDj0ZJ1Q/hq720.jpg", "channel": "MrBeast", "views": "40,376,569 views", "published": "2d ago" } /* more videos */ ] } ``` ### `youtube.comments` A page of comments on a YouTube video, with author, like count, and reply count. ```http GET https://api.chocodata.com/api/v1/youtube/comments?api_key=YOUR_KEY&video_id=dQw4w9WgXcQ ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `video_id` | string | ✅ yes | - | The 11-character YouTube video ID | | `sort` | enum | - | `top` | `top` · `newest` | ```json { "video_id": "dQw4w9WgXcQ", "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "sort_applied": "top", "results_count": 20, "comments": [ { "id": "EhpVZ3pnZTM0MGRCZ0I3NWhXQm01NEFhQUJBZyAoKAE%3D", "text": "can confirm: he never gave us up", "author": "@YouTube", "author_channel_id": "UCBR8-60-B28hp2BmDPdntcQ", "author_is_verified": true, "published": "1 year ago", "like_count": "255K", "reply_count": "960" } /* 19 more comments */ ], "continuation": "Eg0SC2RRdzR3OVdnWGNRGAYygAMK…" } ``` ### `youtube.transcript` The timed transcript of a YouTube video, returned as timestamped segments and as one joined string. ```http GET https://api.chocodata.com/api/v1/youtube/transcript?api_key=YOUR_KEY&video_id=dQw4w9WgXcQ ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `video_id` | string | ✅ yes | - | The 11-character YouTube video ID | | `language` | string | - | default track | Preferred caption language code (e.g. `en`, `de-DE`); one of the `available_languages` | ```json { "video_id": "dQw4w9WgXcQ", "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "language": "en", "language_name": "English", "is_generated": false, "segment_count": 61, "available_languages": ["en", "de-DE", "ja", "pt-BR", "es-419"], "segments": [ { "text": "[♪♪♪]", "start": 1360, "duration": 1680 }, { "text": "♪ We're no strangers to love ♪", "start": 18640, "duration": 3240 } /* 59 more segments */ ], "text": "[♪♪♪] ♪ We're no strangers to love ♪ ♪ You know the rules and so do I ♪…" } ``` ### `tiktok.video` Metadata and engagement stats for a single TikTok video. ```http GET https://api.chocodata.com/api/v1/tiktok/video?api_key=YOUR_KEY&url=https://www.tiktok.com/@tiktok/video/7106594312292453675 ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `url` | string | ✅ yes | - | Full TikTok video URL (a bare numeric video ID is also accepted) | ```json { "id": "7106594312292453675", "url": "https://www.tiktok.com/@tiktok/video/7106594312292453675", "socialPlatform": "tiktok", "title": "how many frogs did you find? 🐸 check out tiktok's #Minecraft community today! @Gorillo", "description": "how many frogs did you find? 🐸 check out tiktok's #Minecraft community today! @Gorillo", "create_time": 1654632929, "created_at": "2022-06-07T20:15:29.000Z", "author": { "id": "107955", "uniqueId": "tiktok", "nickname": "TikTok", "verified": true, "signature": "One TikTok can make a big impact", "url": "https://www.tiktok.com/@tiktok" }, "stats": { "plays": 563500, "likes": 98700, "comments": 1339, "shares": 127, "saves": 58626 }, "hashtags": ["Minecraft"], "thumbnail": "https://p16-common-sign.tiktokcdn-us.com/…", "music": { "title": "original sound", "author_name": "TikTok" } } ``` ### `tiktok.profile` A TikTok creator's public profile and aggregate stats. ```http GET https://api.chocodata.com/api/v1/tiktok/profile?api_key=YOUR_KEY&username=tiktok ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `username` | string | ✅ yes | - | TikTok handle without the `@` prefix | ```json { "uniqueId": "tiktok", "nickname": "TikTok", "signature": "One TikTok can make a big impact", "verified": true, "secUid": "MS4wLjABAAAAv7iSuuXDJGDvJkmH_vz1qkDZYo1apxgzaxdBSeIuPiM", "id": "107955", "create_time": 1425144149, "created_at": "2015-02-28T17:22:29.000Z", "avatar": "https://p16-common-sign.tiktokcdn-us.com/…", "url": "https://www.tiktok.com/@tiktok", "socialPlatform": "tiktok", "stats": { "followerCount": 94400000, "followingCount": 3, "heartCount": 459900000, "videoCount": 1452 } } ``` ### `tiktok.oembed` The lightweight oEmbed record for a TikTok video: title, author, thumbnail, and ready-to-paste embed HTML. ```http GET https://api.chocodata.com/api/v1/tiktok/oembed?api_key=YOUR_KEY&url=https://www.tiktok.com/@tiktok/video/7106594312292453675 ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `url` | string | ✅ yes | - | Full TikTok video URL | ```json { "id": "7106594312292453675", "url": "https://www.tiktok.com/@tiktok/video/7106594312292453675", "socialPlatform": "tiktok", "type": "video", "version": "1.0", "title": "how many frogs did you find? 🐸 check out tiktok's #Minecraft community today! @Gorillo", "author_name": "TikTok", "author_unique_id": "tiktok", "author_url": "https://www.tiktok.com/@tiktok", "provider_name": "TikTok", "provider_url": "https://www.tiktok.com", "thumbnail_url": "https://p16-common-sign.tiktokcdn.com/…", "thumbnail_width": 576, "thumbnail_height": 1024, "embed_type": "video", "html": "
…" } ``` ### `xtwitter.tweet` A single tweet (post) from X with text, engagement counts, and author. ```http GET https://api.chocodata.com/api/v1/xtwitter/tweet?api_key=YOUR_KEY&id=20 ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `id` | string | ✅ yes | - | The numeric tweet (post) ID | ```json { "id": "20", "id_str": "20", "url": "https://x.com/jack/status/20", "socialPlatform": "twitter", "text": "just setting up my twttr", "full_text": "just setting up my twttr", "lang": "en", "created_at": "2006-03-21T20:50:14.000Z", "favorite_count": 311977, "reply_count": 17945, "conversation_count": 17945, "is_edited": false, "user": { "screen_name": "jack", "name": "jack", "id_str": "12", "is_blue_verified": true, "profile_image_url_https": "https://pbs.twimg.com/profile_images/…/azNjKOSH_normal.jpg", "url": "https://x.com/jack" }, "entities": { "urls": [], "user_mentions": [], "hashtags": [], "symbols": [] }, "media": [] } ``` ### `instagram.profile` An Instagram account's public profile and counts. ```http GET https://api.chocodata.com/api/v1/instagram/profile?api_key=YOUR_KEY&username=nasa ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `username` | string | ✅ yes | - | Instagram handle without the `@` prefix | ```json { "id": "528817151", "username": "nasa", "full_name": "NASA", "url": "https://www.instagram.com/nasa/", "biography": "Making the seemingly impossible, possible. ✨", "profile_pic_url": "https://scontent.cdninstagram.com/v/t51.2885-19/…", "is_verified": true, "is_private": false, "follower_count": 104408885, "following_count": 91, "posts_count": 4818, "og_description": "104M Followers, 95 Following, 4,818 Posts - See Instagram photos and videos from NASA" } ``` ### `instagram.post` A single Instagram post by its shortcode: caption, media, author, and engagement. ```http GET https://api.chocodata.com/api/v1/instagram/post?api_key=YOUR_KEY&shortcode=DWm8OQKlKvC ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `shortcode` | string | ✅ yes | - | The post shortcode (the segment after `/p/` in the URL) | ```json { "id": "DWm8OQKlKvC", "shortcode": "DWm8OQKlKvC", "media_id": "3866042192364874690", "url": "https://www.instagram.com/p/DWm8OQKlKvC/", "media_type": "carousel", "is_video": false, "title": "NASA launches Artemis II to the moon!", "author": "agpfoto", "author_id": "19918380", "author_url": "https://www.instagram.com/agpfoto/", "images": [ "https://scontent.cdninstagram.com/v/t51.82787-15/…" ], "thumbnail": "https://scontent.cdninstagram.com/v/t51.82787-15/…", "dimensions": { "width": 1080, "height": 1440 }, "caption": "NASA launches Artemis II to the moon!", "hashtags": [], "comments": 1079, "taken_at": "2026-04-02T00:02:44.000Z", "location": { "id": "254918491", "name": "Launch Complex 39 Press Site", "slug": "launch-complex-39-press-site" } } ``` ### `facebook.page` Search Facebook for pages by name and get matching page cards with like and follower counts. ```http GET https://api.chocodata.com/api/v1/facebook/page?api_key=YOUR_KEY&page=NASA ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `page` | string | ✅ yes | - | A page name or query | ```json { "query": "NASA", "page": 1, "results_count": 8, "total_results": 8, "results": [ { "position": 1, "id": "100044561550831", "title": "NASA - National Aeronautics and Space Administration", "url": "https://www.facebook.com/NASA/", "currency": "USD", "thumbnail": "https://scontent.xx.fbcdn.net/v/t39.30808-1/…", "type": "page", "page": "NASA", "page_id": "100044561550831", "name": "NASA - National Aeronautics and Space Administration", "tagline": "Explore the universe and discover our home planet.", "image": "https://scontent.xx.fbcdn.net/v/t39.30808-1/…", "likes": 28622651, "followers": 28622651, "talking_about_count": 141519 } /* 7 more page cards */ ] } ``` ### `facebook.post` A single Facebook post by URL: author, caption, media, and engagement counts. ```http GET https://api.chocodata.com/api/v1/facebook/post?api_key=YOUR_KEY&url=https://www.facebook.com/{page}/posts/{post_id} ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `url` | string | ✅ yes | - | Full Facebook post URL | ```json { "id": "1148...", "page": "NASA", "page_id": "100044561550831", "post_id": "1148...", "url": "https://www.facebook.com/NASA/posts/1148…", "author": "NASA - National Aeronautics and Space Administration", "caption": "Explore the universe and discover our home planet.", "title": "Explore the universe and discover our home planet.", "image": "https://scontent.xx.fbcdn.net/v/t39.30808-1/…", "reactions_count": 12840, "comments_count": 321, "shares_count": 188 } ``` ### `linkedin.jobsearch` Search LinkedIn job postings by keywords and location. ```http GET https://api.chocodata.com/api/v1/linkedin/jobsearch?api_key=YOUR_KEY&keywords=software%20engineer&location=United%20States ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `keywords` | string | ✅ yes | - | Job title or keywords | | `location` | string | - | - | Location to scope the search to | | `start` | int | - | `0` | Result offset for paging | ```json { "query": "software engineer", "keywords": "software engineer", "location": "United States", "start": 0, "page": 1, "total_results": 10, "jobs": [ { "position": 1, "id": "4407498584", "job_id": "4407498584", "title": "Software Engineer, New Grad (AI)", "url": "https://www.linkedin.com/jobs/view/software-engineer-new-grad-ai-at-notion-4407498584", "currency": "USD", "company": "Notion", "company_url": "https://www.linkedin.com/company/notionhq", "location": "San Francisco, CA", "posted_date": "2026-06-09", "posted_label": "6 days ago", "company_logo": "https://media.licdn.com/dms/image/v2/…/notionhq_logo" } /* 9 more jobs */ ] } ``` ### `linkedin.job` The full detail of a single LinkedIn job posting. ```http GET https://api.chocodata.com/api/v1/linkedin/job?api_key=YOUR_KEY&job_id=4407498584 ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `job_id` | string | ✅ yes | - | The numeric LinkedIn job ID | ```json { "id": "4407498584", "job_id": "4407498584", "title": "Software Engineer, New Grad (AI)", "url": "https://www.linkedin.com/jobs/view/4407498584", "company": "Notion", "company_url": "https://www.linkedin.com/company/notionhq", "location": "San Francisco, CA", "applicants": "Over 200 applicants", "posted_label": "6 days ago", "salary": "$160,000.00 - $250,000.00", "seniority": "Entry level", "employment_type": "Full-time", "job_function": "Engineering and Information Technology", "industries": "Software Development", "description": "Who We Are Notion is the collaborative AI workspace where teams and agents think together…", "company_logo": "https://media.licdn.com/dms/image/v2/…/notionhq_logo" } ``` ### `linkedin.company` A LinkedIn company page: industry, size, headquarters, and specialties. ```http GET https://api.chocodata.com/api/v1/linkedin/company?api_key=YOUR_KEY&company=microsoft ``` | Param | Type | Required | Default | Description | |---|---|---|---|---| | `company` | string | ✅ yes | - | The company's LinkedIn vanity name or numeric ID | ```json { "id": "microsoft", "name": "Microsoft", "url": "https://www.linkedin.com/company/microsoft", "followers": 28379789, "employee_count": 232340, "industry": "Software Development", "company_size": "10,001+ employees", "headquarters": "Redmond, Washington", "website": "https://news.microsoft.com/", "description": "Every company has a mission. What's ours? To empower every person and every organization to achieve more…", "specialties": "Business Software, Developer Tools, Cloud Computing, AI, Machine Learning…", "logo": "https://media.licdn.com/dms/image/v2/…/microsoft_logo" } ``` ## Find the exact endpoint for any site There are three ways to look up the precise path, parameters, and response for a specific site. ### 1. The scraper directory The full browsable catalogue of all 470 endpoints lives at **[/scraper-api](/scraper-api)**. Search by brand or category (for example `zillow`, `linkedin`, `finance`), and open any card for that endpoint's request shape, parameters, and an example. Cards marked **JSON** return structured data from a dedicated endpoint; cards marked **via Universal** route through the [Universal Web Scraper API](/docs/endpoints/universal). ### 2. The dashboard playground The **[dashboard playground](https://app.chocodata.com)** lets you run any endpoint live against your key, see the real response, and copy a ready-made cURL / Node / Python snippet. It is the fastest way to confirm field names and try parameters before you write code. ### 3. The machine-readable corpus For coding agents and LLMs, the full docs are available as [`/docs/llms.txt`](/docs/llms.txt) (manifest) and [`/docs/llms-full.txt`](/docs/llms-full.txt) (single-file concatenation). Append `.md` to any doc URL for raw Markdown. ## Anything not in the directory If a site or page type has no dedicated endpoint yet, you are not blocked: pass its URL to the [Universal Web Scraper API](/docs/endpoints/universal) and get back HTML, text, or auto-extracted JSON. The Universal endpoint covers the entire web, so the directory is a list of where we have a hand-tuned parser, not a list of what you can scrape. ## Related - [Core concepts](/docs/core-concepts) - the model behind every endpoint. - [Product endpoint](/docs/endpoints/product) - specific-item pattern in depth. - [Search endpoint](/docs/endpoints/search) - list pattern in depth. - [Universal Web Scraper API](/docs/endpoints/universal) - scrape any URL. - [Batch endpoint](/docs/endpoints/batch) - run many inputs against any endpoint asynchronously. --- # Changelog _Source: https://chocodata.com/docs/changelog_ # 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