Free tierGetting startedREST APINeoVIN

Free car data API: what the free tier covers and your first call

What MarketCheck's Free plan includes, how to get a key, the three calls worth making first and where your 500 monthly calls show up.

MarketCheck5 min read

For developers evaluating a car data API for a prototype or proof of concept

If you are looking for a free car data API, you probably have a prototype in mind and no budget approved yet. MarketCheck's Free plan is made for that stage: 500 API calls a month with no monthly fee and no per-call charges, on the same car API the paid plans use.

In short. Free costs nothing and includes 500 calls a month at up to 5 calls per second, with search radius capped at 100 miles. It is licensed for evaluation and development. Sign up, copy the key that onboarding shows you, then make three calls, one each to Inventory Search, NeoVIN and Dealerships Search. Read the Quota-Remaining header on every response so you always know where the month stands.

What the Free plan includes

Free plan
Monthly fee $0
Calls 500 a month, shared by every key on the account
Rate 5 calls per second
Search radius Up to 100 miles
Per-call charges None
Partner APIs Not included: VINData title reports, AutoRecalls and the CarsXE plate decoder start on Basic
License Evaluation and development, not a production data source

These figures come from the plan list in the pricing section and the docs' quota and rate limits page. The docs describe the cap as hard: once the 500 calls are used, further calls return a 429 until the quota resets at the start of the next calendar month, and Free never charges automatically for going over. Unused calls do not roll over. When a prototype needs more, you move to a paid plan on the Subscriptions page.

The Acceptable Use Policy puts the licensing in one line: the free tier is for evaluation and development, and you may not use it as a production data source.

Get a key in a few minutes

  1. Sign up with Google, GitHub or email
  2. Onboarding and terms
  3. First API key
  4. Your first call
  1. Create an account with Google, GitHub or an email address and a password, and confirm the email address if you used one.
  2. Onboarding asks about your business and what you are building, then for your acceptance of the Terms of Service and a payment card. On the Free plan nothing is charged for calls.
  3. The last step shows your first API key. Copy it, and create more keys later on the API keys page.

Every request carries the key as the api_key query parameter. Keep calls on your server, because anyone can read a key out of browser code.

GET /v2/search/car/active searches active dealer listings in the US and Canada. The documented sample asks for 2024 Ford F-150s, five to a page, with a count of each trim and price statistics for everything that matched:

Requestbash
curl "https://api.marketcheck.com/v2/search/car/active?api_key=YOUR_API_KEY&year=2024&make=ford&model=f-150&start=0&rows=5&facets=trim&stats=price"

Trimmed to one listing, two trims and the price fields discussed below:

Response (trimmed)json
{
  "num_found": 23090,
  "listings": [
    {
      "vin": "1FTFW3L55RKF33741",
      "heading": "New 2024 Ford F-150 XLT",
      "price": 51752,
      "miles": 12,
      "inventory_type": "new",
      "build": { "year": 2024, "make": "Ford", "model": "F-150", "trim": "XLT", "drivetrain": "4WD" },
      "dealer": { "city": "Royston", "state": "GA", "dealer_type": "franchise" }
    }
  ],
  "facets": { "trim": [{ "item": "XLT", "count": 14105 }, { "item": "STX", "count": 4143 }] },
  "stats": { "price": { "count": 22490, "missing": 600, "median": 52981.18 } }
}

num_found counts all 23,090 matches, while listings holds only the current page, and rows tops out at 50. The quota counts requests, so one request is one call whether it returns 5 rows or 50. That makes facets and stats cheap on Free: ask for them in the same request as the listings rather than in separate calls. To search around a place, add zip and radius, and keep the radius at 100 miles or less on this plan.

Call 2: the build behind a VIN with NeoVIN

GET /v2/decode/car/neovin/{vin}/specs turns a 17-character VIN into the car's trim, installed options with their codes and prices, colors and an MSRP breakdown. It also answers the search for a free VIN decoder API: on the Free plan a decode costs one of your 500 calls and nothing else.

Requestbash
curl "https://api.marketcheck.com/v2/decode/car/neovin/1FTEW1C59LKE56394/specs?api_key=YOUR_API_KEY"

The documented sample for this VIN, trimmed to one of its eighteen installed options:

Response (trimmed)json
{
  "vin": "1FTEW1C59LKE56394",
  "year": 2020,
  "make": "Ford",
  "model": "F-150",
  "trim": "XLT",
  "version": "XLT SuperCrew 5-1/2 Box",
  "drivetrain": "RWD",
  "engine": "5.0L V8",
  "msrp": 40020,
  "delivery_charges": 1695,
  "installed_options_msrp": 10085,
  "combined_msrp": 51800,
  "exterior_color": { "code": "E7", "name": "Velocity Blue Metallic", "base": "Blue" },
  "installed_options_details": [
    { "code": "302A", "name": "Equipment Group 302A - Luxury", "msrp": "4345", "sale_price": "2595" }
  ]
}

combined_msrp is base MSRP plus delivery plus installed options: 40,020 plus 1,695 plus 10,085 is 51,800. Cache each decode by VIN, since a car's factory build never changes and a second decode of the same VIN spends a call for nothing. When year, make, model and trim are all you need, the Basic VIN Decoder, GET /v2/decode/car/{vin}/specs, returns them with an is_valid flag. Signed in, the portal's Decode VIN page runs the same NeoVIN decode with one of your keys, so it spends the same quota. The NeoVIN guide covers what to build on the result.

