From the VIN to the economic evaluation: the vehicle routeAll articles

From the VIN to the economic evaluation: the vehicle route

At purchase time one number decides everything, and nobody knows it: how much sellable substance is in this vehicle? This route leads from the VIN via the parts list to a figure you can actually name.

Published: 2026-09-11Updated: 2026-09-15Reading time: 10 mintapinomahub API & workflows
API & processesVINAPIPricing & valuationHSN/TSNVehicle dataLogistics & inventory

A damaged vehicle is in the yard, the seller wants a price, and the decision happens in minutes. Relying on experience alone means overpaying on unusual series and leaving money behind on ordinary ones. The vehicle route of the tapinomahub API starts exactly where the buyer starts: at the vehicle identification number — and ends at a traceable figure with an order of work for dismantling.

From the VIN to the purchase decisionInput: a 17-character VIN you are authorised to process 1. Match the vehicle (GET /vin/{vin}/vehicle): tapiId, type, kTypes, HSN/TSN, engine and transmission codes 2. Request the parts list (GET /vin/{vin}/parts): 200 with parts and matchLevel — or 202 with a jobId 3. Follow the job (GET /vin/parts/jobs/{jobId}): queued, running, succeeded or failed with a result code 4. Run the economics (GET /vin/{vin}/economic-evaluation): Revenue potential, dismantling ranking, purchase recommendation 5. Collect the analysis (GET /vin/economic-evaluation/jobs/{jobId}): result with assumptions and coverage — or error with a code Output: a price you can name and an order of work for dismantling 202 is not an error but an accepted job. Retry-After states the interval before the next status call.From the VIN to the purchase decisionInput: a 17-character VIN you are authorised to process01Match the vehicleGET /vin/{vin}/vehicletapiId, type, kTypes, HSN/TSN, engine and transmission codes02Request the parts listGET /vin/{vin}/parts200 with parts and matchLevel — or 202 with a jobId03Follow the jobGET /vin/parts/jobs/{jobId}queued, running, succeeded or failed with a result code04Run the economicsGET /vin/{vin}/economic-evaluationRevenue potential, dismantling ranking, purchase recommendation05Collect the analysisGET /vin/economic-evaluation/jobs/{jobId}result with assumptions and coverage — or error with a codeOutput: a price you can name and an order of work for dismantling202 is not an error but an accepted job. Retry-After states the interval before the next status call.
Three business stages, two of them as asynchronous jobs. The status calls are not a workaround but the documented normal case for longer lookups.

Stage 1: make the vehicle unambiguous

GET /vin/{vin}/vehicle matches the VIN against the enabled source. includeEquipments, includeColors and includeTechnical control how deep the answer goes; country sets the market context and provider the contractually agreed source. A successful match contains a stable tapiId — the reference by which every later call means the same vehicle. The service description is in Compare vehicle data by VIN.

Fetch vehicle data including equipment and technical details
curl \
  -H 'X-Api-Key: <API_KEY>' \
  'https://api.tapinomahub.com/vin/WVWZZZ1KZAW000000/vehicle?includeEquipments=true&includeTechnical=true'
The fields that matter when buying
FieldContentUse
tapiIdStable vehicle reference after a successful matchThe bracket around parts list, evaluation and vehicle record
mainType, subType, constructionPeriodSeries, version and production periodThe basis of every usage list and every listing statement
kTypes, natCodesKnown type keys of the vehicle typeConnection to TecDoc structures and catalogue systems
kba.hsn, kba.tsnGerman type approval keys where availableCross-check with HSN/TSN from the registration document
engine.codes, transmission.codesEngine and transmission codes of the typeSeparates assemblies that look identical from outside
equipmentsCategorized, manufacturerOrderCodesEquipment by category, order codes with matched and unmatchedEvidence for value-driving equipment such as matrix lighting or driver assistance
incomplete, dates.productionFlag for an incomplete answer, production dateDecide whether the data is good enough for an evaluation

Stage 2: the vehicle's parts list

GET /vin/{vin}/parts returns the OE positions found: per part number and numberUnformatted, name and nameAddition, category, manufacturer, amount, price, tapiGenArt and the required vdi field. vdi contains confirmed full VDI 4081 codes and remains present as [] when no valid mapping is available. More important than the list itself is how it is qualified: matchLevel states how reliable the assignment is, and missingCategories states what is absent. A non-empty missingCategories explicitly means the parts list is incomplete. Details in Compare parts assignments by VIN.

