Żeby zrobić bota Vinted, który powiadamia o nowych ogłoszeniach z vinted.pl, potrzebujesz źródła danych i pętli. Źródłem jest API Vinted od Scavio: POST /api/v1/vinted/search z "country": "pl", Twoimi filtrami i "sort": "newest_first" zwraca 96 najnowszych ogłoszeń, każde z ID, tytułem, ceną, opłatą Vinted, sumą w złotych, rozmiarem, stanem i zdjęciem. Pętla w Pythonie co kilka minut porównuje ID z tymi, które już widziała, i wysyła nowe na Discorda. Jedno sprawdzenie to 1 kredyt.
Oficjalne API Vinted, Vinted Pro Integrations, jest dostępne tylko dla wybranych firm z Vinted Pro i obsługuje ich własne przedmioty i zamówienia, bez wyszukiwania rynku. Dlatego poradniki o botach Vinted zwykle każą analizować zapytania strony i obchodzić jej zabezpieczenia. Tu tego nie ma: bot rozmawia tylko z API Scavio i dostaje gotowy JSON. Wszystkie odpowiedzi poniżej pochodzą z vinted.pl, 9 listopada 2026, a przykład to damska kurtka zimowa Reserved w rozmiarze M do 100 zł.
Krok 1: zamień nazwy na ID
Filtry wyszukiwania przyjmują ID, a nie nazwy. Zacznij od tego, co wpisują kupujący:
curl -s https://api.scavio.dev/api/v1/vinted/suggestions \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"country": "pl", "query": "kurtka zim"}'Pobrane data (6 z 10 podpowiedzi skrócone):
{
"country": "pl",
"query": "kurtka zim",
"count": 10,
"suggestions": [
{ "text": "kurtka zimowa dziewczynka", "type": "popular_search" },
{ "text": "kurtka zimowa chłopięca", "type": "popular_search" },
{ "text": "kurtka zimowa", "type": "popular_search" },
{ "text": "kurtka zimowa męska", "type": "popular_search" }
]
}Potem marka:
curl -s https://api.scavio.dev/api/v1/vinted/brands \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"country": "pl", "query": "reserved"}'Pobrane data (3 z 5 marek skrócone):
{
"country": "pl",
"query": "reserved",
"count": 5,
"brands": [
{ "id": 10187, "title": "Reserved", "slug": "reserved", "url": "https://www.vinted.pl/brand/10187-reserved", "item_count": 9144375, "is_luxury": false, "requires_authenticity_check": false },
{ "id": 1770043, "title": "Reserved Kids", "slug": "reserved-kids", "url": "https://www.vinted.pl/brand/1770043-reserved-kids", "item_count": 110591, "is_luxury": false, "requires_authenticity_check": false }
]
}Wybierz dokładny title: obok Reserved są Reserved Kids, Reserved YFL i Reserved Baby. item_count to liczba ogłoszeń marki, 9 144 375 dla Reserved. Kategoria pochodzi z /categories: {"country": "pl", "parent_id": 1037} zwróciło Okrycia wierzchnie (Kobiety > Ubrania > Okrycia wierzchnie) z czterema podkategoriami, w tym Kurtki z ID 1908 i jedenastoma podkategoriami, wśród nich Bomberki i Kurtki ocieplane (2614).
Krok 2: pobierz ID rozmiaru
curl -s https://api.scavio.dev/api/v1/vinted/filters \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"country": "pl", "filter": "size", "query": "kurtka zimowa", "category_id": 1908}'Pobrane data w 0,4 sekundy (138 ze 142 opcji skrócone):
{
"country": "pl",
"filter": "size",
"search_param": "size_ids",
"query": "kurtka zimowa",
"category_id": 1908,
"count": 142,
"options": [
{ "id": 2, "title": "XS / 34 / 6", "item_count": 6348, "group": "Kobiety > Odzież" },
{ "id": 3, "title": "S / 36 / 8", "item_count": 15790, "group": "Kobiety > Odzież" },
{ "id": 4, "title": "M / 38 / 10", "item_count": 15152, "group": "Kobiety > Odzież" },
{ "id": 5, "title": "L / 40 / 12", "item_count": 8825, "group": "Kobiety > Odzież" }
]
}search_param mówi, do którego parametru wyszukiwania trafiają ID: rozmiar M to 4 w size_ids. Liczby są bieżące, więc ten sam endpoint pokazuje też, jak duży jest rynek: 15 152 zimowe kurtki w rozmiarze M. Z "filter": "status" dostaniesz ID stanów (6 Nowy z metką, 1 Nowy bez metki, 2 Bardzo dobry, 3 Dobry, 4 Zadowalający), a z "color" i "material" kolory i materiały. ID są takie same na wszystkich 27 stronach Vinted.
Krok 3: pierwsze wyszukiwanie, od najnowszych
curl -s https://api.scavio.dev/api/v1/vinted/search \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"country": "pl", "query": "kurtka zimowa", "brand_ids": [10187], "category_id": 1908, "size_ids": [4], "price_to": 100, "sort": "newest_first"}'Pobrane data w 3,4 sekundy (94 z 96 ogłoszeń skrócone, ID prywatnych sprzedawców usunięte):
{
"country": "pl",
"currency": "PLN",
"query": "kurtka zimowa",
"page": 1,
"per_page": 96,
"count": 96,
"listed_results": 960,
"total_is_capped": true,
"total_pages": 10,
"has_more": true,
"filters": {
"query": "kurtka zimowa",
"category_ids": [1908],
"brand_ids": [10187],
"status_ids": [],
"size_ids": [4],
"color_ids": [],
"material_ids": [],
"price_from": null,
"price_to": 100,
"currency": "PLN",
"sort": "newest_first"
},
"items": [
{
"id": 10732698400,
"title": "Kurtka damska ocieplana marki Reserved rozmiar M",
"url": "https://www.vinted.pl/items/10732698400-kurtka-damska-ocieplana-marki-reserved-rozmiar-m",
"price": 90,
"currency": "PLN",
"price_with_discount": null,
"service_fee": 7.4,
"total_price": 97.4,
"brand": "Reserved",
"size": "M",
"condition": "Bardzo dobry",
"favourite_count": 0,
"is_promoted": false,
"image": "https://images1.vinted.net/t/04_00002_8BnHSfF9ssK5V8zpNygQTBTa/f800/01e7dade.webp?s=9570013ad063ae676966b766547b2be08b5b08be",
"thumbnail": "https://images1.vinted.net/t/04_00002_8BnHSfF9ssK5V8zpNygQTBTa/310x430/01e7dade.webp?s=fcb416213ae5fda722f70dcc22fbbc8f73a1bb40",
"photos": ["https://images1.vinted.net/t/04_00002_8BnHSfF9ssK5V8zpNygQTBTa/f800/01e7dade.webp?s=9570013ad063ae676966b766547b2be08b5b08be"],
"seller": { "is_business": false }
},
{
"id": 10732645354,
"title": "Kurtka puchowa Reserved",
"url": "https://www.vinted.pl/items/10732645354-kurtka-puchowa-reserved",
"price": 48,
"currency": "PLN",
"price_with_discount": null,
"service_fee": 5.3,
"total_price": 53.3,
"brand": "Reserved",
"size": "M",
"condition": "Bardzo dobry",
"favourite_count": 0,
"is_promoted": false,
"image": "https://images1.vinted.net/t/06_008a9_33FL3XqzdKJQHzh8DDwTokhv/f800/95350e67.webp?s=2811faa11b92b1a90462e528417fcb6ca1feaa69",
"thumbnail": "https://images1.vinted.net/t/06_008a9_33FL3XqzdKJQHzh8DDwTokhv/310x430/95350e67.webp?s=c61879e5e5a3bdf546ee80f20e7486fa2a61ef39",
"photos": ["https://images1.vinted.net/t/06_008a9_33FL3XqzdKJQHzh8DDwTokhv/f800/95350e67.webp?s=2811faa11b92b1a90462e528417fcb6ca1feaa69"],
"seller": { "is_business": false }
}
]
}Wiersz czytasz tak: sprzedawca chce 90 zł, opłata Vinted (service_fee) to 7,40 zł, więc kupujący płaci 97,40 zł bez wysyłki. Na vinted.pl opłata we wszystkich 480 ogłoszeniach, które zebraliśmy do porównania cen kurtek według stanu, wynosiła 2,90 zł plus 5% ceny; kosztów wysyłki API nie zwraca. Blok filters to filtry, które Vinted naprawdę zastosował: są w nim wszystkie wysłane ID, więc wyniki to faktycznie Reserved, rozmiar M i maksymalnie 100 zł. listed_results: 960 z total_is_capped: true oznacza co najmniej 960 trafień, bo Vinted pokazuje najwyżej 10 stron po 96. Dla bota to bez znaczenia: nowe ogłoszenia zawsze trafiają na początek pierwszej strony.
Nie każde ogłoszenie będzie po polsku. Europejskie strony Vinted dzielą jedną pulę, więc w tych samych wynikach były też "Geacă iarna lungă" za 66,65 zł i "Zimní bunda Reserved vel. M" za 91,38 zł, przeliczone na złote. Jeśli bot ma pokazywać tylko polskie oferty, filtruj po tytule po swojej stronie; API zwraca wszystko, co pokazuje vinted.pl.
Krok 4: kolejne sprawdzenia i wykrywanie nowych ogłoszeń
Bot powtarza to samo zapytanie co kilka minut. Wykonaliśmy je drugi raz minutę później. Na pierwszych 79 pozycjach były te same ogłoszenia, choć część zmieniła kolejność, ale na pozycjach 80 i 88 pojawiły się dwa ogłoszenia, których wcześniej nie było (fragment):
{ "id": 10720027939, "title": "Kurtka zimowa", "price": 60, "service_fee": 5.9, "total_price": 65.9, "condition": "Dobry" }
{ "id": 10722546556, "title": "kurtka zimowa", "price": 70, "service_fee": 6.4, "total_price": 76.4, "condition": "Bardzo dobry" }To nie są nowe ogłoszenia, tylko przetasowany koniec listy: dwa inne wypadły z pozycji 92 i 95. Widać to po ID, które w naszych odczytach rosły z czasem dodania: najnowsze ogłoszenie na liście, dodane "2 min." wcześniej, ma ID 10732698400, ogłoszenie sprzed 30 minut 10732392664, a te dwa mają ID niższe o ponad 10 milionów. Sama kolejność nie wystarcza, bo od pozycji 16 część ogłoszeń zamieniła się miejscami. Naiwny bot, który porównuje tylko "widziałem / nie widziałem", wysłałby dwa fałszywe alerty. Lepiej zapamiętać najwyższe ID z pierwszego przebiegu i zgłaszać tylko wyższe:
import time
import requests
KEY = "sk_live_your_key" # z panelu Scavio
WEBHOOK = "https://discord.com/api/webhooks/..." # webhook Twojego kanału
BODY = {"country": "pl", "query": "kurtka zimowa", "brand_ids": [10187],
"category_id": 1908, "size_ids": [4], "price_to": 100, "sort": "newest_first"}
def check():
r = requests.post("https://api.scavio.dev/api/v1/vinted/search", json=BODY,
headers={"Authorization": f"Bearer {KEY}"}, timeout=60)
r.raise_for_status()
return r.json()["data"]["items"]
last_id = max(item["id"] for item in check()) # pierwszy przebieg: tylko zapamiętaj
while True:
time.sleep(300) # co 5 minut: 288 kredytów dziennie
try:
items = check()
except requests.RequestException:
continue # błędy nie są liczone, spróbuj przy następnym przebiegu
new = [i for i in items if i["id"] > last_id]
for item in sorted(new, key=lambda i: i["id"]):
requests.post(WEBHOOK, json={"content": f'{item["title"]} | {item["size"]} | '
f'{item["condition"]} | {item["total_price"]} zł z opłatą\n{item["url"]}'},
timeout=30)
if new:
last_id = max(i["id"] for i in new)Webhook Discorda zakładasz w ustawieniach kanału (Integracje > Webhooki); dla Telegrama zamień ostatnie requests.post na wywołanie sendMessage swojego bota. Bot tylko powiadamia. API nie loguje się na Twoje konto, nie kupuje, nie składa ofert i nie pisze do sprzedawców, a decyzję o zakupie podejmujesz w aplikacji Vinted.
Krok 5: sprawdź ogłoszenie, zanim wyślesz alert
Jeśli alert ma zawierać opis, wszystkie zdjęcia albo informację, czy przedmiot jest jeszcze dostępny, dołóż jedno wywołanie /product:
curl -s https://api.scavio.dev/api/v1/vinted/product \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"country": "pl", "item_id": 10732698400}'Pobrane data w 3,9 sekundy (5 z 6 zdjęć skrócone; login, ID i adres profilu sprzedawcy usunięte):
{
"country": "pl",
"id": 10732698400,
"url": "https://www.vinted.pl/items/10732698400-kurtka-damska-ocieplana-marki-reserved-rozmiar-m",
"title": "Kurtka damska ocieplana marki Reserved rozmiar M",
"description": "Do sprzedania kurtka damska, ocieplana,marki Reserved,rozmiar M, długość 60cm, szerokość 50cm, długość rękawa 65cm,używana,nie zniszczona, materiał poliester, puszysta,wysyłka w ciągu kilku godzin.",
"description_translated": false,
"price": 90,
"currency": "PLN",
"brand": { "id": 10187, "name": "Reserved" },
"size": null,
"condition": "Bardzo dobry",
"color": "Niebieski",
"material": "Poliester",
"uploaded_relative": "2 min.",
"category": {
"id": 2614,
"name": "Kurtki ocieplane",
"path": [
{ "id": 1904, "title": "Kobiety", "url": "https://www.vinted.pl/catalog/1904-women" },
{ "id": 4, "title": "Ubrania", "url": "https://www.vinted.pl/catalog/4-clothing" },
{ "id": 1037, "title": "Okrycia wierzchnie", "url": "https://www.vinted.pl/catalog/1037-outerwear" },
{ "id": 1908, "title": "Kurtki", "url": "https://www.vinted.pl/catalog/1908-jackets" },
{ "id": 2614, "title": "Kurtki ocieplane", "url": "https://www.vinted.pl/catalog/2614-puffer-jackets" }
]
},
"photos": ["https://images1.vinted.net/t/04_00002_8BnHSfF9ssK5V8zpNygQTBTa/f800/01e7dade.webp?s=9570013ad063ae676966b766547b2be08b5b08be"],
"favourite_count": 0,
"is_reserved": false,
"is_sold": false,
"status_label": null,
"can_buy": true,
"instant_buy": true,
"is_hidden": false,
"seller": { "is_business": false, "feedback_count": 11, "feedback_reputation": 1, "badges": ["ACTIVE_LISTER", "SPEEDY_SHIPPING"] }
}is_sold i is_reserved mówią, czy przedmiot jest jeszcze do kupienia; gdy któreś zmieni się na true, usuń go z listy obserwowanych. uploaded_relative to sformułowanie Vinted, a nie znacznik czasu. Cena na stronie produktu jest w walucie sprzedawcy: kurtka "reserved zelena bunda", która w wynikach vinted.pl kosztowała 35,56 zł, zwróciła tu "price": 8 i "currency": "EUR". Do porównań używaj ceny z wyszukiwania.
Krok 6: sprawdź sprzedawcę (opcjonalnie)
seller.id z wyniku wyszukiwania lub produktu trafia do /seller, /seller-feedback i /seller-products. Przykład to konto firmowe muchadoaboutvintage, sklep z vintage z Holandii, odczytany na vinted.pl:
curl -s https://api.scavio.dev/api/v1/vinted/seller \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"country": "pl", "user_id": 3137190744}'Pobrane data:
{
"country": "pl",
"id": 3137190744,
"login": "muchadoaboutvintage",
"profile_url": "https://www.vinted.pl/member/3137190744-muchadoaboutvintage",
"is_business": true,
"feedback_count": 186,
"feedback_reputation": 1,
"positive_feedback_count": 186,
"neutral_feedback_count": 0,
"negative_feedback_count": 0,
"item_count": 299,
"country_code": "NL",
"country_name": "Holandia",
"city": null,
"verification": { "email": true, "facebook": false, "google": true },
"avg_response_time": null,
"is_on_holiday": false,
"last_seen_date": "2026-11-09"
}Bot może na tej podstawie pomijać sprzedawców z małą liczbą opinii albo z opiniami negatywnymi. Każde takie sprawdzenie to dodatkowy kredyt, więc rób je tylko dla ogłoszeń, które przeszły już Twoje filtry. /seller-feedback zwraca do 50 opinii na stronę z oceną, treścią, datą i flagą is_automatic dla automatycznych opinii Vinted, bez danych autora.
Wszystkie 9 endpointów
| Endpoint | Co zwraca | Kredyty |
|---|---|---|
/api/v1/vinted/search | 96 ogłoszeń na stronę, strony 1-10, z ceną, opłatą Vinted, sumą, rozmiarem, stanem, zdjęciami i ID sprzedawcy oraz zastosowanymi filtrami | 1 |
/api/v1/vinted/product | Jedno ogłoszenie po ID lub URL: opis, wszystkie zdjęcia, ścieżka kategorii, status sprzedaży i rezerwacji, ocena sprzedawcy | 1 |
/api/v1/vinted/seller | Publiczny profil: ocena, liczba opinii pozytywnych, neutralnych i negatywnych, liczba ogłoszeń, weryfikacje | 1 |
/api/v1/vinted/seller-products | Ogłoszenia sprzedawcy, do 96 na stronę, z opłatą, sumą i flagami sprzedaży i rezerwacji | 1 |
/api/v1/vinted/seller-feedback | Opinie, do 50 na stronę, od najnowszych, z flagą opinii automatycznej i odpowiedzią sprzedawcy | 1 |
/api/v1/vinted/brands | ID marek z liczbą ogłoszeń i flagami marki luksusowej i weryfikacji autentyczności | 1 |
/api/v1/vinted/suggestions | Do 10 podpowiedzi wyszukiwania w języku danej strony | 1 |
/api/v1/vinted/filters | ID rozmiarów, stanów, kolorów lub materiałów z bieżącą liczbą przedmiotów | 1 |
/api/v1/vinted/categories | Drzewo kategorii w języku danej strony albo jedno poddrzewo | 1 |
Błędy nie są liczone: nieznany przedmiot, użytkownik lub kategoria to 404, chwilowa awaria to 502. Każdy endpoint przyjmuje country: pl dla vinted.pl, fr (domyślnie) i pozostałe strony UE, uk, us lub au. Nie ma wyszukiwania sprzedanych ogłoszeń, kosztów wysyłki ani podobnych przedmiotów. Wszystkie parametry są w polskiej dokumentacji: wyszukiwanie, produkt, sprzedawca, przedmioty sprzedawcy, opinie, marki, podpowiedzi, filtry i kategorie. Porównanie wszystkich opcji, od API po gotowe boty, znajdziesz w zestawieniu 7 najlepszych API i botów Vinted.
Na start
- Załóż konto na dashboard.scavio.dev/sign-up: 50 kredytów gratis, bez karty, czyli 50 wywołań Vinted.
- Skopiuj klucz API z panelu i wstaw go w miejsce
sk_live_your_key. - Ustal filtry krokami 1 i 2, z własną frazą i
"country": "pl", albo przetestuj je najpierw w playgroundzie. - Uruchom bota z kroku 4 na komputerze lub serwerze, który działa całą dobę.
- Zobacz stronę API Vinted dla Polski z przykładami w Pythonie i JavaScripcie.
Frequently asked questions
Jak zrobić bota Vinted?
Bot powiadomień to pętla: co kilka minut wyszukuje ogłoszenia z Twoimi filtrami posortowane od najnowszych, zapamiętuje ID, które już widział, i wysyła nowe na Discorda lub Telegram. Z API Vinted od Scavio jedno sprawdzenie to jedno wywołanie /api/v1/vinted/search z "country": "pl" i "sort": "newest_first", które zwraca 96 ogłoszeń i kosztuje 1 kredyt.
Jak często bot może sprawdzać Vinted?
Tak często, jak pozwala budżet. Sprawdzanie co 5 minut to 288 wywołań dziennie, około 8640 miesięcznie, czyli 8640 kredytów: 8,64 dolara w stawce Growth. Co minutę to pięć razy więcej. Najnowsze ogłoszenie w naszym teście było dodane około 2 minuty przed odczytem, więc interwał 2-5 minut wystarcza do większości zastosowań.
Dlaczego bot pokazuje stare ogłoszenia jako nowe?
Bo koniec listy się przesuwa. W dwóch zapytaniach wykonanych minutę po sobie na pierwszych 79 pozycjach były te same ogłoszenia (część w innej kolejności), ale na pozycjach 80 i 88 pojawiły się dwa ogłoszenia o starszych ID, a dwa inne wypadły. Dlatego bot poniżej uznaje za nowe tylko ogłoszenia z ID wyższym niż najwyższe znane, bo w naszych odczytach ID ogłoszeń rosły z czasem dodania.
Czy bot przez API może kupować automatycznie?
Nie z Scavio. API Vinted od Scavio tylko zwraca dane: nie loguje się na Twoje konto, nie kupuje, nie składa ofert i nie pisze do sprzedawców. Bot opisany tutaj wysyła powiadomienie, a decyzję o zakupie podejmujesz sam w aplikacji Vinted. Pamiętaj też, że regulamin Vinted ogranicza korzystanie z zewnętrznych narzędzi.
Dlaczego ceny na vinted.pl mają grosze, np. 35,56 zł?
Europejskie strony Vinted dzielą jedną pulę ogłoszeń, więc na vinted.pl widać też przedmioty z Czech, Słowacji czy Litwy, przeliczone na złote. Kurtka za 35,56 zł w wynikach wyszukiwania miała w /api/v1/vinted/product cenę sprzedawcy 8 euro. Do porównań używaj ceny z wyszukiwania, bo zawsze jest w złotych.