Other

Autodoc API

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….

6 actionsLive JSON1,000 free creditsMCP-ready
Get a free keyOpen in playground

🤖 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 validate, enrich, classify and normalize operational data 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.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "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
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "autodoc",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 1900.4,
    "record_count": 20,
    "bytes": 691275,
    "cache_hit": false,
    "completeness_pct": 100,
    "stop_reason": "limit_reached",
    "method": "server_rendered_html",
    "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/[redacted-phone]-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
  },
  "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": 13.99,
        "price_was": null,
        "rrp": 24.7,
        "currency": "GBP",
        "on_sale": true,
        "rating": 5,
        "rating_stars_out_of_10": 10,
        "review_count": 40,
        "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": 2286,
        "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": 20.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": 49,
        "in_stock": true,
        "fits_selected_vehicle": true
      },
      {
        "article_id": "8000053",
        "article_number": "402B0334",
        "url": "https://www.autodoc.co.uk/ridex/8000053",
        "title": "RIDEX 402B0334 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": 44.6,
        "currency": "GBP",
        "on_sale": true,
        "rating": 4,
        "rating_stars_out_of_10": 8,
        "review_count": 37,
        "image": "https://media.autodoc.de/360_photos/8000053/preview.jpg",
        "images_360_url": "https://media.autodoc.de/360_photos/8000053",
        "specifications": [
          {
            "name": "[trimmed-depth]",
            "value": "[trimmed-depth]"
          },
          {
            "name": "[trimmed-depth]",
            "value": "[trimmed-depth]"
          },
          {
            "name": "[trimmed-depth]",
            "value": "[trimmed-depth]"
          }
        ],
        "units_left": 206,
        "in_stock": true,
        "fits_selected_vehicle": true
      }
    ],
    "category": {
      "slug": "brake-pad-set-10130",
      "category_id": "10130",
      "name": "[redacted-name]",
      "url": "https://www.autodoc.co.uk/car-parts/brake-pad-set-10130"
    },
    "vehicle": {
      "vehicle_id": "12272",
      "vehicle_slug": "[redacted-phone]-d",
      "maker": "bmw",
      "model": "1er-reihe",
      "generation": "1-coupe-e82",
      "name": "[redacted-name]",
      "url": "https://www.autodoc.co.uk/spares/bmw/1er-reihe/1-coupe-e82/[redacted-phone]-d"
    }
  }
}
Actions

What the Autodoc API does

ActionDescriptionConcrete use caseKey params
vehicle_lookupWalk 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 the 52 makers; 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` to walk the German storefront's tree instead; the slugs are the same on both, so a vehicle resolved on one market can be used on the other.Ops teams call vehicle_lookup to get walk Autodoc's vehicle tree.market, maker, model, generation, vehicle, ...
searchThe 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) or `de` (EUR). The same vehicle and the same category work on both — what changes is the price, the currency and the language of the copy.Developer tools call search to get the parts that FIT one exact car, in one part category.category, maker, model, generation, vehicle, ...
product_detailOne 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.Validation workflows 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_searchAutodoc'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` to search the German storefront (EUR).Data-quality teams call part_search to get autodoc's own catalogue-wide search, across roughly 6.7 million parts.query, market, page, max_results
oem_lookupCross-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` for the German storefront's prices (EUR); the OE number and the parts it resolves to are the same on both.Ops 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
categoriesAutodoc'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.Developer tools call categories to get autodoc's part-category vocabulary.market, group
Code samples

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}'
MCP one-liner
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}.
Use cases

Who uses this API and why

  • Ops teams use Autodoc to get walk Autodoc's vehicle tree.
  • Developer tools use Autodoc to get the parts that FIT one exact car, in one part category.
  • Validation workflows use Autodoc to get one part in full, by Autodoc's numeric article id (or its URL).
  • Data-quality teams use Autodoc to get autodoc's own catalogue-wide search, across roughly 6.7 million parts.
  • Ops teams use Autodoc to get cross-reference a vehicle manufacturer's ORIGINAL part number to everything Autodoc sells as….
FAQ

Questions developers ask before integrating

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 a 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, and 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.

Is the Autodoc API a Autodoc scraper?

It is the managed alternative to a DIY Autodoc scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same autodoc back as clean JSON.

Why does my Autodoc scraper keep getting blocked?

Most Autodoc scrapers break on anti-bot defenses, rate limits and IP bans that need rotating residential proxies and browser fingerprinting to clear. ReefAPI handles all of that for you — no proxies, no captchas, no maintenance — and returns live JSON. Blocked or failed calls are free.

docs / autodoc

Autodoc

Autodoc

base /autodoc/v16 endpoints
post/autodoc/v1/vehicle_lookup1 credit

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 the 52 makers; 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` to walk the German storefront's tree instead; the slugs are the same on both, so a vehicle resolved on one market can be used on the other.

