curl --request GET \
--url https://scrapebadger.com/v1/vinted/search \
--header 'x-api-key: <api-key>'import requests
url = "https://scrapebadger.com/v1/vinted/search"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://scrapebadger.com/v1/vinted/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrapebadger.com/v1/vinted/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://scrapebadger.com/v1/vinted/search"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scrapebadger.com/v1/vinted/search")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/vinted/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"items": [
{
"id": 123,
"title": "<string>",
"price": {
"amount": "<string>",
"currency_code": "<string>"
},
"service_fee": "<string>",
"total_item_price": "<string>",
"brand_title": "<string>",
"size_title": "<string>",
"status": "<string>",
"photo": {
"id": 123,
"url": "<string>",
"full_size_url": "<string>",
"width": 123,
"height": 123,
"dominant_color": "<string>",
"is_main": true
},
"photos": [
{
"id": 123,
"url": "<string>",
"full_size_url": "<string>",
"width": 123,
"height": 123,
"dominant_color": "<string>",
"is_main": true
}
],
"url": "<string>",
"path": "<string>",
"user": {
"id": 123,
"login": "<string>",
"photo_url": "<string>",
"business": true
},
"favourite_count": 123,
"view_count": 123,
"is_visible": true,
"promoted": true,
"content_source": "<string>",
"seller_country_code": "<string>",
"display_title": "<string>",
"display_subtitle": "<string>",
"similarity_score": 123
}
],
"pagination": {
"current_page": 123,
"per_page": 123,
"total_pages": 123,
"total_entries": 123,
"time": 123
},
"market": "<string>",
"seller_country": "<string>"
}Search Items
Search Vinted catalog items with filters.
curl --request GET \
--url https://scrapebadger.com/v1/vinted/search \
--header 'x-api-key: <api-key>'import requests
url = "https://scrapebadger.com/v1/vinted/search"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://scrapebadger.com/v1/vinted/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrapebadger.com/v1/vinted/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://scrapebadger.com/v1/vinted/search"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scrapebadger.com/v1/vinted/search")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/vinted/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"items": [
{
"id": 123,
"title": "<string>",
"price": {
"amount": "<string>",
"currency_code": "<string>"
},
"service_fee": "<string>",
"total_item_price": "<string>",
"brand_title": "<string>",
"size_title": "<string>",
"status": "<string>",
"photo": {
"id": 123,
"url": "<string>",
"full_size_url": "<string>",
"width": 123,
"height": 123,
"dominant_color": "<string>",
"is_main": true
},
"photos": [
{
"id": 123,
"url": "<string>",
"full_size_url": "<string>",
"width": 123,
"height": 123,
"dominant_color": "<string>",
"is_main": true
}
],
"url": "<string>",
"path": "<string>",
"user": {
"id": 123,
"login": "<string>",
"photo_url": "<string>",
"business": true
},
"favourite_count": 123,
"view_count": 123,
"is_visible": true,
"promoted": true,
"content_source": "<string>",
"seller_country_code": "<string>",
"display_title": "<string>",
"display_subtitle": "<string>",
"similarity_score": 123
}
],
"pagination": {
"current_page": 123,
"per_page": 123,
"total_pages": 123,
"total_entries": 123,
"time": 123
},
"market": "<string>",
"seller_country": "<string>"
}Query Parameters
/v1/vinted/markets for all supported values.Examples: fr, de, uk, it, es, pl, us1.1 - 96.catalog[] value in a Vinted category URL — browse to the
category on the Vinted site and read it off the address bar:
vinted.fr/catalog?catalog[]=221 → catalog_ids=221.Sub-categories are included: catalog_ids=221 (Women’s T-shirts) also matches
the brand-specific leaves beneath it.Example: 221, 221,1242vinted.fr is not guaranteed
to mean the same category on vinted.de — take the ID from the same market
you pass as market./v1/vinted/brands to look up IDs.Example: 53, 14,53,221/v1/vinted/colors to look up IDs.Example: 1, 1,4,12/v1/vinted/statuses to look up IDs.Example: 6 (New with tags), 1,2 (New without tags, Very good)| Value | Description |
|---|---|
relevance | Best match (default) |
price_low_to_high | Cheapest first |
price_high_to_low | Most expensive first |
newest_first | Most recently listed |
vinted.fr returns items from sellers in IT, DE, NL, ES, and elsewhere (prices and labels are localized, but the seller is abroad). Vinted exposes no native country facet, so ScrapeBadger resolves each result item’s seller country and drops items outside the requested set.Examples: fr, fr,be, IT,ESmarket and seller_country are different axes. market selects which Vinted domain you search (which catalog and currency you see); seller_country filters on where the seller actually is. For example, market=fr&seller_country=it searches the French catalog but returns only items shipped by sellers in Italy.total_entries / total_pages) reflect Vinted’s unfiltered result set. After seller-country filtering, a page may contain fewer than per_page items (or none), even though more matching items exist on later pages. Iterate through pages until you have collected enough matching items.Response
Show Item object
Show Item object
amount (decimal string, e.g. "45.0") and currency_code (ISO 4217, e.g. "EUR").price.currency_code. null when Vinted doesn’t quote one.price.currency_code."Très bon état").id, url, full_size_url, width, height, dominant_color, is_main).photo.id, login, photo_url, business)."search")."IT"). Populated only when seller_country filtering was requested; null otherwise.seller_country filter that was applied (uppercase, comma-separated ISO-2 codes, e.g. "FR,BE"), or null when no filter was requested.Example Response
{
"items": [
{
"id": 9492962028,
"title": "Nike Air Force 1 '07 White",
"price": { "amount": "45.0", "currency_code": "EUR" },
"service_fee": "3.05",
"total_item_price": "48.05",
"brand_title": "Nike",
"size_title": "42",
"status": "Très bon état",
"url": "https://www.vinted.fr/items/9492962028-nike-air-force-1",
"path": "/items/9492962028-nike-air-force-1",
"is_visible": true,
"promoted": false,
"favourite_count": 12,
"view_count": 234,
"content_source": "search",
"seller_country_code": null,
"user": {
"id": 12345678,
"login": "seller_username",
"photo_url": "https://images1.vinted.net/t/...",
"business": false
},
"photo": {
"id": 40179825222,
"url": "https://images1.vinted.net/t/...",
"full_size_url": "https://images1.vinted.net/tc/...",
"width": 600,
"height": 800,
"dominant_color": "#36363D",
"is_main": true
},
"photos": []
}
],
"pagination": {
"current_page": 1,
"per_page": 20,
"total_pages": 48,
"total_entries": 960
},
"market": "fr",
"seller_country": null
}
Example Request — filter by category
Only women’s T-shirts (catalog[]=221 on vinted.fr):
curl "https://scrapebadger.com/v1/vinted/search?query=nike&market=fr&catalog_ids=221&per_page=20" \
-H "x-api-key: YOUR_API_KEY"
const results = await client.vinted.search({
query: "nike",
market: "fr",
catalog_ids: "221",
per_page: 20,
});
results = client.vinted.search(
query="nike",
market="fr",
catalog_ids="221",
per_page=20,
)
Example Request — filter by seller country
Return only listings from sellers physically located in France:curl "https://scrapebadger.com/v1/vinted/search?query=nike+air+force+1&market=fr&seller_country=fr&per_page=20" \
-H "x-api-key: YOUR_API_KEY"
const results = await client.vinted.search({
query: "nike air force 1",
market: "fr",
seller_country: "fr",
per_page: 20,
});
results = client.vinted.search(
query="nike air force 1",
market="fr",
seller_country="fr",
per_page=20,
)
seller_country, whose seller lookups are not billed on top. Failed requests are not charged. The exact charge for any call is returned in the X-Credits-Used response header.Mobile search additions
size_ids and material_ids accept comma-separated filter IDs. Reuse the returned pagination time and a shared search_session_id across pages. Search item display_title / display_subtitle preserve presentation labels; brand_title can be null. Use item details for verified brand, category and condition IDs. See mobile data.Authorizations
Query Parameters
Search query string. Matches against item titles and descriptions.
Vinted market to search (e.g. fr, de, uk, it, es, pl, us).
Page number for paginated results.
x >= 1Number of items per page.
1 <= x <= 96Minimum price filter in the market's local currency.
Maximum price filter in the market's local currency.
Comma-separated Vinted catalog (category) IDs to restrict the search to (e.g. "221" or "221,1242"). Applied by Vinted before the search runs, and sub-categories are included. A catalog ID is the catalog[] value in a Vinted category URL (vinted.fr/catalog?catalog[]=221); IDs are per market.
Comma-separated list of brand IDs to filter by.
Comma-separated list of color IDs to filter by.
Comma-separated list of condition status IDs to filter by.
Sort order for results.
relevance, price_low_to_high, price_high_to_low, newest_first Comma-separated ISO 3166-1 alpha-2 country codes (case-insensitive) to keep only items whose seller is physically located in one of those countries (e.g. "fr" or "fr,be"). Vinted markets federate cross-border listings; this filters on the seller's real location, which is a different axis from market. Note: pagination totals stay unfiltered, so a page may return fewer than per_page items after filtering. Billing: a search is a flat 5 credits whatever filters you pass; seller lookups are not billed on top.
Comma-separated size IDs
Comma-separated material IDs
Pagination time returned by the preceding page
x >= 0Reuse across pages of one search
Response
Successful search
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Echo of the market that was searched.
Echo of the normalized seller_country filter that was applied (uppercase, comma-separated ISO-2 codes, e.g. "FR,BE"), or null when no filter was requested.

