# Standvirtual Scraper — Cars & Motorbikes PT (`reventadata/standvirtual-scraper`) Actor

Searches Standvirtual.com (Portugal) cars or motorbikes by keyword or make, with price, year, mileage and fuel filters. Returns price, make, model, year, km, fuel, gearbox, power, location and dealer name. No proxy required.

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

## Pricing

from $1.00 / 1,000 results

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

> **Unofficial.** This Actor is not affiliated with, authorised by, endorsed by, or in any
> way officially connected to Standvirtual. "Standvirtual" is a trademark of its respective
> owner and is used here only to describe what this tool reads. It reads the same public pages
> a browser does.

Standvirtual Scraper searches [Standvirtual.com](https://www.standvirtual.com), Portugal's car
marketplace, for **cars or motorbikes** by keyword or make, and returns each listing with price,
make, model, version, year, mileage, fuel, gearbox, engine power and capacity, town and
district, seller type and, for dealers, the dealer's name and Standvirtual page.

### What data can you extract from Standvirtual?

Every result Standvirtual itself returns for your search, with the vehicle specs as structured
fields rather than text: `year`, `mileageKm`, `enginePowerCv`, `engineCapacityCm3` are numbers.
The Actor reads the data Standvirtual embeds in its own search pages, so it needs no browser.

### Why scrape Standvirtual?

- **Cars and motorbikes, any make.** Search a keyword like "golf gti", filter by make, or leave
  the search empty and browse the whole category with filters.
- **No proxy needed.** 25 of 25 sequential pages came back with no proxy, so runs carry no
  proxy cost.
- **Filters run on Standvirtual's side.** Price, first-registration year, mileage and fuel are
  sent to Standvirtual, so a narrow search fetches only what matches. Measured: a 20,000 EUR
  price cap took "golf gti" from 145 to 46 listings; mileage up to 20,000 km returned only cars
  at or under 20,000 km.
- **Fuzzy matches dropped.** Standvirtual's search for "golf gti" also returned a VW Bora.
  `requireKeywordMatch` (on by default) keeps only titles containing every word you searched.
- **Dealer or private.** `sellerType` says which; dealer rows carry the public dealer name.

### How to scrape Standvirtual

1. Put search terms in `searchQueries`, or leave it empty to browse the category.
2. Optionally set `make`, a price range, years, maximum mileage or fuel.
3. Run it. Results land in the dataset.

#### Input

| Field | Type | Meaning |
|---|---|---|
| `searchQueries` | array | Optional. One search per term. Empty browses the whole category. |
| `category` | string | `carros` (cars) or `motos` (motorbikes). |
| `make` | string | Optional make slug as in Standvirtual URLs: `bmw`, `vw`, `mercedes-benz`. |
| `minPrice` / `maxPrice` | integer | Optional, EUR. |
| `minYear` / `maxYear` | integer | Optional first-registration year range. |
| `maxMileage` | integer | Optional, km. |
| `fuelType` | string | `diesel`, `electric`, `gaz` (petrol), `gpl`, `plugin-hybrid` and Standvirtual's other values. |
| `sortBy` | string | `newest` (default), `priceAsc`, `priceDesc`, `relevance`. With `relevance` Standvirtual reshuffles between pages, so a long run returns fewer distinct listings per page. |
| `requireKeywordMatch` | boolean | Drops titles missing any search word. Default on. |
| `maxItems` | integer | Cap on rows. Default 1000. |
| `maxPages` | integer | Pages per search, 32 listings each. Default 50. |
| `proxyConfiguration` | object | Off by default. |

```json
{
    "searchQueries": ["golf gti"],
    "maxPrice": 25000,
    "minYear": 2018,
    "maxItems": 200
}
```

#### Output

One row, from a real search on 2026-10-20:

```json
{
    "id": "8097670190",
    "url": "https://www.standvirtual.com/carros/anuncio/vw-golf-ver-2-0-tsi-opf-dsg-gti-ID8Q0ZWI.html",
    "title": "VW Golf 2.0 TSI OPF DSG GTI",
    "description": null,
    "price": 31999.0,
    "currency": "EUR",
    "priceEvaluation": "BELOW",
    "make": "VW",
    "model": "Golf",
    "version": "2.0 TSI OPF DSG GTI",
    "year": 2023,
    "mileageKm": 26157,
    "fuelType": "Gasolina",
    "gearbox": "Automática",
    "enginePowerCv": 245,
    "engineCapacityCm3": 1984,
    "city": "Nogueira da Regedoura",
    "region": "Aveiro",
    "postedAt": "2026-10-09T14:32:16Z",
    "imageUrl": "https://ireland.apollo.olxcdn.com/v1/files/siem67vm28sp-STDVTLPT/image;s=640x480",
    "sellerType": "professional",
    "dealerName": "FMaia Car",
    "dealerUrl": "https://FMaiaCar.standvirtual.com",
    "badges": ["WARRANTY"],
    "categoryId": "29",
    "matchedKeyword": "golf gti"
}
```

### Notes and limits

- **No phone numbers or e-mails.** Only the public dealer name and dealer page are returned;
  private sellers have no name in the data at all.
- **`description`** is the short text Standvirtual shows in search results, often empty; the
  full ad text is on the listing page, which this Actor does not open.
- **Make with a search term** is applied to the results after fetching, so a "serie 3" search
  with make `bmw` drops other makes from Standvirtual's fuzzy results.
- **There is no model filter.** Standvirtual ignores a model in the URL; put the model in the
  search term instead.
- **A run that returns zero rows fails** instead of succeeding empty, so a misconfigured search
  cannot look like an empty market.

### How much does it cost to scrape Standvirtual?

Pay-per-event: you pay per result written to the dataset, with no subscription. The current
price is on the Actor's Pricing tab.

### FAQ

**Is a proxy required?** No. 25 of 25 sequential pages came back without one.

**Does it cover motorbikes?** Yes, set `category` to `motos`.

### More scrapers

| Actor | What it scrapes |
|---|---|
| [OLX Romania Scraper](https://apify.com/reventadata/olx-ro-scraper) | OLX Romania (olx.ro) — any category, no proxy required |
| [Webmotors Scraper](https://apify.com/reventadata/webmotors-scraper) | Webmotors, Brazil — cars |
| [eBay Spain Scraper](https://apify.com/reventadata/ebay-scraper) | eBay Spain (ebay.es) — active listings with seller type |

# Actor input Schema

## `searchQueries` (type: `array`):

Optional. One search per term (for example 'golf gti'). Leave empty to browse the whole category with the filters below.

## `category` (type: `string`):

Cars (carros) or motorbikes (motos).

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

Optional. The make as Standvirtual writes it in its URLs, lower case with hyphens, for example bmw, vw, mercedes-benz. With search terms it is applied to the results; without, it narrows the search itself.

## `minPrice` (type: `integer`):

Optional. Left out of the request when empty, never sent as 0.

## `maxPrice` (type: `integer`):

Optional. Left out of the request when empty.

## `minYear` (type: `integer`):

Optional, for example 2018.

## `maxYear` (type: `integer`):

Optional.

## `maxMileage` (type: `integer`):

Optional.

## `fuelType` (type: `string`):

Fuel type, using Standvirtual's own values.

## `sortBy` (type: `string`):

Order only. Default newest: with Recommended order Standvirtual reshuffles between pages (17-32 new listings per 32-listing page measured), while newest and price order page cleanly.

## `requireKeywordMatch` (type: `boolean`):

Drop listings whose title is missing any word of the search term. Standvirtual's search is fuzzy: 'golf gti' also returned a VW Bora.

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

Cap on rows pushed across all search terms.

## `maxPages` (type: `integer`):

32 listings per page. The walk also stops at the last page of results.

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

Optional. Standvirtual needed no proxy: 25 of 25 sequential pages came back without one. Turn on only if you see request failures.

## Actor input object example

```json
{
  "searchQueries": [
    "golf"
  ],
  "category": "carros",
  "fuelType": "any",
  "sortBy": "newest",
  "requireKeywordMatch": true,
  "maxItems": 10,
  "maxPages": 1,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `matches` (type: `string`):

Matching listings: price, year, mileage, fuel, location, seller type and a link to the ad.

# 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 = {
    "searchQueries": [
        "golf"
    ],
    "maxItems": 10,
    "maxPages": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("reventadata/standvirtual-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 = {
    "searchQueries": ["golf"],
    "maxItems": 10,
    "maxPages": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("reventadata/standvirtual-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 '{
  "searchQueries": [
    "golf"
  ],
  "maxItems": 10,
  "maxPages": 1
}' |
apify call reventadata/standvirtual-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,reventadata/standvirtual-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/D6mpC1A2ZWaqXPBbS/builds/wdvnralXGISrujBtz/openapi.json
