- Workshop management system — dealer management and workshop software
- A workshop management system (also dealer management system, DMS, or workshop software) keeps job, vehicle, customer, parts order and invoice of a workshop in one program. It is used by independent and franchised workshops, dealerships with a service department, fleet workshops and body shops. This page addresses the vendors of such systems and describes where in a job data is typed or guessed today and which call to the API replaces that.
Where data is missing in the process
A workshop job starts with a vehicle and ends with an invoice. In between are points where the software does not know what it would need to know, and a member of staff fills it in from the catalogue or by phone:
- The parts order leaves before fitment is checked. The service advisor copies OE numbers from the catalogue into the job. Whether they fit this exact vehicle with this exact equipment shows up at fitting — or on the return.
- The OE number from the customer's paperwork is a predecessor. The number on the invoice or old part they bring has been superseded. Which one applies today, someone looks up by hand — see OE number: reading original part numbers correctly.
- The removed part carries a label nobody transcribes. Part and reference numbers of the replaced control unit end up as a photo in the job, not as a record — see Used control units: coding, immobiliser, listing.
- Recalls are not reconciled during the visit. The vehicle is on the lift; an open recall would be a second job, but the software knows nothing about it.
- The part designation exists in one language only. A business with customers or suppliers abroad translates designations on the invoice itself.
What the API delivers
| Process step | Call | Result |
|---|---|---|
| Check parts before ordering | POST /vin/cart-check with mode=vehicle | Per line fits=true|false; complete at response level; a fits=false is final only with complete=true; up to 30 lines |
| Classify an OE number | GET /parts/oe/{oeNumber} | Normalised number, supersession chain, reference family, exactly one tapiGenArt, VDI 4081 assignment |
| Clean a number from the job | GET /parts/oe/normalize | matched, unresolved, ambiguous or invalid plus documented replacement numbers |
| Name aftermarket alternatives | GET /parts/oe/{oeNumber}/aftermarket-references | List of references; empty if none exist; no fitment guarantee |
| Read the label of a removed part | POST /scanner/label/extract-partnumbers | Part and reference numbers from the label image |
| Reconcile recalls during the visit | GET /recalls/vehicles/{vin} | Per measure: file reference, register, defect, remedy, stop-drive flag, confidence |
| Translate a part designation | GET /translation/translations | Exactly one designation in the supported target languages |
One job from start to finish
- Create the job, reconcile the vehicle. The workshop captures the VIN. Providers 2 and 3 your system queries directly via
GET /vin/{vin}/vehicle. For provider 1 your server creates a session viaPOST /vin/redirect-sessionsfromvin,returnUrlandstateand sends the service advisor to theredirectUrl; the return bringsstatus=completedwithtapiIdandstate— orstatus=cancelled. The session expires after ten minutes; vehicle or access data never appear in the redirect. - Load the included vehicle data.
GET /vehicles/{tapiId}delivers the technical vehicle data for the job screen as part of the previously paid VIN workflow — without VIN and equipment and without ordering a new vehicle match. - Check recalls while the vehicle is there.
GET /recalls/vehicles/{vin}reconciles the model line against the Kraftfahrt-Bundesamt, EU Safety Gate and NHTSA. An open measure appears in the job with file reference, remedy and stop-drive flag. - Classify the parts in the job. Every OE number passes through
GET /parts/oe/{oeNumber}. Back come the supersession chain, thetapiGenArtas GenArt for the product group and, underpart, the fieldsmanufacturer,nameandlistPrice, which may benulland then stay empty. Without a confirmed base match the call answers404. - Check fitment before ordering. All lines go together to
POST /vin/cart-checkwithmode=vehicle, up to 30 per call. Each line returnsfits;completesits once at response level and says whether the vehicle's parts list was complete. Withcomplete=true, lines withfits=falseare flagged before the order; withcomplete=false, every no in this check remains an open question. If the service answers202, your system collects the result viaGET /vin/cart-check/jobs/{jobId}. - Offer alternatives and used parts. For a line without fitment or availability,
GET /parts/oe/{oeNumber}/aftermarket-referencesdelivers search candidates from the independent aftermarket, not a fitment guarantee. A used part from a dismantler is a further option; which details the workshop needs for that is covered in Workshops as customers: what a trade buyer needs differently. - Capture the removed part. The mechanic photographs the label;
POST /scanner/label/extract-partnumbersreads part and reference numbers and files them on the job. What is not legible in the image stays a gap.
curl \
-H 'X-Api-Key: <API_KEY>' \
-H 'Content-Type: application/json' \
-d '{"vin":"<VIN>","mode":"vehicle","oeNumbers":["5Q0919275C"]}' \
'https://api.tapinomahub.com/vin/cart-check'The build
- Keep the key server-side. The
X-Api-Keybelongs in your server's configuration, never in the workshop front end or a mobile app. In an on-premise installation a service on the workshop server makes the calls. - Start with one endpoint. For this software category that is
POST /vin/cart-check: it acts where errors are most expensive and needs only data the job already holds. - Define the field mapping.
fitsinto the job line, the response'scompleteonto every line of this check,tapiGenArtinto the product group, the current number of the supersession chain into its own field next to the captured one. That mapping is the actual work. - Separate empty result from failure.
404 vehicle_not_foundor an empty reference list are business results: the job stays, the field stays empty, a hint appears. A technical error triggers a retry or a follow-up task — never a default value. - Build in collection after `202`. Long-running checks answer with
202,Location,Retry-Afterand a job ID. Your system pollsGET /vin/cart-check/jobs/{jobId}without blocking the job screen. - Roll out and observe. One pilot workshop first, then broadly.
GET /client/usageshows which calls run how often; the headerX-Tapinoma-Usage-Warningreports low credit.
What to watch out for
- Set an `Idempotency-Key` on every POST. A second click on „Check“ must not trigger a second check;
X-Tapinoma-Idempotent-Replaymarks a replayed answer. Exception:POST /client/partner-workspacesissues the key once — after a timeout, reconcile viaexternalReferenceinstead of creating again. - Do not fill empty fields. If
nameorlistPriceisnull, the field in the job stays empty. A plausible list price from another source is more dangerous than a visible gap. - Store the `tapiId` on the vehicle. It is stable and keeps
GET /vehicles/{tapiId}linked to the previously paid VIN workflow on the next visit. - Never hand the key to the browser. Not even for the redirect: your server calls
POST /vin/redirect-sessions, the browser only receives theredirectUrl. - Set rate limits per workshop.
PUT /client/users/{clientId}/rate-limitslimits per user, key or endpoint, so one business cannot use up the others' quota. - Have the result checked, not passed through.
fits=trueis a reconciliation, not a fitting promise; an aftermarket reference is a search candidate. The software shows provenance and confidence, the workshop decides.
What the API does not do
It does not replace the manufacturer's parts catalogue and gives no fitting instructions. POST /vin/cart-check reconciles whether an OE number fits the vehicle; availability and price the call does not say — GET /parts/oe/{oeNumber}/price delivers an indicative evaluation, not a price guarantee. The recall reconciliation is a working aid at model-line level, not an official statement. No keeper is identified anywhere, no expert report is produced anywhere. For provider 1 the vehicle reconciliation runs exclusively through the redirect into the tapinoma interface; a third-party system cannot call it directly. What no source substantiates stays empty: an empty result is not an error but the result. What is sold is the reconciliation, not a data set; checking and using the results lies with the workshop.
Frequently asked
Can the workshop system query provider 1 directly?
No. For provider 1 your server creates a session via POST /vin/redirect-sessions and sends the user into the tapinoma interface; the tapiId comes back. Providers 2 and 3 can be queried directly via GET /vin/{vin}/vehicle.
What does `fits=false` mean when the response carries `complete=false`?
The vehicle's parts list was not complete; no fits=false in this check is therefore a final exclusion. The lines are flagged as open, not as unsuitable — and the workshop decides.
Is an analysis without a hit charged?
An empty result is not an error but a result. A completed image analysis — the label, for instance — is charged even when no number was legible; the service is the analysis. Credit and consumption are shown by GET /client/credits and GET /client/usage.
How do we connect workshops that already have their own tapinomahub account?
Through cost coverage with PUT /client/sponsorship-grants/{grantReference} for selected endpoints. The workshop remains the owner of its account; billing follows the rules of the grant.
