Autodoc API & Scraper
Autodoc API returns live Autodoc data as clean JSON for autodoc The primary endpoint, vehicle_lookup, returns level ('makers'|'models'|'generations'|'vehicles'|'vehicle') + items[] whose shape follows the level: makers/models/generations are {slug….
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
Developers reach for it when they need to track product listings, prices, availability, variants and reviews without maintaining one-off scraping code or separate API contracts. If you were about to build or fix a Autodoc scraper, this API is the maintained alternative — it returns the same data as clean JSON, with the proxies, rotation and anti-bot handling already solved. This page covers the live example, request shape, response shape and available actions: vehicle_lookup, search, product_detail, part_search. Every request uses the same ReefAPI envelope, one API key and one shared credit pool, so it fits alongside the rest of your data stack.
Autodoc part numbers: which number belongs to whom
A car part has at least three different numbers attached to it and they are not interchangeable. Autodoc has its own internal id, the parts brand has its article number, and the car manufacturer has the OE number the part replaces. Each is looked up by a different action. All examples were measured 2026-08-27 on one RIDEX rear brake pad set.
| Field | Whose number it is | Measured example | Looked up by |
|---|---|---|---|
| article_id | Autodoc's own part id | 7999106 | product_detail (article_id) |
| article_number / sku | The parts brand's number | 402B0071 (RIDEX) | part_search (query) |
| oem_numbers[] | The car maker's original numbers | 34216774692 (BMW), 14 on this one part | oem_lookup (oem_number) |
| ean | GTIN-13 from the spec table | 4059191314577 | returned by product_detail only |
| vehicle_id | One exact engine variant | 12272, BMW E82 118d 2.0 136 hp N47 D20 C | vehicle_lookup, then search |
| category slug | Words plus the real numeric id | brake-pad-set-10130 | categories, then search |
| brand_id | The parts brand | 100015 (RIDEX) | returned on every part row |
The two searches are not interchangeable. part_search takes a parts-brand number: 402B0071 returned article 7999106 first, then BREMBO P 06 038 and FEBI BILSTEIN 16533 as alternatives. oem_lookup takes only a car maker's OE number and answers one it does not carry with a typed NOT_FOUND rather than a landing page. Makers, models and generations have no public numeric id at all, so their slug is the key and maker_id is usually null.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/autodoc/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"category": "brake-pad-set-10130",
"maker": "bmw",
"model": "1er-reihe",
"generation": "1-coupe-e82",
"vehicle": "12272-118-d",
"max_results": 20
}
}{
"ok": true,
"meta": {
"api": "autodoc",
"endpoint": "search",
"mode": "live",
"latency_ms": 16774.7,
"record_count": 20,
"bytes": 723446,
"cache_hit": false,
"completeness_pct": 100,
"stop_reason": "limit_reached",
"upstream_calls": 1,
"fitment": "vehicle",
"scope": [
"bmw",
"1er-reihe",
"1-coupe-e82"
],
"source": {
"route": "/car-parts/brake-pad-set-10130/bmw/1er-reihe/1-coupe-e82/12272-118-d"
},
"pagination": {
"page": 1,
"per_page": 20,
"returned": 20,
"pages_fetched": 1,
"total_results": null,
"known_pages_at_least": 5,
"has_more": true,
"next_page": 2
},
"notes": null,
"timing": {
"total_ms": 16744,
"clearance": "solved",
"cold_start": true,
"clearance_ms": 15129,
"clearance_solves": 1,
"fetches": 1,
"fetch_ms": 1602,
"walls_retried": 0,
"transport_errors_retried": 0
},
"charged_credits": 2,
"version": "1.3.0"
},
"data": {
"parts": [
{
"article_id": "7999106",
"article_number": "402B0071",
"url": "https://www.autodoc.co.uk/ridex/7999106",
"title": "RIDEX 402B0071 Brake pad set Rear Axle, Low-Metallic",
"brand": "RIDEX",
"brand_slug": "ridex",
"brand_id": "100015",
"category_name": "Brake pad set",
"category_generic_id": "402",
"price": 10.99,
"price_was": null,
"rrp": 24.7,
"currency": "GBP",
"on_sale": true,
"rating": 5,
"rating_stars_out_of_10": 10,
"review_count": 44,
"image": "https://media.autodoc.de/360_photos/7999106/preview.jpg",
"images_360_url": "https://media.autodoc.de/360_photos/7999106",
"specifications": [
{
"name": "[trimmed-depth]",
"value": "[trimmed-depth]"
},
{
"name": "[trimmed-depth]",
"value": "[trimmed-depth]"
},
{
"name": "[trimmed-depth]",
"value": "[trimmed-depth]"
}
],
"units_left": 1942,
"in_stock": true,
"fits_selected_vehicle": true
},
{
"article_id": "16413283",
"article_number": "402B0071P",
"url": "https://www.autodoc.co.uk/ridex-plus/16413283",
"title": "RIDEX PLUS 402B0071P Brake pad set Rear Axle",
"brand": "RIDEX PLUS",
"brand_slug": "ridex-plus",
"brand_id": "100762",
"category_name": "Brake pad set",
"category_generic_id": "402",
"price": 18.49,
"price_was": null,
"rrp": 56.58,
"currency": "GBP",
"on_sale": true,
"rating": 4,
"rating_stars_out_of_10": 8,
"review_count": 9,
"image": "https://media.autodoc.de/360_photos/16413283/preview.jpg",
"images_360_url": "https://media.autodoc.de/360_photos/16413283",
"specifications": [
{
"name": "[trimmed-depth]",
"value": "[trimmed-depth]"
},
{
"name": "[trimmed-depth]",
"value": "[trimmed-depth]"
},
{
"name": "[trimmed-depth]",
"value": "[trimmed-depth]"
}
],
"units_left": 44,
"in_stock": true,
"fits_selected_vehicle": true
},
{
"article_id": "7999363",
"article_number": "402B0138",
"url": "https://www.autodoc.co.uk/ridex/7999363",
"title": "RIDEX 402B0138 Brake pad set Front Axle",
"brand": "RIDEX",
"brand_slug": "ridex",
"brand_id": "100015",
"category_name": "Brake pad set",
"category_generic_id": "402",
"price": 15.49,
"price_was": null,
"rrp": 30.8,
"currency": "GBP",
"on_sale": true,
"rating": 4,
"rating_stars_out_of_10": 8,
"review_count": 73,
"image": "https://media.autodoc.de/360_photos/7999363/preview.jpg",
"images_360_url": "https://media.autodoc.de/360_photos/7999363",
"specifications": [
{
"name": "[trimmed-depth]",
"value": "[trimmed-depth]"
},
{
"name": "[trimmed-depth]",
"value": "[trimmed-depth]"
},
{
"name": "[trimmed-depth]",
"value": "[trimmed-depth]"
}
],
"units_left": 1854,
"in_stock": true,
"fits_selected_vehicle": true
}
],
"category": {
"slug": "brake-pad-set-10130",
"category_id": "10130",
"name": "Brake pads",
"url": "https://www.autodoc.co.uk/car-parts/brake-pad-set-10130"
},
"vehicle": {
"vehicle_id": "12272",
"vehicle_slug": "12272-118-d",
"maker": "bmw",
"model": "1er-reihe",
"generation": "1-coupe-e82",
"name": "Brake pads for BMW E82 118d 2.0 136 hp Diesel 2009 - 2013 N47 D20 C",
"url": "https://www.autodoc.co.uk/spares/bmw/1er-reihe/1-coupe-e82/12272-118-d"
}
}
}What the Autodoc API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| vehicle_lookup | Walk Autodoc's vehicle tree — this is where every other action starts, because car parts are only meaningful against a specific car. Call it with no parameters for every maker (176: the popular ones flagged `popular: true`, the rest from Autodoc's full maker page, each with `model_count`); add `maker` for that maker's model families; add `model` for the generations (the chassis codes: E82, F20, W204); add `generation` for the actual engine variants, each with Autodoc's numeric vehicle id. Add `vehicle` (or pass a `vehicle_url`) and you get the car itself — its full factory description (engine, kW/hp, fuel, build years, engine code) plus every part category Autodoc stocks for it, ready to feed straight into `search`. Set `market` to `de` or `es` to walk that storefront's tree instead; the slugs are the same on all, so a vehicle resolved on one market can be used on the other. | Pricing teams call vehicle_lookup to get walk Autodoc's vehicle tree. | market, maker, model, generation, vehicle, ... |
| search | The parts that FIT one exact car, in one part category — the question this API exists to answer. Give a `category` (from the `categories` action, or better from the `categories[]` that a `vehicle_lookup` on your vehicle returns) plus the full vehicle: `maker` + `model` + `generation` + `vehicle`, or a single `vehicle_url`. You get Autodoc's own fitment listing — every brand that makes that part for that car, with price, RRP, rating, review count, the manufacturer's part number, the key specifications and the image — 20 per page. THE VEHICLE IS NOT OPTIONAL, and that is Autodoc's data model rather than a limit of this API: a parts list only exists for one exact engine variant. Autodoc's category page, maker page, model page and generation page are all real pages that carry NO product listing whatsoever (measured: 0 parts at every level above the engine variant, 20 at it). Omitting the vehicle returns MISSING_PARAM rather than an empty result set that would cost you a call and tell you nothing. `market` decides which storefront is priced: `uk` (GBP), `de` or `es` (EUR). The same vehicle and the same category work on all three — what changes is the price, the currency and the language of the copy. | Marketplace operators call search to get the parts that FIT one exact car, in one part category. | category, maker, model, generation, vehicle, ... |
| product_detail | One part in full, by Autodoc's numeric article id (or its URL). Returns the complete image gallery and the 360-degree photo set, the manufacturer's own specification table verbatim (fitting position, dimensions, material, WVA number, weight, EAN), the manufacturer part number, brand, price with currency, availability, shipping cost and return window, the aggregate rating and the customer reviews inline — and, the two fields that matter most in this industry, the full OE cross-reference (every vehicle-manufacturer part number this part replaces) and the equivalent parts Autodoc sells alongside it. `market` picks the storefront — the same `article_id` is the same part on both, priced in GBP on `uk` and EUR on `de`, and `currency` always reports what the page itself said. | Catalog enrichment teams call product_detail to get one part in full, by Autodoc's numeric article id (or its URL). | article_id, url, market, max_reviews |
| part_search | Autodoc's own catalogue-wide search, across roughly 6.7 million parts. Built for the lookup this trade actually does: paste a manufacturer part number (`1987474465`, `402B0071`) and get that part plus its alternatives, or type plain English (`brake pads`, `wiper blades`) for a normal keyword result set. Results are not scoped to a car — use `search` when you need fitment, and `oem_lookup` when the number you hold came off the vehicle manufacturer's own part. Set `market` to `de` or `es` to search that storefront (EUR). Free text is matched by the STOREFRONT'S OWN search, which only understands its own language: Spanish text on `es`, German on `de`, English on `uk` (measured: 'pastillas de freno' on es = 20/20 brake-pad sets; the same text on de = air fresheners, as on autodoc.de itself). Part numbers work on every market. | Retail analysts call part_search to get autodoc's own catalogue-wide search, across roughly 6.7 million parts. | query, market, page, max_results |
| oem_lookup | Cross-reference a vehicle manufacturer's ORIGINAL part number to everything Autodoc sells as a replacement for it. Give BMW's 34216774692 and get the Brembo, TRW, Bosch, ATE and budget-brand equivalents, each with price, rating and the manufacturer's own part number. This is the endpoint a workshop or a parts reseller uses, and it is the reverse of the `oem_numbers` list `product_detail` returns for a part. Set `market` to `de` or `es` for that storefront's prices (EUR); the OE number and the parts it resolves to are the same on all three. | Pricing teams call oem_lookup to get cross-reference a vehicle manufacturer's ORIGINAL part number to everything Autodoc sells as…. | oem_number, market, page, max_results |
| categories | Autodoc's part-category vocabulary — all 199 leaf categories with the slug and numeric id the `search` action needs, so a caller never has to guess one. Optionally filter with `group` (`brake`, `filter`, `suspension`). `market` picks the storefront, which is what decides the LANGUAGE of the slugs and names — the numeric ids are the same category on both, and a uk slug passed to a de `search` resolves correctly because the number is what Autodoc keys on. Cached hard: this list barely moves. | Marketplace operators call categories to get autodoc's part-category vocabulary. | market, group |
Call search from your stack
curl -X POST https://api.reefapi.com/autodoc/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"category":"brake-pad-set-10130","maker":"bmw","model":"1er-reihe","generation":"1-coupe-e82","vehicle":"12272-118-d","max_results":20}'import requests
r = requests.post(
"https://api.reefapi.com/autodoc/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"category": "brake-pad-set-10130",
"maker": "bmw",
"model": "1er-reihe",
"generation": "1-coupe-e82",
"vehicle": "12272-118-d",
"max_results": 20
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/autodoc/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"category": "brake-pad-set-10130",
"maker": "bmw",
"model": "1er-reihe",
"generation": "1-coupe-e82",
"vehicle": "12272-118-d",
"max_results": 20
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.autodoc.search with {"category":"brake-pad-set-10130","maker":"bmw","model":"1er-reihe","generation":"1-coupe-e82","vehicle":"12272-118-d","max_results":20}.Who uses this API and why
- Pricing teams use Autodoc to get walk Autodoc's vehicle tree.
- Marketplace operators use Autodoc to get the parts that FIT one exact car, in one part category.
- Catalog enrichment teams use Autodoc to get one part in full, by Autodoc's numeric article id (or its URL).
- Retail analysts use Autodoc to get autodoc's own catalogue-wide search, across roughly 6.7 million parts.
- Pricing teams use Autodoc to get cross-reference a vehicle manufacturer's ORIGINAL part number to everything Autodoc sells as….
Questions developers ask before integrating
How do I address one exact car?
Four path segments: maker, model, generation and vehicle, for example bmw / 1er-reihe / 1-coupe-e82 / 12272-118-d. Model slugs are German even on the UK site, so 1er-reihe is the 1 Series. vehicle accepts either the full slug or the bare numeric id 12272, and search will not run without it. You can replace all four with a single vehicle_url, and the URL's own domain sets the storefront, so an autodoc.de URL prices in EUR without passing market.
Is the category slug validated?
Only its numeric suffix is. The words are decoration. A search with category=nonsense-words-10130 came back ok with the category resolved to slug brake-pad-set-10130, category_id 10130, name Brake pads. A slug whose words and id disagree will therefore silently return a different part category. Always copy the slug from the categories action or from the categories[] a vehicle_lookup returns for your car.
Do the UK and German storefronts price the same part differently?
They are separate catalogues carrying the same number in a different currency. Article 7999106 returned 10.99 GBP on market=uk and 10.99 EUR on market=de, measured minutes apart, so the numeral is identical and the money is not. Review counts differ too, 41 on the UK listing and 29 on the German one, because each storefront collects its own. Treat them as two catalogues, not one catalogue with a currency switch.
Does compatibility data actually come through?
Yes, but through the fitment listing rather than a per-part vehicle list. On the measured part, fits_vehicles came back as an empty array, while compatible_makers listed BMW with maker_id 16 and oem_references listed 14 BMW OE numbers with the maker named against each. The reliable answer to does this fit my car is to run search scoped to a vehicle and read fits_selected_vehicle: it was true on all five brake-pad rows for the E82 118d, and false on the same part returned by oem_lookup, which is not vehicle-scoped.
Why is total_results always null?
Autodoc publishes no result count anywhere on the page, and its pagination strip is a sliding window rather than a full list of pages. meta.pagination therefore reports known_pages_at_least, a lower bound, and never a total. Pages are 20 parts each, so page until has_more is false. Each upstream page is roughly 650KB, so set max_results to what you will actually use.
What is the difference between the categories action and a vehicle's own category list?
categories returns the catalogue-wide leaf categories, 199 of them, each with a slug and a numeric id. A vehicle_lookup scoped to a car returns a different list that also includes Autodoc's group landing pages, which have no numeric suffix, such as air-conditioning and axle-drive. Those still work as a category value: air-conditioning scoped to the E82 118d returned parts normally. Only about half of the two lists overlap, so prefer the vehicle's own list when you have a car.
Are the numeric category ids the same on both storefronts?
Mostly, but not entirely. 164 of the 199 ids published on autodoc.co.uk also appear in the 199 published on autodoc.de. The slugs and names are localised, which matters for the group filter: group=oil returns 17 categories on the UK storefront and 0 on the German one, where the matching word is öl. Filter on the id where you can, and re-read categories per market where you cannot.
Is units_left a real stock figure?
It is Autodoc's own ending-soon counter, not a warehouse count, and it varies wildly: 1,873 on the RIDEX pad set and 56 on the RIDEX PLUS front set in the same response. Pair it with in_stock, which is the flag that actually matters; one cross-reference row came back with units_left 0 and in_stock false. rrp against price is where the discount lives, 24.70 against 10.99 GBP with on_sale true on the measured part.
What is the Autodoc API?
Autodoc API is a ReefAPI endpoint group for autodoc It returns live JSON through POST requests under /autodoc/v1.
Is the Autodoc API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Autodoc calls use the same shared credit balance as every other ReefAPI engine.
Do I need an Autodoc login or account?
No login to Autodoc is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Autodoc data?
The page example is captured from a live vehicle_lookup call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Autodoc API use?
Autodoc actions currently cost 1-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Autodoc from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call autodoc actions with the same key, credit pool and JSON envelope used by normal REST requests.