JLR US — Discovery Explore Summary
- OEM / market: jlr / us (Land Rover + Jaguar)
- Explored / verified: 2026-06-12 (live probes); updated 2026-07-28
Entities and endpoints
| Entity | Endpoint | Method | Auth / protocol | Pagination | Enumerator |
|---|---|---|---|---|---|
| dealers | retailerlocator.jaguarlandrover.com/dealers | GET | Public; Origin/Referer per brand | none (single response) | multi-zip sweep per brand, deduped by ciCode |
| models | rules.config.landrover.com/rc/{brand_path}/en_us/{nameplate}_{my}/{ver}/.jsonp | GET | Public JSONP (rcjson(...)) | none | vehicle-list → root_config per nameplate; models extracted from PRODUCT decomposition |
| features | rules.config.landrover.com{product_query_href} (per-PRODUCT) | GET | Public JSONP | none | one request per PRODUCT from root_config; non-structural categories extracted |
| inventory | production-api-oregon.search-api.netdirector.auto/api/vehicle-search | POST | Static authorization header + brand-specific uuid param; no WAF | currentPage=1, pageSize=5000 per dealer | per-dealer NetDirector query by locationManufacturerDealerNumber; condition="new" or condition="used" |
Key findings
- NetDirector inventory API adopted.
inventory.landroverusa.comis backed by the NetDirector GraphQL API. The pipeline queries it once per dealer and condition, with dealerciCodedirectly in the response. - Dual-brand coverage. Both Land Rover and Jaguar are fetched from all sources. Brand is
derived from the configurator URL path (
/lr/→ Land Rover,/jag/→ Jaguar), not from response properties. - Jaguar dealer code transformation. Retailerlocator returns Jaguar dealer codes with a
leading
0(e.g.05806); NetDirector expectsJ-prefix (e.g.J5806). The transformation is applied at both dealer extraction and inventory fetch time. - No manufacturer filter. ~40% of Land Rover vehicles have
nullin themanufacturerfield — filtering bymanufacturerdrops them silently. Useconditiononly. - Per-PRODUCT configurator fetching. Body-style configs are fetched per PRODUCT (not per
MODEL or BODYSTYLE). Each PRODUCT is a fully specified vehicle: MODEL x ENGINE x BODYSTYLE
x FUEL_TYPE. The PRODUCT's
query[0].hrefprovides the fetch URL. - SCS model enumerator is self-describing. No hardcoded version segments needed — the base nameplate URL 302-redirects to the current version.
- CURATEDCHOICES excluded. The
CURATEDCHOICEScategory is excluded from feature extraction alongside other structural categories (BODYSTYLE, MODEL, ENGINE, PRODUCT, CHARGES).
Candidate pagination params
- inventory:
currentPage=1,pageSize=5000per dealer.
Fan-out enumerators
- dealer: retailer-locator multi-zip sweep (per brand), dedupe by
ciCode. - model/feature: vehicle-list → root_config (PRODUCT decomposition) → per-product body_style_config.
Fixtures (all real live captures)
packages/ai_public_api/tests/data/jlr/jlr_retailerlocator_sample.json— dealers (R0627 Land Rover Manhattan + neighbors)packages/ai_public_api/tests/data/jlr/jlr_retailerlocator_live_sample.json— dealers (national sweep, 3 real)packages/ai_public_api/tests/data/jlr/jlr_configurator_sample.json— models + features (LIVE l663_k26, Generated 2026-05-26)packages/ai_public_api/tests/data/jlr/jlr_netdirector_sample.json— inventory (3 new vehicles, real VINs, from NetDirector national API)
Cross-source identity keys
- inventory→dealers:
location.manufacturerDealerNumber=dealer_code(with Jaguar 0→J transformation applied at both ends). - inventory→models:
modelCodestored asmanufacturer_model_code; joins to configuratormanufacturer_model_code+model_year. ~44% of new-inventory records have nullmodelCode(stub allocations or unpopulated). - features→models: shared
programme_code,model_year_code,product_idkey.