Decode a 17-character VIN to manufacturer-supplied vehicle metadata via NHTSA's vPIC database. Returns identity (year, make, model, trim, series, body class, manufacturer), assembly plant (city, state, country), engine (cylinders, displacement, HP, fuel type, configuration, engine model), transmission (style, speeds), and body/weight specs. Curated to the ~30 fields agents actually use from vPIC's ~140-field response. Backed by NHTSA.gov; data is public-domain US government records.
/api/vehicle/vin-decodePAYMENT-SIGNATURE.The VIN decode API turns a 17-character VIN into manufacturer-supplied vehicle specs using NHTSA's vPIC database — curated down to the ~30 fields agents actually use from vPIC's ~140-field response.
Get back vehicle identity (year, make, model, trim, series, body class, manufacturer), assembly plant (city, state, country), engine details (cylinders, displacement, horsepower, fuel type, configuration, engine model), transmission (style, speeds), and body and weight specs. The data is public-domain US government records, and there is no API key — pay per decode with x402.
| Name | Type | Description |
|---|---|---|
vinrequired | string | 17-character VIN. Case-insensitive. Excludes letters I, O, and Q per VIN standard. min 17 chars · max 17 chars · match ^[A-HJ-NPR-Z0-9]{17}$ |
modelYear | integer | Optional model-year hint — disambiguates VINs where the year-digit wraps (A=1980/2010, etc.). min 1949 · max 2099 |
# 1. Probe with no auth → 402 envelope with PaymentRequirements curl -sS 'https://2s.io/api/vehicle/vin-decode?vin=xxxxxxxxxxxxxxxxx&modelYear=1949' # 2. Sign + retry with PAYMENT-SIGNATURE: curl -sS 'https://2s.io/api/vehicle/vin-decode?vin=xxxxxxxxxxxxxxxxx&modelYear=1949' \ -H 'PAYMENT-SIGNATURE: <base64-json-payload>' # Or use the canonical runner (handles probe → sign → retry): # EVM_PRIVATE_KEY=0x... node --env-file=.env.local \ # --experimental-strip-types scripts/x402-pay.ts \ # 'https://2s.io/api/vehicle/vin-decode?vin=xxxxxxxxxxxxxxxxx&modelYear=1949'
import { TwoS } from '@2sio/sdk'
const client = new TwoS({
privateKey: process.env.EVM_PRIVATE_KEY as `0x${string}`,
})
const result = await client.vehicle.vinDecode({
"vin": "xxxxxxxxxxxxxxxxx",
"modelYear": 1949
})
console.log('endpoint:', result.endpoint)
console.log('cost:', result.costUsd, 'USDC')
console.log('tx:', result.settlement?.txHash)
console.log('data:', result.data)import os
from twosio import TwoS
client = TwoS(private_key=os.environ["EVM_PRIVATE_KEY"])
result = client.vehicle.vin_decode(vin="xxxxxxxxxxxxxxxxx", modelYear=1949)
print("endpoint:", result.endpoint)
print("cost:", result.cost_usd, "USDC")
print("tx:", (result.settlement or {}).get("tx_hash"))
print("data:", result.data)// 1. Add @2sio/mcp to your MCP host config (Claude Desktop example below).
// EVM_PRIVATE_KEY funds x402 payments per call.
// claude_desktop_config.json
{
"mcpServers": {
"2sio": {
"command": "npx",
"args": ["-y", "@2sio/mcp"],
"env": { "EVM_PRIVATE_KEY": "0x..." }
}
}
}
// 2. Once the server is running, agents call this tool via standard MCP:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "vehicle.vin-decode",
"arguments": {
"vin": "xxxxxxxxxxxxxxxxx",
"modelYear": 1949
}
}
}| Field | Type | Description |
|---|---|---|
ok | boolean | one of: true |
items | array | |
total | integer | Total matching rows upstream; null when unknown. |
source | object |
{
"ok": true,
"items": [
{
"vin": "example",
"modelYear": "example",
"make": "example",
"model": "example",
"trim": "example",
"series": "example",
"bodyClass": "example",
"manufacturer": "example",
"plant": {
"city": "example",
"state": "example",
"country": "example"
},
"engine": {
"cylinders": "example",
"displacementL": "example",
"hp": "example",
"fuelTypePrimary": "example",
"configuration": "example",
"model": "example"
},
"transmission": {
"style": "example",
"speeds": "example"
},
"doors": "example",
"driveType": "example",
"vehicleType": "example",
"gvwrClass": "example"
}
],
"total": 1,
"source": {
"provider": "example",
"url": "example",
"license": "example"
}
}