ParameterAllowed / rangeDescription
market = ukoptionaluk · deWhich Autodoc storefront to read: `uk` (autodoc.co.uk, prices in GBP) or `de` (autodoc.de, prices in EUR). Defaults to `uk`. This decides the catalogue, the prices and the currency, and it applies to EVERY action here — the vehicle tree, the fitment listing, the part page, both searches and the category list. The SLUGS are shared between the two storefronts, so a vehicle or category you resolved on one market can be passed straight to the other; the ids (`article_id`, `vehicle_id`, `category_id`) are the same part and the same car on both. What changes is the price, the currency and the language of the human-readable text. Currency is always read from the page itself and returned in `currency`, so you never have to infer it from this value.
makeroptionalThe car manufacturer, as the slug Autodoc uses in its own URLs — `bmw`, `vw`, `audi`, `mercedes-benz`, `ford`, `vauxhall`, `toyota`, `renault`. Call `vehicle_lookup` with no parameters to get the full list of the 52 makers with their exact slugs; never guess one. Autodoc publishes no open numeric id for a maker (that lives behind a route this API cannot reach), so the slug IS the key.
modeloptionalThe model family slug, as returned by `vehicle_lookup` for your maker — note Autodoc uses German slugs for some families even on the UK site (`1er-reihe` is the BMW 1 Series, `3er-reihe` the 3 Series). Requires `maker`.
generationoptionalThe generation / body slug — the chassis code most owners know their car by (`1-coupe-e82`, `1-e87`, `1-f20`). Returned by `vehicle_lookup` for your model. Requires `maker` and `model`.
vehicleoptionalThe exact engine variant — this is what makes a fitment answer true, and `search` REQUIRES it. Pass either the full slug `vehicle_lookup` returns (`12272-118-d`) or just Autodoc's numeric vehicle id (`12272`); both resolve to the same car. Requires `maker`, `model` and `generation`, because Autodoc's vehicle URLs are hierarchical — the id alone has no page of its own. NOTE: this is the ONLY way to scope parts to a car. Autodoc's `?carId=` query parameter looks like it should work and is silently ignored (measured: identical results with it, without it, and with a nonsense value).
vehicle_urloptionalA full Autodoc vehicle URL instead of the four path parameters — the shortest way to re-use a vehicle you already resolved. Accepted by both `vehicle_lookup` and `search`. Either storefront's spelling works (`autodoc.co.uk/spares/…` or `autodoc.de/ersatzteile/…`) and the URL's own domain SETS the market, so you do not have to pass `market` as well; passing a URL from one storefront together with `market` set to the other is refused rather than silently resolved to one of them.
Try in playground →
post/autodoc/v1/product_detail2 credits

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.

