# Vinted Price Monitor: Price Drop Alerts Without Login (`accountable_eel/vinted-price-monitor`) Actor

Vinted price monitor: schedule a saved search and get back only the listings that got cheaper since the last run, with the old price, the new price and the drop percentage. Price drop alerts to Discord, Slack or Telegram. 27 countries, no login. A quiet run with nothing cheaper is free.

- **URL**: https://apify.com/accountable\_eel/vinted-price-monitor.md
- **Developed by:** [Adrian Voss](https://apify.com/accountable_eel) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.80 / 1,000 price drop returneds

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

## Vinted Price Monitor: Price Drop Alerts Without Login

This is a **price monitor**, not a search dump. Point it at a Vinted search, put it on a schedule,
and every run returns **only the listings whose price has fallen since the last run** — with the old
price, the new price and the drop percentage on the row. A run where nothing got cheaper returns one
summary row and costs you the start fee alone.

The general-purpose [Vinted Scraper](https://apify.com/accountable_eel/vinted-listing-lookup) can do
this too, but it ships as a full-catalogue scraper: you have to turn monitoring on, turn new
listings off, pick a drop threshold, and then read price drops out of a 42-column row. Here that is
the default and the only thing the actor is shaped for. If you want everything a Vinted search
returns — brand, size and category filters, seller details, full photo sets, sold-signal and
sell-through tracking — use the parent actor instead; it is listed under **Related actors** at the
bottom.

### Who it's for

- **Resellers and deal hunters** watching a saved search for a markdown, hourly or every 10 minutes.
- **Anyone hunting one specific item** ("Arc'teryx Beta AR, size M, under 200 euro") who wants a
  message the moment the seller cuts the price, not a daily list they have to diff by hand.
- **Automations.** One row per price drop, straight into Google Sheets, n8n, Make, Zapier, Clay or
  your own bot. Nothing to deduplicate: the actor has already removed everything that did not change.

### What this does that a plain Vinted search doesn't

A Vinted search shows you today's asking prices. It cannot tell you that a jacket was 85 euro
yesterday and is 62 euro now, because it has no memory. This actor keeps one.

| | Plain search | This actor |
|---|---|---|
| Rows you get back | every match, every run | only the ones that got cheaper |
| Old price | not available | `previousPrice` on the row |
| Size of the cut | you work it out | `priceDropPct`, and a minimum you set |
| Cost of a quiet run | you pay for every row again | start fee only |
| Deduplication | yours to do | already done |

### How the price memory works

Each search line becomes a **watchlist**. The actor remembers every listing ID and its price between
runs, in your own account's storage.

1. **First run.** Nothing to compare with, so it returns a single summary row with
   `monitorStatus: FIRST_RUN` and remembers the prices it found. No listings, no charge.
2. **Every run after.** A listing comes back only when its price has fallen by at least
   *Smallest price drop worth an alert* (5% by default) since it was last seen. The row carries
   `previousPrice`, the current `price`, `priceDropPct` and `changeType: price-drop`.
3. **A quiet run.** Nothing cheaper, so you get one row with `monitorStatus: NO_NEW_ROWS` and
   `listingCount: 0`. Set *What a run with no price drops writes to the results* to "Nothing" if your
   integration would rather read an empty dataset.

Two schedules with different price filters keep **separate** memories, so they never overwrite each
other. Give a *Watchlist name* to pin one memory across a filter change.

Want new listings as well? Turn on *Also return listings that are brand new*. They arrive as
ordinary rows marked `changeType: new`.

### Countries

27 Vinted sites, one code per line: `fr`, `de`, `it`, `es`, `nl`, `be`, `at`, `pl`, `cz`, `sk`, `lt`,
`lu`, `pt`, `uk`, `ie`, `se`, `fi`, `dk`, `hu`, `ro`, `hr`, `gr`, `ee`, `lv`, `si`, `us`
(vinted.com) and `au` (vinted.com.au). Keywords run once in every country you pick; a pasted Vinted
link runs on its own country site. Prices come back in each site's own currency, plus a euro
conversion at the European Central Bank's daily rate, so a drop on vinted.pl is comparable with one
on vinted.fr.

### What you get

One row per price drop:

- **The drop** — `previousPrice`, `price`, `priceDropPct`, `totalPrice` (including Vinted's buyer
  protection fee), `currency`, `priceEur`.
- **The listing** — `listingId`, `title`, `brand`, `size`, `condition`, `favouriteCount`,
  `sellerType`, `imageUrl`, `url`, `country`.
- **The history** — `changeType`, `firstSeenAt`, `lastSeenAt`, `daysListed`.
- **The search** — `searchQuery`, `searchCountries`, `listingCount`, `priceDropCount`,
  `monitorStatus`, `medianPriceEur`, plus `countryMedianPriceEur` and `priceGapPct` so you can see
  whether the new price is actually below the market or just below its own old one.

### Price drop alerts to Discord, Slack or Telegram

Paste a webhook into *Send alerts to* and each drop is posted as one message — photo, title, old
price struck through, new price, size, condition, country and link, with a `PRICE DROP -23%` badge.

- **Discord / Slack** — the channel's webhook URL.
- **Telegram** — `https://api.telegram.org/bot<token>/sendMessage?chat_id=<chat id>`.
- **Anything else** — receives JSON, which is what n8n, Make and your own bot want.

Messages are free and never billed. A webhook that fails does not fail the run: the row's
`notifyErrors` says what went wrong. The link itself is stored encrypted and never written to the
results or the log.

### Price

- **Price drop returned**: $5 per 1,000 listings

Plus a $0.00005 start fee per run. Each event above is billed independently, only when it actually returns data — misses (`found:false`) are never charged.

- **Price drops:** $5 per 1,000 rows returned, plus a $0.00005 start fee per run.
- **A quiet run costs the start fee only.** Nothing cheaper means no rows, and no rows means no
  charge — even though the actor still fetched and compared every page.
- A search that returns nothing, or a country that refuses the run, is never billed.

Worked example. One watchlist, checked hourly, on a search where about 3 listings a day get cheaper:
3 × 30 = 90 rows a month, **about $0.45 plus 720 start fees ($0.04)** — roughly **$0.49 a month**.
The cost of a watchlist is driven by how often prices actually move, not by how often you check.

### How to use

1. **In the Apify Console.** Open the actor page and click **Start** — the `searches` field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
2. **Via the API.** Call it directly with a POST request — no Console needed once you have an API token:
   ```bash
   curl "https://api.apify.com/v2/acts/accountable_eel~vinted-price-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
     -X POST \
     -H "Content-Type: application/json" \
     -d '{"searches":["carhartt jacket"]}'
   ```
3. **On a schedule.** Save this actor as an Apify **Task** with the input you want, then add a **Schedule** (hourly, daily, weekly) so it runs on its own — no server of your own required.

Tips:

- **Check often, it is nearly free.** A run that finds nothing costs $0.00005. Every 10 minutes is a
  reasonable cadence for a hot search.
- **Paste a Vinted link** when you need a filter this actor doesn't list (brand, size, category,
  condition, colour). Everything in the link is kept; monitoring only forces newest-first ordering.
- **Raise the threshold on noisy searches.** Sellers nudge prices by a euro to resurface a listing;
  a minimum of 10 or 15% keeps those out of your channel.
- `includeKeywords` and `excludeKeywords` match before billing, so "kids" or "replica" in
  `excludeKeywords` never costs you a row.

### How to filter

Every filter below is optional and off by default — leave it out and you get the exact same price
drops as before. `minPrice`/`maxPrice` and `includeKeywords`/`excludeKeywords` already existed;
this section adds `conditions` and `brands`. `availability` and `sortBy` are deliberately not
offered here: this actor is a price-drop monitor, always newest-first, and a "reserved"/"sold"
state would fight with its own delta memory.

**1. Only near-new price drops, in two countries:**

```json
{
  "searches": ["carhartt jacket"],
  "countries": ["fr", "de"],
  "conditions": ["new_with_tags", "new", "like_new"]
}
```

`conditions` matches Vinted's own 5 grades (New with tags / New without tags / Very good / Good /
Satisfactory) however that country's site writes them — "Neuf avec étiquette" on vinted.fr, "Neu,
mit Etikett" on vinted.de. A listing this run cannot match to a known label comes back as
`unknown`; add `"unknown"` to the list to keep those too, or leave it off to drop them.

