- Dealer management system (DMS)
- A dealer management system is the central software of a car dealership: vehicle stock, customer file, workshop order, parts desk, invoice and the feed to the marketplaces all come together in it. It is used by sales, service reception and accounting; it is connected to marketplaces, manufacturer portals and workshop systems. This page addresses the vendors of such systems and describes where the tapinomahub API replaces typing from the registration document, and what comes back.
Where data is missing in the process
A DMS creates vehicles at many points: at trade-in, at used-car purchase, at service reception of a vehicle from another brand, at the import of a fleet. Each time a registration certificate lies on the counter, and each time someone transfers its fields by hand.
- Trade-in. The customer sits alongside while the salesperson types VIN, first registration and key numbers into the valuation form. A transposed digit in the VIN surfaces only when the marketplace rejects the record.
- Technical file. What the document does not state — gearbox, drivetrain, body — is added from memory, from a manufacturer site, or not at all. For other brands there is no manufacturer access at all.
- Listing text. Title and description come from text modules that may or may not fit the vehicle.
- Service reception. Which recall campaigns are published for the model line is something the service advisor looks up in a manufacturer portal outside the DMS — for other brands often not at all. Whether a campaign has been completed on the individual vehicle is answered only by the manufacturer portal, even with the API in place.
- Parts ordering. Whether an OE number fits this exact vehicle is decided by the parts desk from catalogue and experience. For components with many variants, that is a frequent source of wrong orders.
What the API delivers
| Process step | Call | Result |
|---|---|---|
| Read the registration document | POST /scanner/document/registration | Structured fields of the German registration certificate from image or PDF, quality level standard |
| Vehicle file in one call | POST /vehicles/intake | Document fields, matched vehicle data with tapiId, optional condition report from up to 5 walk-around photos |
| Vehicle match with provider 1 | POST /vin/redirect-sessions | Single-use browser session with redirectUrl; return to returnUrl with status, tapiId and state |
| Read vehicle data | GET /vehicles/{tapiId} | Technical vehicle data for the tapiId, included in the previously paid VIN workflow, without VIN and without equipment |
| Generate listing text | POST /vehicles/{tapiId}/listing | Title, description and equipment highlights in de, en or fr, without price or condition statements |
| Check recalls | GET /recalls/vehicles/{vin} | Campaigns for the model line: reference, register, defect, remedy, stop-drive; only for a VIN matched before, else 404 vin_not_resolvable |
| Check parts before ordering | POST /vin/cart-check | Up to 30 OE positions with fits per position; complete states whether a negative result is final |
A process from start to finish
- Photograph the document. The salesperson photographs the registration certificate in the DMS app. The DMS stores the file on its own server and passes its address as
fileUrltoPOST /vehicles/intake; walk-around photos, up to 5 shots, go along asphotoUrls. - Write the response into the file. Document fields fill VIN, first registration and type data; vehicle data with
tapiIdfill the technical file; the condition report is attached.componentsstates per component whether it was delivered; one not delivered leaves its fields empty and is refunded proportionally. The match in the intake always runs via provider 2;providerin the response is always 2. - Provider 1 match as an alternative. If the vehicle is to be matched via provider 1 instead,
GET /vin/{vin}/vehicleanswers a third-party system withredirect_required. The DMS then creates a session server-side withPOST /vin/redirect-sessionsfromvin, the absolute HTTPSreturnUrland astatefor its own transaction, and sends the salesperson to theredirectUrl. - Handle the return. After the match in the tapinoma interface the salesperson comes back to the
returnUrl— withstatus=completed,tapiIdandstate, or withstatus=cancelled. Vehicle, equipment or access data never appear in the redirect; the session expires after ten minutes. - Reload vehicle data. With the stored
tapiIdthe DMS callsGET /vehicles/{tapiId}as part of the previously paid VIN workflow — without VIN and without equipment. - Generate the listing.
POST /vehicles/{tapiId}/listingwithlanguageand optional dealer notes innotesreturns title, description and equipment highlights. The text invents no properties and names neither price nor condition. - Prepare service.
GET /recalls/vehicles/{vin}lists campaigns for the model line from the official registers. Prerequisite: the VIN was matched before viaPOST /vehicles/intakeor a VIN process of this client, because it is resolved only from the client's own stock built by a previous VIN lookup, not from a supplier; otherwise the endpoint answers404 vin_not_resolvable. Its commercial treatment follows the terms shown before ordering and agreed in the contract. Whether a campaign has been completed on the individual vehicle is still answered only by the manufacturer. Before a parts order,POST /vin/cart-checkchecks up to 30 OE positions against the vehicle (mode=vehicle) or the type (mode=type); for control units, coding remains the workshop's job, see Used control units: coding, immobiliser, listing.
curl \
-H 'X-Api-Key: <API_KEY>' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: <CASE_NUMBER>' \
-d '{"fileUrl": "https://dms.example/documents/4711.pdf", "photoUrls": ["https://dms.example/photos/4711-front.jpg"]}' \
'https://api.tapinomahub.com/vehicles/intake'The integration
- Keep the key server-side. The API key is sent as the
X-Api-Keyheader from the DMS backend and belongs in its configuration — never in the browser interface, never in a mobile app, never in source code. - Pick one endpoint.
POST /vehicles/intakeis the natural starting point because it covers vehicle intake in a single call. Anyone who only wants to read the document begins withPOST /scanner/document/registration. - Define the field mapping. Which response field lands in which field of the file? That mapping is the actual work. The file also needs a field for the
tapiIdand a note of which values came from the lookup. - Distinguish an empty result from an error.
404 vehicle_not_foundis not an error but an outcome: not found. The DMS still creates the file, leaves the fields empty and raises a follow-up — „no hit“ never appears to the user as a red error message. A dropped connection, by contrast, may be retried, with the sameIdempotency-Key. - Collect long-running jobs. If an endpoint answers
202,LocationandRetry-Aftername the job and the waiting time. The status is collected at the job endpoint, for the parts check viaGET /vin/cart-check/jobs/{jobId}— not by calling the original endpoint a second time. - Roll out and observe. One pilot dealership first, then the rest.
GET /client/usageand the response headerX-Tapinoma-Usage-Warningshow credit consumption. The path from contract to go-live is described in the integration guide.
What to watch out for
- Set an `Idempotency-Key`. If a connection drops, the DMS repeats the call with the same key and receives the same response, recognisable by the header
X-Tapinoma-Idempotent-Replay. The exception is calls that issue a secret key (sub-users, partner workspaces): after a timeout, reconcile against what exists instead of repeating blindly. - Leave empty fields empty. If the response returns
null, the field stays empty — no default, no derivation from the world manufacturer identifier. A plausible entry in a listing is more dangerous than a visible gap. - Store the `tapiId`. It is stable and the key to
GET /vehicles/{tapiId}andPOST /vehicles/{tapiId}/listing. Whoever loses it pays for the match again. - Never put the key in the browser. The interface talks to its own backend, the backend to the API. The redirect session for provider 1 is also created server-side; the browser sees only the
redirectUrl. - Set rate limits per user.
PUT /client/users/{clientId}/rate-limitslimits per user, key or endpoint so that a faulty import does not use up the whole dealership's credit. - Have the result checked. Listing text, recall list and fitment statement are working aids. The salesperson reads the text before publishing, the service advisor checks the model-line recalls against the manufacturer portal, and
complete=falsemeans a no is not final.
What the API does not do
The API delivers no valuation and no appraisal: the condition report from POST /vehicles/intake describes what is visible, it calculates neither repair nor residual value. It performs no keeper lookup and gives no price guarantee — the listing text deliberately names no price. Provider 1 is reachable for third-party systems only through the browser redirect. And it sells no data set: what is owed is the lookup or analysis with its result; its use lies with the dealership. What the material does not yield remains a gap — why is explained in VIN lookup in practice: process, result, billing.
Frequently asked
Why does `GET /vin/{vin}/vehicle` answer with `redirect_required`?
Because provider 1 may not be called directly by third-party systems. The match runs through a browser session from POST /vin/redirect-sessions; on return the DMS receives the tapiId. Providers 2 and 3 can be queried directly.
Does `GET /vehicles/{tapiId}` cost credit?
No. The technical vehicle data for a tapiId that the DMS itself obtained through a VIN process is included in that paid original service. It contains no VIN and no equipment.
What happens if the registration document is unreadable?
The unrecognisable fields stay empty; nothing is guessed. With POST /vehicles/intake, components states which components were delivered. The analysis performed is billed; a component not delivered, such as the vehicle match without a readable VIN, is refunded proportionally.
Can we pay for our dealerships' usage?
Yes. When creating a partner workspace via POST /client/partner-workspaces, the vendor can cover the cost of the activated endpoints; for existing accounts there is PUT /client/sponsorship-grants/{grantReference}. If the vendor allows partnerTermsAllowed and the dealership chooses the partner mode, every covered request is billed at the vendor's terms.
