Vinted Arbitrage [π°$1.5/1K] | Cross-Country | Price Compare
Pricing
from $1.47 / 1,000 results
Vinted Arbitrage [π°$1.5/1K] | Cross-Country | Price Compare
Scrape Vinted listings across 26 European markets, convert local prices to EUR and compare margins to find buy/sell arbitrage opportunities. Get per-market averages, medians and pairwise gross-margin reports.
Pricing
from $1.47 / 1,000 results
Rating
0.0
(0)
Developer
Ahmed Jasarevic
Maintained by CommunityActor stats
0
Bookmarked
14
Total users
3
Monthly active users
14 days ago
Last modified
Categories
Share
Vinted Cross-Country Arbitrage Scraper
Scrape Vinted listings across 26 European markets in one run and get a normalised cross-country arbitrage report. Listings are converted to EUR using ECB reference rates, so prices from different currencies are directly comparable.
Quick start
{"mode": "CROSS_COUNTRY","query": "Nike Jordan 4","countries": ["fr", "de", "pl", "it"],"maxItems": 120,"minPrice": 5,"maxPrice": 300}
================ CROSS-COUNTRY ARBITRAGE REPORT ================1. PL 164.75 PLN (avg 37.71 EUR / median 40.55 EUR) range 10.84-300 n=1202. FR 71.32 EUR (avg 71.32 EUR / median 40.00 EUR) range 5-299 n=1203. IT 72.64 EUR (avg 72.64 EUR / median 45.00 EUR) range 5-299 n=1204. DE 78.34 EUR (avg 78.34 EUR / median 50.00 EUR) range 5-299 n=120===============================================================BUY in PL β SELL in DEGross margin: 107.7% (before fees, shipping, buyer protection)
Modes
| Mode | Input | Output |
|---|---|---|
SEARCH | query, countries | Listings per market, up to the deep-pagination limit |
CROSS_COUNTRY | query, countries | Same as SEARCH plus the arbitrage report |
TRENDING | countries | Newest listings across markets |
PRODUCT_DETAIL | startUrls | One enriched row per item link (description, category, photos) |
SELLER_PROFILE | startUrls | Every public item of each seller profile |
Supported markets
fr de uk it es nl pl pt be at lt cz sk hu ro
hr fi dk se ee gr ie lu lv si
USA is not supported. api.vinted.com returns
403 {"code":"FORBIDDEN","message":"Access denied."} for anonymous catalogue
reads. If us is passed it is skipped with a warning instead of failing the run.
Deep pagination
Vinted caps catalogue search at 960 rows (10 pages Γ 96 items), no matter
how large maxItems is. Most scrapers on the Store stop there.
This Actor goes deeper. When a search returns more items than the cap, the configured price range is split into bands and each band is swept separately:
{ "maxItems": 1500, "minPrice": 0, "maxPrice": 500 }
π fr page 10 β 96 rows (86 new, 917/1500)π fr widening across 2 price bands (292 items each) to get past the 960-row ceiling
Requires Max Price β without an upper bound there is nothing to partition
against. Set priceBandPartitioning: false to disable.
Filters
| Input | Notes |
|---|---|
query | Keywords. Empty browses the whole catalogue |
minPrice / maxPrice | Local currency. Both are sent to Vinted |
status_ids | new_with_tags, new_without_tags, very_good, good, satisfactory |
brand_ids | Vinted brand IDs, e.g. 53 (Nike), 14 (Adidas) |
size_ids / color_ids | Vinted size / colour IDs |
catalog_ids | Vinted category IDs |
order | newest_first, relevance, price_low_to_high, price_high_to_low, most_popular, highest_viewed |
Condition names are mapped to Vinted's internal status IDs automatically
(new_with_tags=6, new_without_tags=1, very_good=2, good=3,
satisfactory=4). Numeric IDs are also accepted.
Output fields
title price priceWithFee serviceFee currency brand size
condition url imageUrl seller country liked favourite views
promoted photoCount itemId scraped_at
PRODUCT_DETAIL adds description category color availability.
SELLER_PROFILE adds seller_id.
fetchPhotos: true adds allPhotos (every full-size photo URL, comma separated).
Limits
| Plan | Max items per market | Max markets per run |
|---|---|---|
| Free | 50 | 5 |
| Paid | up to 5000 | 5 |
per_page is capped at 96 by Vinted. Requests across a market run in a single
session, one sticky IP per market, because rotating the IP between the warm-up
request and the API calls invalidates the session cookies.
Local development
npm install# Apify CLI (uses the real proxy and Apify storage)apify run --input '{"mode":"SEARCH","query":"nike","countries":["fr"],"maxItems":50}'# or plain Node against local storagemkdir -p storage/key_value_stores/defaultecho '{"mode":"SEARCH","query":"nike","countries":["fr"],"maxItems":50}' > storage/key_value_stores/default/INPUT.jsonnode main.js
Requires Node 20+ (tested on Node 24).
Troubleshooting
| Symptom | Cause |
|---|---|
Unexpected token '<', "<div class"... | Old releases called www.{domain}/api/v2/catalog/items, which returns a 404 HTML page. Fixed in 2.0.0 by moving to api.{domain}/svc-catalogue/items plus a non-JSON guard |
FORBIDDEN / Access denied | US market, or too many requests. Add a proxy or lower maxItems |
| Run returns 0 items | Check the requested price range actually exists for that market, and that the query is spelled the way Vinted indexes it |
| Items repeat across markets | Expected β the same listing is published in several markets. itemId is stable, use it to dedupe |
Notes
Only public catalogue, wardrobe and item-detail endpoints are used. No login, no account credentials, no private data. Respect Vinted's terms of service and the rate limits of the markets you query.