# Kavak Scraper — Used Car Prices & Inventory (MX, CL, AR, BR) (`fabrikit/kavak-scraper`) Actor

Scrape Kavak's used-car inventory in Mexico, Chile, Argentina, Brazil and the UAE: make, model, version, year, km, retail price, discounts, monthly payment, hub, status and photos. Filter by make, model, year, price, km and body type. From US$2 per 1,000 cars.

- **URL**: https://apify.com/fabrikit/kavak-scraper.md
- **Developed by:** [Fabrikit](https://apify.com/fabrikit) (community)
- **Categories:** Automation, E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 car listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Kavak Scraper — Used Car Prices & Inventory (Mexico, Chile, Argentina, Brazil, UAE)

Pull **Kavak's live used-car inventory and retail prices** into clean JSON, CSV or Excel. Kavak is the largest used-car retailer in Latin America, and its asking prices are a de-facto **retail reference price** for used vehicles in Mexico, Chile, Argentina and Brazil (plus its UAE operation). This Actor reads the same catalog shoppers see and returns one row per car: make, model, version, year, mileage, price and currency, strike-through price and discount, monthly payment, cash vs financed price, transmission, fuel, body type, colour, VIN, city and hub, availability (available or reserved), badges, delivery estimate and photos.

- **5 markets in one run**: Mexico (~8,300 cars), Brazil, Argentina and Chile (~1,300 each), United Arab Emirates (~650).
- **Real filters**: make, model, year range, price range, km range, body type, transmission, availability and sort order, resolved against each country's own filter options.
- **Fast and cheap**: plain HTTP, no browser. 2,000 Mexican cars take about 30 seconds.
- **Optional car-page add-on**: VIN, cash and financed price, promotion name, full photo gallery, hub address with coordinates, inspection-report flag, and the full spec and equipment list (engine, power, airbags, screen, seats...).
- **Mexico enrichment for free**: VIN, colour, fuel, drivetrain, seats, hub, cash vs financed price and exact monthly payment come from Kavak's public product feed, with no extra charge.

### Who uses this data

- **Dealers and used-car lots**: benchmark your stock against the biggest retailer's asking prices by make, model, version, year and km.
- **Lenders, leasing and auto-finance companies**: collateral valuation and loan-to-value checks against current retail prices, plus Kavak's own financed vs cash price.
- **Insurers**: market value for total-loss settlements and underwriting, with the VIN to match exact units.
- **Pricing and valuation tools, marketplaces and analysts**: daily price series, depreciation curves, discount tracking, inventory turnover (cars moving from available to reserved) and regional supply.

### How to use it

1. Pick one or more **countries**.
2. Optionally set **filters**: make (`Toyota`), model (`RAV4`), year range, price range (local currency), km range, body type (`SUV`), transmission, availability.
3. Choose the **sort order** and **max cars**, then press **Start**. Export the dataset as JSON, CSV or Excel, or send it to Google Sheets, a webhook, Make, Zapier or the Apify API.

#### Example inputs

All of Mexico's inventory, cheapest first:

```json
{
    "countries": ["mx"],
    "sort": "price_asc",
    "maxItems": 9000
}
```

Toyota RAV4 and Mazda CX-5, 2018–2023, automatic, under 90,000 km, available now, in four markets, 40 per country, with car pages:

```json
{
    "countries": ["mx", "cl", "br", "ae"],
    "make": "Toyota, Mazda",
    "model": "RAV4, CX-5",
    "yearFrom": 2018,
    "yearTo": 2023,
    "kmMax": 90000,
    "transmission": "automatic",
    "availability": "available",
    "sort": "price_asc",
    "maxItems": 160,
    "maxItemsPerCountry": 40,
    "fetchDetails": true
}
```

Reserved cars only in Chile (what is actually selling), price between 5 and 12 million CLP:

```json
{
    "countries": ["cl"],
    "availability": "reserved",
    "priceMin": 5000000,
    "priceMax": 12000000,
    "maxItems": 500
}
```

#### Input reference

| Field | What it does |
|---|---|
| `countries` | `mx` Mexico, `cl` Chile, `ar` Argentina, `br` Brazil, `ae` United Arab Emirates. Default `["mx"]`. |
| `make`, `model` | Free text, comma-separated for several. Case, accents and punctuation don't matter (`mercedes-benz` = `Mercedes Benz`). If a value doesn't exist in a country, the log lists the valid options and that country is skipped. |
| `yearFrom`, `yearTo` | Model-year range. |
| `priceMin`, `priceMax` | Price range in each country's **local currency** (MXN, CLP, ARS, BRL, AED). Best used with one country. |
| `kmMin`, `kmMax` | Odometer range in km. |
| `bodyType` | Body type as the country site names it: `SUV`, `Sedan`, `Hatchback`, `Pickup`, `Minivan`, `Coupe`, ... |
| `transmission` | `any`, `automatic`, `manual`. |
| `availability` | `any`, `available`, `reserved` (reserved = a buyer already booked it). |
| `sort` | `relevance`, `price_asc`, `price_desc`, `km_asc`, `km_desc`, `year_desc`, `year_asc`. |
| `maxItems` | Total cap across all countries (default 50). |
| `maxItemsPerCountry` | Optional per-country cap, so Mexico doesn't use the whole budget. 0 = none. |
| `fetchDetails` | Visit each car page (add-on event). Default off. |
| `mexicoFeedEnrichment` | Free Mexican enrichment from Kavak's product feed. Default on. |
| `proxyConfiguration` | Not needed. If a country ever blocks with 403/429, the Actor switches that country to Apify residential proxy by itself. |

### Output

Example item (real car, Chile, with `fetchDetails` on; arrays shortened):

```json
{
    "country": "CL",
    "countryName": "Chile",
    "id": "553857",
    "url": "https://www.kavak.com/cl/venta/mazda-mazda_6-25_skyactiv_g_gt_auto_gps-sedan-2017?id=553857",
    "title": "Mazda Mazda 6 2.5 SKYACTIV-G GT AUTO GPS 2017",
    "make": "Mazda",
    "model": "Mazda 6",
    "version": "2.5 SKYACTIV-G GT AUTO GPS",
    "year": 2017,
    "km": 80000,
    "price": 11773900,
    "currency": "CLP",
    "priceLabel": "Precio desde",
    "originalPrice": null,
    "discountAmount": null,
    "discountPercent": null,
    "monthlyPayment": null,
    "cashPrice": 12023900,
    "financedPrice": 11773900,
    "promotionName": null,
    "transmission": "Automático",
    "fuelType": "Gasolina",
    "bodyType": "Sedan",
    "drivetrain": null,
    "color": "Blanco",
    "passengers": 5,
    "vin": "JM7GL4S34J1124200",
    "city": "Metropolitana de Santiago",
    "hub": "Kavak Vespucio Norte",
    "hubAddress": "Américo Vespucio 981, Huechuraba, 8580000 Huechuraba, Metropolitana",
    "hubLatitude": -33.3760467,
    "hubLongitude": -70.6570517,
    "status": "available",
    "statusLabel": "Disponible",
    "badges": ["Nuevo ingreso"],
    "badgeKeys": ["newly-published-car"],
    "refurbished": true,
    "comingSoon": false,
    "outlet": false,
    "condition": "seminuevo",
    "sellerType": "kavak",
    "sellerName": null,
    "deliveryDaysMin": 16,
    "deliveryDaysMax": 30,
    "deliveryDaysEstimated": 17,
    "imageUrl": "https://images.prd.kavak.io/images/553857/EXTERIOR-frontSidePilotDistance-1791637649281.jpeg",
    "images": ["https://images.prd.kavak.io/images/553857/EXTERIOR-frontSidePilotDistance-1791637649281.jpeg", "..."],
    "specs": {
        "engine.liters": "2.5",
        "engine.cylinders": "4",
        "performance.max_power_hp": "185",
        "transmission.number_of_speeds": "6",
        "...": "..."
    },
    "equipment": ["Start/Stop", "Control de Crucero", "Sensor de distancia", "Aire acondicionado", "..."],
    "inspectionReportAvailable": true,
    "searchRank": 2,
    "dataSources": ["catalog", "details"],
    "detailsFetched": true,
    "scrapedAt": "2026-10-12T17:47:05.319Z"
}
```

#### Field notes

| Field | Notes |
|---|---|
| `id` | Kavak stock ID. Stable while the car is listed; use it to diff runs. |
| `url` | Car page. The `?id=` part matters: Kavak reuses the same page slug for every unit of the same version and year. |
| `price` | The headline price on the card. In Mexico, Chile and Brazil this is the **"from" price with Kavak financing**; in Argentina and the UAE it is the cash price. Always in `currency`. |
| `cashPrice`, `financedPrice` | Final cash and financed prices after promotions. Mexico: always (from the feed). Other countries: with `fetchDetails`. |
| `originalPrice`, `discountAmount`, `discountPercent` | Strike-through price and the discount against `price`, when Kavak shows one (Outlet, Hot Deals, promos). |
| `monthlyPayment` | Kavak's own monthly-payment estimate where the site shows it (Mexico, UAE). |
| `status` | `available` or `reserved` (normalized from Disponible / Apartado / Reservado / Disponível / Available / Booked). `statusLabel` keeps the original text. |
| `city`, `hub` | City or region of the car and the Kavak hub/branch where it sits. `hubAddress` and coordinates come with `fetchDetails`. |
| `drivetrain` | `2WD`/`4WD` from the Mexican feed, otherwise inferred from the version name (`4WD`, `AWD`, `4MATIC`, `xDrive`, `quattro`...). `null` when unknown. |
| `sellerType`, `sellerName` | `kavak` for Kavak-owned stock, `ally` for partner dealers in Mexico (dealer company name when shown). |
| `specs`, `equipment` | With `fetchDetails`: every spec as a stable key (`engine.liters`, `airbags.number`, `seats.capacity`...) and the list of equipment the car has. Labels are in the country's language. |
| `searchRank` | Position in the search results for your sort order. |
| `dataSources` | Which sources filled the row: `catalog`, `feed` (Mexico), `details`. |

Kavak does not publish a listing date. To track new arrivals, schedule the Actor and compare `id`s between runs (the `newly-published-car` badge marks recent arrivals).

A `SUMMARY` record in the run's key-value store lists, per country, the cars reported by the site, pages fetched, cars saved, the filters applied and any errors.

### Pricing

Pay per event: you only pay for cars delivered.

| Event | Price | When |
|---|---|---|
| Actor start | US$0.00005 | Once per run (per GB of memory) |
| `car-result` | **US$0.002** (US$2 per 1,000 cars) | Each car saved to the dataset |
| `car-details` | US$0.001 (US$1 per 1,000 cars) | Each car whose own page was fetched and merged (only with `fetchDetails`) |

Examples: 1,000 cars = US$2; 1,000 cars with car pages = US$3; Mexico's full inventory (~8,300 cars) ≈ US$16.70.

The Actor respects the **maximum charge** you set for a run: it never hands out more cars than that budget covers and stops cleanly when it is reached.

### FAQ

**How fresh is the data?** Each run reads the live catalog, so prices and availability are as of the run. Kavak adds and removes cars every day; schedule the Actor (daily or weekly) for a price history.

**Does it need a proxy or login?** No. It uses public pages only. If a country starts blocking requests, the run switches that country to Apify residential proxy automatically.

**Why is the price different from the price on the car page?** In Mexico, Chile and Brazil the catalog shows the lower price that applies when you finance with Kavak. The car page (and this Actor's `cashPrice`) also shows the cash price, which is usually a bit higher.

**Can I get every car in a country?** Yes: set `maxItems` above the country's inventory. Mexico (~8,300 cars) takes about 2 minutes.

**Can I mix currencies?** Each row has its own `currency`. Price filters are applied in each country's local currency, so use them with a single country.

**What about Colombia, Peru or Turkey?** Kavak's Colombia and Peru sites currently don't serve a catalog, and Turkey runs on a different brand and platform, so they are not included.

**Is personal data included?** No. The data describes vehicles owned by Kavak or partner dealers (companies) and the company's own branches. No buyer or seller personal data is collected.

### En español

**Kavak Scraper** extrae el inventario de autos usados de Kavak y sus precios de venta en **México, Chile, Argentina, Brasil** (y Emiratos Árabes): marca, modelo, versión, año, kilometraje, precio y moneda, precio tachado y descuento, mensualidad, precio de contado vs financiado, transmisión, combustible, carrocería, color, VIN, ciudad y sucursal, estado (disponible o apartado/reservado), badges, plazo de entrega y fotos.

- Filtros: marca, modelo, rango de años, precio (en moneda local), kilometraje, carrocería, transmisión, disponibilidad y orden.
- Complemento opcional `fetchDetails` (página de cada auto): VIN, precio de contado y financiado, galería completa, dirección y coordenadas de la sucursal, ficha técnica y equipamiento.
- Precio: US$2 por 1.000 autos (`car-result`) + US$1 por 1.000 páginas de detalle (`car-details`, solo si lo activas).

Útil para concesionarias y lotes de usados, financieras y leasing, aseguradoras y herramientas de tasación que necesitan un precio de referencia retail actualizado.

# Actor input Schema

## `countries` (type: `array`):

Kavak markets to scrape. Mexico is by far the largest inventory (~8,300 cars), followed by Brazil, Argentina and Chile (~1,300 each) and the UAE (~650). Countries are scraped in this order.

## `make` (type: `string`):

Car brand as shown on Kavak, e.g. `Toyota`, `Mazda`, `Mercedes Benz`. Several brands: separate with commas. Case and accents don't matter. Leave empty for all brands.

## `model` (type: `string`):

Model name, e.g. `RAV4`, `CX-5`, `Versa`. Several models: separate with commas. Leave empty for all models.

## `yearFrom` (type: `integer`):

Oldest model year to include (e.g. `2018`).

## `yearTo` (type: `integer`):

Newest model year to include.

## `priceMin` (type: `integer`):

In each country's local currency (MXN, CLP, ARS, BRL, AED) — best used with a single country.

## `priceMax` (type: `integer`):

In each country's local currency (MXN, CLP, ARS, BRL, AED) — best used with a single country.

## `kmMin` (type: `integer`):

Minimum odometer reading in km.

## `kmMax` (type: `integer`):

Maximum odometer reading in km.

## `bodyType` (type: `string`):

Body type as named on the country site, e.g. `SUV`, `Sedan`, `Hatchback`, `Pickup`, `Minivan`, `Coupe`. Several: separate with commas. Unknown names are reported in the log together with the valid options for that country.

## `transmission` (type: `string`):

Gearbox type.

## `availability` (type: `string`):

`available` = can be bought now; `reserved` = already reserved/booked by a buyer (useful to measure what sells).

## `sort` (type: `string`):

Order of the results. `relevance` is the site default.

## `maxItems` (type: `integer`):

Stop after this many cars across all selected countries. Kavak shows 30 cars per page.

## `maxItemsPerCountry` (type: `integer`):

Optional cap per country, so one big market (Mexico) does not use up the whole `Max cars` budget. 0 = no per-country cap.

## `fetchDetails` (type: `boolean`):

Visit each car's own page (1 extra request per car, charged as the `car-details` add-on event) to add: VIN, cash and financed price, promotion name, colour, fuel, drivetrain, the full photo gallery, the hub's address and coordinates, the inspection-report flag, and the full spec and equipment list (engine, power, airbags, screen, seats...).

## `mexicoFeedEnrichment` (type: `boolean`):

Mexico only, free: download Kavak's public product feed (about 9 requests) to add VIN, colour, fuel, drivetrain, seats, hub, cash vs financed price and the exact monthly payment to every Mexican car, without visiting car pages.

## `proxyConfiguration` (type: `object`):

Kavak answers plain requests, so no proxy is needed. If a country starts blocking (HTTP 403/429), the Actor switches that country to Apify RESIDENTIAL proxy automatically.

## Actor input object example

```json
{
  "countries": [
    "mx"
  ],
  "make": "",
  "model": "",
  "bodyType": "",
  "transmission": "any",
  "availability": "any",
  "sort": "relevance",
  "maxItems": 50,
  "maxItemsPerCountry": 0,
  "fetchDetails": false,
  "mexicoFeedEnrichment": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `cars` (type: `string`):

All cars collected during the run

## `overview` (type: `string`):

Key fields per car

## `summary` (type: `string`):

Per-country counts, applied filters and errors

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "countries": [
        "mx"
    ],
    "make": "",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("fabrikit/kavak-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "countries": ["mx"],
    "make": "",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("fabrikit/kavak-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "countries": [
    "mx"
  ],
  "make": "",
  "maxItems": 50
}' |
apify call fabrikit/kavak-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fabrikit/kavak-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ziEOyylqCEPWAnOSk/builds/kgRsLXJfUkNyPX4pO/openapi.json
