← All examples

Scraping the Vinted API

DataDomeCloudflareSessions  · Full write-up →

Vinted's internal API returns structured JSON — listings, prices, seller info — but requires a browser-minted session token protected by DataDome. Sessemi handles both in two API calls.

Step 1 — Mint a session

Load the homepage with a named session. This solves the DataDome challenge and captures the access_token_web cookie.

curlcurl -X POST https://api.sessemi.com/scrape \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.vinted.fr",
    "pool": "residential",
    "country": "FR",
    "session": "my-vinted-fr"
  }'

Takes ~6 seconds on the first call. The session is now alive — cookies stored, IP pinned to France.

Step 2 — Hit the API

Scrape the product search endpoint with the same session. Sessemi replays the cookies through its fast path — no browser needed.

curlcurl -X POST https://api.sessemi.com/scrape \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.vinted.fr/api/v2/catalog/items?search_text=nike&per_page=20",
    "pool": "residential",
    "country": "FR",
    "session": "my-vinted-fr"
  }'

Returns the JSON response in ~4 seconds. Every additional API call on the same session reuses the token.

What you get back
{ "items": [ { "id": 8761034138, "title": "Zip brésil noir", "price": { "amount": "25.00", "currency_code": "EUR" }, "brand_title": "Nike", "size_title": "L / 40", "user": { "login": "seller_123" }, "photo": { "url": "https://images1.vinted.net/..." } }, ... ], "pagination": { "total_entries": 48291, "total_pages": 2415 } }
Cross-market scraping

Same endpoint structure across all 26 Vinted domains. Swap the TLD and country code:

domainsvinted.fr  → country: FR     vinted.de  → country: DE
vinted.es  → country: ES     vinted.it  → country: IT
vinted.nl  → country: NL     vinted.be  → country: BE
vinted.pl  → country: PL     vinted.pt  → country: PT
vinted.co.uk → country: GB   vinted.lt  → country: LT
...
Python — full example

Scrape Nike listings from Vinted France and Germany in one script:

pythonimport requests, json

API_KEY = "YOUR_KEY"
API_URL = "https://api.sessemi.com/scrape"
headers = {"X-API-Key": API_KEY, "Content-Type": "application/json"}

markets = [("fr", "FR"), ("de", "DE")]

# Step 1: Mint sessions (one per market)
for domain, country in markets:
    requests.post(API_URL, headers=headers, json={
        "url": f"https://www.vinted.{domain}",
        "pool": "residential",
        "country": country,
        "session": f"vinted-{domain}"
    })

# Step 2: Search across markets
for domain, country in markets:
    resp = requests.post(API_URL, headers=headers, json={
        "url": f"https://www.vinted.{domain}/api/v2/catalog/items"
               f"?search_text=nike&per_page=20&order=newest_first",
        "pool": "residential",
        "country": country,
        "session": f"vinted-{domain}"
    })

    data = resp.json()
    items = json.loads(data["content"]).get("items", [])
    for item in items:
        print(f"[{domain.upper()}] {item['title']}"
              f" — {item['price']['amount']} {item['price']['currency_code']}"
              f" — {item.get('brand_title', 'N/A')}")

Sessions expire after 5 minutes of inactivity or 1 hour total. On a 401, re-mint by loading the homepage again — Sessemi handles the challenge solve automatically.

Useful Vinted endpoints
endpoints/api/v2/catalog/items?search_text={query}     — product search
/api/v2/users/{id}/items                       — seller's listings
/api/v2/items/{id}                             — product details
/api/v2/users/{id}                             — seller profile

500 free credits — enough to test this example end to end.

Get your API key →