**2. Like-new Carhartt, cheapest first is not offered — but named brands are:**

```json
{
  "searches": ["denim jacket"],
  "brands": ["carhartt", "levis"],
  "minPrice": 15,
  "maxPrice": 80
}
```

`brands` is a case-insensitive contains match against the brand this run already reads off the
page (no extra request) — combine it with the existing `minPrice`/`maxPrice` to only get price
drops on the brands and range you watch.

**3. Available only, unknown condition excluded, biggest drops only:**

```json
{
  "searches": ["stone island"],
  "conditions": ["new_with_tags", "new", "like_new", "good", "fair"],
  "minPriceDropPct": 15
}
```

Leaving `"unknown"` out of `conditions` drops listings Vinted gives no grade for, and
`minPriceDropPct` (already existed) keeps only the cuts worth an alert.

### Input

```json
{
  "searches": [
    "carhartt jacket"
  ]
}
```

One search per line: plain keywords such as "carhartt jacket", or a search link copied from your browser on any Vinted country site (its own filters such as brand, size and category are kept). Each line becomes a watchlist: the first run remembers the prices it finds, and every run after it returns only the listings that got cheaper. Keywords run once in every country you pick below; a pasted link runs on its own country site. No login required. Accepted formats: carhartt, levis 501, https://www.vinted.fr/catalog?search\_text=stone%20island\&order=newest\_first.

