Vinted Price Monitor: Price Drop Alerts Without Login
Pricing
from $3.80 / 1,000 price drop returneds
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
a day ago
Last modified
Categories
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 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.
- First run. Nothing to compare with, so it returns a single summary row with
monitorStatus: FIRST_RUNand remembers the prices it found. No listings, no charge. - 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 currentprice,priceDropPctandchangeType: price-drop. - A quiet run. Nothing cheaper, so you get one row with
monitorStatus: NO_NEW_ROWSandlistingCount: 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, pluscountryMedianPriceEurandpriceGapPctso 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
- In the Apify Console. Open the actor page and click Start — the
searchesfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - 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"]}'
- 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.
includeKeywordsandexcludeKeywordsmatch before billing, so "kids" or "replica" inexcludeKeywordsnever 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
| 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 | <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.
Related actors
- 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.