Vinted Scraper & New Listing Alerts - Prices, Brands, Sizes avatar

Vinted Scraper & New Listing Alerts - Prices, Brands, Sizes

Pricing

$1.00 / 1,000 items

Go to Apify Store
Vinted Scraper & New Listing Alerts - Prices, Brands, Sizes

Vinted Scraper & New Listing Alerts - Prices, Brands, Sizes

Scrape Vinted search results: listing title, brand, size, condition, price (incl. buyer protection), favourites and image. Turn on new-listing alerts and run on a schedule to get only newly posted items matching your search. No login, no seller/member data collected.

Pricing

$1.00 / 1,000 items

Rating

0.0

(0)

Developer

Luke Hunter

Luke Hunter

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 hours ago

Last modified

Share

For a vinted price tracker, reselling research, or bulk vinted listings data across any Vinted country. Give it search terms (or your own Vinted catalog URLs) and it returns every item listing on the results page(s) - title, brand, size, condition, price (including buyer protection), favourites and image - read straight from Vinted's own public search pages. No login, no session, no seller data. Turn on new-listing alerts mode (onlyNewSinceLastRun) and run it on a schedule so resellers get new listings matching a saved search - brand, size, price range - the moment they appear.

Pay-per-result: $0.001 per item — 1,000 items = $1.

Quick start (1 minute)

  1. Open the Input tab and enter one or more search terms, e.g. jacket.
  2. Pick the Vinted country to search (defaults to the UK).
  3. Click Start. Export the resulting dataset to CSV/Excel/JSON, or pull it through the API shown below.
{
"searchTerms": ["jacket"],
"country": "uk",
"maxItems": 20
}

That prefilled example finishes in well under a minute and costs $0.04.

How it works

Vinted's own catalog search page (/catalog?search_text=...) is server-rendered HTML - no login or session needed to view it, and no public JSON API exists for search (Vinted's /api/v2/catalog/items endpoint requires a signed-in browser session, so this Actor never uses it). This Actor:

  1. Checks the target domain's robots.txt for the exact path it is about to read (/catalog), and skips that search (reporting why, in the run's status message) if it is disallowed.
  2. Pages through the search results, stopping on the first page with zero items - the real end of the results.
  3. Parses each listing card into one flat dataset row: title, brand, size, condition, price, price including buyer protection, favourites count and image.
  4. Reads Vinted politely: about one request every 3 seconds, and honestly reporting - never disguising or evading - a block, a challenge page (e.g. a bot-check interstitial), or a search with genuinely no results.

Use cases

  • Vinted price tracker: run a search on a schedule and compare price/totalPriceWithFees over time for a brand, item type or your own listings' competitors.
  • Reselling research: see what similar items are actually listed and sold for - brand, size, condition and price together - before pricing your own listing.
  • Vinted listings data: export a whole search's results (title, brand, size, condition, price, favourites) for spreadsheet analysis.

New-listing alerts: get only new items

