# Standvirtual API — standvirtual.com, Portugal's largest car marketplace (OLX Group): search used and new cars by make, model, series, district, keyword and the site's own price, year, mileage, power, engine size, fuel, gearbox, body, drive, origin, VAT and seller-type filters, and read the full offer. Price in EUR with the site's own market price indicator, private vs dealer seller, promoted flag. No account, no browser.

> Search standvirtual.com car ads the way its visitors do: make, model or series, Portuguese district, free-text keyword, and the site's own filters — price, first registration year, mileage, engine power and capacity, fuel, gearbox, body type, driven wheels, national or imported, VAT deductible, new or used, private seller or dealer. 32 ads per page with the price in EUR, standvirtual's below/in/above-market price indicator, year, mileage with the site's own printed figure beside it, fuel, gearbox, power, engine size, town and district, the seller type the site publishes, the dealer's name and page, and whether the ad is a paid promoted placement. Every filter is checked against what the site says it applied; a make, model or district the site does not recognise is refused instead of quietly widening to every car. Total result count and page count are returned.
> ReefAPI engine `standvirtual` · 3 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/standvirtual/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/standvirtual/v1/search — 3 credits
Search standvirtual.com car ads the way its visitors do: make, model or series, Portuguese district, free-text keyword, and the site's own filters — price, first registration year, mileage, engine power and capacity, fuel, gearbox, body type, driven wheels, national or imported, VAT deductible, new or used, private seller or dealer. 32 ads per page with the price in EUR, standvirtual's below/in/above-market price indicator, year, mileage with the site's own printed figure beside it, fuel, gearbox, power, engine size, town and district, the seller type the site publishes, the dealer's name and page, and whether the ad is a paid promoted placement. Every filter is checked against what the site says it applied; a make, model or district the site does not recognise is refused instead of quietly widening to every car. Total result count and page count are returned.

**Parameters:**
- `make` (string, optional) — A make exactly as standvirtual spells it in its URLs: bmw, mercedes-benz, peugeot, renault, vw (Volkswagen is 'vw'), audi, citroen, seat. The `makes` action lists all 151 with live ad counts. A make the site does not apply is refused — the site itself would silently answer with every car in Portugal.
- `model` (string, optional) — A model slug as the search rows publish it in `model_slug` (golf, clio, 320, ix1, c-220) or a series slug from `makes` (serie-3, classe-c). Requires make.
- `series` (string, optional) — The series level that standvirtual uses for BMW, Mercedes-Benz, Lexus and Porsche (serie-3, serie-x, classe-c, 911), as rows publish it in `series_slug`. Alone it returns the whole series; with model it narrows to that model inside the series. Requires make.
- `location` (string, optional) — A Portuguese district slug as standvirtual spells it: lisboa, porto, braga, aveiro, setubal, santarem, leiria, faro, coimbra, viseu, vianadocastelo, vilareal, guarda, evora, portalegre, beja, braganca, castelobranco, madeira-madeira, acores. A location the site does not apply is refused.
- `query` (string, optional) — Free text, applied by standvirtual's own keyword search (search[q]) and echoed back. Measured: 'golf' 681 ads, 'bmw' 4,732.
- `page` (integer, optional, default 1) — Result page from 1. The site serves 32 ads per page; a page past the last returns 0 rows with page_beyond_last=true and the real total.
- `sort` (enum, optional) — Result order, using standvirtual's own published sort ids. [one of: relevance, featured, newest, price_asc, price_desc, mileage_asc, mileage_desc, power_asc, power_desc]
- `seller_type` (enum, optional) — Private sellers (Particular) or dealers (Profissional), standvirtual's own filter. Rows carry the seller type the site publishes. [one of: private, business]
- `condition` (enum, optional) — New or used, as the site's own filter defines it. [one of: used, new]
- `fuel_type` (enum, optional) — Fuel, standvirtual's own codes ('gaz' is petrol). [one of: diesel, gaz, electric, plugin-hybrid, hibride-gaz, hibride-diesel, gpl, gnc, hidrogen]
- `gearbox` (enum, optional) — Gearbox type. [one of: manual, automatic]
- `body_type` (enum, optional) — Body type (Segmento). [one of: suv, combi, sedan, compact, city-car, mini, coupe, cabrio, minivan]
- `drive` (enum, optional) — Driven wheels (Tracção). [one of: front-wheel-drive, rear-wheel-drive, integral]
- `origin` (enum, optional) — National or imported vehicle, the site's own filter. [one of: national, imported]
- `vat_deductible` (boolean, optional) — true returns only ads where VAT (IVA) is deductible — the site's own 'IVA dedutível' filter, relevant to company buyers.
- `price_from` (integer, optional) — Lowest price in EUR, inclusive.
- `price_to` (integer, optional) — Highest price in EUR, inclusive.
- `year_from` (integer, optional) — Lowest year in years, inclusive.
- `year_to` (integer, optional) — Highest year in years, inclusive.
- `mileage_from` (integer, optional) — Lowest mileage in kilometres, inclusive.
- `mileage_to` (integer, optional) — Highest mileage in kilometres, inclusive.
- `engine_power_from` (integer, optional) — Lowest engine power in cv (metric hp), inclusive.
- `engine_power_to` (integer, optional) — Highest engine power in cv (metric hp), inclusive.
- `engine_capacity_from` (integer, optional) — Lowest engine capacity in cm3, inclusive.
- `engine_capacity_to` (integer, optional) — Highest engine capacity in cm3, inclusive.

