# Ovoko / RRR.lt European OEM Used Auto Parts & Price Scraper (`js_j/ovoko-oem-auto-parts-scraper`) Actor

Extract used OEM auto parts, live EUR prices, dismantler SKUs, and donor vehicle specs (VIN, engine code, mileage, year, kW) from Ovoko (ovoko.fr, ovoko.de, ovoko.es, ovoko.it, ovoko.pl, ovoko.co.uk) and RRR.lt by OEM part number. Built-in delta monitoring for daily price and stock tracking.

- **URL**: https://apify.com/js_j/ovoko-oem-auto-parts-scraper.md
- **Developed by:** [Jaber Bensmida](https://apify.com/js_j) (community)
- **Security:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.02 / 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.

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

## 🚗 Ovoko & RRR.lt European OEM Auto Parts & Price Scraper

<p align="center">
  <img src="assets/store_banner.jpg" alt="Ovoko & RRR.lt European OEM Auto Parts Scraper" width="100%" style="border-radius: 8px;" />
</p>

<p align="center">
  <a href="https://apify.com"><img src="https://img.shields.io/badge/Apify-Actor-orange?logo=apify&style=for-the-badge" alt="Apify Actor" /></a>
  <a href="#-pricing--monetization-pay-per-event"><img src="https://img.shields.io/badge/Pricing-Pay--Per--Event%20($0.02%2F1k)-green?style=for-the-badge" alt="Pay Per Event" /></a>
  <a href="#-why-use-this-scraper"><img src="https://img.shields.io/badge/RAM-512%20MB%20Ultra--Light-blue?style=for-the-badge" alt="Memory" /></a>
  <a href="#-supported-marketplaces"><img src="https://img.shields.io/badge/Coverage-7%20EU%20Countries-purple?style=for-the-badge" alt="Coverage" /></a>
</p>

***

The most reliable, high-speed, and cost-effective scraper for **Ovoko** (`ovoko.fr`, `ovoko.de`, `ovoko.es`, `ovoko.it`, `ovoko.pl`, `ovoko.co.uk`) and **RRR.lt**.

Extract live used OEM car parts, EUR market prices, seller SKUs, dismantler info, and donor vehicle technical specifications (**VIN, Engine Code, Gearbox Code, Mileage, Year, Fuel Type, Steering Side, and High-Res Photos**) directly by OEM part numbers or custom search URLs.

Built-in **delta price monitoring** tracks daily price drops, new inventory arrivals, and arbitrage opportunities across Europe without re-billing you for unchanged listings.

***

### 🌟 Why Use This Scraper?

- **⚡ Blazing Fast & Ultra-Lightweight:** Powered by Crawlee & Cheerio parsing with browser TLS fingerprinting. Scrapes dozens of parts in seconds using only **512 MB RAM**, keeping platform costs virtually zero.
- **🛡️ Built-in Cloudflare Bypass:** Emulates modern browser TLS handshakes (JA3/JA4) and HTTP/2 headers out-of-the-box. No expensive headless browser overhead needed.
- **🌍 Multi-Domain Regional Routing:** Automatically queries local endpoints across France, Germany, Spain, Italy, Poland, Lithuania, and the UK.
- **🔍 Deep Technical Specs Enrichment:** Visits individual part pages to extract **Donor Vehicle VIN (chassis number)**, **Engine Code**, **Gearbox Code**, **Vehicle Position (LHD/RHD, Left/Right)**, and full photo galleries.
- **📉 Automated Delta & Price Drop Alerts:** Remembers previously seen parts and prices. When enabled, only outputs new listings or price reductions, saving compute and money.
- **💰 Pay-Per-Event (PPE) Friendly:** Predictable, transparent pricing. You only pay for what you scrape ($0.05 / 1,000 starts + $0.02 / 1,000 scraped parts).

***

### 💼 Business Use Cases

1. **Auto Parts Arbitrage & Trading:** Scan European dismantlers for undervalued OEM headlights, turbos, radar modules, and ECUs, then resell them locally with high profit margins.
2. **Auto Repair & Garage Sourcing:** Input customer part numbers in bulk to instantly locate the lowest-cost OEM replacement across 1,000+ certified European car dismantlers.
3. **Insurance & Salvage Valuation:** Access accurate, live fair-market values of genuine recycled OEM parts for insurance claims and estimation models.
4. **Daily Restock & Price-Drop Monitoring:** Schedule the Actor to run every morning. Receive webhook alerts whenever a dismantler drops the price on high-demand parts.

***

### 🌍 Supported Marketplaces

The scraper automatically formats localized search queries and extracts data across all official Ovoko / RRR domains:

| Domain | Country | Localized Path |
|---|---|---|
| `ovoko.fr` | 🇫🇷 France | `/chercher?q={oem}&exact=1` |
| `rrr.lt` | 🇱🇹 Lithuania | `/paieska?q={oem}&exact=1` |
| `ovoko.de` | 🇩🇪 Germany | `/suche?q={oem}&exact=1` |
| `ovoko.es` | 🇪🇸 Spain | `/buscar?q={oem}&exact=1` |
| `ovoko.it` | 🇮🇹 Italy | `/ricerca?q={oem}&exact=1` |
| `ovoko.pl` | 🇵🇱 Poland | `/szukaj?q={oem}&exact=1` |
| `ovoko.co.uk` | 🇬🇧 United Kingdom | `/search?q={oem}&exact=1` |

***

### 📥 Input Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `oemCodes` | Array of Strings | `["9826650680", "03L903017E", "561119603R"]` | List of OEM part numbers or search queries to scrape. |
| `startUrls` | Array of Objects | `[]` | Optional direct category, search, or part URLs (e.g., specific vehicle filters). |
| `marketplaceDomain` | String (Dropdown) | `"ovoko.fr"` | Regional storefront to query (`ovoko.fr`, `rrr.lt`, `ovoko.de`, etc.). |
| `exactOemMatch` | Boolean | `true` | Restrict results strictly to exact part code matches (`exact=1`). |
| `maxItemsPerQuery` | Integer | `40` | Maximum number of parts to collect per OEM code or URL. |
| `scrapeFullPartDetails` | Boolean | `false` | When enabled, opens each part page to extract VIN, Engine/Gearbox codes, and full photo gallery. |
| `onlyNewOrPriceChanged` | Boolean | `false` | Delta mode: Only outputs newly listed parts or items whose price dropped/increased since the last run. |
| `proxyConfiguration` | Object | `{ "useApifyProxy": true }` | Apify Proxy settings (Datacenter or Residential). |

#### Example Input JSON

```json
{
  "oemCodes": [
    "9826650680",
    "03L903017E",
    "561119603R"
  ],
  "marketplaceDomain": "ovoko.fr",
  "exactOemMatch": true,
  "maxItemsPerQuery": 50,
  "scrapeFullPartDetails": true,
  "onlyNewOrPriceChanged": false
}
```

***

### 📤 Sample Output Record

Each item returned by the Actor includes complete commercial, logistics, and automotive engineering metadata:

```json
{
  "partId": "CBR5135",
  "dismantlerSku": "CBR5135",
  "queriedOem": "9826650680",
  "oemCode": "9826650680",
  "otherCodes": ["9826650680-01", "1631814080"],
  "title": "Support de pare-chocs arrière",
  "priceEur": 18.35,
  "currency": "EUR",
  "priceChangeStatus": "NEW",
  "previousPriceEur": null,
  "inStock": true,
  "donorCarModel": "Peugeot 3008 II",
  "donorYear": 2018,
  "donorMileageKm": 45000,
  "donorEngineCc": 1200,
  "donorPowerKw": 96,
  "donorFuelType": "Petrol",
  "donorGearboxType": "Manual",
  "donorEngineCode": "HN02",
  "donorGearboxCode": "20CP22",
  "donorBodyType": "SUV",
  "donorColorCode": "KWE",
  "donorVin": "VF3MCMR...",
  "positionOnVehicle": "Arrière gauche",
  "steeringSide": "Gauche",
  "sellerName": "AUTO-PLUS Łukasz Ławniczak",
  "isTopSeller": true,
  "imageUrl": "https://images.ovoko.com/bl/fill/1024x768/cbr/...jpg",
  "imageGallery": [
    "https://images.ovoko.com/bl/1024x768/cbr/...jpg",
    "https://images.ovoko.com/tl/1024x768/cbr/...jpg",
    "https://images.ovoko.com/tr/1024x768/cbr/...jpg"
  ],
  "url": "https://ovoko.fr/les-pieces/cbr5135-9826650680-peugeot-3008-ii-support-de-pare-chocs-arriere",
  "marketplaceDomain": "ovoko.fr",
  "scrapedAt": "2026-10-17T20:32:21.145Z"
}
```

***

### 💵 Pricing & Monetization (Pay-Per-Event)

This Actor uses Apify's **Pay-Per-Event (PPE)** pricing model:

- **`actor-start`:** **$0.05 / 1,000 runs** (covers base container initialization)
- **`oem-part-scraped`:** **$0.02 / 1,000 parts** extracted ($0.00002 per part)

> 💡 **Cost Optimization Tip:** Enable `onlyNewOrPriceChanged: true` on scheduled daily runs. Unchanged items are automatically skipped and **you are never billed for duplicate parts**.

***

### ⚡ Delta Monitoring & Price Drop Alerts

To track price drops automatically:

1. Go to the **Schedules** tab on Apify Console.
2. Schedule this Actor to run daily (e.g., every morning at `08:00 UTC`).
3. Set `onlyNewOrPriceChanged: true`.
4. In the Actor's **Integrations** tab, set up a **Webhook** on `Run succeeded`:
   - Send new parts directly to **Slack**, **Discord**, or an **Airtable / Google Sheet** via Zapier or Make!

***

### 💻 Programmatic Usage (API & SDKs)

#### Node.js / JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('YOUR_USERNAME/ovoko-oem-auto-parts-scraper').call({
    oemCodes: ['9826650680', '03L903017E'],
    marketplaceDomain: 'ovoko.fr',
    scrapeFullPartDetails: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Extracted ${items.length} auto parts:`, items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_APIFY_TOKEN')

run = client.actor('YOUR_USERNAME/ovoko-oem-auto-parts-scraper').call(run_input={
    'oemCodes': ['9826650680', '03L903017E'],
    'marketplaceDomain': 'ovoko.fr',
    'scrapeFullPartDetails': True,
})

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(f"[{item['priceChangeStatus']}] {item['title']} - €{item['priceEur']} ({item['donorCarModel']})")
```

***

### ❓ Frequently Asked Questions (FAQ)

##### Do I need my own proxies?

No. The Actor uses Apify Proxy by default (`useApifyProxy: true`). For high-volume enterprise crawls (10,000+ pages), you can select Residential proxies in the input settings.

##### Can I search by part names instead of OEM codes?

Yes. You can enter part keywords (e.g. `volant peugeot 3008`, `phare bmw f30`) into `oemCodes` and set `exactOemMatch: false`.

##### How does delta monitoring remember previous prices?

The Actor stores a state dictionary in its persistent default Key-Value Store (`PART_PRICES`). When a scheduled run executes, it compares live prices with historical prices.

***

### ⚖️ License & Disclaimer

This Actor is intended for automated data aggregation, pricing intelligence, and market research of publicly available automotive listings on Ovoko and RRR.lt. Users are responsible for adhering to local laws, GDPR regulations, and the platform terms of service.

# Actor input Schema

## `oemCodes` (type: `array`):

Enter OEM part codes (e.g., 9826650680, 03L903017E, 561119603R) or part keywords. The scraper will query each code automatically.

## `startUrls` (type: `array`):

Paste direct URLs from ovoko.fr, rrr.lt, ovoko.de, etc. if you want to scrape a specific car model or category filter.

## `marketplaceDomain` (type: `string`):

Select which regional Ovoko/RRR storefront to query.

## `exactOemMatch` (type: `boolean`):

When enabled (exact=1), filters out fuzzy keyword matches and returns only exact part code matches.

## `maxItemsPerQuery` (type: `integer`):

Maximum number of parts to extract per OEM code or start URL.

## `scrapeFullPartDetails` (type: `boolean`):

If enabled, visits each individual part page to extract full Donor VIN, Engine Code, Gearbox Code, Paint Code, and High-Res Photo gallery.

## `onlyNewOrPriceChanged` (type: `boolean`):

Saves part IDs and prices across runs in KeyValueStore. Only outputs and charges for brand-new listings or parts whose price changed since the last run.

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

Apify Proxy settings. Datacenter proxies work for light runs; switch to Residential if scraping thousands of pages.

## Actor input object example

```json
{
  "oemCodes": [
    "9826650680",
    "03L903017E",
    "561119603R"
  ],
  "marketplaceDomain": "ovoko.fr",
  "exactOemMatch": true,
  "maxItemsPerQuery": 40,
  "scrapeFullPartDetails": false,
  "onlyNewOrPriceChanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing all extracted car parts, live EUR prices, SKUs, and donor vehicle specs.

## `priceState` (type: `string`):

Key-value record tracking part prices across scheduled runs for daily price drop and restock monitoring.

# 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 = {
    "oemCodes": [
        "9826650680",
        "03L903017E",
        "561119603R"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("js_j/ovoko-oem-auto-parts-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 = { "oemCodes": [
        "9826650680",
        "03L903017E",
        "561119603R",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("js_j/ovoko-oem-auto-parts-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 '{
  "oemCodes": [
    "9826650680",
    "03L903017E",
    "561119603R"
  ]
}' |
apify call js_j/ovoko-oem-auto-parts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,js_j/ovoko-oem-auto-parts-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/pH3l1TkH3t3fMCEvs/builds/xAHVJkgPKYw2CxSnj/openapi.json
