---
title: "Decode up to 50 VINs."
method: POST
path: "/v1/vin/batch"
tags: ["VIN"]
---

# Decode up to 50 VINs.

`POST /v1/vin/batch`

## Request

- Base URL: `https://open.wenmarpro.com`
- URL: `https://open.wenmarpro.com/v1/vin/batch`
- Auth: none declared

The answer is an array in the order asked. Each item is a decode, or the
error object a single request for that VIN would have returned.

With `?include=recalls`, each decode that reaches a model year of the
catalog also carries `recalls`: how many campaigns may apply to that
model year. It is a count for the year, make and model, never a lookup
by VIN.

## Query parameters

- `include` string

## Request body

- BatchRequest
  - `vins` string[], required: At most 50 VINs.

## Response `200`

One item per VIN, in order.

- BatchItem[]
  - union: One answer of a batch: a decode, or the error a single request for that VIN would have given.
    - VinDecode: A decoded VIN. A field that could not be determined is left out.
      - `base_price_usd` number, double, nullable: Manufacturer base price in US dollars, when NHTSA has one.
      - `body` string, nullable
      - `catalog` Selection: The catalog's answer for one decoded VIN.
        - `engine_id` string, nullable: The engine's id form, when the decode settles on one.
        - `entry` Entry, required: One vehicle of the catalog, down to whatever level was asked for.
          - `body` string, nullable
          - `drive` string, nullable
          - `engine` string, nullable
          - `id` string, required: The stable id. It stays the same from one data release to the next for as long as the names do.
          - `make` string, required
          - `model` string, required
          - `submodel` string, nullable
          - `summary` string, required: One line naming everything above that is known.
          - `transmission` string, nullable
          - `vehicle_types` string[], required: NHTSA's vehicle types for this model year, such as `Truck`.
          - `year` integer, required
        - `submodel_id` string, nullable: The submodel's id form, when the decode names exactly one.
        - `vehicle_id` string, required: The id of the year, make and model.
      - `check_digit` CheckDigit, required
        - `actual` string, required: What position 9 is.
        - `expected` string, required: What position 9 should be.
        - `valid` boolean, required
      - `doors` integer, nullable
      - `drivetrain` string, nullable
      - `engine` Engine
        - `configuration` string, nullable
        - `cylinders` integer, nullable
        - `displacement_cc` integer, nullable
        - `displacement_l` number, double, nullable
        - `electrification` string, nullable
        - `fuel` string, nullable
        - `label` string, nullable: The short name shops use, such as `2.0L Turbo` or `3.5L V6`.
        - `model` string, nullable
        - `turbo` boolean, nullable
      - `gvwr` string, nullable: Gross vehicle weight rating class, as NHTSA words it.
      - `make` string, nullable
      - `manufacturer` Manufacturer, required
        - `country` string, nullable
        - `name` string, required
        - `vehicle_type` string, nullable
        - `wmi` string, required: The manufacturer code: three characters, or six for a low-volume maker.
      - `model` string, nullable
      - `plant` Plant, required: Where the vehicle was built. `code` is position 11 of the VIN.
        - `city` string, nullable
        - `code` string, required
        - `company` string, nullable
        - `country` string, nullable
        - `state` string, nullable
      - `recalls` VinRecallCount: What a batch decode says of recalls when `include=recalls` is asked: how many campaigns may apply to the model year the VIN decodes to.
        - `count` RecallCount, required: How many recall campaigns list a model year, for each country. `null` for a country this server holds no recalls for; `0` when it holds them and none lists the model year.
          - `ca` integer, nullable
          - `us` integer, nullable
        - `do_not_drive` boolean, required: Whether any of them carries NHTSA's advisory not to drive.
        - `lookup` RecallLookup, required: Where to check one vehicle for open recalls. Neither government publishes recalls by VIN as data, so no answer here can say a recall applies to a VIN: these lookups can.
          - `maker` string, nullable: The maker's own lookup by VIN, where one is on file.
          - `nhtsa` string, required: NHTSA's lookup by VIN, for the United States.
          - `tc` string, required: Transport Canada's recall search, for Canada.
        - `may_apply` boolean, required: Always `true`. The count is for the year, make and model, not for the VIN: check the VIN at the addresses in `lookup`.
        - `park_outside` boolean, required: Whether any of them carries NHTSA's advisory to park outside.
      - `safety` Safety: Safety equipment as the manufacturer reported it: `Standard`, `Optional`, or a system type such as `Direct`.
        - `abs` string, nullable
        - `adaptive_cruise` string, nullable
        - `airbags_curtain` string, nullable
        - `airbags_front` string, nullable
        - `airbags_knee` string, nullable
        - `airbags_side` string, nullable
        - `auto_brake` string, nullable
        - `backup_camera` string, nullable
        - `blind_spot` string, nullable
        - `dynamic_brake_support` string, nullable
        - `esc` string, nullable
        - `forward_collision` string, nullable
        - `lane_centering` string, nullable
        - `lane_departure` string, nullable
        - `lane_keep` string, nullable
        - `park_assist` string, nullable
        - `pedestrian_braking` string, nullable
        - `rear_cross_traffic` string, nullable
        - `tpms` string, nullable: How tire pressure is monitored, as NHTSA words it, such as `Direct`.
        - `traction_control` string, nullable
      - `seat_rows` integer, nullable
      - `seats` integer, nullable
      - `series` string, nullable
      - `transmission` string, nullable
      - `transmission_speeds` integer, nullable
      - `trim` string, nullable
      - `valid` boolean, required: Whether the check digit, position 9, is right. Many genuine VINs from outside North America fail it.
      - `vin` string, required
      - `warnings` Warning[], required: Things to know about a decode that still succeeded.
        - `code` string, required: `invalid_check_digit`, `model_year_unknown`, `no_patterns` or `model_unresolved`. More may be added.
        - `message` string, required
        - `suggestions` string[]: VINs the caller may have meant.
      - `wheel_size_front` integer, nullable: Front wheel diameter in inches.
      - `wheel_size_rear` integer, nullable: Rear wheel diameter in inches.
      - `year` integer, nullable
    - ErrorBody: The body of every error: `{ "error": { "code", "message", "details" } }`.
      - `error` ErrorDetail, required
        - `code` string, required: A stable code to branch on. One of `invalid_vin`, `validation_failed`, `not_found`, `dataset_unavailable`, `method_not_allowed`, `payload_too_large`, `uri_too_long`, `rate_limited`, `unavailable`, `internal_error`.
        - `details` object, required: More about the error. Always an object; empty when there is nothing to add.
        - `message` string, required: A sentence for a person to read.

## Other responses

- `400`: `validation_failed`: the body is not `{ "vins": [...] }` or lists more than 50, or `include` is not `recalls`.
- `404`: `dataset_unavailable`: `include=recalls` was asked of a server that holds no recalls.
- `413`: `payload_too_large`.
- `429`: `rate_limited`.

---

[API](https://skmtc.dev/wenmarpro/apis/wenmar-open.md) · [All operations](https://skmtc.dev/wenmarpro/apis/wenmar-open/llms.txt) · [OpenAPI document](https://skmtc.dev/wenmarpro/apis/wenmar-open/revisions/1027b548b6f0?raw)
