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

Know what every seller on avtopro.pl charges for the parts you sell. Give it a list of part numbers and get back the lowest price, the average, and every individual offer with the seller's name, rating, delivery time and the country the stock ships from.

- **URL**: https://apify.com/climond/avtopro-pl-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 Poland Competitor Price Checker

Check what your competitors charge on [avtopro.pl](https://avtopro.pl). Give this Actor a list of part numbers and it returns the lowest price, the average price, how many sellers carry the part, and a full record for every individual offer — including **the seller's name and rating**, which most parts scrapers cannot give you.

Built for parts dealers, distributors and workshops in Poland who need to price a catalogue against the market rather than spot-check it by hand.

### Why the Polish market is worth watching specifically

AvtoPro Poland is not a purely domestic marketplace, and that is the interesting part. Measured across the sample parts in the prefilled input, offers break down by the country the stock actually ships from:

| Ships from | Share of offers |
|---|---|
| Poland | 44% |
| **Ukraine** | **35%** |
| France | 17% |
| Spain | 3% |
| Czechia | 1% |

Over a third of what a Polish buyer sees on this site is cross-border stock. Every listing in the output carries `country_iso` and `delivery_days`, so you can separate the sellers who compete with you locally from the ones winning on price by shipping in — and price accordingly instead of guessing.

### 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` — `PLN` on this site
- `seller_name` and `seller_rating` — who is undercutting you and how well rated they are
- `country_iso` and `delivery_city` — Kraków, Warszawa, or a warehouse abroad
- `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

The headline prices come from exact matches only. Averaging a Bosch coil against an NGK equivalent describes the category, not 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 Polish part numbers, 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": "03D906051", "maker": "VAG", "description": "Ignition coil", "origin_price": 120},
    {"item_id": "WL7322", "maker": "WIX", "description": "Oil filter", "origin_price": 35}
  ],
  "proxyConfiguration": {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}
}
```

`items` is the only required field. `item_id` is the part code as avtopro.pl lists it; `description` and `origin_price` pass through untouched so you can compare your own price against the market in the same row.

`proxyConfiguration` needs a residential proxy — avtopro.pl blocks datacenter addresses even at low request rates. Your own provider works too 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 of the market — 8 offers on a Renault bumper absorber, 146 on a common oil filter. Seller counts for a single exact code run 1 to 7, which is what a market this size looks like; if you are used to numbers from a larger marketplace, that is the market, not the Actor.

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

### Scope

This Actor reads AvtoPro's international card feed. `avtopro.es` and `avtopro.pt` serve the same feed and work if you point `siteUrl` at them, though they are a separate seller pool in euros — there is a dedicated Spain Actor for that.

**`avtopro.ua` will not work here.** The Ukrainian site serves a completely different page template and needs the AvtoPro Ukraine Competitor Price Checker. Worth knowing given how much Ukrainian stock shows up in Polish results: if you want to price against the source rather than the resellers, that is the Actor to use.

### Frequently asked questions

#### Is this legal?

The Actor reads listing pages avtopro.pl 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.

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

Because that is the market. In the sample basket the busiest part returned 146 offers and the quietest 8. The Actor reports what the feed holds.

#### Why is `seller_name` filled here when other AvtoPro scrapers leave it empty?

Different markup. This site ships its feed as JSON that names the seller outright. The Ukrainian site renders a table whose rows carry no name at all.

#### 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, so you can trigger runs and read datasets from your own systems.

#### How fresh is the data?

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

# Actor input Schema

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

One entry per part: item\_id (the part code as avtopro.pl 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.pl, spanning small result sets (8 offers) to large ones (106) - 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.pl blocks datacenter addresses even at low request rates. Prices come back in PLN 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.pl. The same card feed runs on avtopro.es and avtopro.pt, so those work here too, though they are a separate seller pool in euros - the AvtoPro Spain Actor is aimed at them. 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": "55593189",
      "maker": "Opel",
      "description": "Oil filter",
      "origin_price": 0
    },
    {
      "item_id": "620939134R",
      "maker": "Renault",
      "description": "Rear bumper absorber",
      "origin_price": 0
    },
    {
      "item_id": "263203C100",
      "maker": "Hyundai",
      "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": "ADBP990010",
      "maker": "Blue Print",
      "description": "Oil filter",
      "origin_price": 0
    },
    {
      "item_id": "280732",
      "maker": "Maxgear",
      "description": "Oil filter",
      "origin_price": 0
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "siteUrl": "https://avtopro.pl"
}
```

# 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": "55593189",
            "maker": "Opel",
            "description": "Oil filter",
            "origin_price": 0
        },
        {
            "item_id": "620939134R",
            "maker": "Renault",
            "description": "Rear bumper absorber",
            "origin_price": 0
        },
        {
            "item_id": "263203C100",
            "maker": "Hyundai",
            "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": "ADBP990010",
            "maker": "Blue Print",
            "description": "Oil filter",
            "origin_price": 0
        },
        {
            "item_id": "280732",
            "maker": "Maxgear",
            "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-pl-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": "55593189",
            "maker": "Opel",
            "description": "Oil filter",
            "origin_price": 0,
        },
        {
            "item_id": "620939134R",
            "maker": "Renault",
            "description": "Rear bumper absorber",
            "origin_price": 0,
        },
        {
            "item_id": "263203C100",
            "maker": "Hyundai",
            "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": "ADBP990010",
            "maker": "Blue Print",
            "description": "Oil filter",
            "origin_price": 0,
        },
        {
            "item_id": "280732",
            "maker": "Maxgear",
            "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-pl-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": "55593189",
      "maker": "Opel",
      "description": "Oil filter",
      "origin_price": 0
    },
    {
      "item_id": "620939134R",
      "maker": "Renault",
      "description": "Rear bumper absorber",
      "origin_price": 0
    },
    {
      "item_id": "263203C100",
      "maker": "Hyundai",
      "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": "ADBP990010",
      "maker": "Blue Print",
      "description": "Oil filter",
      "origin_price": 0
    },
    {
      "item_id": "280732",
      "maker": "Maxgear",
      "description": "Oil filter",
      "origin_price": 0
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call climond/avtopro-pl-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-pl-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/vo3Ctz527bctflYk1/builds/5TKXBGfLuQljv9qR2/openapi.json
