Vinted France–Germany Arbitrage Scanner avatar

Vinted France–Germany Arbitrage Scanner

Pricing

Pay per event

Go to Apify Store
Vinted France–Germany Arbitrage Scanner

Vinted France–Germany Arbitrage Scanner

Compare public Vinted France and Germany listings, normalize EUR prices, estimate fees and spreads, and rank likely cross-country resale opportunities.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Compare public Vinted France and Germany listings for the same product search, estimate sourcing costs, and rank possible cross-country resale opportunities.

This Vinted scraper is built for recurring resale research rather than a generic catalog dump. It collects current records from vinted.fr and vinted.de, finds likely comparable items, chooses the cheaper side as the source market, and returns transparent profit and match evidence.

Important: each row compares two independent used-item listings. A high score is a research lead, not proof that the products are identical or that a resale will complete at the observed price.

What does the Vinted arbitrage scanner do?

For one supplied query, the Actor:

  1. opens anonymous public sessions on Vinted France and Vinted Germany;
  2. loads structured listing records from both national catalogs;
  3. normalizes EUR prices and listing fields;
  4. excludes the same listing ID from being matched to itself;
  5. scores possible pairs using title tokens, brand, size, and condition;
  6. selects the cheaper listing as the buy side;
  7. estimates buyer protection, shipping, resale fees, spread, profit, and ROI;
  8. saves the strongest opportunities in profit-ranked order.

The default dataset is ready for JSON, CSV, Excel, Google Sheets, API, webhook, and scheduled-run workflows.

Who is this Actor for?

  • Resellers comparing sourcing prices between France and Germany.
  • Vintage and sneaker buyers screening many listings before manual inspection.
  • Marketplace analysts studying cross-country asking-price differences.
  • Ecommerce teams feeding current Vinted comparisons into internal dashboards.
  • Automation builders scheduling a repeatable Vinted API-style workflow without maintaining anonymous sessions.

Why use this instead of two listing exports?

A pair of raw exports still leaves the hard work to you. This Actor adds a consistent comparison layer:

  • a buy/sell direction for every pair;
  • Vinted's exposed buyer-protection fee when available;
  • configurable fallback fee and shipping assumptions;
  • gross spread, estimated net profit, spread percentage, and ROI;
  • a bounded confidence score and human-readable match reasons;
  • direct source URLs and images for manual validation.

The Actor does not claim to identify guaranteed flips. It reduces the catalog to reviewable candidates.

What Vinted data is returned?

Field groupIncluded data
Rankingrank, query, matchConfidence, matchReasons
Source listingmarket, ID, title, brand, size, condition, price, URL, image
Comparable listingmarket, ID, title, brand, size, condition, price, URL, image
Costsbuyer protection, shipping assumption, resale-fee estimate, total cost
Opportunitygross spread, estimated net profit, ROI, spread percentage
FreshnessscrapedAt ISO timestamp

Fields that Vinted omits can be null. Listing titles and conditions remain in their source language.

How matching works

The scanner compares France records with Germany records and calculates a score from zero to one.

  • Title-token overlap carries most of the score.
  • An exact normalized brand adds evidence.
  • An exact normalized size adds evidence.
  • An exact localized condition adds evidence when the text is equal.
  • Identical listing IDs are always rejected.

Use minMatchConfidence to control strictness. The default 0.3 is useful for discovery. Raise it for a shorter review list. Always open both URLs before acting on an opportunity: color, authenticity, defects, bundle contents, audience, and exact model can still differ.

Getting started

  1. Open the Actor in Apify Console.
  2. Enter a real product or model in Vinted search query.
  3. Keep 48 listings per country for a quick first comparison.
  4. Set your realistic shipping and resale-fee assumptions.
  5. Click Start.
  6. Open Arbitrage opportunities in the dataset.
  7. Sort or filter by profit, ROI, or confidence.
  8. Inspect both source URLs before making a sourcing decision.

A good first input is:

{
"searchQuery": "nike dunk",
"maxListingsPerCountry": 48,
"maxOpportunities": 20,
"minMatchConfidence": 0.3,
"minNetProfitEur": 0
}

Input parameters