GET /v2/dealerships/car searches MarketCheck's dealership directory for the US and Canada. The documented sample asks for dealerships within 50 miles of a point in Los Angeles:

Requestbash
curl "https://api.marketcheck.com/v2/dealerships/car?api_key=YOUR_API_KEY&latitude=34.0522&longitude=-118.2437&radius=50&rows=2"

Trimmed to one row, with the seller name, website, street and phone removed:

Response (trimmed)json
{
  "num_found": 2766,
  "mc_dealerships": [
    {
      "mc_dealer_id": "1174168",
      "mc_location_id": "1445189",
      "dealer_type": "independent",
      "city": "Los Angeles",
      "state": "CA",
      "zip": "90014",
      "distance": 0.74
    }
  ]
}

Dealerships Search is the newer of MarketCheck's two dealer directories, and the docs say the older Dealers Search, /v2/dealers/car, is being phased out. Store mc_dealer_id and mc_location_id against your own records; the dealer directory guide explains why those two are the durable keys.

One script for all three calls

The three calls together spend 3 of your 500 calls, and every response reports where the month stands:

first-calls.mtsts
const BASE = 'https://api.marketcheck.com/v2'

async function call(path: string, params: Record<string, string | number> = {}) {
  const url = new URL(BASE + path)
  url.searchParams.set('api_key', process.env.MARKETCHECK_API_KEY ?? '')
  for (const [key, value] of Object.entries(params)) url.searchParams.set(key, String(value))
  const res = await fetch(url)
  // Every response carries the account's monthly quota position
  console.log(`${path}: ${res.status}, ${res.headers.get('Quota-Remaining')} of ${res.headers.get('Quota-Limit')} calls left`)
  if (!res.ok) throw new Error(`${path} returned ${res.status}: ${await res.text()}`)
  return res.json()
}

const search = await call('/search/car/active', { year: 2024, make: 'ford', model: 'f-150', rows: 5, facets: 'trim', stats: 'price' })
console.log(`${search.num_found} listings, median asking price ${search.stats.price.median}`)

const build = await call('/decode/car/neovin/1FTEW1C59LKE56394/specs')
console.log(`${build.year} ${build.make} ${build.model} ${build.trim}, combined MSRP ${build.combined_msrp}`)

const dealers = await call('/dealerships/car', { latitude: 34.0522, longitude: -118.2437, radius: 50, rows: 2 })
console.log(`${dealers.num_found} dealerships within 50 miles`)

Save it as first-calls.mts (the .mts extension lets it use top-level await) and run npx tsx first-calls.mts with your key in MARKETCHECK_API_KEY. Live counts and prices will differ from the documented samples, because the data changes every day.

Where your 500 calls show up

  1. Quota headers on every response
  2. Your log or alert
  3. You decide when to move up a plan

Four places tell you how the month is going:

  • Response headers. Quota-Limit, Quota-Remaining and Quota-Reset-Time describe the month, and RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset-Time the current second. A 429 body names the limit you hit: API rate limit exceeded means wait a moment and retry, and Monthly API quota exhausted means you are done until the reset, with Retry-After giving the seconds to wait.
  • The Overview page. Total calls for the dates you pick, filterable by key, plus tiles for the last 24 hours, 7 days and 30 days. Usage syncs every 15 minutes. The 30-day tile is a rolling window, while the quota counts the calendar month, so the two can differ.
  • Query Logs. Today's calls one by one with their status codes, totals by endpoint and a CSV export, which is the quickest way to find a loop that is spending calls.
  • Usage Alerts. Emails when usage crosses the percentages of your monthly quota that you choose.

Limits to design around

  • The quota is per account. Every key on the account draws on the same 500 calls, so a test suite and a demo running at once share them.
  • Five calls per second. Space out bursts and retry a per-second 429 after a short pause; a monthly 429 will not clear by retrying.
  • Radius up to 100 miles. On a Free key, keep radius at 100 or less.
  • Partner endpoints need a paid plan. VINData, AutoRecalls and CarsXE start on Basic, and each needs its agreement accepted on the 3rd-party API agreements page.
  • Batch jobs are not on Free. The docs list batch decoding as an Enterprise package offering, enabled on request.
  • Development only. Free is licensed for evaluation and development. Move to a paid plan before the data reaches customers.

Who this is for

Developers who need car data for a prototype or an internal demo, and who want to see live responses before anyone approves a budget.

Start here

  1. Create a free account and copy the key from the last onboarding step.
  2. Run first-calls.mts and compare the shape of each response with the samples above.
  3. Set a usage alert at a percentage that leaves room for your next demo.
  4. Keep the Inventory Search, NeoVIN Decoder and quota and rate limits pages open while you build.

Start building on the Free tier.

The Free tier is for development and testing, on the same endpoints you will use in production. When you go live, pick a plan on the pricing page.

Building with a coding assistant? Give it the free Docs MCP, so it looks up documented parameters instead of guessing them.

More use cases

All use cases