Funkcje
Integracje
Kanały dostawy powiadomień. Podpinasz raz, w Integracjach; każdy monitor może słać na inny kanał.
Telegram
- 1Napisz do @BotFather i stwórz bota (/newbot), skopiuj token.
- 2Napisz do @userinfobot, żeby poznać swój chat_id.
- 3W Integracjach → Telegram wklej token i chat_id.
- 4Napisz cokolwiek do swojego bota (inaczej Telegram nie pozwoli mu wysłać pierwszej wiadomości).
Discord
Na swoim serwerze: Ustawienia kanału → Integracje → Webhooki → Nowy webhook, skopiuj URL i wklej w Integracjach. Powiadomienia przychodzą jako wiadomości na wybranym kanale.
Push w przeglądarce
Systemowe powiadomienia działające także przy zamkniętej karcie. Każde urządzenie (laptop, telefon z Androidem) łączysz osobno przyciskiem „Włącz na tym urządzeniu”; lista urządzeń z osobnym testem i usuwaniem jest w tym samym popupie.
Safari wspiera push od wersji 16.4; na iPhonie wymagane jest dodanie strony do ekranu początkowego.
Webhook i e-mail
Podajesz własny adres HTTPS, a każde trafienie monitora dostajesz jako POST z JSON-em (Content-Type: application/json). Body ma zawsze ten sam kształt — pola, których dla danej oferty nie znamy, przychodzą jako null:
{
"title": "iPhone 13 Pro 256GB",
"url": "https://vinted.pl/items/123456",
"marketplace": "vinted",
"price": "2 000 PLN",
"image": "https://images.vinted.net/...jpg",
"hidden": false,
"monitorId": "8f3c1e2a-…-uuid",
"seller": {
"login": "ola_vinted",
"country": "Polska",
"countryFlag": "🇵🇱",
"city": "Warszawa",
"feedbackCount": 123,
"feedbackReputation": 0.98,
"photoUrl": "https://images.vinted.net/avatar.jpg"
}
}- 1title, url, marketplace — zawsze obecne.
- 2price — sformatowany string (np. „2 000 PLN”) albo null.
- 3image — URL miniatury albo null.
- 4hidden — true, gdy ofertę znaleźliśmy przez id-probing i może być niewidoczna w publicznym wyszukiwaniu portalu.
- 5monitorId — UUID monitora, który złapał ofertę (do routingu po Twojej stronie).
- 6seller — dane sprzedającego; dziś tylko Vinted, gdzie indziej null. feedbackReputation to ułamek 0–1 (0.98 = 98%).
Requesty przychodzą z adresów IP Cloudflare (nie z naszego serwera). Jeśli filtrujesz ruch po IP, dopuść zakresy Cloudflare.
Opcjonalny klucz podpisu: gdy go ustawisz, każdy request niesie nagłówek x-snipeit-signature: sha256=<hex>, gdzie hex = HMAC-SHA256(klucz, surowe body). Policz to samo po swojej stronie i porównaj — tak potwierdzisz, że request pochodzi od nas i body nie zostało zmienione.
import { createHmac, timingSafeEqual } from "node:crypto";
function verify(rawBody, header, secret) {
const expected =
"sha256=" + createHmac("sha256", secret).update(rawBody).digest("hex");
const a = Buffer.from(header ?? "");
const b = Buffer.from(expected);
return a.length === b.length && timingSafeEqual(a, b);
}Każdy podpięty kanał ma przycisk „Testuj powiadomienie” (limit 3/min) — użyj go od razu po konfiguracji.
E-mail: najprostszy kanał — podajesz adres i odbierasz powiadomienia mailem z linkiem do oferty.