# AUTO.RIA — Ukraine vehicle marketplace

> Search AUTO.RIA and get FULL listings back, not ids: price in all three currencies AUTO.RIA publishes, odometer in kilometres, year, trim, modification, generation, body style, colour, region and city, VIN and plate where the seller publishes them, every photo URL, the accident/credit/customs flags the site prints, and the seller block (dealer name, dealer page and badges, or the private seller's own site id and the site's own masked phone). Covers all eight vehicle categories and the used, new and on-order surfaces. At least one of `make`, `model`, `region`, `city`, `year_from`, `year_to`, `price_from_usd`, `price_to_usd`, `fuel`, `gearbox`, `body_type_id`, `seller_type`, `mileage_from_km`, `mileage_to_km`, `engine_from_l`, `engine_to_l`, `accident_history`, `has_video`, `has_photo`, `vin_verified` or `auction_possible` is normally wanted — calling with none of them returns the whole category, newest/most-relevant first, which is a valid but very broad answer.
> ReefAPI engine `autoria` · 8 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/autoria/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/autoria/v1/search — 3 credits
Search AUTO.RIA and get FULL listings back, not ids: price in all three currencies AUTO.RIA publishes, odometer in kilometres, year, trim, modification, generation, body style, colour, region and city, VIN and plate where the seller publishes them, every photo URL, the accident/credit/customs flags the site prints, and the seller block (dealer name, dealer page and badges, or the private seller's own site id and the site's own masked phone). Covers all eight vehicle categories and the used, new and on-order surfaces. At least one of `make`, `model`, `region`, `city`, `year_from`, `year_to`, `price_from_usd`, `price_to_usd`, `fuel`, `gearbox`, `body_type_id`, `seller_type`, `mileage_from_km`, `mileage_to_km`, `engine_from_l`, `engine_to_l`, `accident_history`, `has_video`, `has_photo`, `vin_verified` or `auction_possible` is normally wanted — calling with none of them returns the whole category, newest/most-relevant first, which is a valid but very broad answer.

