Dokumentacja
Jedno zapytanie, jedna odpowiedź
API sprawdza adresy email i numery telefonu. Zwraca werdykt w trzech stopniach, a przy literówce podpowiada poprawną wersję. Odpowiedź przychodzi w milisekundach, bo wynik trzymamy w cache przez 30 dni.
Uwierzytelnianie
Każde zapytanie wymaga klucza w nagłówku X-API-Key. Klucz wygenerujesz w panelu. Trzymaj go na serwerze — nigdy w kodzie strony, który widzi przeglądarka.
X-API-Key: vk_TWOJ_KLUCZ
Adres API: http://localhost:8000 (środowisko lokalne). Po wdrożeniu na serwer podmieniasz tylko ten adres.
Sprawdzenie adresu email
/verify/emailTreść zapytania:
{ "email": "anna.kowalska@gmail.com" }Odpowiedź dla poprawnego adresu:
{
"valid": true,
"status": "valid",
"reason": null,
"suggestion": null,
"checks": {
"syntax": true,
"mx": true,
"smtp": "skipped",
"disposable": false,
"role": false
}
}Odpowiedź dla literówki — zwróć uwagę na suggestion:
{
"valid": false,
"status": "risky",
"reason": "domain_typo",
"suggestion": "jan@gmail.com",
"checks": { "syntax": true, "mx": false, "smtp": "skipped",
"disposable": false, "role": false }
}Pola odpowiedzi
- valid
- true tylko dla statusu valid. Do prostej decyzji: wpuścić czy nie.
- status
- valid, risky albo invalid — opis niżej.
- reason
- kod powodu, gdy coś jest nie tak. Lista poniżej.
- suggestion
- poprawiony adres przy literówce w domenie. Inaczej null.
- checks
- co po kolei sprawdziliśmy: składnia, rekord MX, SMTP, adres jednorazowy, adres funkcyjny.
Powody (pole reason)
- bad_syntax
- adres nie jest poprawnym adresem email
- domain_typo
- literówka w domenie — poprawiony adres jest w polu suggestion
- disposable
- adres jednorazowy, tymczasowa skrzynka
- no_mx
- domena nie odbiera poczty
- dns_error
- domena nie odpowiada
- role_account
- adres funkcyjny: biuro@, kontakt@, sklep@
- catch_all
- domena przyjmuje każdy adres, nie da się potwierdzić skrzynki
- mailbox_not_found
- serwer odpowiedział, że skrzynki nie ma
Sprawdzenie numeru telefonu
/verify/phoneTreść zapytania:
{ "phone": "+48 601 234 567" }Odpowiedź:
{
"valid": true,
"status": "valid",
"normalized": "+48601234567",
"type": "mobile",
"operator": "Plus",
"operator_source": "libphonenumber",
"reason": null
}- normalized
- numer w formacie międzynarodowym — ten zapisz w bazie.
- type
- mobile, fixed_line, voip, premium_rate i podobne.
- operator
- operator z tablic numeracyjnych UKE.
- operator_source
- skąd wiemy o operatorze: uke albo libphonenumber.
Powody (pole reason)
- bad_format
- numeru nie da się odczytać
- not_polish
- numer spoza Polski
- unassigned_prefix
- prefiks nieprzydzielony operatorowi (tablice UKE)
- unusual_number_type
- numer nietypowy: premium, usługowy, satelitarny
Sprawdzamy poprawność i przydział numeru, nie to, czy telefon jest w tej chwili włączony. Sprawdzenie w sieci operatora (HLR) będzie osobną, płatną opcją.
Trzy statusy i co z nimi zrobić
Wszystko się zgadza. Przyjmij kontakt.
Da się dostarczyć, ale coś budzi wątpliwość: literówka, adres funkcyjny, domena przyjmująca wszystko. Nie odrzucaj — zapytaj klienta albo oznacz w CRM.
Kontakt nie istnieje lub jest błędny. Zatrzymaj formularz i poproś o poprawkę.
Przykłady
curl -X POST http://localhost:8000/verify/email \
-H "X-API-Key: TWOJ_KLUCZ" \
-H "Content-Type: application/json" \
-d '{"email":"anna.kowalska@gmail.com"}'Kody błędów
Błąd zwracamy jako { "detail": "opis po polsku" }.
Zasada na produkcji: gdy walidacja odpowie błędem, przepuść klienta dalej. Lepiej przyjąć jeden podejrzany adres niż stracić zamówienie.
Limity i rozliczenie
- Wspólna pula
- Email i telefon liczą się do tego samego limitu miesięcznego.
- Cache 30 dni
- Powtórne sprawdzenie tej samej wartości jest natychmiastowe, ale nadal liczy się do limitu.
- Tempo
- 10 zapytań na sekundę na klucz. Powyżej dostajesz 429 z nagłówkiem Retry-After.
- Po limicie
- Wchodzi pula prepaid, jeśli ją masz. Bez niej zapytania dostają 403.
- Plik CSV
- Całą bazę sprawdzisz w panelu bez pisania kodu — do 20 000 rekordów na paczkę.
Podgląd interaktywny
Pełna specyfikacja OpenAPI, z możliwością wysłania zapytania prosto z przeglądarki: http://localhost:8000/docs. Działa, gdy API jest uruchomione.
