VehiCode
PlatformAPIResourcesPricing

API docs

Integrate VIN decoding into your workflow

Use the VehiCode API to decode VINs, track usage, and report corrections from your own product or backend service.

Authentication

Send your API key

  1. Create an API key in the subscriber portal.
  2. Send it with each subscriber request.
  3. Keep the full key private; VehiCode only shows it once.
Preferredx-api-key: vdx_your_api_key
AlternativeAuthorization: Bearer vdx_your_api_key

Plans

Monthly limits

  • Free25 requests / month
  • Starter500 requests / month
  • Business2,500 requests / month
  • EnterpriseCustom limits, SLA, and integrations

Errors

Predictable responses

  • 400Invalid request payload
  • 401Invalid or inactive API key
  • 429Monthly or public usage limit reached

Rate-limit details are returned in response headers and body usage metadata.

Decode endpoint

POST /api/decode

Decode a VIN into available vehicle identification, specifications, and usage data. A populated manufacturer identifies the vehicle make; without it, treat the result as VIN parsing. Free access provides basic information. Starter and Business can include extended technical data where available.

Response metadata describes what was returned: verifiedTechnicalFields, estimatedTechnicalFields, and possibleConfigurationsCount count their respective results. publishedSupplementalFields counts additional vehicle fields in the response. The legacy premiumFieldsAvailable count also includes premium values not shown on the current plan.

Request

curl -X POST https://vehicode.eu/api/decode \
  -H "Content-Type: application/json" \
  -H "x-api-key: vdx_your_api_key" \
  -d '{"vin":"WVWZZZAUZHP507470"}'

Response

Vehicle reportVIN segments, manufacturer, model, body style, year, optional specs

Usage metadatalimit, remaining, resetAt

{
  "status": "decoded",
  "requestId": "8e24ce52-cc7b-46f2-a42a-dfc77fd23f9d",
  "isFinal": true,
  "report": {
    "vin": "WVWZZZAUZHP507470",
    "wmi": "WVW",
    "vds": "ZZZAUZ",
    "vis": "HP507470",
    "validFormat": true,
    "manufacturer": "Volkswagen",
    "model": "Golf",
    "bodyStyle": "Combi",
    "bodyStyleNormalized": "wagon",
    "modelYear": "2017",
    "vehicleType": "Passenger car",
    "region": "Europe"
  },
  "metadata": {
    "plan": "business",
    "upgradeAvailable": false,
    "premiumFieldsAvailable": 0
  },
  "usage": {
    "limit": 2500,
    "remaining": 2499,
    "resetAt": "2026-08-01T00:00:00.000Z"
  }
}

Result contract

Successful, partial, and unknown VINs

A usable decode includes a meaningful vehicle identity, usually manufacturer and model. Stronger partial responses may also include model year, body style, vehicle type, or technical fields.

When a valid VIN needs slower enrichment before it is useful, the API returns enrichment_pending with retryAfterSeconds and usageCharged: false. Invalid VIN format and malformed JSON return 400 and are not charged.

Enrichment can take tens of seconds. A pending response is not final: poll the returned relative URL with the same API key, honor Retry-After, and stop when isFinal is true. Polling does not create another logical decode or add another charge; a usable completed decode is charged at most once.

Pending response

{
  "requestId": "ddfdc2d7-cbb0-4e24-9b9b-afd109ba23c4",
  "status": "enrichment_pending",
  "isFinal": false,
  "retryAfterSeconds": 15,
  "pollUrl": "/api/decode/ddfdc2d7-cbb0-4e24-9b9b-afd109ba23c4",
  "usageCharged": false
}

Poll with curl

curl https://vehicode.eu/api/decode/ddfdc2d7-cbb0-4e24-9b9b-afd109ba23c4 \\
  -H "x-api-key: vdx_your_api_key"

TypeScript helper

