# Car.gr Scraper - Greek Car Listings & Prices (`studio-amba/car-gr-scraper`) Actor

Scrape car listings from Car.gr, Greece's largest car marketplace with 15M+ classifieds. Extract prices, specs, mileage, fuel type, transmission, seller info, and images. No login or cookies required.

- **URL**: https://apify.com/studio-amba/car-gr-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **Features:** Limited permissions
- **Stats:** 17 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Car.gr Scraper

Scrape **car listings from Car.gr**, Greece's largest automotive classifieds platform with over 15 million listings. Extract prices, specs, mileage, fuel type, transmission, power, seller information, and images for any make and model. Run on the Apify platform with full API access, scheduling, and integrations built in.

### Why use this actor?

Car.gr is the dominant car marketplace in Greece with 12-16 million monthly visits and hundreds of thousands of active vehicle listings from both professional dealers and private sellers. This scraper lets you **monitor prices, track inventory, and build datasets** for market research, price comparison tools, or dealership intelligence -- all without writing code, managing infrastructure, or needing any login credentials.

### How to scrape Car.gr data

1. Go to the **Input** tab and enter a car make (e.g., BMW, Toyota, Volkswagen) or a free-text search query.
2. Optionally add filters: model, year range, price range, fuel type, condition, and sort order.
3. Set `maxResults` to control how many listings you want (default: 100).
4. Click **Start** and wait for the run to complete.
5. Download your data from the **Output** tab in JSON, CSV, Excel, or HTML format.

