Vinted Arbitrage Scanner
One query, priced across up to 23 Vinted country sites: median, quartiles, spread percent and an opportunity score per country - where an item is cheap and...
One query, priced across up to 23 Vinted country sites: median, quartiles, spread percent and an opportunity score per country - where an item is cheap and where it sells high. Aggregates only, zero seller data by construction. About $0.02 per full comparison.
$3.00 / 1,000 · 100.0% success over 29 public runs in the last 30 days.
Run it on Apify → Free to try - runs bill per result on your own account.
What you give it
Every field is optional unless marked; sensible defaults do the rest.
| Field | Type | What it does | Default |
|---|---|---|---|
searchQuery |
string | What to price-compare across country sites, exactly as you would type it in Vinted's search box, e.g. "nike air max 90" or "barbour jacket". | nike air max 90 |
countries |
array | Vinted country sites to compare (2-23). Default: eight euro markets, so every spread is same-currency. Non-euro sites (co.uk, pl, cz, se, dk, hu, ro, com) are compared within their own currency only - amounts are never converted. | ["fr", "de", "es", "it", "nl", "be", "pt", "at"] |
maxItemsPerCountry |
integer | Priced listings sampled per site (20-500). One catalog page is ~96; bigger samples cost more requests and steadier medians. | 96 |
priceMin |
integer | Ignore listings below this price (site currency) - cuts junk from the sample. | - |
priceMax |
integer | Ignore listings above this price (site currency). | - |
maxItems |
integer | Upper bound on output rows (one per country). | 25 |
reportFailures |
boolean | When a run fails, send the developer the actor name and build, an error category, the error message (truncated) and a one-way hash of your input - so a bug can be fixed without anyone asking you to reproduce it. Your input itself, your results and your identity are never sent, and successful runs send nothing at all. Switch this off and the actor behaves exactly the same. | True |
What you get back
One JSON object per result, with exactly these fields - no seller identities, no contact data, ever.
A real result row from a recent run:
{
"cheapestInCurrencyGroup": true,
"currency": "EUR",
"domain": "fr",
"matchedListings": 960,
"maxCents": 6500,
"medianCents": 1499,
"medianTotalCents": 1644,
"minCents": 200,
"opportunityScore": 0,
"p25Cents": 700,
"p75Cents": 2300,
"sampleSize": 40,
"searchQuery": "nike",
"site": "vinted.fr",
"spreadPct": 0
}
| Field | Type | Meaning |
|---|---|---|
searchQuery |
string | The query the row was sampled for. |
domain |
string | Country site suffix, e.g. fr, de, co.uk. |
site |
string | Full site name. |
currency |
['string', 'null'] | Currency of every amount in this row. |
matchedListings |
['integer', 'null'] | How many listings matched the query on this site. |
sampleSize |
integer | Priced listings sampled for the statistics. |
medianCents |
integer | Median asking price in minor units. |
p25Cents |
integer | 25th-percentile asking price. |
p75Cents |
integer | 75th-percentile asking price. |
minCents |
integer | Cheapest sampled asking price. |
maxCents |
integer | Highest sampled asking price. |
medianTotalCents |
['integer', 'null'] | Median total buyer price including buyer protection, when reported. |
spreadPct |
integer | How far this country's median sits above the cheapest median in the same currency, in percent. 0 = this is the cheapest market. |
cheapestInCurrencyGroup |
boolean | True for the cheapest market of its currency group - the buy side of the arbitrage. |
opportunityScore |
integer | spreadPct clamped to 0-100: how attractive selling into this market is versus buying in the group's cheapest. |
Health
100.0% success over 29 public runs in the last 30 days. Live record, failures included: status page.
Full documentation, examples and the AI-assistant prompt live on the store page.