DEV Community

Cover image for Vinted Scraper in Python — Honest Developer Guide (2026)
KazKN
KazKN

Posted on

Vinted Scraper in Python — Honest Developer Guide (2026)

Vinted Scraper in Python — Honest Developer Guide (2026)

Search GitHub for "vinted scraper python" and you get about 60 repositories. Half of them are abandoned. A third haven't shipped a working request in six months. The remaining handful actually scrape Vinted in 2026. This guide is the honest read on which approach fits which use case — DIY in Python with curl-cffi, the half-DIY route via a Vinted API wrapper, and the fully managed escape hatch when you decide your time is worth more than your proxy bill.

I run Vinted Smart Scraper on Apify (97,900+ runs, 26 EU markets) so I have skin in the game on the managed side, but I've also maintained the DIY stack and the breakage cycle is real. Read this before you git clone something that's going to break in two weeks.

🐍 The state of the Python ecosystem for Vinted

Three categories of repo dominate when you search "vinted scraper python" on GitHub:

Category Examples State in 2026
vinted-api-wrapper style Pawikoski/vinted-api-wrapper, Giglium/vinted_scraper Active, but break frequently when Vinted ramps Datadome
Personal demo scrapers Toffaa/Pynted, Seb943/scrapeVIN, Gertje823/Vinted-Scraper Mostly archived; last commits 2023-2024
PyPI installable packages vinted-scraper on PyPI, vinted-api-wrapper on PyPI Maintained sporadically; install before you trust

The pattern is the same across all of them: someone writes a clean wrapper around Vinted's internal /api/v2/catalog/items endpoint, it works for 3-6 months, Vinted upgrades Datadome, the wrapper breaks, the maintainer doesn't have time, the repo goes stale.

That's not a knock on the maintainers. It's the structural reality of scraping a Datadome-protected marketplace as a side project. Which leads to the question every Python dev should answer before they pick a path.

🛤️ Three paths, ranked by how much of your weekend you want back

Path 1 — Pure DIY (requests + curl-cffi + residential proxies)

For Python devs who want full control, ~20 hours initial build, 2-4 hours/month maintenance, and ~€80-200/month in residential proxy costs.

# requirements.txt: curl-cffi>=0.7
from curl_cffi import requests

def search_vinted(query: str, country: str = "fr", proxy_url: str | None = None):
    session = requests.Session(impersonate="chrome131")
    headers = {
        "Accept": "application/json",
        "Accept-Language": {"fr": "fr-FR,fr;q=0.9", "de": "de-DE,de;q=0.9"}[country],
    }
    proxies = {"https": proxy_url} if proxy_url else None
    url = f"https://www.vinted.{country}/api/v2/catalog/items"
    params = {"search_text": query, "per_page": 96}

    resp = session.get(url, params=params, headers=headers, proxies=proxies, timeout=30)
    resp.raise_for_status()
    return resp.json()["items"]


# Usage
items = search_vinted("nike air max 90", country="fr",
                     proxy_url="http://user:pass@gate.smartproxy.com:7000")
print(len(items), "items returned from vinted.fr")
Enter fullscreen mode Exit fullscreen mode

What this code is not doing — and what you'll need to add for production:

  • No Datadome cookie persistence. First request might 403. Need session retry with cookie warming.
  • No fingerprint variation. All requests look identical; Datadome correlates and bans the IP.
  • No country session pool. Cross-country runs share state and get all flagged at once.
  • No adaptive backoff. Uniform timing is robotic.
  • No JA3 rotation. chrome131 impersonation works today; Datadome may fingerprint it next quarter.

Realistic effort to get a stable DIY stack: 15-25 hours initial, plus continuous maintenance. If you bill yourself at $50/hour, that's $750-1,250 of opportunity cost before the first run. The proxy bill is on top.

Path 2 — Half-DIY (Python wrapper around a managed API)

For Python devs who want to ship code, not maintain infrastructure. Use the Apify SDK to call a managed Vinted scraper and just write the post-processing logic in Python.

pip install apify-client
Enter fullscreen mode Exit fullscreen mode
# Same search, fully managed
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("kazkn/vinted-smart-scraper").call(run_input={
    "mode": "SEARCH",
    "query": "nike air max 90",
    "countries": ["fr"],
    "maxItems": 100,
})

dataset = client.dataset(run["defaultDatasetId"]).list_items().items
print(len(dataset), "items returned")
for item in dataset[:3]:
    print(f"{item['title']} - {item['price']} {item['currency']}")
Enter fullscreen mode Exit fullscreen mode

This is roughly 5 minutes from pip install to first result. The Apify actor handles Datadome, residential rotation, fingerprint, sessions — you handle whatever business logic actually needs Python (analytics, ML, integration into your existing pipeline).

The cross-country mode is the killer feature for resellers and works the same way:

