Prepared for coordinated rollout; not an activation announcement. The version-2 response contract and expanded collection are enabled separately per environment by LMN. Confirm your environment’s access before integration testing. Existing HTTP responses may retain the earlier shape until cutover; stored historical webhooks retain their original shape afterward.
Routes
The routes, request fields, idempotency, deadline, retry and credit rules below are shared by every generation; only the response shape differs. The raw-facts page is the primary reference for them.
There is no separate partner lookup endpoint for the supplemental sources. Access and data are scoped to your organization and API environment.
Submit and follow a lookup
- Send exactly one
vinorplate. A VIN is 17 characters, without I, O, or Q. Plate requests require anIdempotency-Key; VIN requests accept and ignore that header. - Save the returned
id. A repeated in-flight VIN uses the same job and creates no additional webhook. - Poll that ID until
completedorfailed, or consume the signed terminal webhook on your existing endpoint. - Read
reportfor insurance history,aggregatefor consolidated facts,exportfor the export reporting date, andsafetyfor model crash-test results. Inspectsourcesfor coverage. A failed primary lookup can still contain supplemental facts and export evidence.
Request fields
Unknown JSON properties and requests containing both or neither identifier return HTTP400. The same normalized plate body treats omitted
fresh as false; changing fresh (or, on legacy envelope requests, reference) with the same key is a different body.
VIN reuse and plate idempotency
When LMN can link a plate to its VIN from stored registry evidence or inventory, plate and VIN requests for the same vehicle follow the same reuse and credit rules below. A plate that cannot be linked is handled as a new plate request. In the expanded live workflow, a request after a VIN’s earlier lookup has finished creates a new asynchronous lookup. Each provider can reuse its eligible seven-day source capture; the partner’s active 30-day credit entitlement determines whether the result is free. An earlier frozen lookup is not returned as a new consolidated check. Before expanded collection is enabled, the earlier workflow can return HTTP200 for an eligible completed same-partner VIN lookup within its legacy 30-day reuse window.
For a plate, the same idempotency key and normalized body returns the existing lookup with 200, even if it is still pending. The same key with a different body returns 422 idempotency_key_reused. Use a new key for an intentionally new plate check. Replaying an old key reads that original job; it does not refresh its frozen result.
fresh: true can bypass provider-cache reuse for an authorized new plate lookup. On a VIN request it does not authorize another paid provider refresh. A reused job’s credit fields, source, reference, and timestamps describe that original job, not a new charge.
Collection, deadline, and availability
When the national vehicle registry is enabled, LMN collects registry evidence from the supplied VIN or plate before plate-dependent sources start. Verified registry evidence can link the two identifiers. Without it, LMN uses verified inventory mappings or the insurance-history response. Once a verified VIN and plate are available, the insurance history, national maintenance records, and dealer-listing sources can run in parallel. The VIN-based national export records lookup runs independently of plate resolution. National maintenance records need a plate; the separate national export records lookup uses the submitted VIN. Dealer-listing collection searches by the verified plate and can retrieve listing history, nested history details, insurance, and inspection evidence. A missing listing or unavailable source does not erase facts ready from another source. A plate or VIN echoed by a request alone is not vehicle identity evidence. The content deadline for national records, dealer listings, export, and safety is five minutes from lookup acceptance. LMN freezes the facts ready by that deadline, or earlier when all sources have finished. Results that become ready afterward do not change that lookup’s HTTP result or terminal event. Webhook delivery and finalization can occur later; five minutes is a content cutoff, not a network-delivery SLA. When the insurance-history source is temporarily unavailable, LMN retries it with backoff for up to about 15 minutes after the first unavailable attempt. The lookup staysprocessing and shows a retry object with next_attempt_at and window_ends_at. Supplemental facts keep their five-minute cutoff. If the insurance-history report becomes ready, the lookup completes and sends the normal history_lookup.completed webhook; otherwise it fails once, with no credit charged. A report LMN has already obtained for the lookup is still delivered even if processing finishes after the window. A failed lookup is never reopened.
Supplemental collection does not add a second or third history credit.
Version-2 response
The lookup object is returned directly by POST and GET-one. GET-list uses{data: [...], next_cursor: ...}. New terminal webhook events place the lookup object in data.
The outer contract version, primary report version, and aggregate version are independent. An outer version of 2 does not change the primary report to version 2.
Complete response examples
Every example below is a complete JSON object generated offline through the response mapper and consolidation code. The linked pages include full response bodies and JSON downloads. Identifiers, observations, times, and costs are illustrative synthetic data, not a current vehicle report.Source availability
Neutral
reason values are not_collected, plate_unresolved, identity_unresolved, no_listing, no_record, provider_unavailable, report_unavailable, and source_translation_incomplete, or null. Reasons do not contain internal processing diagnostics. source_translation_incomplete (status partial): the insurance history was delivered; one or more verbatim source blocks could not be translated and are omitted from report.source_sections. Structured fields are complete. The omitted locations are listed in the reconciliation coverage manifest as completeness.gaps entries {kind:"source_translation", section_id, scope:"title"|"block"|"section", block_index?, block_kind?:"text"|"table", reason:"untranslatable_source_text"|"translation_unavailable"} (no source text). translation_unavailable: translation was temporarily unavailable; a later new lookup of the same vehicle may return the block. A request answered from an earlier lookup returns that lookup’s result unchanged. A source with no admitted revision has null revision_id and captured_at.
Old jobs and ordinary sandbox fixtures projected after cutover can have not_collected for supplemental providers. A version-2 HTTP envelope does not assert that those old jobs were recollected. For a reused capture, captured_at keeps its original time.
Reading the combined report
One lookup returns four complementary sections. GET, list items, and new terminal webhooks share the same response structure.
The
report object keeps its existing insurance schema. National vehicle registry facts, export dates, and model safety results retain their own provenance and availability in the surrounding lookup response. A completed lookup means the primary report completed; it does not mean every supplemental source returned data. A failed lookup can still contain aggregate and export evidence; safety remains null on failure.
Reading consolidated data
The aggregate hasvehicle, facts[], events[], and complete. See typed schema details.
- Each fact has a
key,subject,cardinality,values[], andconflict. A value carries its own source evidence. - Equal values can share evidence from several providers. A scalar conflict retains all reported alternatives; do not silently choose the first or add them together.
- Work items, work categories, and part codes use set cardinality. Multiple set members do not themselves mean conflict.
- Verified matching events can be consolidated. Uncertain same-date or coarse-date matches remain separate with
certainty: "unresolved"and a sharedcandidate_group_id. Do not count those as confirmed separate incidents or collapse them by date alone. - Event
contexts[]preserve date precision and mileage per source. Unknown context dates can be empty strings with precisionunknown; do not invent a day from a month. - Evidence identifiers are opaque. Use
provider,revision_id, andobservation_idfor attribution; they are not URLs or pointers to a raw-data download. aggregate.completedescribes reconciliation of admitted observations. It does not prove that every provider was available or that the vehicle’s full lifetime history is known. Readsourcesas well.
Primary insurance-history report
report.schema_version remains 1. Its typed fields include:
Null means unavailable or unstated. An empty array means the source section was present with no entries. Full dates use
YYYY-MM-DD, months use YYYY-MM, and primary report *_krw amounts are Korean won integers without FX conversion. Source totals are retained rather than recalculated from list lengths.
Safety ratings and crash-test images
When safety enrichment is enabled, a newly completed lookup includes a top-levelsafety object alongside report. It contains model-level safety ratings and official crash-test images, with the tested specification, source, capture time, and applicability stated for each result. This section is separate from insurance claims, listing photos, and the provider availability in sources.
U.S. government 5-Star Safety Ratings results use native five-star ratings for overall, frontal, side-impact, side-pole, and rollover categories where supplied, including available driver/passenger breakdowns. An unrated category has
value: null and status: "not_rated". safety_concerns: null means the source did not supply that information. Categories can have ratings without images. Missing data does not imply a zero-star result.
U.S. results describe U.S. specifications. A similarly named Korean-market model does not establish equivalent equipment or applicability. Unsupported mappings return unavailable; reference-only results list the unknown or differing attributes. Korean government new-car safety rating results remain unavailable until detailed source evidence and applicability are verified. These are model-level references and do not describe this VIN’s accidents, equipment, or outstanding recalls.
Images use official externally hosted URLs in media[].source_url; delivery_url is currently null. Preserve source attribution and applicability context when displaying them, and follow each result’s usage_terms_url. Image URLs can become unavailable independently of a rating. Video delivery is not included in this slice.
Pending, failed, pre-feature, and enrichment-disabled lookups return safety: null. Safety availability does not change insurance completion or credit charges. GET, list items, and newly generated webhooks use the same persisted safety snapshot. Reusing an existing lookup keeps its original snapshot; it does not refresh the catalog or generate an additional webhook. Stored historical webhooks retain their original shape.
With sandbox safety enabled, these synthetic inputs exercise the result states without external requests:
All three examples are marked
synthetic: true. Their applicability is invented for integration testing and is not evidence about an actual VIN.
Seven-day captures and 30-day credits
Credits are separate per organization and environment. A chargeable lookup reserves a credit while processing and settles once; a free-repeat entitlement remains usable at zero available balance. New chargeable work with no available credit returns
402 insufficient_history_credits. A plate lookup needs a verified full VIN before a credit can be charged.
Webhooks and compatibility
A terminal result creates onehistory_lookup.completed or history_lookup.failed event for the lookup. Retries can deliver that same event more than once: verify the signature and handle the event ID idempotently. Reusing an existing job sends no additional event.
New events use the environment’s contract at finalization. Stored legacy event bodies and explicit replays remain unchanged after cutover, even when a current GET of that lookup uses a version-2 projection. Read data.history_lookup_schema_version; absence means legacy. The current GET is not a byte-for-byte replacement for a historical event.
New lookup responses and new terminal events have no PDF field. Use JSON rendering. Previously stored PDF links, where an authorized legacy object still exists, retain only their legacy access behavior; they do not provide PDFs for new lookups.
Errors and limits
A successful GET of a failed lookup returns200 with status: "failed". Processing codes are no_record, provider_unavailable, and provider_error. A no_record response does not identify the reason the primary source has no report; inspect supplemental data independently.
HTTP errors are separate: 400 invalid input/missing plate idempotency key, 401 authentication, 403 history_lookup_not_enabled for disabled partner access, 404 history_lookup_not_found for an unavailable scoped ID, 422 idempotency_key_reused, 402 insufficient_history_credits, 429 rate/capacity limits, and 503 service_unavailable for environment availability. See Errors.
Default partner limits are 10 in flight and 200 per KST day; configured limits can differ. Honor Retry-After. A transport timeout is not proof that submission failed. With a returned ID, resume GET. If the POST response was lost, a plate’s same idempotency key/body recovers its original job. A VIN repeat recovers the same job only while it is in flight; after completion, expanded collection creates a new lookup. Use GET-list with the identifier and time range (and, for legacy envelope requests, your accepted reference) to locate an original VIN job before intentionally submitting again.
Sandbox and rollout
The saved Sportage VINKNAPM813BHK185630 remains a free historical sandbox example, even with fresh: true, and retains its original capture time and provider inquiry date. It is exempt from ordinary report-age reuse for that exact sandbox sample; it is not a current car check or proof of current multi-provider collection.
Ordinary fixture-mode sandbox inputs include 00가0000 (clean), 00가0001 (damage history), 00가0002 (sparse), 00가0404 (no record), and 00가0503 (unavailable). Real-data trial mode uses live provider behavior for other identifiers and can consume test credits. Confirm your mode before using a real plate or VIN. The downloadable multi-provider examples are offline contract fixtures; they do not claim the sandbox collected those three providers.
Environment cutover is coordinated in place on /v1/history-lookups; this is not a new /v2 endpoint. Current HTTP/list projections and newly created events move to the v2 envelope, while old event replay stays original. Allow added fields, retain primary report version 1 parsing, handle absent v2 fields in legacy events, and remove reliance on a history PDF. LMN enables expanded collection only after its separate release checks.