# CarGurus API — live used-car listings from cargurus.com (US), cargurus.ca and cargurus.co.uk with CarGurus's own deal rating (Great / Good / Fair / High / Overpriced) and instant market value (IMV) on every car. Search around a ZIP or postcode by make, model, year, price, mileage, body, fuel, transmission, drivetrain, colour, deal rating, seller type, certification, days on market, price drops, single owner, no accidents and one dealer's stock; then pull one listing in full: price history, dealer fees, vehicle-history counts, options, specs, description, photos and the dealer with address, phone, rating and hours. Plus the make and model lists. No login, no key.

> Search CarGurus used-car listings around a ZIP / postcode. Every row carries the asking price, CarGurus's deal rating and instant market value (IMV), the gap between them, days on market, the last price drop, VIN, specs, features and the dealer. Filters are applied by the source; every enum is a closed list per site — an unknown value is rejected instead of silently returning everything.
> ReefAPI engine `cargurus` · 4 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/cargurus/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/cargurus/v1/search — 2 credits
Search CarGurus used-car listings around a ZIP / postcode. Every row carries the asking price, CarGurus's deal rating and instant market value (IMV), the gap between them, days on market, the last price drop, VIN, specs, features and the dealer. Filters are applied by the source; every enum is a closed list per site — an unknown value is rejected instead of silently returning everything.

