# Vinted Deal Radar (new listings and price drops monitor) (`integrative_cafe_8pc/vinted-deal-radar`) Actor

Schedule a Vinted search and get only listings that are new since the last run, plus price drops on listings seen before. Any Vinted country, price filters, webhook alerts to Discord, Slack, Telegram or any URL. No login, no seller personal data.

- **URL**: https://apify.com/integrative_cafe_8pc/vinted-deal-radar.md
- **Developed by:** [Bluefield Data](https://apify.com/integrative_cafe_8pc) (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 $1.00 / 1,000 new listing or price drops

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

## Vinted Deal Radar

**Schedule it every 10 minutes and get only new listings.** Each run checks your Vinted search, newest first, and returns only the listings that appeared since the previous run, plus listings you saw before whose **price dropped**. Send every hit to Discord, Slack, Telegram or any webhook and be the first to message the seller.

Works on every Vinted country site (France, Germany, UK, US, Spain, Italy, Netherlands, Poland and 16 more). No login, no account, no browser.

### Why this one

- **Only what is new.** The radar remembers what it already showed you (in a key-value store in your own account), so a schedule never sends the same listing twice. In our tests, the second run right after the first returned 0 repeats.
- **Price drops.** A listing you saw at 40 EUR that is now 30 EUR comes back with `event: "price_drop"`, `previousPrice` and `priceDropPercent`.
- **Alerts built in.** Put a Discord, Slack or Telegram webhook in `webhookUrl` and each hit arrives as a message. Any other URL receives the listing as JSON.
- **Runs finish.** When Vinted blocks a request, the radar opens a fresh anonymous session on a new residential IP in the site's country and retries with growing waits. In our tests, 5 out of 5 real searches came back with results and 0 errors.
- **No personal data.** Seller name, avatar and profile are never returned.

### How to schedule it

1. Fill the input (for example `searchText: "nike dunk"`, `domain: vinted.fr`, `priceMax: 60`) and save it as a task.
2. In the task, open **Schedules** and pick a cron like `*/10 * * * *` (every 10 minutes) or `0 * * * *` (every hour).
3. Optional: add your Discord webhook in `webhookUrl`.

Each search keeps its own memory. Running several searches? Create one task per search, or give each a `monitorName`.

### Input

| Field | What it does |
|---|---|
| `searchText` | What to look for, as in the Vinted search bar |
| `domain` | Vinted country site (vinted.fr, vinted.de, vinted.co.uk, vinted.com, ...) |
| `priceMin`, `priceMax` | Price range in the site's currency |
| `searchUrl` | Optional: paste a Vinted catalog URL with your filters (category, brand, size, condition) |
| `maxItems` | How many of the newest listings to check per run (default 30) |
| `webhookUrl` | Optional: Discord, Slack, Telegram or any URL that accepts a POST |
| `monitorName` | Optional: name of the memory; a new name starts over |

```json
{
  "searchText": "nike dunk",
  "domain": "vinted.fr",
  "priceMax": 60,
  "webhookUrl": "https://discord.com/api/webhooks/..."
}
```

### Output

```json
{
  "event": "price_drop",
  "id": 10537610686,
  "title": "Nike Dunk Low Panda",
  "price": 30.0,
  "previousPrice": 40.0,
  "priceDropPercent": 25.0,
  "currency": "EUR",
  "priceWithBuyerFee": 32.2,
  "brand": "Nike",
  "size": "42",
  "condition": "Very good",
  "photoUrl": "https://images1.vinted.net/t/.../f800/....webp",
  "url": "https://www.vinted.fr/items/10537610686-nike-dunk-low-panda",
  "favouriteCount": 3,
  "promoted": false,
  "location": null,
  "firstSeenAt": null,
  "checkedAt": "2026-10-26T02:41:36+00:00",
  "domain": "vinted.fr",
  "searchText": "nike dunk"
}
```

`event` is `new` or `price_drop`. Vinted's search does not publish the listing date or city, so `firstSeenAt` tells you when the radar first saw the listing (within your schedule interval) and `location` is filled only when Vinted provides it. Brand, size and condition come in English.

### Pricing

Pay per event: a small fee per check (each run) and a fee per new listing or price drop delivered. Listings you already saw are free, and a run that fails is free. See the Pricing tab for the current values.

### Notes

The first run of a search returns up to `maxItems` current listings as new; from the second run on you only get what changed.

# Actor input Schema

## `searchText` (type: `string`):

What to look for, as you would type it in the Vinted search bar.

## `domain` (type: `string`):

Which Vinted country to search. Prices come in that country's currency.

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

Only listings at or above this price, in the site's currency. Leave empty for no minimum.

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

Only listings at or below this price, in the site's currency. Leave empty for no maximum.

## `searchUrl` (type: `string`):

Paste a Vinted catalog URL with your filters (category, brand, size, condition, price). It replaces the country site above; search text and prices above still apply on top.

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

How many of the newest listings to check per run. Only new listings and price drops are returned and charged.

## `webhookUrl` (type: `string`):

Each new listing or price drop is POSTed here. Discord and Slack webhook URLs and Telegram bot sendMessage URLs (with chat_id in the URL) get a readable message; any other URL gets the listing as JSON.

## `monitorName` (type: `string`):

Memory key for this search. Leave empty and the search itself is the key. Use the same name across runs to keep the same memory, or a new name to start over.

## `proxy` (type: `object`):

Residential proxy is recommended. The exit country follows the Vinted site unless you set one.

## Actor input object example

```json
{
  "searchText": "nike dunk",
  "domain": "vinted.fr",
  "maxItems": 30,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `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 = {
    "searchText": "nike dunk",
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("integrative_cafe_8pc/vinted-deal-radar").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 = {
    "searchText": "nike dunk",
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("integrative_cafe_8pc/vinted-deal-radar").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 '{
  "searchText": "nike dunk",
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call integrative_cafe_8pc/vinted-deal-radar --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,integrative_cafe_8pc/vinted-deal-radar"
        }
    }
}
```

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/IElsRjqoTvybkeqEL/builds/i2Omi5jRyBGkB305R/openapi.json