What `matchLevel` says about the scope of the result
ValueMeaningConsequence for use
vehicle_specific_best_availableVehicle-specific assignment at the best available qualitySound enough for evaluation and dismantling planning
vehicle_specific_unverifiedVehicle-specific but not cross-checkedUsable for internal planning; check individual positions before selling
vehicle_type_candidatesCandidates at vehicle type level, not the individual vehicleDo not use as a fitment statement — here the part on the vehicle decides

Handling the asynchronous job properly

The parts list and the evaluation can take longer than an HTTP response should wait. The API therefore either answers 200 immediately or accepts the job with 202 — including Location, Retry-After and a jobId. That is the documented normal case, not a malfunction.

  1. Handle both answers. An integration that only knows 200 works in testing and fails in production. 202 supplies jobId, statusUrl, status and retryAfterSeconds.
  2. Poll at the stated interval, not in a tight loop. GET /vin/parts/jobs/{jobId} and GET /vin/economic-evaluation/jobs/{jobId} return queued, running, succeeded or failed.
  3. On `succeeded` the result is in `result` — the same structure as a direct 200 response. Your code therefore needs only one parsing path.
  4. On `failed`, `error.code` distinguishes vehicle_not_found — an empty business finding — from vin_service_unavailable, a technical outage. Only the second justifies a retry.
  5. The job reference belongs in the record. Lose it and the result cannot be collected; an unknown job ends in 404 vin_parts_job_not_found.
Collect an accepted job
# 202 Accepted: {"jobId":"8f1c…","status":"queued","retryAfterSeconds":5,…}
curl \
  -H 'X-Api-Key: <API_KEY>' \
  'https://api.tapinomahub.com/vin/parts/jobs/8f1c2f9e-2a44-4b7f-9a1e-6d4b8f0c3a21'

Stage 3: the economic evaluation

GET /vin/{vin}/economic-evaluation combines the parts list with market prices and calculates three things: the vehicle's revenue potential, an order of work for dismantling and a purchase recommendation. The response discloses its assumptions so that every figure can be recalculated — see Create an economic evaluation by VIN.

How a parts list becomes a purchase figurePriced parts of the VIN — coverage shows how many parts were relevant, selected and priced 1. Assumptions (assumptions): priceBasis min, recoveryRate, costPerPartEur, maxPricedParts 2. Revenue potential (revenuePotential): min, average and max in EUR — the range stays visible 3. Dismantling ranking (parts[].rank): Parts by expected revenue, calculated with one unit each 4. Purchase recommendation (purchaseRecommendation): recoveryRate × min, less the cost per priced part The recommendation deliberately rests on the minimum: a buyer pays before a single part is sold.Priced parts of theVINcoverage shows how many partswere relevant, selected andpricedHow a parts list becomes a purchase figureAssumptionsassumptionspriceBasis min, recoveryRate, costPerPartEur, maxPricedPartsRevenue potentialrevenuePotentialmin, average and max in EUR — the range stays visibleDismantling rankingparts[].rankParts by expected revenue, calculated with one unit eachPurchase recommendationpurchaseRecommendationrecoveryRate × min, less the cost per priced partThe recommendation deliberately rests on the minimum: a buyer pays before a single part is sold.
The analysis does not hide its arithmetic: assumptions, coverage, range and recommendation each sit separately in the response.
The parameters that fit the calculation to your business
ParameterMeaningRange and default
conditionThe condition the price valuation is based onused or new
recoveryRateShare of the revenue potential actually achieved on sale0.05 to 1; default 0.5
costPerPartAssumed cost per priced part for removal, storage and shipping, in EUR0 to 1000; default 0
maxPricedPartsUpper limit of parts included in the evaluationDefault and maximum 100
  • `coverage` makes the data situation visible: totalParts, excludedIrrelevant, relevantParts, selectedParts, pricedParts and unpricedParts. A high unpricedParts is a warning sign, not a detail.
  • `revenuePotential` gives min, average and max. The range stays fully visible — it is not compressed into one number.
  • `purchaseRecommendation.goodPurchasePriceEur` is the figure for the conversation in the yard: recoveryRate times the minimum, less the assumed cost per priced part.
  • `assumptions.priceBasis` reports min. The result therefore documents the basis the recommendation rests on.
  • `parts[]` carries rank, number, name, category and pricing with min, average, max, confidence and evaluatedAt. The amounts in pricing are per unit.
  • `amount` comes unchanged from the provider's parts list, is unverified and enters no calculation. The arithmetic uses one unit per part.

