validation_error | 400 | Request shape failed validation. | Bad enum, missing field, model without make, ids > 100, from without to. | Inspect error.details.issues[].path. Fix the request; do not retry as-is. |
missing_idempotency_key | 400 | Idempotency-Key header absent on order creation. | POST /v1/orders without header. | Add UUID v4 header, retry. |
invalid_cursor | 400 | Cursor invalid, expired, or sort-mismatched. | Resending a cursor after changing sort=. | Restart pagination from page 1 with the desired sort. |
missing_max_bid | 400 | Auction vehicle requires max_bid_amount_usd. | POST with null/omitted/below-listing bid. | Add max_bid_amount_usd (integer > 0, ≥ listing). Not required for buy-now. |
missing_api_key | 401 | x-api-key header absent. | Any request without header. | Add the header. |
invalid_api_key | 401 | Key not recognized, revoked, or wrong env. | Sandbox key against production URL, or revoked key. | Verify env (sandbox vs production); rotate if compromised. |
ip_not_allowed | 403 | Source IP not in allowlist. | Egress IP missing from the key’s allowlist. Production keys only — sandbox trial keys have no allowlist and never return this. | Add the IP yourself: partner console → Keys → the key → Allowlist. Check egress NAT stability; if your backend has rotating IPs, certify on sandbox first. |
invalid_status_transition | 403 / 409 | Requested transition not permitted. | 403 = partner attempted an LMN-owned status (secondary_inspection_in_progress, secondary_inspection_ready, acquiring, secured, export_processing, in_transit); details.reason: "partner_not_authorized". 409 = sequence violation (e.g., delivered from non-customs, DELETE from non-placed); details.reason: "out_of_sequence". details.current_status set in both cases. | Re-fetch GET /v1/orders/{id} to see current state. Only use partner-permitted transitions: in_transit → customs, customs → delivered. |
vehicle_not_found | 404 | Unknown or unavailable vehicle ID. | Stale ID, wrong-env ID, a dealer (encar_*) detail page whose upstream advertisement is no longer active / marked SOLD or WAIT, or a dealer listing currently under contract (계약중) on Encar. | Refresh the listing; confirm correct base URL. For a SOLD / WAIT dealer car, treat this as no longer available to buy and remove or disable the listing in your UI. For an under-contract dealer car, this is reversible — don’t remove the listing permanently; it can resolve normally again once the contract falls through. Cars you have already ordered are exempt — their detail still resolves from your stored order snapshot, so a purchased vehicle won’t return this error. |
order_not_found | 404 | Unknown order ID for this key. | Wrong env, cross-key ID, or deleted. | Confirm correct base URL; the ID belongs to your account. |
order_vehicle_snapshot_not_found | 404 | Order exists, but no purchased-vehicle snapshot is stored. | GET /v1/orders/{id}/vehicle for a historical order created before snapshot storage. | Use live GET /v1/vehicles/{vehicle_id} only if the listing still exists; otherwise contact LMN for manual recovery. |
past_order_cutoff | 409 | POST after the auction’s cutoff. | auction_date − N min (your integration’s lead time; default 1440 = 24h) already passed. | Inform dealer that the order window is closed. |
past_secondary_inspection_cutoff | 409 | POST with secondary_inspection_required: true after the inspection request window. | End of day (auction day − 2, your integration’s local time) already passed — read secondary_inspection_cutoff_at on the Vehicle resource. | Offer the dealer the same order without inspection (secondary_inspection_required: false) while order_cutoff_at is still open. |
duplicate_order | 409 | Active order already exists for this vehicle. | Repeat POST while a prior order is not terminal. details.existing_order_id references it. | Redirect user to existing order page. Do not auto-retry. |
idempotency_key_reused | 422 | Same Idempotency-Key with a different vehicle_id, or the same vehicle with a different secondary_inspection_required. | Client-library bug reusing keys across logical requests, or a retry that flipped the inspection flag. | Inspect details.original_vehicle_id / details.original_secondary_inspection_required. Generate a fresh key per new order. |
vehicle_unavailable | 410 | Vehicle no longer available. | Dealer or buy-now listing disappeared before LMN could complete the purchase. | Move order to failed in UI once the order snapshot reflects failure_reason: "vehicle_unavailable"; notify dealer. |
rate_limited | 429 | Two distinct conditions share this code — one transient, one permanent. See Telling the two 429s apart. | Transient: more than 5 test-webhook fires per minute on one Eagle Eye watch. Permanent: a sandbox trial key has spent its lifetime call budget. | Branch on error.details. Present (limit + used) → budget exhausted, stop retrying. Absent → test-webhook throttle, retry after ~60s. |
internal_error | 500 | Server-side failure. | Rare; LMN on-call is paged automatically. Body carries only a generic message — no stack traces. | Retry with exponential backoff (3 tries). If persistent, share request_id with support. |
mixed_source_pagination_unsupported | 400 | cursor passed with mixed auction+dealer source. | Trying to paginate beyond page 1 on a query like source=glovis,dealer&cursor=…. | Restart pagination per source — issue separate requests with source=glovis and source=dealer. The first page of a mixed query is supported; deeper iteration is not. |
dealer_upstream_unavailable | 503 | A dealer upstream (Encar or Danawa) is unreachable or returned an unexpected response shape. | Transient dealer-source outage, network blip, bot-protection interstitial, or extractor drift. Mixed requests degrade gracefully instead of this error, with two headers: X-LMN-Partial-Dealer-Unavailable: 1 (binary flag, always the literal 1) and X-LMN-Dealer-Unavailable-Sources: <csv> — a comma-separated list of the dealer source names that failed (e.g. encar, danawa, or encar,danawa); a pure dealer request fails with 503 only when all dealer sources are down (one source down still returns the survivor’s rows + the header). | Retry after a short backoff (5–30s). If persistent (> 5 min for a single ID, > 2 min for list), include request_id and the failing dealer query in a support note — auction requests are unaffected during dealer outages. |