# Standvirtual Listings Scraper (`piotrv1001/standvirtual-listings-scraper`) Actor

Scrape Standvirtual.com car listings (carros usados) by filters or search URL: price, full specs, equipment, seller and district for cars, motorcycles, vans and trucks. Optional seller phone numbers, VIN, description and photos. No page cap, no duplicates.

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

## Pricing

from $1.00 / 1,000 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

### 🚗 Standvirtual Listings Scraper

**Standvirtual Listings Scraper** extracts vehicle listings from **[Standvirtual.com](https://www.standvirtual.com/)**, Portugal's largest car marketplace (carros usados, carros novos, stands de automóveis), with no login and no API key. Search with simple filters (make, model, price, year, mileage, fuel, body type, district) or paste any Standvirtual search URL. You get clean JSON with **prices in EUR, full specs, equipment, seller and location**. You can also add the **seller phone numbers, VIN, full description and all photos**.

It covers cars (carros), motorcycles (motos), vans (comerciais), trucks (pesados), motorhomes (autocaravanas) and boats (barcos). Run it on the **[Apify platform](https://apify.com/)** to get scheduling, an API, webhooks and exports to Google Sheets, Excel or CSV.

### ✨ Features

- 🏷️ **Full specs in every listing.** Each row has the price in EUR, make, model, version, first registration year, mileage, fuel, gearbox, engine size and power, body type and colour. It also has **every parameter and equipment flag** the seller filled in (often 50 to 150 per car), such as number of owners, service book or import status.
- 📞 **Phone numbers and VIN.** Turn on **Include details** to add the seller's phone numbers (including every branch of multi-stand dealers), the VIN, the full description, all photos, a grouped equipment list and the stand's address with GPS and opening hours.
- 🔍 **Filters or URLs.** Use the built-in filters, or set up a search on standvirtual.com and paste the URL. Every filter, the sort order and even `page=3` are kept.
- 📦 **No page cap.** You can walk an entire category (42,000+ cars) to the last page. Each listing appears once, even when several searches overlap.
- 💸 **Market signals.** Each row includes Standvirtual's price evaluation (below, in or above market), any recent price drop with the lowest price in the last 30 days, and promoted or highlighted flags.

### 💡 Use cases

- **Car pricing and valuation.** Compare asking prices for used cars by model, year and mileage, or track price drops over time.
- **Dealer and lead research.** List stands by district with their stock, website, address and phone numbers.
- **Stock monitoring.** Schedule a "newest first" run to catch fresh listings for the models you buy or import.
- **Market analysis.** See the supply of EVs, hybrids or imported cars by district and price band.

### 🛠️ How to use

1. **Choose what to search.** Fill in the filters (for example Make `Renault`, Model `Clio`), or paste one or more Standvirtual search URLs.
2. **Set Max listings.** The default is 50. Use 0 for every result.
3. **(Optional) Turn on Include details** to get phones, VIN, the description and photos.
4. **Run** the Actor, then export the dataset as JSON, CSV or Excel, or read it through the API.

With empty input the Actor returns the 50 newest passenger cars.

### 📥 Input

| Field                       | Type    | Description                                                                                                      |
| --------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------- |
| `searchUrls`                | array   | Standvirtual search URLs. When set, the filter fields are ignored.                                               |
| `category`                  | string  | `cars` (default), `motorcycles`, `vans`, `trucks`, `motorhomes`, `boats`                                         |
| `keyword`                   | string  | Free-text search                                                                                                 |
| `make` / `model`            | string  | Names as shown on the site, e.g. `Renault` / `Clio`, `BMW` / `Série 3`, `Mercedes-Benz` / `Classe A`             |
| `priceMin` / `priceMax`     | integer | Price range in EUR                                                                                               |
| `yearMin` / `yearMax`       | integer | First registration year range                                                                                    |
| `mileageMin` / `mileageMax` | integer | Mileage range in km                                                                                              |
| `fuelType`                  | array   | `gaz` (petrol), `diesel`, `hibride-gaz`, `hibride-diesel`, `plugin-hybrid`, `electric`, `gpl`, `gnc`, `hidrogen` |
| `bodyType`                  | array   | `suv`, `combi`, `sedan`, `compact`, `city-car`, `minivan`, `coupe`, `cabrio`, `mini`                             |
| `gearbox`                   | string  | `manual` or `automatic`                                                                                          |
| `condition`                 | string  | `used` or `new`                                                                                                  |
| `sellerType`                | string  | `private` (particular) or `business` (profissional)                                                              |
| `region`                    | string  | District or island, e.g. `lisboa`, `porto`, `braga`, `madeira`. For a city with a radius, paste a URL instead.   |
| `sort`                      | string  | `newest` (default), `relevance`, `priceAsc`, `priceDesc`, `mileageAsc`, `mileageDesc`, `powerAsc`, `powerDesc`   |
| `maxItems`                  | integer | Maximum listings to save. Default `50`, `0` = no limit.                                                          |
| `includeDetails`            | boolean | Add phones, VIN, description, photos and seller address. Default `false`.                                        |

If a make or model is not found, the run stops and lists the names Standvirtual knows, so you can copy the right one.

Example:

```json
{
    "make": "Renault",
    "model": "Clio",
    "fuelType": ["gaz"],
    "yearMin": 2019,
    "priceMax": 15000,
    "region": "lisboa",
    "maxItems": 100
}
```

Or paste a URL:

```json
{
    "searchUrls": [
        "https://www.standvirtual.com/carros/bmw/desde-2018?search%5Bfilter_enum_engine_code%5D=serie-3&search%5Bfilter_enum_fuel_type%5D=diesel"
    ],
    "maxItems": 0,
    "includeDetails": true
}
```

### 📤 Output

Each listing is one dataset item:

```json
{
    "id": "8097257677",
    "url": "https://www.standvirtual.com/carros/anuncio/bmw-318-ver-d-auto-ID8PZgCh.html",
    "title": "BMW 318 d Auto",
    "price": 25800,
    "currency": "EUR",
    "priceIsGross": true,
    "priceEvaluation": "IN",
    "priceDropPercent": null,
    "priceLowest30Days": null,
    "make": "BMW",
    "model": "318",
    "version": "d Auto",
    "year": 2022,
    "mileageKm": 132000,
    "fuelType": "diesel",
    "gearbox": "automatic",
    "engineCapacityCm3": 1995,
    "enginePowerHp": 150,
    "bodyType": "combi",
    "color": "black",
    "condition": "used",
    "city": "Pedrouços",
    "region": "Porto",
    "sellerType": "dealer",
    "sellerId": "23688",
    "sellerName": "FIEL MOTOR",
    "sellerWebsite": "https://fielmotor.standvirtual.com",
    "isPromoted": false,
    "thumbnailUrl": "https://ireland.apollo.olxcdn.com/v1/files/wz8692ouh5rs1-STDVTLPT/image;s=640x480",
    "createdAt": "2026-09-30T09:52:53Z",
    "parameters": {
        "is_imported_car": "Não",
        "android_auto": "Sim",
        "bluetooth_interface": "Sim"
    },
    "scrapedAt": "2026-10-05T12:09:25.985Z"
}
```

With **Include details** on, each item also has:

```json
{
    "description": "Kia Ceed 1.6 CRDi GT Line 136cv 2016: elegância, eficiência e tecnologia! ...",
    "images": ["https://ireland.apollo.olxcdn.com/v1/files/.../image", "..."],
    "phones": ["927 612 534"],
    "vin": "U5YHN516AGL264929",
    "equipment": { "Áudio e Multimédia": ["Bluetooth", "Rádio"] },
    "status": "ACTIVE",
    "updatedAt": "2026-10-05T09:34:57Z",
    "seller": {
        "name": "AUTO-AVENTAGE LDA",
        "type": "dealer",
        "address": "ZONA INDUSTRIAL VILA REAL- RETA DA PORTELA - CONST",
        "postalCode": "5000-082",
        "city": "Vila Real",
        "latitude": 41.30104,
        "longitude": -7.74224,
        "profileUrl": "https://autoaventage.standvirtual.com/inventory",
        "activeAds": 11,
        "workingHours": [{ "day": 1, "isOpen": true, "openAt": "09:30", "closeAt": "19:00" }]
    }
}
```

Fields the seller left empty are `null`. Not every listing has a VIN or a visible phone number.

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

The Actor uses pay-per-event pricing, so you pay only for listings you get:

| Event           | Price                     | When it's charged                                                |
| --------------- | ------------------------- | ---------------------------------------------------------------- |
| Actor start     | **$0.00005**              | Once per run                                                     |
| Listing         | **$0.001** ($1 per 1,000) | For every saved listing                                          |
| Listing details | **$0.002** ($2 per 1,000) | On top of the listing price, for each listing saved with details |

For example, 1,000 listings cost about **$1.00**, or **$3.00** with phones, VIN and descriptions. Set a maximum cost per run in Apify, and the Actor stops when it reaches that cost.

### ⚙️ Tips

- **Large runs:** sort by **Newest first** (the default). It is the most stable order for long runs, and repeated listings are removed.
- **Daily monitoring:** schedule a run with `sort: newest` and a small `maxItems` to collect only fresh listings.
- **City plus radius:** set it on standvirtual.com and paste the URL. The radius is kept.
- **Skip details when you don't need them.** Listing rows already include full specs and equipment flags. Details add contact data, VIN, the description and photos.

### ❓ FAQ

**Is it legal to scrape Standvirtual?**
The Actor collects only publicly visible information. Phone numbers of private sellers are personal data. You are responsible for using it lawfully (e.g. GDPR) and for respecting Standvirtual's terms.

**Do I need a proxy?**
No setup is needed. The default Apify proxy is preselected and works.

**Is there a result limit?**
No. Every page of a search can be reached. `maxItems` and your maximum cost per run are the only limits.

**Why did a run return fewer listings than requested?**
Either the search had fewer results, or some listings were removed between the search and the detail visit. Removed listings are skipped and not charged. The run's status message explains any shortfall.

### 🛟 Support

Missing a field or a filter? Open an issue in the **Issues** tab. Feedback and feature requests are welcome.

# Actor input Schema

## `searchUrls` (type: `array`):

Standvirtual search result URLs, copied from your browser after setting filters on standvirtual.com, e.g. https://www.standvirtual.com/carros/bmw/desde-2018?search%5Bfilter_enum_engine_code%5D=serie-3\&search%5Bfilter_enum_fuel_type%5D=diesel. Every filter, the sort order and the page number in the URL are kept. When you add URLs, the filter fields below are ignored.

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

Vehicle category to search when no search URLs are given. Defaults to passenger cars.

## `keyword` (type: `string`):

Free-text search, e.g. "tesla model 3" or "teto de abrir".

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

Vehicle make as on standvirtual.com, e.g. "Renault", "Peugeot", "BMW", "Mercedes-Benz".

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

Model of the chosen make as on standvirtual.com, e.g. "Clio", "Série 3", "Classe A". Needs "Make".

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

Lowest price in euro.

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

Highest price in euro.

## `yearMin` (type: `integer`):

Oldest first registration year, e.g. 2018.

## `yearMax` (type: `integer`):

Newest first registration year.

## `mileageMin` (type: `integer`):

Lowest mileage in kilometres.

## `mileageMax` (type: `integer`):

Highest mileage in kilometres.

## `fuelType` (type: `array`):

One or more fuel types (any of them matches).

## `bodyType` (type: `array`):

One or more body types (any of them matches).

## `gearbox` (type: `string`):

Manual or automatic transmission.

## `condition` (type: `string`):

New or used vehicles.

## `sellerType` (type: `string`):

Private sellers or dealers (companies).

## `region` (type: `string`):

Portuguese district (distrito) or island. For a city with a radius, paste a search URL instead.

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

Order of results for the filter search and for search URLs that do not set their own order. "Newest first" is the most reliable for large runs.

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

Maximum number of listings to save across all searches. 0 = no limit (every result of the search, there is no page cap).

## `includeDetails` (type: `boolean`):

Also open every listing page to add the seller phone numbers, VIN, full description, all photos, equipment list and the seller address with GPS. Costs an extra detail event per listing and is slower.

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

The default Apify proxy works for Standvirtual.

## Actor input object example

```json
{
  "make": "Renault",
  "model": "Clio",
  "sort": "newest",
  "maxItems": 50,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "make": "Renault",
    "model": "Clio",
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/standvirtual-listings-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 = {
    "make": "Renault",
    "model": "Clio",
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/standvirtual-listings-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 '{
  "make": "Renault",
  "model": "Clio",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call piotrv1001/standvirtual-listings-scraper --silent --output-dataset

```

## MCP server setup

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