Vinted Arbitrage [πŸ’°$1.5/1K] | Cross-Country | Price Compare avatar

Vinted Arbitrage [πŸ’°$1.5/1K] | Cross-Country | Price Compare

Pricing

from $1.47 / 1,000 results

Go to Apify Store
Vinted Arbitrage [πŸ’°$1.5/1K] | Cross-Country | Price Compare

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

Ahmed Jasarevic

Maintained by Community

Actor stats

0

Bookmarked

14

Total users

3

Monthly active users

14 days ago

Last modified

Share

Vinted Cross-Country Arbitrage Scraper

Apify Actor Node

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=120
2. FR 71.32 EUR (avg 71.32 EUR / median 40.00 EUR) range 5-299 n=120
3. IT 72.64 EUR (avg 72.64 EUR / median 45.00 EUR) range 5-299 n=120
4. DE 78.34 EUR (avg 78.34 EUR / median 50.00 EUR) range 5-299 n=120
===============================================================
BUY in PL β†’ SELL in DE
Gross margin: 107.7% (before fees, shipping, buyer protection)

Modes

ModeInputOutput
SEARCHquery, countriesListings per market, up to the deep-pagination limit
CROSS_COUNTRYquery, countriesSame as SEARCH plus the arbitrage report
TRENDINGcountriesNewest listings across markets
PRODUCT_DETAILstartUrlsOne enriched row per item link (description, category, photos)
SELLER_PROFILEstartUrlsEvery 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

InputNotes
queryKeywords. Empty browses the whole catalogue
minPrice / maxPriceLocal currency. Both are sent to Vinted
status_idsnew_with_tags, new_without_tags, very_good, good, satisfactory
brand_idsVinted brand IDs, e.g. 53 (Nike), 14 (Adidas)
size_ids / color_idsVinted size / colour IDs
catalog_idsVinted category IDs
ordernewest_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

PlanMax items per marketMax markets per run
Free505
Paidup to 50005

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 storage
mkdir -p storage/key_value_stores/default
echo '{"mode":"SEARCH","query":"nike","countries":["fr"],"maxItems":50}' > storage/key_value_stores/default/INPUT.json
node main.js

Requires Node 20+ (tested on Node 24).


Troubleshooting

SymptomCause
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 deniedUS market, or too many requests. Add a proxy or lower maxItems
Run returns 0 itemsCheck the requested price range actually exists for that market, and that the query is spelled the way Vinted indexes it
Items repeat across marketsExpected β€” 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.