DVSA's MOT History API hands you a raw list of past tests — dates, results, mileage, defect text. It doesn't tell you if the mileage looks clocked, whether the pass rate is trending down, or whether this vehicle is worse than others of the same make and model. Zyfy computes all of that on every lookup.
Built on DVSA and DVLA data under the Open Government Licence v3.0. Not affiliated with DVSA.
{
"registration": "AB12CDE",
"make": "VOLKSWAGEN",
"signals": {
"motStatus": "valid",
"motExpiryDate": "2026-11-14",
"odometerTrend": "consistent",
"latestOdometerMiles": 89240,
"motPassRate": 0.875,
"totalMotTests": 8,
"totalMotFailures": 1,
"advisoryTrend": "stable",
"failureClusters": ["tyres"],
"advisoryClusters": ["tyres", "brakes"],
"lastMotResult": "passed",
"lastMotDate": "2025-11-14"
},
"scores": {
"motRiskScore": 0.15,
"conditionScore": 0.81
},
"summary": {
"buyRecommendation": "good"
},
"checkedAt": "2026-07-09T10:22:31Z"
}The official source is DVSA's MOT History API — a free trade API, separate from DVLA's vehicle lookup, requiring its own registration. Send a registration or VIN, get back every recorded MOT test for that vehicle: pass/fail result, test date, recorded mileage, and the free-text description of every advisory and failure item.
That's genuinely the full historical record — DVSA doesn't hold anything back. The gap is entirely on the interpretation side. The API returns an array of test objects; it doesn't tell you whether the mileage sequence looks tampered with, whether the same defect keeps recurring across tests, or how this vehicle's failure rate compares to a thousand others of the same make, model, and age. Building that layer — chronological mileage comparison with same-day-retest handling, defect text classification, fleet benchmarking — is a non-trivial amount of engineering before the data is actually decision-ready.
Zyfy does that computation on every lookup and returns the result merged with DVLA's tax and specification data in the same call — so a used-car platform, a warranty provider, or a finance underwriter gets a scored, ready-to-use response instead of a data dump to process.
Same underlying test records. Different amount of work before it's a usable signal.
| Field | DVSA MOT History (official) | Zyfy |
|---|---|---|
| Raw MOT test records | ✓ — full list, date/result/mileage/defects | ✗ — not returned as a raw list; computed into pass rate, trend, and defect clusters instead |
| Advisory & failure text | ✓ free-text descriptions | ✗ — not returned as free text; classified into 9 defect categories instead (failureClusters / advisoryClusters) |
| Odometer trend / clocking flag | ✗ — you compare readings yourself | ✓ computed automatically, same-day retests handled correctly |
| Pass rate across history | ✗ | ✓ motPassRate, 0.0–1.0 |
| Recurring defect detection | ✗ | ✓ failureClusters / advisoryClusters across separate tests |
| Fleet benchmark (same make/model/year) | ✗ | ✓ per-test failure and advisory rate vs identical vehicles |
| Condition / risk score | ✗ | ✓ conditionScore, motRiskScore, buyRecommendation |
| DVLA tax/spec data in the same call | ✗ — separate DVLA API, separate registration | ✓ one response, one API key |
| Bulk lookups | ✗ — one vehicle per request | ✓ up to 500 per call, plus async bulk jobs |
A subset of what's returned — every field on every plan, including free. View the full signal reference →
signals.odometerTrend string | nullconsistent, high_mileage, low_mileage, possible_clocking, or insufficient_data. Compares every recorded reading chronologically.
signals.motPassRate number | null0.0–1.0 across all recorded tests. Null when fewer than 2 tests exist.
signals.totalMotTests / totalMotFailures integerRaw counts across the full recorded history — the same numbers you'd get counting the DVSA array yourself, just already tallied.
signals.failureClusters string[]Defect categories that recur across separate tests — e.g. ["tyres", "brakes"] — derived by classifying every DVSA defect description.
signals.advisoryTrend string | nullimproving, stable, or worsening — the direction of travel in advisory count across the vehicle's recent test history.
scores.motRiskScore number | null0–1, lower is better. Accounts for last result, lifetime pass rate, advisory trajectory, odometer integrity, and dangerous defect history in one number.
Fraud detection
Every recorded MOT mileage reading is compared chronologically against the one before it. Any drop triggers possible_clocking. The one wrinkle that trips up naive implementations: a vehicle failed and re-tested on the same day produces two readings with the same date but a real chronological order — Zyfy orders same-day tests failed-before-passed specifically to avoid flagging that pattern as a false positive. It's a small detail, but it's the difference between a clocking signal you can trust and one that cries wolf on ordinary re-test days.
Yes. DVSA publishes a free MOT History API for trade use — anyone can register for access. What it returns is raw: a list of past tests with dates, results, mileage readings, and defect text. There is no official "risk score" or fraud flag; that interpretation is left entirely to whoever consumes the data.
Send the registration to GET /v1/vehicle/{registration} with your Zyfy API key. The response includes the computed MOT intelligence — pass rate, trend, defect clusters, and risk scores — derived from the vehicle's full DVSA test history. No separate DVSA registration required on your side.
Zyfy flags possible_clocking when any recorded odometer reading is lower than a previous reading in chronological order. Same-day retests are ordered failed-before-passed specifically to avoid false positives from a vehicle being tested twice in one day. It's a strong indicator, not a certainty — a small number of cases are instrument replacements or recording errors rather than tampering — but it surfaces automatically on every lookup rather than requiring you to write the comparison logic yourself.
Just the summary. Zyfy deliberately doesn't return individual test line items or raw defect text — you get pass rate, trend, defect clusters, fleet benchmark comparisons, and risk scores, all computed from the vehicle's full test history. If you need the raw, unprocessed test-by-test records, that's what DVSA's own MOT History API is for; Zyfy is the interpreted layer on top, not a mirror of it.
As far back as DVSA has recorded testing for that vehicle — typically since the vehicle's third year on the road, when MOT testing first becomes mandatory. Older or historic vehicles may have a shorter or empty record.
New vehicles under 3 years old are MOT-exempt and simply return an empty history with motStatus: "no_mot" — not an error. Signals that depend on test history (odometerTrend, motPassRate, condition score) return null rather than a misleading default.
Contains public sector information licensed under the Open Government Licence v3.0.
Free tier. No credit card. 100 requests/month.
Get your free API key