**Parameters:**
- `zip` (string, required) — Search centre: a US ZIP (10001), a Canadian postal code (M5V 3L9) or a UK postcode (SW1A 1AA), matching `site`. Required: without it the source would place the search wherever the request comes from. A code the source cannot place is rejected.
- `site` (enum, optional, default "us") — Which CarGurus site. Listing ids and make ids belong to one site. [one of: us, ca, uk]
- `distance` (integer, optional, default 50) — Search radius around `zip`, in the site's unit (miles on us/uk, km on ca). The site's own steps are 10/25/50/75/100/150/200/500; any whole number is accepted.
- `nationwide` (boolean, optional, default false) — Search the whole country (the site's own nationwide radius); overrides `distance`. Distances are still measured from `zip`.
- `make` (string, optional) — Make: the site's make id (m2 = Ford on cargurus.com, from the `makes` action or a search row's make_id) or the make's name (Ford, Mercedes-Benz) — a name is looked up in the site's make list; an unknown make is rejected.
- `model_id` (string, optional) — Model id within `make` (d334 = Explorer), from the `models` action or a search row's model_id. Needs `make`.
- `year_min` (integer, optional) — Earliest model year (inclusive).
- `year_max` (integer, optional) — Latest model year (inclusive).
- `price_min` (integer, optional) — Lowest asking price in the site's currency (USD / CAD / GBP).
- `price_max` (integer, optional) — Highest asking price in the site's currency.
- `mileage_min` (integer, optional) — Lowest mileage (miles on us/uk, km on ca).
- `mileage_max` (integer, optional) — Highest mileage (miles on us/uk, km on ca).
- `days_on_market_min` (integer, optional) — Only listings on the market for at least this many days.
- `days_on_market_max` (integer, optional) — Only listings on the market for at most this many days.
- `body_type` (array, optional) — Body style. One value or several comma-separated (any of them). A value the chosen site does not offer is rejected. [one of: coupe, convertible, hatchback, minivan, pickup, sedan, suv, van, wagon]
- `fuel` (array, optional) — Fuel type. One value or several comma-separated (any of them). A value the chosen site does not offer is rejected. [one of: diesel, electric, gasoline, hybrid, cng, flex_fuel, biodiesel, fuel_cell, dual_fuel]
- `transmission` (array, optional) — Transmission. One value or several comma-separated (any of them). A value the chosen site does not offer is rejected. [one of: automatic, manual, unknown]
- `drivetrain` (array, optional) — Driven wheels. One value or several comma-separated (any of them). A value the chosen site does not offer is rejected. [one of: awd, 4wd, fwd, rwd, 4x2]
- `deal_rating` (array, optional) — CarGurus's own deal rating: how the asking price compares with its instant market value. One value or several comma-separated (any of them). A value the chosen site does not offer is rejected. [one of: great, good, fair, high, overpriced, no_analysis, uncertain]
- `seller_type` (array, optional) — Seller type. One value or several comma-separated (any of them). A value the chosen site does not offer is rejected. [one of: franchise_dealer, cargurus_partner]
- `condition` (array, optional) — Condition / certification as the site classifies it (the search covers used cars; this narrows to certified pre-owned). One value or several comma-separated (any of them). A value the chosen site does not offer is rejected. [one of: used, certified, third_party_certified, approved_used]
- `exterior_color` (array, optional) — Exterior colour group. One value or several comma-separated (any of them). A value the chosen site does not offer is rejected. [one of: black, blue, brown, gold, gray, green, orange, pink, purple, red, silver, teal, white, yellow, unknown]
- `price_drops_only` (boolean, optional, default false) — Only listings whose price was recently reduced.
- `single_owner` (boolean, optional, default false) — Only cars the vehicle-history report shows with one owner.
- `no_accidents` (boolean, optional, default false) — Only cars with no accidents reported.
- `with_photos_only` (boolean, optional, default false) — Only listings with at least one photo.
- `include_shipped` (boolean, optional, default true) — The site's default (true) mixes in cars from outside the radius that the seller can ship to you once a make is chosen. false keeps only cars within `distance` of `zip`.
- `dealer_id` (string, optional) — Only one dealer's stock: `seller.dealer_id` of a listing. The dealer's cars inside the radius only.
- `sort` (enum, optional, default "best_match") — Result order. price_asc / price_desc order by price_plus_fees (the price with the dealer's fees), as the site does, and leave out listings without a price (measured 81,127 → 72,444 for New York). Sponsored rows (placement priority/featured) are placed by the site and do not follow the order. [one of: best_match, best_deal, price_asc, price_desc, mileage_asc, mileage_desc, closest, year_desc, year_asc, newest_listing, oldest_listing]
- `page` (integer, optional, default 1) — Page number; a page holds about 20-23 listings (the site sets it). The source stops serving pages before its own total runs out — a page past the end returns no rows and meta.beyond_last_page = true.

**Returns:** listings[]: listing_id, site, url, title, year, make, make_id, model, model_id, trim, entity_id, body_type, is_new, is_certified, currency, price (asking price), price_display, price_plus_fees, fees_included_in_price_plus_fees, fee_disclosure, imv_price (CarGurus instant market value), imv_differential (the source's own gap: IMV − base price on search rows, IMV − headline price on listing), below_imv_by (IMV − price), below_imv_by_with_fees, previous_price, original_price, last_price_drop_amount, last_price_drop_at, deal_rating (great|good|fair|high|overpriced|no_analysis|uncertain), deal_rating_code, deal_score, days_on_market, mileage, mileage_unit, mileage_display, vin, stock_number, exterior_color, exterior_color_group, interior_color, fuel_type, fuel_economy_city/highway/combined, fuel_economy_unit, transmission, drivetrain, engine, doors, features[], image, picture_count, distance, distance_unit, how_to_shop, financing_eligible, placement (priority|featured|standard), is_sponsored, ulez_compliant (uk), seller{dealer_id, seller_id, name, city, region, postal_code, location, phone, phone_display, is_franchise_dealer, franchise_make, is_cargurus_partner, logo}. meta: total (the source's count), total_includes_shipped, page, has_more, beyond_last_page, sponsored_rows, promo_tiles_dropped, location{zip, latitude, longitude, name}, filters_applied, warnings.

**Example request body:**
```json
{
  "zip": "10001",
  "distance": 50,
  "make": "m2",
  "model_id": "d334",
  "deal_rating": "great,good",
  "sort": "best_deal"
}
```

### POST https://api.reefapi.com/cargurus/v1/listing — 2 credits
One CarGurus listing in full by its id: asking price, price with dealer fees and each fee, IMV and deal rating, the full price history, days on market and at the dealer, VIN, mileage, specs, options, fuel economy, vehicle-history counts (accidents, owners), the seller's description, every photo and the dealer with address, coordinates, phone, website, rating, review count and opening hours. A removed listing returns NOT_FOUND.

**Parameters:**
- `listing_id` (string, required) — `listing_id` of a search row, as is (or the number in a cargurus …/details/<id> URL). Use the same `site` the row came from.
- `site` (enum, optional, default "us") — Which CarGurus site. Listing ids and make ids belong to one site. [one of: us, ca, uk]
- `zip` (string, optional) — Optional: the zip/postcode to measure the car's distance from. Without it no distance is returned.

**Returns:** listing{} with the search-row fields plus status, is_active, condition, headline_price (the figure the listing page headlines — for some dealers it includes their fees), headline_price_display, headline_price_includes_fees, dealer_fees[{name, amount, type}], price_history[{price, date}], days_at_dealer, saved_count, fuel_tank_capacity, cargo_volume, legroom[], options[], specs{category: {label: value}}, vehicle_history{has_report, accident_count, owner_count, report_date}, description, images[], listing_tier, distance (only with zip), seller{dealer_id, seller_id, type, name, street, city, region, postal_code, country, latitude, longitude, phone, phone_display, website, facebook, instagram, rating, review_count, is_franchise_dealer, is_cargurus_partner, inventory_url, logo, opening_hours[]}

**Example request body:**
```json
{
  "listing_id": "441095283"
}
```

### POST https://api.reefapi.com/cargurus/v1/makes — 2 credits
Every make the chosen CarGurus site lists, with the site's make id that `search` and `models` take.

**Parameters:**
- `site` (enum, optional, default "us") — Which CarGurus site. Listing ids and make ids belong to one site. [one of: us, ca, uk]

**Returns:** makes[{make_id, name, is_popular}]

**Example request body:**
```json
{
  "site": "us"
}
```

### POST https://api.reefapi.com/cargurus/v1/models — 2 credits
The models of one make with the source's live listing counts — the model_id `search` takes.

**Parameters:**
- `make` (string, required) — The site's make id (m2) or the make's name (Ford).
- `site` (enum, optional, default "us") — Which CarGurus site. Listing ids and make ids belong to one site. [one of: us, ca, uk]
- `zip` (string, optional) — Optional: count models around this zip/postcode (with `distance`). Without it the counts are nationwide.
- `distance` (integer, optional, default 50) — Search radius around `zip`, in the site's unit (miles on us/uk, km on ca). The site's own steps are 10/25/50/75/100/150/200/500; any whole number is accepted.

**Returns:** make{make_id, name}, models[{model_id, name, count, is_popular}]

**Example request body:**
```json
{
  "make": "Ford"
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=cargurus
- Human docs page: https://reefapi.com/docs/cargurus
- Overview page: https://reefapi.com/cargurus-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