ParameterAllowed / rangeDescription
article_idoptionalAutodoc's own numeric part id, exactly as every other action here returns it. This is the ONLY key `product_detail` needs — the brand in the URL is decoration and Autodoc redirects `/anything/7999106` to the right part. Provide `article_id` or `url`.
urloptionalA full Autodoc part URL — an alternative to `article_id`. Either storefront's domain works and the domain SETS the market, so `autodoc.de/ridex/7999106` returns the same part priced in EUR.
market = ukoptionaluk · deWhich Autodoc storefront to read: `uk` (autodoc.co.uk, prices in GBP) or `de` (autodoc.de, prices in EUR). Defaults to `uk`. This decides the catalogue, the prices and the currency, and it applies to EVERY action here — the vehicle tree, the fitment listing, the part page, both searches and the category list. The SLUGS are shared between the two storefronts, so a vehicle or category you resolved on one market can be passed straight to the other; the ids (`article_id`, `vehicle_id`, `category_id`) are the same part and the same car on both. What changes is the price, the currency and the language of the human-readable text. Currency is always read from the page itself and returned in `currency`, so you never have to infer it from this value.
max_reviews = 25optional0–100How many of the part's inline reviews to return (0-100). Autodoc publishes roughly 25 on the page itself; there is no second page of them on this route, so asking for more does not fetch more.
Try in playground →
post/autodoc/v1/oem_lookup3 credits

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` for the German storefront's prices (EUR); the OE number and the parts it resolves to are the same on both.

ParameterAllowed / rangeDescription
oem_numberrequiredA vehicle manufacturer's ORIGINAL part number (BMW 34216774692, VAG 1K0615301AA). Returns every aftermarket part Autodoc sells as a replacement for it — the cross-reference this industry runs on. Spaces and dots are ignored. A number Autodoc does not carry returns a typed NOT_FOUND rather than the catalogue landing page it actually serves.
market = ukoptionaluk · deWhich Autodoc storefront to read: `uk` (autodoc.co.uk, prices in GBP) or `de` (autodoc.de, prices in EUR). Defaults to `uk`. This decides the catalogue, the prices and the currency, and it applies to EVERY action here — the vehicle tree, the fitment listing, the part page, both searches and the category list. The SLUGS are shared between the two storefronts, so a vehicle or category you resolved on one market can be passed straight to the other; the ids (`article_id`, `vehicle_id`, `category_id`) are the same part and the same car on both. What changes is the price, the currency and the language of the human-readable text. Currency is always read from the page itself and returned in `currency`, so you never have to infer it from this value.
page = 1optional1–50Which page of results to start from (1-based). Autodoc serves 20 parts per page. Page until `meta.pagination.has_more` is false.
max_results = 20optional1–200How many parts to return in total (1-200). Anything above 20 costs one extra upstream page fetch per additional 20 results, and each Autodoc page is roughly 650KB, so ask for what you will use.
Try in playground →
post/autodoc/v1/categories1 credit

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.

ParameterAllowed / rangeDescription
groupoptionalOptional substring filter over the category list (`brake`, `filter`, `suspension`, `oil`). Case-insensitive, matched against both the category name and its slug. Omit to get all 199. NOTE this matches the words of the storefront you asked for: on `market=de` the names and slugs are German, so `filter` still works (Ölfilter/Luftfilter) but `oil` returns nothing and `öl`/`brems` are what match (measured: `oil` -> 17 categories on uk, 0 on de). Filter on `category_id` instead when you need a market-independent answer — the ids are the same categories on both storefronts.
market = ukoptionaluk · deWhich Autodoc storefront to read: `uk` (autodoc.co.uk, prices in GBP) or `de` (autodoc.de, prices in EUR). Defaults to `uk`. This decides the catalogue, the prices and the currency, and it applies to EVERY action here — the vehicle tree, the fitment listing, the part page, both searches and the category list. The SLUGS are shared between the two storefronts, so a vehicle or category you resolved on one market can be passed straight to the other; the ids (`article_id`, `vehicle_id`, `category_id`) are the same part and the same car on both. What changes is the price, the currency and the language of the human-readable text. Currency is always read from the page itself and returned in `currency`, so you never have to infer it from this value.
Try in playground →