run = client.actor("kazkn/vinted-smart-scraper").call(run_input={
    "mode": "CROSS_COUNTRY",
    "query": "nike air max 90",
    "countries": ["fr", "de", "es", "it", "nl"],
})

summary = client.dataset(run["defaultDatasetId"]).list_items().items[0]["summary"]
print(f"Best buy: {summary['bestBuyCountry']} | Best sell: {summary['bestSellCountry']}")
print(f"Arbitrage spread: {summary['arbitrageSpread']}")
Enter fullscreen mode Exit fullscreen mode

Output last week:

Best buy: es | Best sell: it
Arbitrage spread: 78%
Enter fullscreen mode Exit fullscreen mode

Path 3 — Pure managed (no Python at all)

For analysts and resellers who don't write Python but want clean Vinted data: open the Apify Console, click Try for free, fill the form, click Start. The output is downloadable JSON / CSV / Excel. Roughly 30 seconds end-to-end. If your goal was just data and not building infrastructure, this is where you should be.

🧰 The Vinted API wrapper question

A common search on Stack Overflow and Reddit: "Is there a Python Vinted API wrapper that just works?"

The honest answer is no, not for long. The /api/v2/catalog/* endpoints inside Vinted are not a public API; they're internal SPA endpoints that Vinted is allowed to change without notice. Any wrapper around them is implicitly a maintenance product. The popular wrappers (vinted-api-wrapper, vinted-scraper on PyPI) work today, will break in Q3, will get patched, will break again in Q1, and so on.

The most stable "Vinted API wrapper" experience you can have in Python is to call a managed service that absorbs the maintenance for you. That's what the Apify integration above is, in practice — it's a Vinted API wrapper with someone else maintaining the anti-detection stack.

🤖 Adding it to AI agents (MCP)

If you're building agents on top of Claude or Cursor, the vinted-mcp-server package exposes the same scraper as MCP tools an LLM can call directly. From a Python perspective:

# Bonus: drive the MCP server programmatically from Python via subprocess + STDIO
# or just point Claude Desktop at it via the standard MCP config
Enter fullscreen mode Exit fullscreen mode

Standard config snippet for ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "vinted": {
      "command": "npx",
      "args": ["-y", "vinted-mcp-server"]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

After this, Claude can directly call find_arbitrage_opportunities, monitor_keyword, analyze_seller, and get_item_details. Your Python agent can speak to Claude over the standard MCP wire and Claude does the scraping side. Architecturally clean, and you stop maintaining the detection stack inside your Python codebase.

📊 Cost comparison (real numbers)

Approach Setup time Monthly cost (10K items) Maintenance
Pure DIY (curl-cffi + Smartproxy) 15-25 hours €80-200 (proxies) 2-4 hrs/month
Apify SDK from Python 5 minutes $5 (free tier covers it) ~0
Pure managed (no code) 30 seconds $5 (free tier covers it) 0

Above 50K items/month, DIY starts looking competitive on raw cost — but you also start carrying real engineering risk. Below 50K, the managed path is dominant on both axes (cost AND time).

❓ FAQ

Is vinted-scraper on PyPI safe to use?

Yes, for reading public data, on a small scale, with a residential proxy. Treat it as a thin wrapper around the same internal endpoints; it inherits all the same Datadome risk.

Can I scrape Vinted without writing Python at all?

Yes. The Apify actor has a no-code form interface and exports to JSON / CSV / Excel directly.

How do I store Vinted data in Postgres / BigQuery / Pandas?

Use the Apify SDK from Python (pip install apify-client), grab the dataset items as a list of dicts, and feed them straight into pandas.DataFrame() or psycopg.execute_batch(). The shape is stable.

Does Vinted block headless Playwright?

Often yes, by Q2 2026. Plain Playwright leaves detectable navigator props. Use playwright-extra with the stealth plugin, or Camoufox, or just use a managed actor that handles fingerprint for you.

Can I scrape Vinted commercially?

Personal use is fine. Commercial resale of raw Vinted data risks both ToS breach and GDPR issues if you store seller info. Get a lawyer if you're building a data product around it.

🎬 Try the cross-country mode

5-minute test if you're a Python dev:

pip install apify-client
export APIFY_TOKEN="..."  # free at apify.com
python -c "
from apify_client import ApifyClient
c = ApifyClient('$APIFY_TOKEN')
r = c.actor('kazkn/vinted-smart-scraper').call(run_input={
    'mode': 'CROSS_COUNTRY',
    'query': 'nike air max 90',
    'countries': ['fr','de','es','it','nl']
})
print(c.dataset(r['defaultDatasetId']).list_items().items[0]['summary'])
"
Enter fullscreen mode Exit fullscreen mode

That snippet — once your token is set — gives you median prices across five EU markets with arbitrage spread in under 90 seconds. If you build something interesting on top, drop a link or open an issue on github.com/DataKazKN/vinted-mcp-server.

kazkn

Top comments (0)