### Sample output

| query | found | status | searchQuery | searchCountries | listingCount | priceDropCount | monitorStatus | medianPriceEur | listings | listingId | title | price | previousPrice | priceDropPct | totalPrice | currency | priceEur | countryMedianPriceEur | priceGapPct | brand | size | condition | conditionRaw | conditionBucket | country | favouriteCount | sellerType | imageUrl | url | changeType | firstSeenAt | lastSeenAt | daysListed | scrapedAt |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| carhartt jacket | true | OK | <search> | <countries searched> | <price drops returned> | <price drops since last run> | <monitoring status> | \<median price of the search, eur> | \<all price drops found (full list)> | <vinted listing id> | <title> | \<price (local currency)> | <price when last seen> | \<price drop %> | <price incl. buyer protection fee> | <currency> | \<price in eur (ecb daily rate)> | \<median price in this country, eur> | \<cross-country price gap % (vs median of all countries)> | <brand> | <size> | <condition> | \<condition (raw label)> | \<condition (standard grade)> | <vinted country> | <favourites> | \<seller type (private / business)> | <main photo> | <listing link> | \<change (new / price-drop / gone / seen)> | <first seen on a run> | <last seen on a run> | \<days listed (first to last seen)> | 1970-01-01T00:00:00.000Z |

A real row from the live smoke test (`carhartt jacket`, vinted.fr, 5 listings checked,
2026-09-26). This is what run one looks like: the prices are now remembered, and the drops start
next run.

```json
{
  "query": "carhartt jacket",
  "found": true,
  "status": "OK",
  "searchQuery": "carhartt jacket",
  "searchCountries": "fr",
  "listingCount": 0,
  "priceDropCount": 0,
  "monitorStatus": "NO_NEW_ROWS",
  "medianPriceEur": 59.99,
  "scrapedAt": "2026-09-26T00:06:19.956Z"
}
```

### Use it from Clay, n8n, Make, or an AI agent

This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.

```bash
curl "https://api.apify.com/v2/acts/accountable_eel~vinted-price-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"searches":["carhartt jacket"]}'
```

**n8n.** Add an HTTP Request node: Method `POST`, URL `https://api.apify.com/v2/acts/accountable_eel~vinted-price-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>`, Body Content Type `JSON`, JSON Body `{"searches":["carhartt jacket"]}` (swap in an expression from an earlier node for a real value).

