# Polovni Automobili API scraper — Serbia's largest car-classifieds site (polovniautomobili.com). Search the live Serbian used- and new-car market with the site's own filters (brand, model, price, year, mileage, fuel, gearbox, body, engine size, power, colour, equipment, region) and pull the FULL ad: price and currency as printed, odometer, registration validity, equipment and safety lists, every photo, the free-text description and the seller (dealer name, address, coordinates, rating, phone numbers, active-ad count). No account, no browser.

> Search the live Serbian car market on polovniautomobili.com. Every row is one ad: brand, model, year, price with the currency the ad itself prints, odometer, fuel, gearbox, body, engine size, power in kW and hp, doors, seats, emission class, town, photo and the seller (trade name, dealer page, dealer id). total_results is the site's own count and pages / page_size come from the response, not from a constant. 🔴 Read reachable_pages, not pages: the source advertises more pages than it will serve — page 751 and beyond answer HTTP 200 with page 1 all over again (measured), so page is capped at 750 and 200 ads per page is how you reach a large result set. Every filter offered here was measured to move that total in the same run; filters the source accepts and ignores are deliberately absent. Call with no parameters to page the whole market. The paid block the site prints above the results is returned separately as top_ads so it is never mistaken for an organic hit.
> ReefAPI engine `polovniautomobili` · 5 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/polovniautomobili/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/polovniautomobili/v1/search — 2 credits
Search the live Serbian car market on polovniautomobili.com. Every row is one ad: brand, model, year, price with the currency the ad itself prints, odometer, fuel, gearbox, body, engine size, power in kW and hp, doors, seats, emission class, town, photo and the seller (trade name, dealer page, dealer id). total_results is the site's own count and pages / page_size come from the response, not from a constant. 🔴 Read reachable_pages, not pages: the source advertises more pages than it will serve — page 751 and beyond answer HTTP 200 with page 1 all over again (measured), so page is capped at 750 and 200 ads per page is how you reach a large result set. Every filter offered here was measured to move that total in the same run; filters the source accepts and ignores are deliberately absent. Call with no parameters to page the whole market. The paid block the site prints above the results is returned separately as top_ads so it is never mistaken for an organic hit.