No login, no cookies, no account required. The scraper handles pagination automatically and respects rate limits.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchQuery` | String | No | Free-text search (e.g., "SUV", "cabrio"). Default: "BMW" |
| `make` | String | No | Car manufacturer (e.g., BMW, Toyota, Volkswagen) |
| `model` | String | No | Car model as car.gr lists it (e.g., Corolla, Golf, A 180). Needs `make`. A model car.gr does not list ends the run with a clear message instead of returning other models. |
| `yearFrom` | Integer | No | Minimum registration year (e.g., 2018) |
| `yearTo` | Integer | No | Maximum registration year (e.g., 2024) |
| `priceFrom` | Integer | No | Minimum price in EUR |
| `priceTo` | Integer | No | Maximum price in EUR |
| `fuelType` | String | No | Fuel type: petrol, diesel, lpg, electric, hybrid, cng |
| `condition` | String | No | Vehicle condition: used, new |
| `sortBy` | String | No | Sort: newest, cheapest, expensive, year_new, year_old, mileage_low, popular |
| `maxResults` | Integer | No | Max listings to return (default: 100, max: 7200) |
| `sellerIds` | Array | No | Only the listings of these sellers. Use the `sellerId` output value, or a car.gr URL with `user=<id>` |
| `trackListings` | Boolean | No | Remember the listings between runs and report new, removed and repriced ones (default: off) |
| `trackingKey` | String | No | Name of the tracked search. Empty = derived from the filters |
| `salesWindowDays` | Integer | No | Days counted in the summary's potential sales per model and per seller (default: 30) |
| `proxyConfiguration` | Object | No | Proxy settings (RESIDENTIAL recommended) |

### Output

Each car listing contains the following fields:

| Field | Type | Description |
|-------|------|-------------|
| `listingTitle` | String | Full listing title |
| `make` | String | Car manufacturer |
| `model` | String | Car model |
| `year` | Integer | First registration year |
| `mileage` | Integer | Mileage in kilometers |
| `fuelType` | String | Petrol, Diesel, LPG, Electric, Hybrid, Plug-in Hybrid, or CNG |
| `transmission` | String | Automatic or Manual |
| `engineSize` | String | Engine displacement in cc |
| `power` | String | Engine power in hp |
| `price` | Number | Listing price in EUR |
| `currency` | String | Currency code (EUR) |
| `offerType` | String | Sale or Rent |
| `sellerType` | String | Professional or Private |
| `sellerId` | String | Car.gr seller id, usable in the `sellerIds` input |
| `sellerName` | String | Seller name as car.gr shows it. Empty for most private sellers |
| `sellerUrl` | String | Car.gr search for all cars of this seller |
| `baseModel` | String | Model without the variant, as car.gr classifies it. Empty when car.gr has no model for the ad (some vans) |
| `listedAt` | String | When the ad was created, as car.gr reports it |
| `modifiedAt` | String | When the ad was last modified, as car.gr reports it |
| `location` | String | Place as car.gr prints it: town, prefecture and postcode in Greek capitals (e.g. ΧΑΛΑΝΔΡΙ Ν. ΑΤΤΙΚΗΣ 15231) |
| `imageUrl` | String | Primary image URL |
| `imageUrls` | Array | All image URLs |
| `listingUrl` | String | Direct link to listing on Car.gr |
| `listingId` | String | Unique Car.gr listing ID |
| `scrapedAt` | String | ISO 8601 timestamp |

### Example output

```json
{
    "listingTitle": "BMW 320d Touring M Sport",
    "make": "BMW",
    "model": "320d Touring",
    "year": 2021,
    "mileage": 45000,
    "fuelType": "Diesel",
    "transmission": "Automatic",
    "engineSize": "1995 cc",
    "power": "190 hp",
    "price": 32500,
    "currency": "EUR",
    "offerType": "Sale",
    "sellerType": "Professional",
    "location": "ΑΘΗΝΑ 10442",
    "imageUrl": "https://www.car.gr/images/listing-123456.jpg",
    "imageUrls": ["https://www.car.gr/images/listing-123456.jpg"],
    "listingUrl": "https://www.car.gr/classifieds/cars/view/123456",
    "listingId": "123456",
    "scrapedAt": "2026-06-09T10:30:00.000Z"
}
```

### Follow a dealer's stock

Put one or more seller ids in `sellerIds` to get those sellers' cars. Ads without photos are included. Every row has a `sellerId`, so run a search once to find the id of a dealer. The free-text search is ignored when `sellerIds` is set. `make`, `model` and the other filters still apply.

### Track listings between runs

Turn on `trackListings` and schedule the same input, for example every three days. The first run remembers the listings. Each later run adds:

- `status` on every listing: `new` or `active`, with `firstSeenAt`, `lastSeenAt`, `previousPrice` and `priceChanged`.
- One row per ad deleted since the last run: `status` is `removed`, with `removedAt`, `daysListed` and `removalClass`.
- One `__SEGMENT_SUMMARY__` row: car.gr's count, new, removed and repriced listings, and potential sales per model and per seller over `salesWindowDays`.

Car.gr says an ad was deleted, not why, so `potential_sold` means the ad was deleted and is never a confirmed sale. The value is `reposted` when the same seller offers a matching car under a new id. Set `maxResults` above the number of listings in the search, because listings are only marked removed when the run read every result page. Car.gr shows at most 300 pages (7,200 listings) per search, so split a bigger search by year. Removed rows and the summary row count as results. History is kept in the `car-gr-tracking` key-value store in your account.

### Use cases

- **Market research** -- Track car prices across the Greek market to identify trends, seasonal fluctuations, and regional price differences.
- **Dealership intelligence** -- Monitor competitor inventory and pricing strategies in real time.
- **Price comparison** -- Build price comparison tools or alerts for specific makes and models.
- **Data journalism** -- Analyze the Greek used car market for stories on affordability, popular models, and import trends.
- **Investment analysis** -- Track depreciation rates and identify undervalued vehicles.

### Proxy configuration

Car.gr is protected by Cloudflare. **RESIDENTIAL proxies with a Greek IP are recommended** for reliable results. The default proxy configuration uses Apify RESIDENTIAL proxies with country set to Greece (GR).

If you experience blocks or empty results, ensure your proxy configuration includes:

- `useApifyProxy: true`
- `apifyProxyGroups: ["RESIDENTIAL"]`
- `apifyProxyCountry: "GR"`

### Rate limits and performance

The scraper processes pages with built-in delays to avoid triggering anti-bot protections. Expect roughly 1-2 pages per minute, with each page containing approximately 25 listings. For 100 listings, a typical run takes 2-5 minutes depending on proxy speed.

### Integrations

Use the [Apify API](https://docs.apify.com/api/v2) to programmatically start runs, fetch results, and integrate with your existing tools:

- **Google Sheets** -- Export results directly to a spreadsheet.
- **Webhooks** -- Get notified when a run finishes.
- **API** -- Fetch results in JSON, CSV, or Excel via REST API.
- **Zapier / Make** -- Connect to 5,000+ apps with no-code integrations.
- **Scheduling** -- Run daily, weekly, or on any custom schedule.

### Cost estimate

This actor is billed $0.02 per run plus $0.002 per result — **1,000 results cost about $2.02**. Usage cost only settles once a run reports **SUCCEEDED** — reading a dataset mid-run will show a cost far below the real total.

### Tips for best results

1. Use the `make` field instead of `searchQuery` when you know the exact manufacturer -- it uses Car.gr's native URL routing for more reliable results.
2. Set `maxResults` to a reasonable number to keep costs and run time low.
3. Add year and price filters to narrow down results and get more targeted data.
4. If runs return 0 results, try with a different proxy group or increase retry count.

### Legal disclaimer

This actor is designed for legitimate data collection purposes such as market research, price monitoring, and competitive analysis. Users are responsible for ensuring their use complies with applicable laws and Car.gr's terms of service.

# Actor input Schema

## `searchQuery` (type: `string`):

Free-text search term (e.g., 'SUV', 'cabrio', 'van'). Ignored when make is set.

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

Car manufacturer (e.g., BMW, Toyota, Volkswagen, Mercedes-Benz, Audi, Opel, Fiat, Hyundai, Nissan, Peugeot).

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

Car model (e.g., 3 Series, Corolla, Golf, A 180). Requires make to be set. Matched against the model names car.gr lists; a model car.gr does not list ends the run with a message naming the models it does list.

## `yearFrom` (type: `integer`):

Minimum first registration year (e.g., 2018).

## `yearTo` (type: `integer`):

Maximum first registration year (e.g., 2024).

## `priceFrom` (type: `integer`):

Minimum price in EUR.

## `priceTo` (type: `integer`):

Maximum price in EUR.

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

Filter by fuel type.

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

Filter by vehicle condition.

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

Sort order for results.

## `maxResults` (type: `integer`):

Maximum number of car listings to return.

## `sellerIds` (type: `array`):

Only the listings of these car.gr sellers, for example a dealer's whole stock. Use the number in the sellerId output field, or a car.gr URL with user=<id>. Replaces the free-text search; make, model and the other filters still apply. Ads without photos are included.

## `trackListings` (type: `boolean`):

Off by default. When on, the actor remembers every listing of this search in a key-value store in your account ("car-gr-tracking") and adds firstSeenAt, lastSeenAt, status (new, active), price changes, one row per listing deleted since the last run (status removed, with removalClass potential_sold or reposted), and one **SEGMENT_SUMMARY** row. Car.gr says an ad was deleted, not why, so a removal is a potential sale, never a confirmed one. Set maxResults above the number of listings in the search: listings are only marked removed when the run read every result page. Schedule the same input, for example every three days. Each removed and summary row counts as a result.

## `trackingKey` (type: `string`):

Name of the tracked search in the store. Leave empty to derive it from the filters, so the same filters always continue the same history. A new key starts a new history.

## `salesWindowDays` (type: `integer`):

Number of past days counted in the summary row's potential sales per model and per seller.

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

Proxy settings. RESIDENTIAL proxies recommended for Car.gr (Cloudflare-protected).

## Actor input object example

```json
{
  "searchQuery": "BMW",
  "maxResults": 5,
  "trackListings": false,
  "salesWindowDays": 30,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GR"
  }
}
```

# 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 = {
    "searchQuery": "BMW",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "GR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/car-gr-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 = {
    "searchQuery": "BMW",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "GR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/car-gr-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 '{
  "searchQuery": "BMW",
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GR"
  }
}' |
apify call studio-amba/car-gr-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/car-gr-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/2h0ddM9M1OfKdIjC9/builds/pBEI67oFlba8GH0fc/openapi.json