Turn on onlyNewSinceLastRun and put this Actor on a schedule to get a genuine Vinted new-listing alert: every run after the first delivers (and charges for) only items it hasn't delivered before for that exact search. It's the same wedge as Wellfound Jobs Scraper's job-alerts mode, applied to reselling.

  1. Set your search as usual — a search term with priceFrom/priceTo (a brand or size can go in searchTerms too, e.g. "nike jacket medium"), or a pasted startUrls catalog link with brand/size/price filters already baked in — plus:
{
"searchTerms": ["nike jacket"],
"country": "uk",
"priceFrom": 10,
"priceTo": 40,
"onlyNewSinceLastRun": true,
"maxItems": 100
}
  1. Click Schedule on the run page (or create one under Schedules in the Apify Console) — every 30-60 minutes works well for a fast-moving search.
  2. The first scheduled run is a baseline: it delivers every item currently listed (it's all new to you) and remembers it — you're charged normally for that run. Every run after that only delivers items it hasn't seen before for this exact search.
  3. Add a Webhook under the schedule's Integrations for ACTOR.RUN.SUCCEEDED, pointing at Apify's own Slack/email integration (or a Zapier/Make webhook step) so you see new matching listings the moment a run finds them.

The run's status message tells you what happened: "First run for 1 search: 40 item(s) delivered and remembered; next runs return only new ones." on the baseline, then "3 new item(s) since last run across 1 search (37 already seen)." on later runs. A run that finds nothing new still succeeds with an empty dataset — that's the point of the mode, not a failure.

Each searchTerms entry and each startUrls entry is tracked as its own, independent watch (not one watch for the whole run), keyed on that search's own terms/country/price/sort (or its exact pasted URL) — so you can run several saved searches (different brands, sizes, price bands) in one Actor task without their seen-history mixing. stateStoreName only needs changing if you want to isolate or reset a watch's memory, or run several Actor tasks against the same account without them sharing state.

Input

{
"searchTerms": ["jacket"],
"startUrls": [],
"country": "uk",
"priceFrom": null,
"priceTo": null,
"sortBy": "relevance",
"maxPagesPerSearch": 1,
"maxItems": 60,
"onlyNewSinceLastRun": false,
"stateStoreName": "vinted-scraper-seen-items"
}
FieldTypeDefaultDescription
searchTermsstring[](none)Words to search for, e.g. "jacket". Searched on the domain set by country. Up to 50 terms per run.
startUrlsstring[](none)Full Vinted catalog URLs to scrape instead of (or alongside) search terms, e.g. https://www.vinted.co.uk/catalog?search_text=jacket&price_to=20. Any filters already in the URL are kept; only pagination is added. Must be a vinted.* URL. Up to 50 per run. At least one of searchTerms or startUrls is required.
countrystring"uk"Which Vinted domain to search on for searchTerms (ignored for startUrls, which use their own domain). One of: uk, fr, de, es, it, nl, be, pl, us, au, at, cz, dk, ee, fi, gr, hr, hu, ie, lt, lu, lv, pt, ro, se, si, sk.
priceFrominteger(none)Only include listings priced at or above this amount, in the country's own currency.
priceTointeger(none)Only include listings priced at or below this amount.
sortBy"relevance" | "newest" | "price_low" | "price_high""relevance"How Vinted orders the results.
maxPagesPerSearchinteger11–20. How many result pages to fetch per search term/start URL. Vinted shows about 96 items per page.
maxItemsinteger601–5,000. Hard cap on rows delivered across the whole run — your cost cap.
onlyNewSinceLastRunbooleanfalseNew-listing alerts mode — see above. Delivers and charges only items not delivered by a previous run of the same search.
stateStoreNamestringvinted-scraper-seen-itemsName of the store that remembers what every alert-mode search has already delivered. Change it only to isolate several Actor tasks or reset a watch.

Output fields

CategoryFields
IdentityitemId, url
Listingtitle, brand, size, condition
Priceprice, currency, totalPriceWithFees
EngagementfavouritesCount
MediaimageUrl
Search contextcountry, searchTerm, page, position, scrapedAt

Missing values are returned as null. Nothing is invented.

Output example

{
"itemId": "10156138130",
"url": "https://www.vinted.co.uk/items/10156138130-fat-face-teddy-fleece-age-45",
"title": "Fat face teddy fleece age 4/5",
"brand": "FatFace",
"size": "5 years / 110 cm",
"condition": "Very good",
"price": 4,
"currency": "GBP",
"totalPriceWithFees": 4.62,
"favouritesCount": 0,
"imageUrl": "https://images1.vinted.net/t/02_024e5_kxdcgDrGSSp2hJYWN1hXEwpV/310x430/28e5250f.webp?s=6b5663cff047d9d187bc4a4d2468793ff128e470",
"country": "uk",
"searchTerm": "jacket",
"page": 1,
"position": 1,
"scrapedAt": "2026-09-27T00:00:00.000Z"
}

Use it as an API

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("lukehunter/vinted-scraper").call(
run_input={
"searchTerms": ["jacket", "coat"],
"country": "uk",
"maxItems": 200,
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item["price"], item["currency"])

Pricing and cost control

Pay per delivered listing.

$0.001 per item — 1,000 items = $1.

Rows deliveredCost
20$0.02
1,000$1.00
10,000$10.00

There is no charge for starting a run, and no charge for a search that is skipped, blocked, or produces no results. maxItems gives you a hard upper bound on cost.

Limitations

  • No seller/member data, by design. This Actor only ever collects listing (item) fields - title, brand, size, condition, price, favourites count, image. It never collects seller usernames, profile links, avatars or any other member data, and never fetches a /member/ page (Vinted's own robots.txt disallows it, and this Actor would not fetch it even if it didn't).
  • Search results pages only. This Actor reads Vinted's catalog search pages, not individual item detail pages - so it does not collect a listing's full description, all photos, or the seller's shipping/return terms.
  • No login, no session, no Vinted API. Vinted's own JSON search API needs a signed-in browser session; this Actor never uses it and never logs in on your behalf.
  • A minority of requests may be met with a bot-check/challenge page. When that happens, this Actor reports it honestly (per search, in the run's status message) and stops that search rather than attempting to evade it - you are not charged for a blocked search.
  • Prices reflect the listing at scrape time; a seller can change or remove a listing at any moment.
  • This is an independent tool, not affiliated with, endorsed by, or connected to Vinted. You are responsible for using the collected data in accordance with Vinted's terms and applicable law.

FAQ

Does this collect seller information?

No, never. Only listing (item) fields - see "Limitations" above.

Can I filter by price?

Yes - set priceFrom and/or priceTo in the country's own currency.

Can I use my own Vinted search URL, with filters I've already set (brand, size, etc.)?

Yes - paste it into startUrls. Every filter already in the URL is kept; this Actor only adds pagination.

Why is currency sometimes different from what I expected?

currency is set from the country you searched (or, for a startUrls entry, the domain in that URL) - e.g. uk → GBP, fr → EUR. It is not read from the page itself.

How do I get alerted to new listings instead of the same items every time?

Set onlyNewSinceLastRun: true and put the Actor on a schedule — see "New-listing alerts" above. The first scheduled run delivers everything (and remembers it); later runs only deliver what's new. Each search term or start URL keeps its own history, so several saved searches (different brands, sizes, price bands) never mix up each other's alerts.

Other data tools from the same developer, built to the same standard: official or public sources, hard cost caps, and honest documentation of limits.