Billing: the monthly VIN bundle

  • VIN Vehicle, VIN Parts and VIN Cart Check form the bundle `VIN_MONTHLY_LOOKUP`. Billing and repetitions are governed exclusively by the agreed terms. Cache or result reuse does not change customer billing.
  • The `X-Tapinoma-Billing-Bundle` header is set when a call falls under that cap. X-Tapinoma-Billing-Source names the billing decision alongside it.
  • A plan applies per endpoint key, not across the board. If no plan covers the call or the monthly quota is used up, the balance is charged; if that is not enough, the API answers 402 insufficient_credits.
  • `404 vin_not_resolvable` marks a lookup that was not performed; its commercial treatment follows the terms shown before ordering and agreed in the contract.
  • The sandbox follows the agreed terms. It uses the same base address, answers only with documented synthetic test data and behaves as described for validation, rate limits and asynchronous states — the right place to build your 202 handling.

The workflow when buying

  1. Capture the VIN — typed, from the registration document via POST /scanner/document/registration, or from the vehicle via POST /scanner/vin/extract. Seventeen characters, otherwise 400 invalid_vin.
  2. Match the vehicle and record tapiId, the matchLevel of later calls and incomplete in the record.
  3. Request the parts list and handle 202 properly. Store the job reference, poll at the stated interval.
  4. Request the evaluation with your assumptions, not the defaults. Your business knows its recovery rate and cost per part better than any default.
  5. Show recommendation, range and coverage together. A figure without coverage next to it invites confidence the data does not support.
  6. Plan dismantling by rank. The first positions carry the revenue; the rest decide how long the vehicle occupies the hall.
  7. Reconcile after selling: achieved revenue against the recommendation, priced parts against sold parts. That is how your own reliable recoveryRate comes about.

Limits you need to know

  • An evaluation is not a price guarantee. It is indicative, it rests on market offers and assumptions, and it does not replace an inspection. No VIN lookup sees damage, mileage or completeness.
  • Coverage depends on the source. Depending on manufacturer, year and market, the amount of available data differs. incomplete, missingCategories and unpricedParts are the fields that make that visible.
  • A VIN relates to a vehicle and can become personal data. Transmit only what you are authorised to transmit, and only what the purpose requires. Retention in your own system follows your agreement and your deletion periods.
  • `vehicle_type_candidates` is not a fitment statement. At that level the list describes the vehicle type, not the individual vehicle.
  • The parts list is not an inventory. It says what can be fitted in this type — not what is still fitted in this vehicle and sellable. The inspection makes that difference.

Schemas, error codes and example responses are in the developer documentation. Once the evaluated vehicle becomes individual parts, continue with From the OE number to a marketplace-ready article and, once those parts are on the bench, with From part photo to listing: the image route through the tapinomahub API.

Frequently asked

Why does the API answer 202 instead of the result?

Because the provider lookup can take longer than a response should wait. The 202 gives jobId, statusUrl and retryAfterSeconds; the result appears later in result with the same structure as a direct answer.

Does every VIN lookup cost again?

No. VIN Vehicle, VIN Parts and VIN Cart Check form a monthly bundle: per client and VIN the bundle price is charged at most once in a calendar month.

Why does the purchase recommendation rest on the minimum?

Because buying means paying before selling. assumptions.priceBasis reports min; the revenue potential stays in the response in full with min, average and max.

Is the quantity from the parts list used in the calculation?

No. amount comes unchanged and unverified from the provider's list. The arithmetic uses one unit per part so that a questionable quantity cannot multiply money.

Does the analysis replace an inspection?

No. It evaluates what the data says can be fitted. Damage, mileage, missing parts and the actual condition remain a matter of looking at the vehicle.