**Clay.** Add an "HTTP API" column: Method `POST`, URL `https://api.apify.com/v2/acts/accountable_eel~vinted-price-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>`, Body `{"searches":["{{search}}"]}`, mapping the row's search into the `searches` array.

**MCP.** In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Vinted Price Monitor: Price Drop Alert, Saved Searches" — the agent will find and run this actor.

### vs. alternatives

- **A Vinted saved search with email alerts.** Free, but it tells you about new listings only —
  Vinted does not notify you when a price on an existing listing falls, which is the drop most worth
  catching.
- **A general Vinted scraper.** Returns every match every run. You pay for the same unchanged
  listings again and again, and you have to diff them yourself.
- **The parent actor,** [Vinted Scraper](https://apify.com/accountable_eel/vinted-listing-lookup).
  Same engine, everything switched on: brand/size/category/condition/colour filters, listing
  details, seller data, full photo sets, sold-signal and sell-through tracking, up to 2,000 listings
  per search. Use it when you want the whole catalogue; use this one when you want the cuts.

### Data & privacy

- **No login, no cookies, no account.** There is no input field that could take a Vinted session,
  and none is needed: everything here comes from Vinted's public search pages.
- **Seller identity is not returned.** You get `sellerType` (private or business), never a seller
  name, profile link or raw Vinted user ID.
- **Your webhook link is a secret input** — encrypted at rest, never logged, never written into a
  result row.
- **The price memory holds listing IDs and prices only**, in your own account's storage, and only
  for the watchlists you run.

### FAQ

**Nothing came back on the first run. Is it broken?**
No. The first run has no earlier price to compare with, so it stores what it finds and returns one
summary row (`monitorStatus: FIRST_RUN`). Drops start from the second run.

**How small a drop will it catch?**
Whatever you set. The default is 5%, measured on the item price, not the total with Vinted's fee.

**Can I get new listings too?**
Yes — turn on *Also return listings that are brand new*. They come back marked
`changeType: new` and are billed like any other row.

**Does it tell me when something sold?**
No. Sold and delisted detection lives in the parent actor's sold-signal mode; this one is about
price changes on live listings. See **Related actors**.

**What happens if Vinted refuses a page?**
The run retries on fresh connections, then once on a residential connection, for that page only.
That costs you nothing extra. If it still fails, the row says `BLOCKED` and is not billed.

**Can two schedules share one watchlist?**
Give them the same *Watchlist name*. Leave it empty and each set of filters gets its own memory.

### Related actors

- **[Vinted Scraper: New Listing & Price Drop Alerts to Discord](https://apify.com/accountable_eel/vinted-listing-lookup)**
  — the parent, and the full-capability version: every Vinted filter (brand, size, category,
  condition, colour, seller type), listing details and photo sets, sold-signal and sell-through
  tracking, cross-country price gaps, up to 2,000 listings per search, and the same Discord, Slack
  and Telegram alerts.
- **[OLX Listing Scraper](https://apify.com/accountable_eel/olx-listing-lookup)** — the same
  monitoring idea on OLX classifieds.
- **[Kleinanzeigen Search](https://apify.com/accountable_eel/kleinanzeigen-search-lookup)** — new
  listing and price alerts on Germany's biggest classifieds site.

# Actor input Schema

## `searches` (type: `array`):

One search per line: plain keywords such as "carhartt jacket", or a search link copied from your browser on any Vinted country site (its own filters such as brand, size and category are kept). Each line becomes a watchlist: the first run remembers the prices it finds, and every run after it returns only the listings that got cheaper. Keywords run once in every country you pick below; a pasted link runs on its own country site. No login required. Accepted formats: carhartt, levis 501, https://www.vinted.fr/catalog?search\_text=stone%20island\&order=newest\_first. You're only charged for the ones we actually find — a miss costs nothing.

## `countries` (type: `array`):

One country code per line. Keywords run once in each: fr, de, it, es, nl, be, at, pl, cz, sk, lt, lu, pt, uk, ie, se, fi, dk, hu, ro, hr, gr, ee, lv, si, us (vinted.com) and au (vinted.com.au). Prices come back in each site's own currency plus a euro conversion. Ignored for pasted Vinted links, which use their own country. Leave empty for France.

## `testRun` (type: `boolean`):

Turn this on to test your input on a small sample before running the full list. Turn it off to process everything.

## `onlyFound` (type: `boolean`):

Only keep rows where something was actually found. Misses are always free, whether or not you show them here.

## `includeKeywords` (type: `array`):

Optional. Only keep results that mention at least one of these words (e.g. a job title, a city, a product name). Leave empty to keep everything.

## `excludeKeywords` (type: `array`):

Optional. Drop any result that mentions one of these words. Leave empty to skip nothing.

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

Optional. Stop the run once this many results have been found — useful for a quick, cheap sample. Leave blank for no limit.

## `maxListingsPerSearch` (type: `integer`):

Vinted shows 96 listings per page and stops any single search at 960. Above 960 (up to 2,000) this actor splits the search into price bands and merges them newest first. This is how deep the watchlist looks, not how many rows you get back: you only pay for the listings that actually got cheaper.

## `minPrice` (type: `integer`):

Optional. Sent to Vinted as its own price filter, on the item price before the buyer protection fee. On a multi-country run it applies in each site's currency (euros on vinted.fr, zloty on vinted.pl).

## `maxPrice` (type: `integer`):

Optional. Sent to Vinted as its own price filter, on the item price before the buyer protection fee. Leave empty for no maximum.

## `conditions` (type: `array`):

Optional. One per line: new\_with\_tags, new, like\_new, good, fair, unknown. Leave empty to keep every condition. Matched against Vinted's own 5 grades (New with tags, New without tags, Very good, Good, Satisfactory) in whichever of the 27 site languages this listing came from; a listing this actor could not match to a known label is `unknown` — never a guessed grade. Applied while paging, so the actor keeps reading pages until it has enough matching listings.

## `brands` (type: `array`):

Optional. Keep only listings whose brand contains one of these names (case-insensitive, e.g. "Carhartt"). Checked against the brand this run already returns — no extra request.

## `deltaMode` (type: `boolean`):

On by default: this is what the actor is for. The first run remembers every listing and price it finds and returns a single summary row. From the second run on, a listing comes back only when its price has fallen by at least the percentage below since it was last seen, with the old price, the new price and the drop percentage on the row. Unchanged listings are removed before you are billed, so a quiet run only costs the start fee. Schedule it every 10 minutes or hourly, and have each drop posted straight to Discord, Slack or Telegram with "Send alerts to" below. Turn this off to get every matching listing instead, like an ordinary search.

## `deltaName` (type: `string`):

Leave empty and one is derived from this run's price filters, so two schedules with different filters keep separate price memories. Type your own name to keep one memory across a filter change.

## `minPriceDropPct` (type: `integer`):

A listing must be at least this much cheaper than when it was last seen to come back as a price drop. 5 means a 20 euro item has to fall by at least 1 euro. Raise it to only hear about real cuts.

## `alertOnPriceDrop` (type: `boolean`):

On by default. The drop is measured on the item price, not the total with the buyer protection fee. Turning this off with the checkbox above on leaves nothing to return.

## `alertOnNew` (type: `boolean`):

Off by default, so your results stay price drops only. Turn it on to also get listings this watchlist has never seen, each marked new rather than price-drop. They are billed like any other row.

## `skipFirstRun` (type: `boolean`):

The first run of a watchlist has no earlier price to compare with, so it returns one summary row and no listings either way. This matters only if you also turned on "Also return listings that are brand new": with it on, the first run remembers everything silently instead of returning a hundred rows at once.

## `quietRunOutput` (type: `string`):

A quiet run is a search with nothing cheaper since the last run. "One summary row" (the default) keeps the row with monitorStatus NO\_NEW\_ROWS and zero listings. "Nothing" writes zero items, so a bot or integration reading the results never has to skip rows. A search that failed still returns its error row.

## `notifyUrl` (type: `string`):

Optional. After the price drops are billed, each one is posted here as one message: photo, title, the old and new price, size, condition, country and link, with a PRICE DROP -X% badge. Discord or Slack: paste the channel's webhook URL. Telegram: https://api.telegram.org/bot<token>/sendMessage?chat\_id=<chat id>. Any other URL receives JSON. Messages are free, and a message that fails never fails the run (the row's notifyErrors says why). Stored encrypted, never logged or written to the results.

## `notifyFormat` (type: `string`):

Leave on "Detect from the link": discord.com links get Discord messages, hooks.slack.com Slack, api.telegram.org Telegram, anything else JSON. Pick one only to override that.

## `maxNotificationsPerRun` (type: `integer`):

Up to 100. Above this, one "+N more" message says how many more price drops are in the run's results, so a busy run never floods the channel. 0 sends only that one summary message.

## `columns` (type: `array`):

Choose which pieces of information to include in each result row. All are included by default.

## `expandRows` (type: `boolean`):

When on, each listing found gets its own row instead of being grouped under its search. You're still only charged once per search, no matter how many rows it produces.

## `residentialFallback` (type: `boolean`):

On by default. Vinted sometimes refuses Apify's shared datacenter connections on a country site (seen on vinted.de). The actor first retries on fresh datacenter connections, then on a residential one, for that page only. It costs you nothing extra: you still pay per listing returned. Turn it off to never use residential connections.

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

Parallel requests. Keep conservative — this target has no browser fallback, so getting blocked costs more than slow-and-steady.

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

Apify Proxy config. Residential recommended for anti-bot-sensitive targets.

## Actor input object example

```json
{
  "searches": [
    "carhartt jacket"
  ],
  "countries": [
    "fr"
  ],
  "testRun": false,
  "onlyFound": false,
  "includeKeywords": [],
  "excludeKeywords": [],
  "maxListingsPerSearch": 96,
  "conditions": [],
  "brands": [],
  "deltaMode": true,
  "deltaName": "",
  "minPriceDropPct": 5,
  "alertOnPriceDrop": true,
  "alertOnNew": false,
  "skipFirstRun": false,
  "quietRunOutput": "summary",
  "notifyFormat": "auto",
  "maxNotificationsPerRun": 20,
  "columns": [
    "searchQuery",
    "searchCountries",
    "listingCount",
    "priceDropCount",
    "monitorStatus",
    "medianPriceEur",
    "listings",
    "listingId",
    "title",
    "price",
    "previousPrice",
    "priceDropPct",
    "totalPrice",
    "currency",
    "priceEur",
    "countryMedianPriceEur",
    "priceGapPct",
    "brand",
    "size",
    "condition",
    "conditionRaw",
    "conditionBucket",
    "country",
    "favouriteCount",
    "sellerType",
    "imageUrl",
    "url",
    "changeType",
    "firstSeenAt",
    "lastSeenAt",
    "daysListed"
  ],
  "expandRows": true,
  "residentialFallback": true,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "searches": [
        "carhartt jacket"
    ],
    "countries": [
        "fr"
    ],
    "includeKeywords": [],
    "excludeKeywords": [],
    "conditions": [],
    "brands": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("accountable_eel/vinted-price-monitor").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 = {
    "searches": ["carhartt jacket"],
    "countries": ["fr"],
    "includeKeywords": [],
    "excludeKeywords": [],
    "conditions": [],
    "brands": [],
}

# Run the Actor and wait for it to finish
run = client.actor("accountable_eel/vinted-price-monitor").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 '{
  "searches": [
    "carhartt jacket"
  ],
  "countries": [
    "fr"
  ],
  "includeKeywords": [],
  "excludeKeywords": [],
  "conditions": [],
  "brands": []
}' |
apify call accountable_eel/vinted-price-monitor --silent --output-dataset

```

## MCP server setup

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

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/fdUSby3V17q75ZLBV/builds/Mf5ygRTNHlEABPsVs/openapi.json
