REST API
Everything on this site is available as JSON. No key, no sign-up, no write methods.
Quick start
curl https://toyota-epc.aftermarketcatalog.com/api/v1 # a VIN to its catalogue curl https://toyota-epc.aftermarketcatalog.com/api/v1/vin/JTDKB20U903100000 # a drawing with every part on it curl https://toyota-epc.aftermarketcatalog.com/api/v1/catalogs/EU/112510/figures/712850 # one part number, everywhere curl https://toyota-epc.aftermarketcatalog.com/api/v1/part-numbers/7397055010
Add ?pretty to any URL for indented JSON.
Conventions
- Envelope
- { data, meta, links }
- Errors
- { error: { status, code, message } }
- Paging
- ?limit= (max 500) &offset=
- Language
- ?lang=01 … 05
- Market
- in the path, or ?region=EU|GR|US|JP
- Rate limit
- 120 requests/minute per address
- CORS
- open to any origin; GET and OPTIONS only
- Caching
- Cache-Control: public, max-age=3600
Read meta.capped before trusting a total.
Several tables run to tens or hundreds of millions of rows and every underlying query
carries a hard cap. When a result hits that cap, capped: true
says the total is a floor, not the real count.
Abbreviations
1 endpoints| Path | What it returns |
|---|---|
| GET /api/v1/abbreviations | The abbreviation dictionary |
Accessories
3 endpoints| Path | What it returns |
|---|---|
| GET /api/v1/accessories | Accessory campaigns |
| GET /api/v1/accessories/{campaign} | One campaign and its items |
| GET /api/v1/accessories/item/{id} | One accessory line |
Catalogs
14 endpoints| Path | What it returns |
|---|---|
| GET /api/v1/catalogs | Search catalogues by model, chassis or catalogue code |
| GET /api/v1/catalogs/{region}/{code} | One vehicle catalogue |
| GET /api/v1/catalogs/{region}/{code}/sections | The sections of a catalogue, with cover figures |
| GET /api/v1/catalogs/{region}/{code}/sections/{section} | One section: its part groups and drawings |
| GET /api/v1/catalogs/{region}/{code}/groups/{pnc} | Every part line under one part group (PNC) |
| GET /api/v1/catalogs/{region}/{code}/figures | Every figure key used by a catalogue |
| GET /api/v1/catalogs/{region}/{code}/figures/{figureKey} | A drawing with its callouts and all the parts they point at |
| GET /api/v1/catalogs/{region}/{code}/variants | Model variants and VIN prefixes a catalogue covers |
| GET /api/v1/catalogs/{region}/{code}/characteristics | The attribute legend used by the fitment codes |
| GET /api/v1/catalogs/{region}/{code}/frames | Frame-number ranges a catalogue applies to |
| GET /api/v1/catalogs/{region}/{code}/group-members | Catalogue group to model-variant mapping |
| GET /api/v1/catalogs/{region}/{code}/notes | Illustration notes (per catalogue, not per figure) |
| GET /api/v1/catalogs/{region}/{code}/new-parts | Most recently introduced parts in a catalogue |
| GET /api/v1/catalogs/{region}/{code}/specs | Raw spec/option codes for a catalogue |
Fitment
1 endpoints| Path | What it returns |
|---|---|
| GET /api/v1/fitment/{code} | Every part carrying a given fitment code |
Openapi.json
1 endpoints| Path | What it returns |
|---|---|
| GET /api/v1/openapi.json | This OpenAPI document |
Part names
1 endpoints| Path | What it returns |
|---|---|
| GET /api/v1/part-names | Part groups by name |
Part numbers
4 endpoints| Path | What it returns |
|---|---|
| GET /api/v1/part-numbers/{number} | Everything known about a part number, across all markets |
| GET /api/v1/part-numbers/{number}/history | Supersessions, the full replacement chain, and substitutes |
| GET /api/v1/part-numbers/{number}/suffixes | What the two-character suffix on a number selects |
| GET /api/v1/part-numbers/{number}/price | List price (Japanese dataset only) |
Parts
1 endpoints| Path | What it returns |
|---|---|
| GET /api/v1/parts/{id} | One catalogue part line, with fitment and remarks |
Regions
3 endpoints| Path | What it returns |
|---|---|
| GET /api/v1/regions | The four market datasets |
| GET /api/v1/regions/{region}/models | Model families in one market, A–Z |
| GET /api/v1/regions/{region}/models/{slug} | One model family and its production runs |
Search
1 endpoints| Path | What it returns |
|---|---|
| GET /api/v1/search | Unified search: VIN, part number, model or part name |
Service
1 endpoints| Path | What it returns |
|---|---|
| GET /api/v1 | Service description and endpoint index |
Stats
1 endpoints| Path | What it returns |
|---|---|
| GET /api/v1/stats | Every table behind the catalogue, with row counts |
Vehicles
3 endpoints| Path | What it returns |
|---|---|
| GET /api/v1/vehicles/{chassis}/serials | Serial runs recorded for a chassis |
| GET /api/v1/vehicles/{chassis}/{frame} | Build month for one chassis and frame number |
| GET /api/v1/vehicles/model-code/{modelCode}/accessories | Accessories offered against a model code |
Vin
1 endpoints| Path | What it returns |
|---|---|
| GET /api/v1/vin/{vin} | VIN or frame prefix to the catalogues covering the vehicle |
What the data does not contain
These are properties of the source catalogue, not of the API. Every one of them is signalled in the payload rather than hidden:
- quantity
- Always null, on every part, and that is the true value — the catalogue records which parts a vehicle takes, never how many.
- price
- List price, Japanese dataset only, whole yen, no effective date and no history. Other markets return an empty prices array.
- resolved
- On a drawing callout: false for the ~18% that point at standard fasteners appearing in no parts list.
- unverified
- Fields read from the record layout but confirmed by no published legend — destination codes, page references, a few flags. Raw values, no interpretation.
- notes
- Illustration notes are per catalogue. No key ties one to a single drawing reliably, so none is invented.
- spec_codes
- Surrogate identifiers. Countable and groupable, not translatable — correlating them against every decoded key space in the dataset produced no matches.
The catalogue is four independent market datasets. A part number, a model or a VIN
present in one may be entirely absent from another, so the market is part of nearly
every request.