ParameterTypeDefaultPurpose
searchQuerystringrequiredProduct, brand, or model searched on both markets
maxListingsPerCountryinteger48Records loaded from each catalog, 5–200
maxOpportunitiesinteger20Ranked pairs saved, 1–100
sortBystringrelevanceVinted catalog order before matching
minMatchConfidencenumber0.3Minimum similarity score, 0.2–1
minNetProfitEurnumber0Minimum estimated net profit saved
shippingCostEurnumber5Shipping assumption added to source cost
buyerProtectionRatenumber0.05Fee-rate fallback when Vinted omits its fee
buyerProtectionFixedEurnumber0.7Fixed fee fallback when Vinted omits its fee
resaleFeeRatenumber0Optional fraction reserved from sell price
proxyConfigurationobjectdirectOptional Apify proxy configuration

France and Germany are fixed product scope, not user-selectable aliases. Values are compared only when Vinted reports EUR.

Output example

A real local run for nike dunk returned a record shaped like this:

{
"rank": 1,
"query": "nike dunk",
"buyMarket": "DE",
"sellMarket": "FR",
"buyListingId": "9616696920",
"buyTitle": "Nike Dunk low",
"buyBrand": "Nike",
"buySize": "40",
"buyPriceEur": 15,
"buyBuyerProtectionEur": 1.45,
"estimatedShippingEur": 5,
"estimatedTotalCostEur": 21.45,
"comparableSellPriceEur": 90,
"grossSpreadEur": 75,
"estimatedNetProfitEur": 68.55,
"roiPercent": 319.58,
"matchConfidence": 0.625,
"matchReasons": [
"title token overlap 50%",
"same brand",
"same size"
],
"scrapedAt": "2026-08-09T14:51:15.845Z"
}

URLs and image URLs are also included in each dataset row. IDs and prices above illustrate the current output shape; live listings can change or disappear.

How much does it cost to compare Vinted France and Germany?

The Actor uses pay-per-event pricing:

  • $0.021 for one start event per run;
  • one opportunity event per saved comparison, with plan discounts.

At the BRONZE tier, an opportunity costs $0.016. That makes the event charge approximately:

Saved opportunitiesApproximate BRONZE charge (USD)
10.037
50.101
100.181
250.421
1001.621

FREE through DIAMOND opportunity prices are $0.0184, $0.016, $0.01248, $0.0096, $0.0064, and $0.00448. The start event remains $0.021. The active live prices appear in Apify Console before a run. maxOpportunities is the clearest output-cost control.

Profit assumptions and limitations

The calculation is:

estimated total cost
= buy price + buyer protection + configured shipping
estimated net profit
= comparable sell price - estimated total cost - estimated resale fee

The comparable price is a current asking price, not a confirmed sale price. The estimate excludes taxes, customs, currency conversion, returns, repairs, cleaning, authentication, packaging, travel, failed delivery, and the value of your time unless you incorporate them into the configurable rates.

Vinted's fee structure can vary by buyer, country, basket, promotion, and time. When the public listing payload includes a service fee, the Actor uses it. Otherwise it applies your percentage-plus-fixed fallback.

Scheduling recurring sourcing research

Create an Apify schedule for repeated snapshots:

  1. save one Task per product model;
  2. run it daily or weekly;
  3. send the dataset to a webhook, Sheets, or your database;
  4. deduplicate on buyListingId and sellListingId;
  5. alert only when profit and confidence cross your own thresholds.

The Actor itself does not maintain price history or send alerts. Apify schedules and integrations provide those workflow layers.

Useful recurring searches include model-specific footwear, designer bags, vintage denim, and collectible outerwear. Narrow product names generally match better than broad terms such as shoes.

Export and integration options

Every run writes normal Apify dataset rows. You can:

  • download JSON, CSV, XML, RSS, or Excel;
  • connect Google Sheets through an Apify integration;
  • trigger a webhook when a run succeeds;
  • read results from the dataset API;
  • transform rows in Make, Zapier, n8n, or your own code;
  • feed reviewed candidates to inventory-planning tools.

Use listing IDs for deduplication and scrapedAt for snapshot time. Do not assume rank is stable across runs because live inventories change.

Run through the Apify API with cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~vinted-cross-country-arbitrage-scanner/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"searchQuery": "adidas samba",
"maxListingsPerCountry": 60,
"maxOpportunities": 25,
"shippingCostEur": 5
}'

Store tokens in environment variables. Never commit them to source code.