async function waitForDecode(initial, apiKey) {
  let result = initial;

  while (!result.isFinal) {
    await new Promise((resolve) =>
      setTimeout(resolve, result.retryAfterSeconds * 1000)
    );

    const response = await fetch(
      'https://vehicode.eu' + result.pollUrl,
      { headers: { 'x-api-key': apiKey } }
    );
    result = await response.json();
  }

  return result;
}
Detailed labelbodyStyle

Human-readable source label such as Combi, Station Wagon, Convertible, or 5-door hatchback.

Canonical enumbodyStyleNormalized

Stable integration value such as wagon, hatchback, suv, van, or cabrio.

Unknownunknown

No body style was determined.

Otherother

A body style was known but does not fit a supported canonical category.

{
  "bodyStyle": "Combi",
  "bodyStyleNormalized": "wagon"
}

{
  "bodyStyle": "Convertible",
  "bodyStyleNormalized": "cabrio"
}

Response depth

Free vs paid API output

Free responses include basic vehicle information. Starter and Business can include additional specifications and configurations where available for the VIN.

Free

Compact public report

Basic VIN and vehicle identification, when available.

vinwmivdsmanufacturermodelbodyStylebodyStyleNormalizedmodelYearregionusage
Starter / Business

Premium vehicle report

Extended vehicle and technical data where available.

specs.enginespecs.fuelTypespecs.powerKwspecs.driveTypespecs.displacementCctechnicalSpecs.lengthMmtechnicalSpecs.curbWeightKgtechnicalSpecs.cargoVolumeLitersmetadata.upgradeAvailable

Technical certainty

How to read technical data

Confirmed
specs and technicalSpecs contain confirmed technical values. Some dimensions and weights may apply to a model or variant.
Estimated
estimatedSpecs contains supported inferences, not confirmed facts. Each value has a type and confidence, never a percentage.
Possible
possibleConfigurations lists supported alternatives, not the exact vehicle build. engineCode: "UNKNOWN" means the engine code is unavailable; coverage: "partial" means the list is not exhaustive.
{
  "specs": {
    "fuelType": "Gasoline"
  },
  "estimatedSpecs": {
    "powerKw": {
      "value": 95,
      "type": "estimated",
      "confidence": "high"
    },
    "curbMassKg": {
      "min": 1450,
      "max": 1825,
      "type": "range",
      "confidence": "medium"
    }
  }
}

Attribution

Data Sources

Where applicable, VehiCode uses vehicle type-approval data from the Swiss Federal Roads Office (ASTRA/FEDRO) TAS open dataset. Responses using this data include an X-Data-Attribution header.

Usage limits

Handling 429 responses

When the monthly subscriber limit is reached, decode requests pause until the next reset or until the plan is upgraded.

{
  "error": "Monthly subscriber decode limit reached.",
  "limit": 25,
  "remaining": 0,
  "resetAt": "2026-08-01T00:00:00.000Z"
}

Response headers

Usage and auth metadata

Successful and limited responses include rate-limit headers. Subscriber requests also include the authenticated workspace slug.

Auth modeX-Vehicode-Auth

Shows whether the request used an API key or public access.

WorkspaceX-Vehicode-Client

Subscriber workspace slug when an API key is used.

Monthly limitX-RateLimit-Limit

Plan limit for authenticated usage.

RemainingX-RateLimit-Remaining

Requests left in the current usage window.

Reset timeX-RateLimit-Reset

Unix timestamp for the next usage reset.

Request IDX-Request-Id

Support/debug identifier when the decode request was stored.

Corrections

Report incorrect decodes

Use POST /api/report-decode-issue when your system knows the expected manufacturer, model, body style, model year, and a short note. Reports are queued for admin review.

curl -X POST https://vehicode.eu/api/report-decode-issue \
  -H "Content-Type: application/json" \
  -H "x-api-key: vdx_your_api_key" \
  -d '{
    "vin": "WVWZZZAUZHP507470",
    "expectedManufacturer": "Volkswagen",
    "expectedModel": "Golf",
    "expectedBodyStyle": "Combi",
    "expectedModelYear": "2017",
    "note": "Customer record confirms this is a Golf Variant."
  }'