# AvtoPro.es/pt Competitor Price Checker (`climond/avtopro-es-pt-competitor-price-checker`) Actor

One Actor for both Iberian storefronts. Send a list of part numbers and get the lowest price, the average, and every offer on avtopro.es with the seller's name, rating and delivery city.

- **URL**: https://apify.com/climond/avtopro-es-pt-competitor-price-checker.md
- **Developed by:** [Mark Slipenkyi](https://apify.com/climond) (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 $10.00 / 1,000 part price checkeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## AvtoPro Spain Competitor Price Checker

Check what your competitors charge on [avtopro.es](https://avtopro.es). Feed this Actor a list of part numbers and it returns the lowest price, the average price, how many sellers carry each part, and a full record of every individual offer — including **the seller's name and rating**.

Built for recambistas, distributors and workshops pricing a catalogue against the market instead of spot-checking it by hand.

### One Actor covers both Iberian storefronts

AvtoPro runs `avtopro.es` and `avtopro.pt` as two storefronts over **one seller pool**. Checked across three parts, every single seller on the Portuguese site also appears on the Spanish one — 9 of 9, 13 of 13, 6 of 6. Offer counts match exactly; Portuguese prices run 0.5–2% higher for the same stock.

So there is no second Actor to buy. Point `siteUrl` at `https://avtopro.pt` and you get the Portuguese storefront's pricing of the same inventory, from this Actor.

Where the stock actually ships from, measured across the sample parts:

| Ships from | Share of offers |
|---|---|
| Spain | 95% |
| Portugal | 5% |
| France | 1% |

A genuinely Iberian marketplace, unlike AvtoPro's Polish site where a third of the stock crosses a border to get there.

### What you get for each part

One dataset item per part, with headline figures and a nested `listings` array holding every individual offer:

- `lowest_price`, `average_price`, `seller_count` — for the exact part code, not the analogues
- `currency` — `EUR` on both Iberian storefronts
- `seller_name` and `seller_rating` — who is undercutting you, and how well rated they are
- `delivery_city` — Madrid, Pontevedra, Huesca, wherever the stock sits
- `delivery_days` — how fast each competitor actually ships
- `boosted` — sellers who paid to rank above where they placed organically
- `url` — a direct link to each offer
- `exact_match` — false for the analogues AvtoPro cross-references to your part
- `truncated` — normally false; true on the rare part with more offers than one run budgets for

Headline prices come from exact matches only. Averaging a Bosch coil against an NGK equivalent describes the category rather than your competition — but the analogues stay in `listings` if you want to price against them too.

### How to use it

1. Press Start. The input arrives prefilled with 8 real part numbers verified on this site, so you can see the output before typing anything.
2. Swap in your own codes. Add `maker` where you know it — it disambiguates codes shared across brands.
3. Export as JSON, CSV or Excel, or pull the dataset from the Apify API.

Runs can be scheduled, so a weekly price sweep needs no manual work after setup.

### Input

```json
{
  "items": [
    {"item_id": "HU514X", "maker": "MANN", "description": "Oil filter", "origin_price": 12},
    {"item_id": "3D0941295", "maker": "VAG", "description": "Headlight range control", "origin_price": 200}
  ],
  "proxyConfiguration": {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}
}
```

`items` is the only required field. `item_id` is the part code as avtopro.es lists it; `description` and `origin_price` pass through untouched so your own price sits in the same row as the market's.

`proxyConfiguration` needs a residential proxy — avtopro.es blocks datacenter addresses even at low request rates. Your own provider works via Custom proxies.

`maxConcurrency` defaults to 8. Each part gets its own proxy session, so parts do not queue behind one address. Drop it to 2 if you would rather have every part than a fast run.

### What a run looks like

The sample basket spans the real range — 5 offers on a VAG headlight controller, 246 on a common Renault oil filter. Seller counts for a single exact code run 1 to 13. Depth varies enormously by part, and busy parts cost more to check because there is simply more to read; you pay the same flat rate either way.

Parts that fail are not charged. A code with no offers here comes back with an `error` field rather than stopping the run.

### Scope

This Actor reads AvtoPro's international card feed, shared by `avtopro.es`, `avtopro.pt` and `avtopro.pl`. The Spanish and Portuguese storefronts are one market, covered here. The Polish site is a genuinely different seller pool in złoty — there is a dedicated Poland Actor for it.

**`avtopro.ua` will not work here.** The Ukrainian site serves a completely different page template and needs the AvtoPro Ukraine Competitor Price Checker. It is also markedly cheaper: on identical part numbers quoted in euros, Ukrainian sellers ran 2–7x below Spanish ones with three to four times the supply. If you source rather than only resell, that is worth a look.

### Frequently asked questions

#### Is this legal?

The Actor reads listing pages avtopro.es publishes openly. Nothing sits behind a paywall, and seller names are company names shown publicly on every listing — no personal data is collected. How you use the data, including copyright and database rights, is your responsibility. Take legal advice before republishing listings rather than using them for internal analysis.

#### Should I also buy a Portugal Actor?

There isn't one, and you would not want one. Both storefronts sell the same stock from the same sellers; set `siteUrl` to `https://avtopro.pt` to see that inventory at Portuguese prices.

#### Why do some parts return far more sellers than others?

Because that is the market. In the sample basket the busiest part returned 246 offers and the quietest 5.

#### What happens if my proxy gets blocked?

The Actor backs off and retries before giving up on a part, and a part that still fails carries an `error` rather than stopping the run. If it happens often, lower `maxConcurrency` or use your own residential provider.

#### Can I run this from my own code?

Yes. Every Apify Actor has a REST API plus official JavaScript and Python clients.

#### How fresh is the data?

Every run fetches live. No cache — results reflect the site at the moment the run executes.

# Actor input Schema

## `items` (type: `array`):

One entry per part: item\_id (the part code as avtopro.es lists it, required), description (free text, carried through to output), origin\_price (your own price, carried through for reference), maker (your catalog's brand for this part - the strongest signal for picking the right search suggestion when a part code is ambiguous). Example: \[{"item\_id": "03D906051", "description": "Ignition coil", "origin\_price": 100, "maker": "VAG"}] The prefilled basket is 8 real parts, each verified live on avtopro.es, spanning small result sets (5 offers) to large ones (201) - cost per part scales with how many sellers a part has, so a mixed basket is the honest way to see what a run costs. 'origin\_price' is passed through untouched; replace it with your real figures.

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

A residential proxy is required: avtopro.es blocks datacenter addresses even at low request rates. Prices come back in EUR and the Actor reports the currency it was served rather than assuming one. If Apify Proxy gets blocked, switch to Custom proxies and supply your own.

## `siteUrl` (type: `string`):

Defaults to https://avtopro.es. Set it to https://avtopro.pt to price the same inventory at the Portuguese storefront - both are one seller pool, verified seller by seller, with Portuguese prices running 0.5-2% higher. avtopro.pl also serves this feed but is a separate market in zloty. avtopro.ua serves a completely different page template and will NOT work here - use the AvtoPro Ukraine Competitor Price Checker for that.

## `maxConcurrency` (type: `integer`):

How many parts are fetched at once, default 8. Each part gets its own proxy session, so this is I/O-bound rather than memory-bound, and a faster run is also a cheaper one because compute is billed on wall-clock time. Raising it trades a few percent of parts for speed; lower it to 2 if you would rather have every part than a fast run.

## Actor input object example

```json
{
  "items": [
    {
      "item_id": "03D906051",
      "maker": "VAG",
      "description": "Ignition coil",
      "origin_price": 0
    },
    {
      "item_id": "620939134R",
      "maker": "Renault",
      "description": "Rear bumper absorber",
      "origin_price": 0
    },
    {
      "item_id": "3D0941295",
      "maker": "VAG",
      "description": "Headlight range control",
      "origin_price": 0
    },
    {
      "item_id": "263203C100",
      "maker": "Hyundai",
      "description": "Oil filter",
      "origin_price": 0
    },
    {
      "item_id": "HU514X",
      "maker": "MANN",
      "description": "Oil filter",
      "origin_price": 0
    },
    {
      "item_id": "WL7322",
      "maker": "WIX",
      "description": "Oil filter",
      "origin_price": 0
    },
    {
      "item_id": "172896",
      "maker": "FEBI",
      "description": "Oil filter",
      "origin_price": 0
    },
    {
      "item_id": "04152YZZA1",
      "maker": "Toyota",
      "description": "Oil filter",
      "origin_price": 0
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "siteUrl": "https://avtopro.es"
}
```

# Actor output Schema

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

One record per part: lowest\_price, average\_price and seller\_count for the exact part code, the currency those figures are quoted in, and a nested 'listings' array with one entry per competitor offer (price, seller name and rating, brand, new or used, delivery city and days, warehouse country, paid-placement flag, and a direct link). Analogues AvtoPro cross-references to the part ship in 'listings' too, marked exact\_match: false, and are excluded from the headline figures. A part with no offers in this market carries an 'error' field instead of prices.

# 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 = {
    "items": [
        {
            "item_id": "03D906051",
            "maker": "VAG",
            "description": "Ignition coil",
            "origin_price": 0
        },
        {
            "item_id": "620939134R",
            "maker": "Renault",
            "description": "Rear bumper absorber",
            "origin_price": 0
        },
        {
            "item_id": "3D0941295",
            "maker": "VAG",
            "description": "Headlight range control",
            "origin_price": 0
        },
        {
            "item_id": "263203C100",
            "maker": "Hyundai",
            "description": "Oil filter",
            "origin_price": 0
        },
        {
            "item_id": "HU514X",
            "maker": "MANN",
            "description": "Oil filter",
            "origin_price": 0
        },
        {
            "item_id": "WL7322",
            "maker": "WIX",
            "description": "Oil filter",
            "origin_price": 0
        },
        {
            "item_id": "172896",
            "maker": "FEBI",
            "description": "Oil filter",
            "origin_price": 0
        },
        {
            "item_id": "04152YZZA1",
            "maker": "Toyota",
            "description": "Oil filter",
            "origin_price": 0
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("climond/avtopro-es-pt-competitor-price-checker").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 = {
    "items": [
        {
            "item_id": "03D906051",
            "maker": "VAG",
            "description": "Ignition coil",
            "origin_price": 0,
        },
        {
            "item_id": "620939134R",
            "maker": "Renault",
            "description": "Rear bumper absorber",
            "origin_price": 0,
        },
        {
            "item_id": "3D0941295",
            "maker": "VAG",
            "description": "Headlight range control",
            "origin_price": 0,
        },
        {
            "item_id": "263203C100",
            "maker": "Hyundai",
            "description": "Oil filter",
            "origin_price": 0,
        },
        {
            "item_id": "HU514X",
            "maker": "MANN",
            "description": "Oil filter",
            "origin_price": 0,
        },
        {
            "item_id": "WL7322",
            "maker": "WIX",
            "description": "Oil filter",
            "origin_price": 0,
        },
        {
            "item_id": "172896",
            "maker": "FEBI",
            "description": "Oil filter",
            "origin_price": 0,
        },
        {
            "item_id": "04152YZZA1",
            "maker": "Toyota",
            "description": "Oil filter",
            "origin_price": 0,
        },
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("climond/avtopro-es-pt-competitor-price-checker").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 '{
  "items": [
    {
      "item_id": "03D906051",
      "maker": "VAG",
      "description": "Ignition coil",
      "origin_price": 0
    },
    {
      "item_id": "620939134R",
      "maker": "Renault",
      "description": "Rear bumper absorber",
      "origin_price": 0
    },
    {
      "item_id": "3D0941295",
      "maker": "VAG",
      "description": "Headlight range control",
      "origin_price": 0
    },
    {
      "item_id": "263203C100",
      "maker": "Hyundai",
      "description": "Oil filter",
      "origin_price": 0
    },
    {
      "item_id": "HU514X",
      "maker": "MANN",
      "description": "Oil filter",
      "origin_price": 0
    },
    {
      "item_id": "WL7322",
      "maker": "WIX",
      "description": "Oil filter",
      "origin_price": 0
    },
    {
      "item_id": "172896",
      "maker": "FEBI",
      "description": "Oil filter",
      "origin_price": 0
    },
    {
      "item_id": "04152YZZA1",
      "maker": "Toyota",
      "description": "Oil filter",
      "origin_price": 0
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call climond/avtopro-es-pt-competitor-price-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,climond/avtopro-es-pt-competitor-price-checker"
        }
    }
}

```

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/PDEuaQdzifgP3aPtu/builds/ro66ezgcvbez3Iitx/openapi.json