Run through JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor(
'automation-lab/vinted-cross-country-arbitrage-scanner'
).call({
searchQuery: 'levis 501',
maxListingsPerCountry: 96,
maxOpportunities: 30,
minNetProfitEur: 5,
shippingCostEur: 6.5,
resaleFeeRate: 0.05,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Run through Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor(
"automation-lab/vinted-cross-country-arbitrage-scanner"
).call(run_input={
"searchQuery": "nike dunk",
"maxListingsPerCountry": 48,
"maxOpportunities": 20,
"minMatchConfidence": 0.4,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)

Use with Apify MCP and AI agents

Add this Actor to Claude Code:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/vinted-cross-country-arbitrage-scanner"

Claude Desktop setup

Claude Desktop can use this MCP configuration:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/vinted-cross-country-arbitrage-scanner"
}
}
}

Cursor setup

In Cursor, open Settings → Tools & MCP → New MCP Server and use the same https://mcp.apify.com?tools=automation-lab/vinted-cross-country-arbitrage-scanner URL.

VS Code setup

In VS Code, add the same HTTP endpoint to your workspace MCP server configuration and start the apify server from the MCP tools view.

Example prompts:

  • “Compare Nike Dunk listings on Vinted France and Germany and show opportunities above €15 estimated profit.”
  • “Run a Levi's 501 sourcing comparison with €6.50 shipping and a 5% resale reserve.”
  • “Return the five strongest Adidas Samba matches and include both listing URLs.”

An AI agent should still treat match and profit values as screening evidence and ask a human to verify the listings.

Proxy, retry, and failure behavior

The default route uses anonymous, isolated sessions and structured catalog requests without a proxy. If all bounded direct sessions are blocked, the Actor retries through an Apify residential proxy located in the matching market.

You can provide proxyConfiguration to control proxy use explicitly. A configured proxy is not silently replaced if it fails.

The run fails rather than returning a misleading empty success when either market cannot provide useful records. A valid query with no matching pairs can finish successfully with an empty dataset.

Responsible use and legality

This Actor reads public marketplace listing records. Use it only for lawful research and automation that respects Vinted's terms, applicable database rights, privacy rules, consumer-protection law, tax obligations, and reasonable request volumes.

Do not use the output to harass sellers, evade platform safeguards, misrepresent products, automate prohibited purchases, or make decisions about people. Seller profile identifiers are not included in the result dataset.

You are responsible for verifying product authenticity, listing rights, shipping eligibility, and legal resale requirements in each country.

Troubleshooting

Why are there no opportunities?

The query may have too few comparable products, your confidence threshold may be high, or your fee assumptions may make every pair unprofitable. Try a specific model with more inventory, increase maxListingsPerCountry, lower minMatchConfidence carefully, or inspect a negative minNetProfitEur during research.

Why do two matched items look different?

Text matching cannot see every variant or defect. Raise minMatchConfidence, prefer model-specific queries, and verify title, size, condition, photos, and description at both URLs.

Why did the Actor fail before producing rows?

Vinted may have challenged both direct and residential sessions, one catalog may be unavailable, or the input may be invalid. Check the run log for the market and retry reason. Repeated blind retries are not recommended.

Does this scrape Vinted customer service data?

No. The Actor only compares public product listings. It does not retrieve customer-service contacts, messages, accounts, private profiles, sold history, or support cases.

FAQ

Does this guarantee profit?

No. It ranks current asking-price comparisons under your assumptions. Availability, sale price, fees, shipping, returns, condition, authenticity, and demand can change.

Are France and Germany prices converted?

Both supported catalogs report EUR, so no foreign-exchange conversion is applied.

Can I compare other Vinted countries?

Not in this Actor. Its validated scope is France and Germany. Use Vinted Scraper when you need independent listing exports from other supported regional domains.

Is a browser used for every request?

No. The production route bootstraps an anonymous session over HTTP and replays the structured catalog endpoint. This is faster and lighter than browser automation.

Can I monitor changes?

Yes, by saving this input as an Apify Task and scheduling it. Persist and compare listing-pair IDs in your downstream storage; this Actor does not keep cross-run history.

  • Vinted Scraper — export independent Vinted listing records across supported regional domains when you do not need France–Germany matching and profit ranking.

Support

For reproducible questions, include the input, run URL, approximate timestamp, and the market named in the error. Do not post Apify tokens, private account data, or seller contact details.