Vehicle Intelligence

Enrich any UK vehicle registration with DVLA details, DVSA MOT intelligence, odometer trend, and ULEZ compliance.

Endpoints

GET /v1/vehicle/{registration} POST /v1/vehicle/bulk POST /v1/vehicle/bulk/async GET /v1/vehicle/bulk/jobs/{jobId} DELETE /v1/vehicle/bulk/jobs/{jobId}

Request

Pass any UK registration plate — with or without spaces, upper or lower case (e.g. AB12CDE or ab12 cde). Returns enrichmentPending: true for plates not yet in the database — retry after the Retry-After header value.

Response

Returns a JSON object. See the signal reference for all fields and values. All field names are camelCase.

Brief example — AB12CDE
{
  "registration": "AB12CDE",
  "make": "VOLKSWAGEN",
  "fuelType": "diesel",
  "yearOfManufacture": 2012,
  "vehicleAgeYears": 14,
  "summary": {
    "buyRecommendation": "good",
    "vehicleRiskLevel": "low",
    "motRiskLevel": "low"
  },
  "signals": {
    "euroEmissionStandard": "EURO 5",
    "ulezCompliant": false,
    "motStatus": "valid",
    "motExpiryDate": "2026-11-14",
    "odometerTrend": "consistent",
    "totalMotTests": 8,
    "motPassRate": 0.875
  }
}

Bulk lookups

Available on Starter and above. Quota is consumed upfront for the full batch. Vehicle lookups in bulk are processed sequentially to stay within DVLA/DVSA rate limits.

TierRegistrations per call
FreeNot available
MicroNot available
Starter50
Pro100
Business250
Enterprise500

Synchronous bulk

All results returned immediately. Best for smaller batches where you want inline results.

POST /v1/vehicle/bulk
// Request
{ "registrations": ["AB12CDE", "XY21ZZZ", "PQ09ABC"] }

// Response 200
{
  "total": 3,
  "results": [
    { /* full vehicle response */ },
    { "registration": "XY21ZZZ", "error": "not_found" },
    { "registration": "PQ09ABC", "error": "invalid_format" }
  ]
}

Async bulk

Submit a job and poll for results. Recommended for larger batches. Jobs expire 24 hours after submission.

POST /v1/vehicle/bulk/async → 202 Accepted
// Request
{ "registrations": ["AB12CDE", "XY21ZZZ"] }

// Response 202
{
  "jobId":   "vbulk_4f3a9c1e72b8d5c",
  "status":  "queued",
  "total":   2,
  "pollUrl": "/v1/vehicle/bulk/jobs/vbulk_4f3a9c1e72b8d5c"
}
GET /v1/vehicle/bulk/jobs/{jobId} — poll until status = "complete"
{
  "jobId":       "vbulk_4f3a9c1e72b8d5c",
  "status":      "complete",
  "total":       2,
  "done":        2,
  "createdAt":   "2026-05-18T10:00:00Z",
  "completedAt": "2026-05-18T10:00:14Z",
  "expiresAt":   "2026-05-19T10:00:00Z",
  "results": [ /* full vehicle responses */ ]
}

Status lifecycle: queuedprocessingcomplete | failedexpired

Use DELETE /v1/vehicle/bulk/jobs/{jobId} to clean up a job before it expires.