Vinted Price Monitor: Price Drop Alerts Without Login avatar

Vinted Price Monitor: Price Drop Alerts Without Login

Pricing

from $3.80 / 1,000 price drop returneds

Go to Apify Store
Vinted Price Monitor: Price Drop Alerts Without Login

Vinted Price Monitor: Price Drop Alerts Without Login

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.

Pricing

from $3.80 / 1,000 price drop returneds

Rating

0.0

(0)

Developer

Adrian Voss

Adrian Voss

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

a day ago

Last modified

Share

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 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 searchThis actor
Rows you get backevery match, every runonly the ones that got cheaper
Old pricenot availablepreviousPrice on the row
Size of the cutyou work it outpriceDropPct, and a minimum you set
Cost of a quiet runyou pay for every row againstart fee only
Deduplicationyours to doalready 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:
    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:

{
"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:

{
"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:

{
"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

{
"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

queryfoundstatussearchQuerysearchCountrieslistingCountpriceDropCountmonitorStatusmedianPriceEurlistingslistingIdtitlepricepreviousPricepriceDropPcttotalPricecurrencypriceEurcountryMedianPriceEurpriceGapPctbrandsizeconditionconditionRawconditionBucketcountryfavouriteCountsellerTypeimageUrlurlchangeTypefirstSeenAtlastSeenAtdaysListedscrapedAt
carhartt jackettrueOK<median price of the search, eur><all price drops found (full list)> <price (local currency)><price drop %><price in eur (ecb daily rate)><median price in this country, eur><cross-country price gap % (vs median of all countries)><condition (raw label)><condition (standard grade)><seller type (private / business)><change (new / price-drop / gone / seen)><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.

{
"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.

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. 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.

  • Vinted Scraper: New Listing & Price Drop Alerts to Discord — 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 — the same monitoring idea on OLX classifieds.
  • Kleinanzeigen Search — new listing and price alerts on Germany's biggest classifieds site.