error.code, headers and source_status — not whether cards appeared. Auction cards rendering says nothing about the dealer request.
Contracts referenced: Dealer source constraints, Mixed source, Dealer upstream unavailability, Errors. The storefront recipe these fixes assume is Combined inventory storefront.
Using an AI coding assistant? Connect it to the documentation connector and paste the error body — it can match it to the entries below. Paste the status,
error.code, error.message and request_id; never your API key.T1 — source=dealer requires make
Symptom. 400 with:
make cannot be executed. This happens when the storefront sends the dealer request before the user has chosen a make, or when the auction query (where make is optional) is forwarded to the dealer request unchanged.
Corrected request.
make may be a CSV (make=Hyundai,Kia).
Verify. 200; source_status present; rows have source: "dealer" and encar_… IDs.
T2 — auction_status cannot be combined with source=dealer
Symptom. 400 with:
details.field, appears for auction_date_from / auction_date_to, accident_grade, exterior_grade, auction_count_min / auction_count_max, and orderable_only=true.
Cause. Dealer listings have no auction, so auction-only filters are rejected rather than silently ignored. The storefront forwarded its auction filters to the dealer request.
Corrected request. Build the dealer request from the common-filter whitelist only (which filters go where):
200. The dealer response has no auction_result values (they are null for dealer rows).
T3 — “All sources” shows only auctions
Symptom. No error. The page labelled “All sources” shows auction cards only; the dealer request either never ran or returned nothing you can see. Causes — check in this order:sourcewas omitted. Omittingsourcesearches auction listings only, even whenmakeis present. A presentX-LMN-Filtered-Out: dealer=Nheader on such a request is a best-effort estimate of dealer cars an auction-only filter would have hidden — the dealer upstream is queried to compute that count, but no dealer rows are returned (Null-strict semantics).- No
makeyet, so your backend (correctly) skipped the dealer request — but the UI did not say so. orderable_only=truewas sent. It returns onlyupcomingauction cars with an open order window; dealer rows are excluded by definition.- Dealer degraded. A mixed first-page request returned
200withX-LMN-Partial-Dealer-Unavailable: 1andX-LMN-Dealer-Unavailable-Sources: encar, and the page rendered the auction rows without noticing (see T6). - A “Buy now” toggle is gating the dealer request. Dealer cars are Buy now, but they belong in “All sources” whether or not that toggle is on (source vs. purchase method).
200 with source_status.encar.status of fresh or stale and rows with source: "dealer". If it is 200 with zero rows and a healthy source_status, the integration works and the filter is just narrow — broaden it (drop model, widen year/price, try Hyundai or Kia).
T4 — First page works, the next page fails
Symptom. Page 1 renders. Loading more returns400:
source=glovis,dealer), which is supported, and the next page sent that mixed source together with cursor, which is not (Mixed source — first page only).
Corrected request. Paginate each source with its own cursor, from page 1:
200 and its rows differ from page 1 of the same source. next_cursor: null marks the end of that source. If you request limit above 48 on dealer, the response carries X-LMN-Dealer-Page-Max: 48 — keep following the dealer cursor.
T5 — Changing a filter reuses the old cursor
Symptom. After changingmodel, sort or any filter, the list looks wrong: the first cars are missing, results seem to start mid-way, or the page is unexpectedly empty. There is usually no error — /v1/vehicles does not return invalid_cursor; the only error case is 400 validation_error with details.field: "cursor" after a taxonomy version change (Model vs. sub-model → Pagination).
Cause. A cursor is a position in one specific result set. On /v1/vehicles, sending it with different filters or a different sort does not fail — it returns page N of the new result set, silently skipping its first page (observed: a page-2 cursor reused with sort=price_asc returned 200 with page 2 of the price-sorted set). Conventions → Pagination.
Corrected behaviour. On any filter or sort change, discard both cursors and request page 1 of each source:
cursor parameter, and the first row of the new result is a page-1 row.
T6 — Dealer source unavailable, stale or partial
Symptom. One of:-
Dealer-only request:
503 -
Mixed first-page request:
200with auction rows only, headersX-LMN-Partial-Dealer-Unavailable: 1andX-LMN-Dealer-Unavailable-Sources: encar, and bodysource_status.encar.status: "unavailable". -
Dealer request:
200withsource_status.encar.status: "stale"(cached rows up to 30 minutes old,as_ofset) or"partial"(some makes of a multi-make query answered).
503 means every requested dealer source failed and no eligible cache existed; stale means LMN served its last good page; partial means some branches answered. None of these are integration bugs. Dealer upstream unavailability, dealer_upstream_unavailable.
Corrected behaviour. Keep the auction rows, show a “dealer listings temporarily unavailable” notice (with as_of when stale), and retry only the dealer request after 5–30 seconds. Preserve the previous dealer rows rather than blanking the section.
Verify. The retry returns 200 with source_status.encar.status: "fresh". If a dealer request stays 503 for more than about two minutes, send the request_id to support (escalation template) — auction requests are unaffected meanwhile.
T7 — An API failure is shown as “No vehicles found”
Symptom. The page says no vehicles match, but the backend actually received a non-2xx response — most often401:
400 from T1/T2, a 429 (trial budget exhausted), or a 503 (T6) — or the fetch threw before any response.
Cause. The storefront treats “no rows” and “the request failed” as the same state, usually because an error path returns [].
Corrected behaviour. Separate the states (Failures vs. empty results): on non-2xx or a thrown fetch, render the HTTP status, error.code, error.message and request_id; reserve “No cars match these filters” for 200 with data: [].
Verify. Temporarily use a wrong key: the page must show 401 invalid_api_key with a request_id. Restore the key and confirm a narrow filter shows the empty state instead. Keep the two visually distinct.
T8 — options_include rejected for dealer
Symptom. 400 with:
panoramic_sunroof and dashcam have no dealer-side filter and are rejected rather than silently dropped. Every other documented token works on dealer. The same forwarding mistake as T2 (options_include for dealer).
Corrected request. Drop the two tokens from the dealer request (keep them on the auction one):
200; rows carry both options in options.
Still stuck?
Collect the exact request (sanitized query), the HTTP status, the full error body and therequest_id, and the backend function that built the request, and send them to partners@lmnauto.com using the escalation template. Never include your API key.