**Parameters:**
- `brand` (enum, optional) — Brand, spelled exactly as polovniautomobili spells it — the site's own label IS the filter value ('Mercedes Benz', 'Škoda', 'Lynk & Co'). Case is forgiven. The brands action returns the live list. [one of: Alfa Romeo, Alpina, Alpine, Aro, Aston Martin, Audi, Avantier, BAIC, BAW, Bentley, BMW, BYD, Cadillac, Changan, Chery, Chevrolet, Chrysler, Citroen, Cupra, Dacia, Daewoo, Daihatsu, Dodge, Dongfeng, DR, DS, Ferrari, Fiat, Ford, Foton, GAZ, Geely, Genesis, GMC, Honda, Hummer, Hyundai, Ineos, Infiniti, Isuzu, JAC Motors, Jaguar, Jeep, Jetour, JMEV, KGM, Kia, Lada, Lamborghini, Lancia, Land Rover, Leapmotor, Lexus, Lincoln, Lynk & Co, Mahindra, Maserati, Maxus, Maybach, Mazda, McLaren, Mercedes Benz, MG, MINI, Mitsubishi, Moskvitch, Nissan, NSU, Oldsmobile, Opel, Peugeot, Polski Fiat, Pontiac, Porsche, Ram, Renault, Rolls Royce, Rover, Saab, Seat, Seres, Smart, SsangYong, Subaru, Suzuki, SWM, Škoda, Tata, Tesla, Toyota, Trabant, UAZ, Volkswagen, Volvo, Wartburg, Xiaomi, Yudo Auto, Zastava, other]
- `model` (array, optional) — One or more models of that brand, as the site spells them (A4, Golf, Astra). Requires brand — the site scopes models to a brand, and the models action lists a brand's models. Several models are OR-ed.
- `price_min` (integer, optional) — Lowest asking price, in the ad's own currency (Serbian car ads are priced in EUR; the row tells you with price_currency).
- `price_max` (integer, optional) — Highest asking price, in the ad's own currency.
- `year_min` (integer, optional) — Earliest build year.
- `year_max` (integer, optional) — Latest build year.
- `mileage_min` (integer, optional) — Lowest odometer reading, km.
- `mileage_max` (integer, optional) — Highest odometer reading, km.
- `power_kw_min` (integer, optional) — Lowest engine power in kW. The site filters power in kW only — its horsepower box is a display, and a horsepower filter was measured to be ignored upstream, so it is not offered here. Rows carry both power_kw and power_hp.
- `power_kw_max` (integer, optional) — Highest engine power in kW.
- `engine_cc_min` (integer, optional) — Lowest engine displacement, cc.
- `engine_cc_max` (integer, optional) — Highest engine displacement, cc.
- `fuel` (array, optional) — Fuel type(s). Several values are OR-ed. [one of: gasoline, diesel, gasolineLpg, gasolineCng, hybridGasoline, hybridDiesel, plugInHybrid, hybrid, electric]
- `gearbox` (array, optional) — Gearbox. The site distinguishes the number of manual gears (manual4Gears / manual5Gears / manual6Gears) from automatic. [one of: manual4Gears, manual5Gears, manual6Gears, automatic]
- `body_type` (array, optional) — Body style. [one of: sedan, hatchback, caravan, coupe, cabrioletOrRoadster, minivan, suv, pickup]
- `colour` (array, optional) — Exterior colour, from the site's own 21-colour vocabulary. [one of: white, pearlWhite, beige, bordeaux, brown, black, red, chameleon, cream, purple, orange, blue, grey, brown2, silver, turquoise, navyBlue, green, golden, yellow, pink]
- `drive` (array, optional) — Driven wheels (front, rear, 4x4, 4x4Reducer). [one of: front, rear, 4x4, 4x4Reducer]
- `emission_class` (enum, optional) — Euro emission class. One value — this source takes a single emission class, not a set. [one of: euro1, euro2, euro3, euro4, euro5, euro6]
- `doors` (enum, optional) — Door count as the site groups it: '3' means 2/3 doors, '5' means 4/5 doors. Those two are the ONLY values it accepts — any other number returns an empty result upstream, so it is rejected here instead. [one of: 3, 5]
- `seats` (enum, optional) — Exact number of seats (2–9). One value. [one of: 2, 3, 4, 5, 6, 7, 8, 9]
- `damaged` (array, optional) — Damage state: undamaged, damaged but driveable, damaged and not driveable. [one of: notDamaged, damagedInDrivingCondition, damagedNotInDrivingCondition]
- `plates` (array, optional) — Registration status of the car on sale: domestic Serbian plates, to be registered in the buyer's name, or foreign plates. [one of: domesticPlates, onBuyersName, foreignPlates]
- `air_conditioning` (array, optional) — Air-conditioning: none, manual or automatic. [one of: none, manual, automatic]
- `interior_material` (array, optional) — Upholstery material. [one of: cloth, leather, combinedLeather, velor, other]
- `interior_colour` (array, optional) — Interior colour. [one of: black, beige, brown, grey, other]
- `wheel_side` (enum, optional) — Steering-wheel side. [one of: left, right]
- `flywheel` (enum, optional) — Dual-mass (floating) flywheel or not — a Serbian-market buying criterion the site filters on. [one of: floatingFlywheel, noFloatingFlywheel]
- `attest` (enum, optional) — Whether the vehicle carries a Serbian conversion attest. [one of: attested, notAttested]
- `trade_in` (array, optional) — Seller's part-exchange stance (no exchange, for a cheaper car, same price, for a more expensive car, no preference). [one of: noExchange, tradeForCheaper, samePrice, tradeForMoreExpensive, noPreference]
- `country` (enum, optional) — Country the ad is placed from. RS is Serbia; the site also carries ads from Montenegro, Bosnia and further afield. [one of: RS, ME, BA, BE, FR, NL, IT, DE, RU, CH, GB, AT, BG, CZ, DK, HR, IE, LT, LU, HU, MK, PT, RO, SK, SI, ES, SE, PL, NO, JP, CN, TR, KR, US, XX]
- `country_of_origin` (enum, optional) — Country the car was imported from. [one of: ME, BA, BE, FR, NL, IT, DE, RU, CH, GB, AT, BG, CZ, DK, HR, IE, LT, LU, HU, MK, PT, RO, SK, SI, ES, SE, PL, NO, JP, CN, TR, KR, US]
- `only_with_price` (boolean, optional) — Drop ads that are published without a price.
- `registered_to_seller` (boolean, optional) — Only ads where the vehicle is registered to the seller — the site's own 'Vlasništvo' switch.
- `listing_age` (enum, optional, default "all") — Used cars, brand-new cars, or both. Measured 2026-10-01: all = 75 449 ads, used = 73 773, new = 1 678. [one of: all, used, new]
- `page_size` (enum, optional, default 25) — Ads per page. 25, 50, 100 and 200 were measured to work; anything else is silently served as 25 by the source, so it is rejected here. Use 200 when you want a large result set: the page NUMBER is capped at 750 whatever the page size, so 25 per page can only reach 18 750 ads of a 75 000-ad search while 200 per page reaches all of them. [one of: 25, 50, 100, 200]
- `page` (integer, optional, default 1) — 1-based page, hard-capped at 750. Beyond 750 the source silently serves page 1 again with HTTP 200 (measured), so a request for page 751+ is rejected rather than answered with duplicate rows. The response says pages (the source's own count), reachable_pages (what you can actually page to) and reachable_results.

**Returns:** {total_results, page, page_size, pages, has_more, count, duplicates_dropped, filters_applied, search_url, cars[], top_ads[]} — each car has ad_id, url, title, brand, model, year, price, price_currency, price_on_request, price_before_discount, mileage_km, fuel, gearbox, body_type, doors, seats, engine_cc, power_kw, power_hp, emission_class, city, is_new, tags[], image_url, images_count, promoted_search, updated_at and seller{}.

**Example request body:**
```json
{
  "brand": "volkswagen",
  "max_results": 20
}
```

### POST https://api.reefapi.com/polovniautomobili/v1/listing — 2 credits
The FULL ad behind an ad_id from search: everything the detail page publishes. Adds what the search row cannot carry — the free-text description, the complete equipment and safety lists (measured 1-97 and 0-18 items), every photo at full size, exterior and interior colour and material, drive, registration validity and the site's own registration-cost estimate, part-exchange stance, financing terms, and the seller block with street address, town, district, postal code, coordinates, rating, active-ad count and phone numbers. A dead or removed ad answers NOT_FOUND, never an empty success.

**Parameters:**
- `ad_id` (string, required) — The numeric ad id, exactly as a search row returns it in ad_id.
- `slug` (string, optional) — Optional url slug. polovniautomobili ignores the slug text (two different slugs for the same id return the same ad), so leaving it out is fine — the engine supplies a placeholder. Pass it only if you want the canonical url echoed back verbatim.

**Returns:** {car:{ad_id, url, title, brand, model, variant, year, price, price_currency, price_on_request, price_fixed, mileage_km, fuel, gearbox, body_type, doors, seats, engine_cc, power_kw, power_hp, drive, emission_class, colour, interior_colour, interior_material, air_conditioning, wheel_side, damaged, plates, country, imported, registration_valid_until, registration_cost_min/max, owner_legal_status, registered_to_seller, selling_method, trade_in, reserved, status, description, condition[], equipment[], safety[], images[], published_at, renewed_at, financing{}, seller{}, breadcrumbs[]}}

**Example request body:**
```json
{
  "ad_id": "28407810"
}
```

### POST https://api.reefapi.com/polovniautomobili/v1/brands — 2 credits
Every car brand polovniautomobili lists, with the exact spelling the search filter wants and the site's url slug. Measured 99 entries on 2026-10-01 (including the catch-all 'other'). Read this before building a brand filter: the filter value is the LABEL ('Mercedes Benz', 'Škoda'), not the slug.

**Parameters:** none

**Returns:** {count, total_ads, brands:[{brand, label, slug}]}

### POST https://api.reefapi.com/polovniautomobili/v1/models — 3 credits
The models of one brand that currently have live ads, with the number of ads seen for each and the spelling the search `model` filter wants. polovniautomobili publishes no model vocabulary anywhere on this surface (probed on the search payload, the brand page and the brand/model page), so this reads the brand's own result pages instead and tells you exactly how big the sample was: brand_ads is the brand's total, ads_sampled is what was read, sample_coverage_pct is the share. A model with no live ad will not be listed.

**Parameters:**
- `brand` (enum, required) — Brand label as polovniautomobili spells it. Case is forgiven. [one of: Alfa Romeo, Alpina, Alpine, Aro, Aston Martin, Audi, Avantier, BAIC, BAW, Bentley, BMW, BYD, Cadillac, Changan, Chery, Chevrolet, Chrysler, Citroen, Cupra, Dacia, Daewoo, Daihatsu, Dodge, Dongfeng, DR, DS, Ferrari, Fiat, Ford, Foton, GAZ, Geely, Genesis, GMC, Honda, Hummer, Hyundai, Ineos, Infiniti, Isuzu, JAC Motors, Jaguar, Jeep, Jetour, JMEV, KGM, Kia, Lada, Lamborghini, Lancia, Land Rover, Leapmotor, Lexus, Lincoln, Lynk & Co, Mahindra, Maserati, Maxus, Maybach, Mazda, McLaren, Mercedes Benz, MG, MINI, Mitsubishi, Moskvitch, Nissan, NSU, Oldsmobile, Opel, Peugeot, Polski Fiat, Pontiac, Porsche, Ram, Renault, Rolls Royce, Rover, Saab, Seat, Seres, Smart, SsangYong, Subaru, Suzuki, SWM, Škoda, Tata, Tesla, Toyota, Trabant, UAZ, Volkswagen, Volvo, Wartburg, Xiaomi, Yudo Auto, Zastava, other]
- `sample_pages` (integer, optional, default 3) — How many 200-ad pages of this brand's stock to read. 3 pages cover 600 ads, which is the whole stock for most brands; raise it for Volkswagen or Audi, and read sample_coverage_pct to see whether you got all of it.

**Returns:** {brand, brand_ads, ads_sampled, sample_pages, sample_coverage_pct, count, models:[{model, ads_seen}]}

**Example request body:**
```json
{
  "brand": "volkswagen"
}
```

### POST https://api.reefapi.com/polovniautomobili/v1/filter_options — 2 credits
The complete filter vocabulary the site itself ships, group by group, with each value's Serbian label — fuel, gearbox, body, colour, interior, drive, emission class, damage, plates, condition/history claims, the 97-item equipment list, the 18-item safety list, regions and countries. Each group says which search parameter it feeds, and groups the site publishes but does not actually filter on are marked filterable: false. Use this instead of hard-coding enum values: when the site adds a colour or a driver-assist item, it shows up here on the next call.

**Parameters:** none

**Returns:** {count, sorts[], listing_age[], groups:[{param, source_field, filterable, count, values:[{value,label}]}]}

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