Does the part fit the vehicle? Checking the cart against the VINAll articles

Does the part fit the vehicle? Checking the cart against the VIN

Wrong orders are the most expensive part of parts shipping. This case shows how a shop checks the cart at the checkout against the vehicle instead of paying for the return.

Published: 2026-09-12Reading time: 4 mintapinomahub API & workflows
API & processesVINLogistics & inventoryAPIMarketplacesWorkshopEngine

A customer puts three parts in the cart and types in their vehicle identification number. Two fit, one belongs to a different engine of the same series. If that does not surface at the checkout, it surfaces at installation — and then it costs shipping, return, credit note and an annoyed customer.

Does the part fit the vehicle? The cart against the VINInput: a customer’s cart and the vehicle identification number of their car 1. Normalise the numbers (GET /parts/oe/normalize): Retyped spellings become one lookupKey per line 2. Check the cart (POST /vin/cart-check): One call for the whole cart; 202 with a jobId only if the vehicle check cannot finish at once 3. Collect the result (GET /vin/cart-check/jobs/{jobId}): Per line fits, plus complete for the whole cart Output: fewer returns, because the wrong order surfaces before dispatch A negative result with complete=false is not a definitive exclusion. It belongs at the checkout as a notice, not in an invented promise.Does the part fit the vehicle? The cart against the VINInput: a customer’s cart and the vehicle identification number of their car01Normalise the numbersGET /parts/oe/normalizeRetyped spellings become one lookupKey per line02Check the cartPOST /vin/cart-checkOne call for the whole cart; 202 with a jobId only if the vehicle check cannot finish at once03Collect the resultGET /vin/cart-check/jobs/{jobId}Per line fits, plus complete for the whole cartOutput: fewer returns, because the wrong order surfaces before dispatchA negative result with complete=false is not a definitive exclusion. It belongs at the checkout as a notice, notin an invented promise.
Normalise first, then check, and collect after a 202 response. With an incomplete parts list a negative single result is not a definitive exclusion.

The cart check accepts the whole cart in one call. If the result is available at once, it comes back directly with 200. If a vehicle check cannot be completed immediately, the API answers with 202 and a jobId, and the result is collected via the status endpoint.

SurfaceRoles
HubParts trading, Workshop, Platform and marketplace

What this case requires

  • A vehicle identification number from the customer. Without it there is no reference to check against.
  • The cart lines as numbers. Free text in the cart is not a checkable object; that is why normalisation comes first.
  • A place in the checkout that can wait for the result. If the API answers with 202, the result is only available via the status endpoint — the interface has to reflect that.
  • A rule for what happens on `fits=false` with `complete=false`. Allow the order with a notice or block it: that is a commercial decision.
  • The entitlement to query the vehicle. With the call you confirm that you are the keeper, the owner or demonstrably authorised or otherwise legally entitled, and that you use the identification number solely for the stated permissible purpose.

The sequence

The table names the responsible call per stage and what exists afterwards. The reasoning for why a stage cannot be skipped follows below it.

The call chain of this use case
StageCallWhat exists afterwards
Normalise the numbersGET /parts/oe/normalizeRetyped spellings become one lookupKey per line
Check the cartPOST /vin/cart-checkOne call for the whole cart; 202 with a jobId only if the vehicle check cannot finish at once
Collect the resultGET /vin/cart-check/jobs/{jobId}Per line fits, plus complete for the whole cart

Why each stage is needed

  1. Normalise the numbers. GET /parts/oe/normalize turns a retyped spelling into a lookupKey. Without this step you check hyphens and spaces too, and the cart fails on formatting.
  2. Check the cart. POST /vin/cart-check takes one to 30 lines at once as oeNumbers, together with vin and the mandatory mode of type or vehicle. One call for the whole cart replaces a query per line; the response keeps the order and duplicates of the input.
  3. Collect the result. After a 202 response, GET /vin/cart-check/jobs/{jobId} returns the status; on succeeded, result contains oe and fits per line and complete for the cart. If complete=false, a negative single result is not a definitive exclusion.
Check a cart against the vehicle identification number
curl -X POST \
  -H 'X-Api-Key: <API_KEY>' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: korb-88213' \
  -d '{"vin":"<VIN>","country":"de","mode":"vehicle","oeNumbers":["8K0959455K","1K0121207AK"]}' \
  'https://api.tapinomahub.com/vin/cart-check'

What you end up with

What remains is a checkout that warns the customer before they pay. That lowers the return rate, and it lowers it at the right end: not through stricter return terms but through fewer wrong orders.

Where to find this in the documentation

The binding field lists, error codes and sample responses live in this surface’s OpenAPI contract at docs.tapinomahub.com (tapinoma-hub). All use cases arranged by surface and role: overview of the use cases.

Frequently asked

Does the result always come via a job?

No. If the result is available at once, it comes directly with 200. If a vehicle check cannot be completed immediately, the API answers with 202 and a jobId, and the result is collected via the status endpoint.

What do I show the customer on a negative result with an incomplete parts list?

Best of all the finding itself: that the parts list was not complete and the negative result is therefore not a definitive exclusion. A blanket “does not fit” would be wrong, a blanket “fits” would be risky.

Can I run the check overnight across open orders?

Yes, each check is a call of its own. If the API answers with 202, the result is collected via GET /vin/cart-check/jobs/{jobId}; the contract does not define a dedicated mode for batch runs.