**Parameters:**
- `category` (enum, optional, default "cars") — Which vehicle catalogue to search. Each one is a separate surface with its own inventory; live totals measured 2026-10-01 are in the labels. [one of: cars, moto, water, special, trailers, trucks, buses, agricultural]
- `listing_type` (enum, optional, default "used") — Which AUTO.RIA surface to read. `used` = second-hand stock already in Ukraine (317,695 live) · `new` = new vehicles from dealers/importers (7,399) · `order` = offered to order or in transit (4,330) · `all` = the three together (325,095). New-car adverts are numbered in their OWN id range and are read through their own surface; `search` handles that per row, so a mixed `all` page still returns the right vehicle for every id in it. [one of: used, new, order, all]
- `make` (string, optional) — Manufacturer. Accepts the AUTO.RIA make name as `makes` returns it (e.g. `Audi`, `Volkswagen`) or its numeric id (e.g. `6`). A name costs one extra lookup; the id does not. An unknown name is rejected with the nearest matches named.
- `model` (string, optional) — Model, as `models` returns it (e.g. `Q7`) or its numeric id. Requires `make`. Resolving a model NAME costs one extra lookup.
- `year_from` (integer, optional) — Earliest model year, inclusive. Site parameter `s_yers[0]`.
- `year_to` (integer, optional) — Latest model year, inclusive. Site parameter `po_yers[0]`.
- `price_from_usd` (integer, optional) — Lowest asking price in US dollars. The site's price filter is denominated in USD — verified by rows: `price_from_usd=60000` returned cars priced $61,000–$285,000 and `price_to_usd=900` returned $320–$900.
- `price_to_usd` (integer, optional) — Highest asking price in US dollars (see `price_from_usd`).
- `mileage_from_km` (integer, optional) — Lowest odometer reading in KILOMETRES. AUTO.RIA's own filter is denominated in thousands of km, so this is divided by 1000 before it is sent and therefore rounds down to the nearest 1,000 km.
- `mileage_to_km` (integer, optional) — Highest odometer reading in kilometres (see `mileage_from_km` for the 1,000 km rounding).
- `engine_from_l` (number, optional) — Smallest engine displacement in litres. Site parameter `engineVolumeFrom`.
- `engine_to_l` (number, optional) — Largest engine displacement in litres. Site parameter `engineVolumeTo`.
- `fuel` (enum, optional) — Fuel / drivetrain. Live row counts for the cars category are in the labels. Fuel ids 7 and 9 exist in the site's numbering but return 0 rows, so they are not offered. [one of: petrol, diesel, gas, gas-petrol, hybrid, electric, methane, phev, mhev, reev]
- `gearbox` (enum, optional) — Transmission, from the site's own gearbox list. [one of: manual, automatic, tiptronic, robot, cvt, reducer]
- `body_type_id` (integer, optional) — Body style id. The valid ids for a category come from `reference` with `list=body_types` (for cars: 3 saloon, 4 hatchback, 5 SUV/crossover, 8 MPV …). An unknown id returns 0 rows rather than an error.
- `region` (string, optional) — Oblast / region. Accepts the name as `regions` returns it or its numeric id (e.g. `10` = Kyiv region). Resolving a name costs one extra lookup.
- `city` (string, optional) — City. Accepts the name as `regions` with a `region` returns it, or its numeric id (`10` = Kyiv). Resolving a name requires `region` and costs one extra lookup.
- `seller_type` (enum, optional) — Who is selling. Both values were confirmed against the rows they return, not just against the total. [one of: private, dealer]
- `accident_history` (enum, optional) — Filter on AUTO.RIA's own accident flag. `none` = never in an accident (233,031 live, every sampled row flagged false) · `had_accident` = has accident history (84,673, every sampled row flagged true). [one of: none, had_accident]
- `has_video` (boolean, optional) — Only ads with a video (8,256 live in the cars category).
- `has_photo` (boolean, optional) — Only ads with at least one photo (316,322 of 317,695 live — almost all of them, so this filter rarely changes much.
- `vin_verified` (boolean, optional) — Only ads whose VIN AUTO.RIA has checked (275,895 live; every sampled row carried a VIN).
- `auction_possible` (boolean, optional) — Only sellers open to bidding/haggling (198,149 live; every sampled row carried the flag).
- `sort` (enum, optional, default "relevance") — Result order. `relevance` sends no sort key and uses AUTO.RIA's own ranking — measured stable (two identical calls shared 20/20 ids; three pages of 100 gave 300 rows, 300 unique). `newest` drifts slightly while you page, because ads keep arriving: four pages of 100 gave 400 rows and 399 unique. `price_asc` and `price_desc` share 0 of 20 rows, so they are genuinely opposite orders. [one of: relevance, newest, price_asc, price_desc]
- `page` (integer, optional, default 1) — 1-based result page. Deep paging works: page 500 at 20 rows a page still answered 20 fresh ids.
- `max_results` (integer, optional, default 20) — Rows to return, 1–40. Each row is a full listing payload, so this is also the number of upstream listing reads. For ids only — thousands of them, up to 100 a page — use `search_ids` instead.

**Returns:** {results[], total_available, returned, page, category, listing_type, sort} — `total_available` is AUTO.RIA's own exact count for the query, not a page estimate. Rows carry `price_usd/uah/eur`, `price_currency`, `price_display_usd` + `price_conflict`, `mileage_km` + `mileage_text` + `mileage_conflict`, `fuel`/`engine_capacity_l`, `vin`, `plate_number`, `photo_urls[]`, `is_sold`/`is_active`/`from_archive` and `seller{}`.

**Example request body:**
```json
{
  "category": "cars",
  "max_results": 5
}
```

### POST https://api.reefapi.com/autoria/v1/search_ids — 1 credit
The same search, but it returns only AUTO.RIA's own exact total and the advert ids — one upstream request and about 3 KB, whatever the page size. Use it to size a market, to page through tens of thousands of ads cheaply, or to feed `listings`. At least one of `make`, `model`, `region`, `city`, `year_from`, `year_to`, `price_from_usd`, `price_to_usd`, `fuel`, `gearbox`, `body_type_id`, `seller_type`, `mileage_from_km`, `mileage_to_km`, `engine_from_l`, `engine_to_l`, `accident_history`, `has_video`, `has_photo`, `vin_verified` or `auction_possible` is normally wanted — calling with none of them returns the whole category, newest/most-relevant first, which is a valid but very broad answer.

**Parameters:**
- `category` (enum, optional, default "cars") — Which vehicle catalogue to search. Each one is a separate surface with its own inventory; live totals measured 2026-10-01 are in the labels. [one of: cars, moto, water, special, trailers, trucks, buses, agricultural]
- `listing_type` (enum, optional, default "used") — Which AUTO.RIA surface to read. `used` = second-hand stock already in Ukraine (317,695 live) · `new` = new vehicles from dealers/importers (7,399) · `order` = offered to order or in transit (4,330) · `all` = the three together (325,095). New-car adverts are numbered in their OWN id range and are read through their own surface; `search` handles that per row, so a mixed `all` page still returns the right vehicle for every id in it. [one of: used, new, order, all]
- `make` (string, optional) — Manufacturer. Accepts the AUTO.RIA make name as `makes` returns it (e.g. `Audi`, `Volkswagen`) or its numeric id (e.g. `6`). A name costs one extra lookup; the id does not. An unknown name is rejected with the nearest matches named.
- `model` (string, optional) — Model, as `models` returns it (e.g. `Q7`) or its numeric id. Requires `make`. Resolving a model NAME costs one extra lookup.
- `year_from` (integer, optional) — Earliest model year, inclusive. Site parameter `s_yers[0]`.
- `year_to` (integer, optional) — Latest model year, inclusive. Site parameter `po_yers[0]`.
- `price_from_usd` (integer, optional) — Lowest asking price in US dollars. The site's price filter is denominated in USD — verified by rows: `price_from_usd=60000` returned cars priced $61,000–$285,000 and `price_to_usd=900` returned $320–$900.
- `price_to_usd` (integer, optional) — Highest asking price in US dollars (see `price_from_usd`).
- `mileage_from_km` (integer, optional) — Lowest odometer reading in KILOMETRES. AUTO.RIA's own filter is denominated in thousands of km, so this is divided by 1000 before it is sent and therefore rounds down to the nearest 1,000 km.
- `mileage_to_km` (integer, optional) — Highest odometer reading in kilometres (see `mileage_from_km` for the 1,000 km rounding).
- `engine_from_l` (number, optional) — Smallest engine displacement in litres. Site parameter `engineVolumeFrom`.
- `engine_to_l` (number, optional) — Largest engine displacement in litres. Site parameter `engineVolumeTo`.
- `fuel` (enum, optional) — Fuel / drivetrain. Live row counts for the cars category are in the labels. Fuel ids 7 and 9 exist in the site's numbering but return 0 rows, so they are not offered. [one of: petrol, diesel, gas, gas-petrol, hybrid, electric, methane, phev, mhev, reev]
- `gearbox` (enum, optional) — Transmission, from the site's own gearbox list. [one of: manual, automatic, tiptronic, robot, cvt, reducer]
- `body_type_id` (integer, optional) — Body style id. The valid ids for a category come from `reference` with `list=body_types` (for cars: 3 saloon, 4 hatchback, 5 SUV/crossover, 8 MPV …). An unknown id returns 0 rows rather than an error.
- `region` (string, optional) — Oblast / region. Accepts the name as `regions` returns it or its numeric id (e.g. `10` = Kyiv region). Resolving a name costs one extra lookup.
- `city` (string, optional) — City. Accepts the name as `regions` with a `region` returns it, or its numeric id (`10` = Kyiv). Resolving a name requires `region` and costs one extra lookup.
- `seller_type` (enum, optional) — Who is selling. Both values were confirmed against the rows they return, not just against the total. [one of: private, dealer]
- `accident_history` (enum, optional) — Filter on AUTO.RIA's own accident flag. `none` = never in an accident (233,031 live, every sampled row flagged false) · `had_accident` = has accident history (84,673, every sampled row flagged true). [one of: none, had_accident]
- `has_video` (boolean, optional) — Only ads with a video (8,256 live in the cars category).
- `has_photo` (boolean, optional) — Only ads with at least one photo (316,322 of 317,695 live — almost all of them, so this filter rarely changes much.
- `vin_verified` (boolean, optional) — Only ads whose VIN AUTO.RIA has checked (275,895 live; every sampled row carried a VIN).
- `auction_possible` (boolean, optional) — Only sellers open to bidding/haggling (198,149 live; every sampled row carried the flag).
- `sort` (enum, optional, default "relevance") — Result order. `relevance` sends no sort key and uses AUTO.RIA's own ranking — measured stable (two identical calls shared 20/20 ids; three pages of 100 gave 300 rows, 300 unique). `newest` drifts slightly while you page, because ads keep arriving: four pages of 100 gave 400 rows and 399 unique. `price_asc` and `price_desc` share 0 of 20 rows, so they are genuinely opposite orders. [one of: relevance, newest, price_asc, price_desc]
- `page` (integer, optional, default 1) — 1-based result page. Deep paging works: page 500 at 20 rows a page still answered 20 fresh ids.
- `max_results` (integer, optional, default 100) — Ids to return, 1–100. 100 is the site's own page ceiling: asking for 101, 150, 200 or 500 all returned exactly 100.

**Returns:** {listing_ids[], total_available, returned, page, category, listing_type, sort}.

**Example request body:**
```json
{
  "category": "cars",
  "make": "6",
  "max_results": 50
}
```

### POST https://api.reefapi.com/autoria/v1/listing — 1 credit
One AUTO.RIA advert in full, by id. Returns everything the advert page publishes: the three-currency price with the seller's own currency named, the odometer in kilometres, trim and modification, VIN and plate where published, every photo URL, the accident/credit/customs/abroad flags, and the seller. A SOLD or ARCHIVED advert is a successful answer carrying `is_sold`, `sold_at_utc`, `is_active` and `from_archive` — only an id AUTO.RIA has never issued returns NOT_FOUND.

**Parameters:**
- `listing_id` (string, required) — AUTO.RIA advert id, as `search` / `search_ids` return it (e.g. `38876558`). New-car ids are shorter (`2085460`) and resolve through the same call.
- `listing_type` (enum, optional, default "used") — Which id namespace the advert id belongs to. AUTO.RIA numbers NEW-car adverts separately from second-hand ones and the two ranges OVERLAP: id 2085460 is a Peugeot 2008 among the new cars and an archived Subaru Forester among the used ones, and both answer HTTP 200. Pass `new` for an id that came out of a `new` search; `used` (the default) covers ids from `used`, `order` and `all` searches. `search` routes every id automatically, so this only matters when you bring your own id. [one of: used, new]

**Returns:** One row in the same shape `search` returns.

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

### POST https://api.reefapi.com/autoria/v1/listings — 2 credits
Up to 25 adverts in one call, in the same shape as `listing`, and cheaper per advert than 25 single calls. Ids AUTO.RIA does not know come back in `not_found` instead of failing the call; if the upstream cuts the batch short, the rows it did return are still returned and the shortfall is reported in `meta`.

**Parameters:**
- `listing_ids` (string, required) — Up to 25 AUTO.RIA advert ids, comma-separated. Ids that do not exist are reported in `not_found` rather than failing the call.
- `listing_type` (enum, optional, default "used") — Which id namespace the advert id belongs to. AUTO.RIA numbers NEW-car adverts separately from second-hand ones and the two ranges OVERLAP: id 2085460 is a Peugeot 2008 among the new cars and an archived Subaru Forester among the used ones, and both answer HTTP 200. Pass `new` for an id that came out of a `new` search; `used` (the default) covers ids from `used`, `order` and `all` searches. `search` routes every id automatically, so this only matters when you bring your own id. [one of: used, new]

**Returns:** {results[], not_found[], requested, returned}.

**Example request body:**
```json
{
  "listing_ids": "38876558,40419902,40299426"
}
```

### POST https://api.reefapi.com/autoria/v1/makes — 1 credit
Every manufacturer AUTO.RIA lists for a vehicle category, with the id the `make` filter takes. 500+ entries for cars, including Chinese EV brands most catalogues do not carry.

**Parameters:**
- `category` (enum, optional, default "cars") — Which vehicle catalogue to search. Each one is a separate surface with its own inventory; live totals measured 2026-10-01 are in the labels. [one of: cars, moto, water, special, trailers, trucks, buses, agricultural]

**Returns:** {results[{id, name}], returned, category}.

**Example request body:**
```json
{
  "category": "cars"
}
```

### POST https://api.reefapi.com/autoria/v1/models — 1 credit
Every model AUTO.RIA lists under one manufacturer, with the id the `model` filter takes.

**Parameters:**
- `make` (string, optional) — Manufacturer. Accepts the AUTO.RIA make name as `makes` returns it (e.g. `Audi`, `Volkswagen`) or its numeric id (e.g. `6`). A name costs one extra lookup; the id does not. An unknown name is rejected with the nearest matches named.
- `category` (enum, optional, default "cars") — Which vehicle catalogue to search. Each one is a separate surface with its own inventory; live totals measured 2026-10-01 are in the labels. [one of: cars, moto, water, special, trailers, trucks, buses, agricultural]

**Returns:** {results[{id, name}], returned, make, make_id, category}.

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

### POST https://api.reefapi.com/autoria/v1/regions — 1 credit
Ukraine's oblasts with the ids the `region` filter takes. Pass `region` to get that oblast's cities with the ids the `city` filter takes instead.

**Parameters:**
- `region` (string, optional) — Oblast / region. Accepts the name as `regions` returns it or its numeric id (e.g. `10` = Kyiv region). Resolving a name costs one extra lookup.

**Returns:** {results[{id, name}], returned, level} — `level` is `regions` or `cities`.

**Example request body:**
```json
{
  "region": "10"
}
```

### POST https://api.reefapi.com/autoria/v1/reference — 1 credit
AUTO.RIA's own closed lists, so nobody has to guess an id: vehicle categories, body styles, gearbox types and drive types. Drive type is returned on every listing but is NOT filterable — measured, and said here rather than discovered by a customer.

**Parameters:**
- `list` (enum, required) — Which reference list to return. [one of: categories, body_types, gearboxes, drive_types]
- `category` (enum, optional, default "cars") — Which vehicle catalogue to search. Each one is a separate surface with its own inventory; live totals measured 2026-10-01 are in the labels. [one of: cars, moto, water, special, trailers, trucks, buses, agricultural]

**Returns:** {results[{id, name, parent_id?}], returned, list, category}.

**Example request body:**
```json
{
  "list": "body_types"
}
```

## 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=autoria
- Human docs page: https://reefapi.com/docs/autoria
- Overview page: https://reefapi.com/autoria-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