**Returns:** results[]{listing_id (pass to `listing`), ad_id, title, subtitle, url, created_at, price (EUR; null when the site publishes 0), price_raw, currency, price_is_placeholder, price_mismatch, price_is_gross, price_gross, price_net, price_badges, price_evaluation (the site's BELOW/IN/ABOVE/NONE market indicator), price_drop_previous, make, make_slug, model, model_slug, series, series_slug, version, year (first registration), mileage_km, mileage_display, fuel_type{value,label}, gearbox{value,label}, engine_power_cv, engine_capacity_cm3, field_mismatch, location{city, region, country}, seller{kind private|dealer|crosslisted, uuid, dealer_id, dealer_name, dealer_url, is_credit_intermediary}, is_promoted, promotions, badges, brand_program, image}, count, total_results, total_pages, page, page_size, has_more, page_beyond_last, source_page_rows (edges the site served; varies), rows_dropped (rows without id or title), sort, filters_applied, search_url

**Example request body:**
```json
{
  "make": "vw",
  "model": "golf"
}
```

### POST https://api.reefapi.com/standvirtual/v1/listing — 3 credits
The full standvirtual offer from a search row's listing_id or the offer URL: title, price in EUR checked against the price the page prints, price labels (fixed, negotiable, trade-in accepted), make, model, series, version, first registration year and month, mileage, fuel, gearbox, power, engine size, body, colour, doors, seats, drive, new/used, origin, VAT-deductible flag, warranty, the complete printed specification list, equipment by group, all photos, the seller's description, the seller (private or dealer, name, dealer page, website, active ads, badges) and its published location with postal code and map point. Phone numbers are published by the site only in encrypted form and are not returned. A withdrawn or unknown offer answers NOT_FOUND.

**Parameters:**
- `listing_id` (string, required) — The `listing_id` of a search row (ID8Q0I6X — the token at the end of the offer URL) or the full standvirtual offer URL. The numeric ad_id does not address an offer page and is refused.

**Returns:** listing_id, ad_id, title, url, status, created_at, updated_at, price, price_raw, price_printed, currency, price_is_placeholder, price_mismatch, price_labels, price_negotiable, price_fixed, price_drop_previous, make, make_slug, model, model_slug, series, series_slug, version, year, first_registration_month, mileage_km, mileage_display, fuel_type, gearbox, engine_power_cv, engine_capacity_cm3, field_mismatch, body_type, colour, doors, seats, drive, condition, origin, vat_deductible, warranty, location{city, region, subregion, postal_code, address, latitude, longitude, country}, seller{kind, type_raw (PRIVATE|PROFESSIONAL|STAND), id, stand_id, uuid, name, dealer_url, website, active_ads, badges, phones_encrypted}, is_promoted, promotions, badges, description, specs[]{key,label,value,group}, equipment[]{key,label,items}, images, image_count, verified_car, breadcrumb

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

### POST https://api.reefapi.com/standvirtual/v1/makes — 3 credits
standvirtual's own make and model register with live ad counts, read from the site's filter catalogue: no parameter -> every make (151) with its slug and count; make -> that make's models (or series for BMW, Mercedes-Benz, Lexus, Porsche) with has_submodels; make + series -> the models inside the series. Use it to get a slug right before searching.

**Parameters:**
- `make` (string, optional) — Omit for the make list; give a make for its model list.
- `series` (string, optional) — With make, a series (has_submodels=true in the model list) to read its sub-models (serie-3 -> 316, 318, 320 …).

**Returns:** results[]{slug, label, count, has_submodels (models list only)}, kind (makes|models|submodels), count, make, series, source_url

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

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