API VIES (unijny VAT)
walidacja VAT-UE bez klucza
Sprawdzenie unijnego numeru VAT w systemie VIES (Komisja Europejska) — jednym zapytaniem GET, w odpowiedzi czysty JSON. Dostajesz status ważności, nazwę i adres podatnika (o ile państwo je udostępnia; dla numerów PL — tylko miejscowość) oraz znacznik czasu sprawdzenia. Bez klucza API, bez rejestracji i bez dziennego limitu. To wygodna warstwa nad usługą VIES (SOAP), która zdejmuje z Ciebie koperty XML.
Jeden GET, jeden JSON
Endpoint jest publiczny, metoda GET, a parametr ?format=json zwraca dane maszynowo (bez niego dostajesz stronę HTML dla człowieka). Ścieżka to /vies/{kraj}/{numer} — kraj to dwuliterowy kod państwa UE (np. PL, DE), numer to numer VAT bez prefiksu kraju:
curl "https://skanfirmy.pl/vies/PL/5260250995?format=json"
W odpowiedzi dostajesz status ważności numeru, nazwę i adres podatnika w formie zwracanej przez VIES — dla polskich numerów od 26.09.2026 zamiast adresu tylko miejscowość (szczegóły niżej) — oraz znacznik czasu zapytania (dowód sprawdzenia):
{
"countryCode": "PL",
"vatNumber": "5260250995",
"valid": true,
"result": "valid",
"name": "ORANGE POLSKA SPÓŁKA AKCYJNA",
"address": null,
"city": "WARSZAWA",
"requestDate": "2026-09-26T08:15:02.000Z",
"privacy": {
"naturalPerson": null,
"hidden": ["address"],
"reason": "Dane osoby fizycznej prowadzącej działalność ograniczone do niezbędnych do weryfikacji kontrahenta (RODO). Pełny wpis publikuje rejestr źródłowy (officialSource).",
"officialSource": "https://www.gov.pl/web/kas/wykaz-podatnikow-vat"
},
"checkedAt": "2026-09-26"
}
Pole valid to jedyna miarodajna odpowiedź na pytanie „czy ten unijny numer VAT jest ważny”. Pola name i address VIES zwraca tylko wtedy, gdy dane państwo członkowskie je ujawnia — część krajów ich nie udostępnia i wówczas potrafią być puste.
Bez klucza API, bez rejestracji, bez limitu dziennego
Endpoint działa od razu — nie musisz zakładać konta, generować klucza API ani pilnować dziennego limitu zapytań. Jedyne ograniczenie chroni serwis przed nadużyciami: najwyżej 20 zapytań na 10 sekund z jednego adresu IP (po przekroczeniu kod 429 przez 10 sekund; od 25.09.2026). To celowa różnica względem komercyjnych nakładek na VIES: chcemy, żeby walidację VAT-UE dało się wpiąć w minutę, także z poziomu agenta AI. Serwis jest bezpłatny i służy do pojedynczych zapytań inicjowanych przez użytkowników lub ich agentów, nie do masowego pobierania danych.
Zamiast VIES SOAP
Oficjalna usługa to VIES Komisji Europejskiej — SOAP z operacją checkVat, kopertami XML i odpowiedzią, którą trzeba samodzielnie sparsować. Działa, ale integracja potrafi zająć popołudnie. Nasz endpoint robi to wszystko po stronie serwera i zwraca gotowy JSON — Ty wysyłasz jeden GET.
Co zwraca /vies/{kraj}/{numer}:
| Pole | Znaczenie |
|---|---|
valid | Wartość logiczna — jedyna miarodajna odpowiedź, czy numer VAT-UE jest ważny w VIES w chwili sprawdzenia |
result | Pole pochodne (enum), obecne w każdej odpowiedzi — także błędnej: valid — numer ważny, not_registered — poprawny format, ale numer niezarejestrowany, invalid_format — błędny format numeru lub kod kraju spoza UE (HTTP 400), source_unavailable — VIES lub rejestr krajowy chwilowo niedostępny (HTTP 502/503), restricted — dane numeru PL nie są prezentowane (HTTP 200, bez pola valid). Rozróżnia literówkę od numeru niezarejestrowanego |
name | Nazwa podatnika w formie zwracanej przez VIES (może być pusta, jeśli państwo jej nie ujawnia) |
address | Adres podatnika w formie zwracanej przez VIES (może być pusty lub zastrzeżony w niektórych państwach). Dla numerów PL od 26.09.2026 zawsze null — patrz city |
city | Tylko numery PL, od 26.09.2026: miejscowość z adresu zwróconego przez VIES |
countryCode | Dwuliterowy kod państwa UE z zapytania |
vatNumber | Numer VAT bez prefiksu kraju |
requestDate | Znacznik czasu z VIES — dowód, kiedy sprawdzenie zostało wykonane |
privacy | Od 26.09.2026: dla numerów PL z adresem — co pominęliśmy (hidden), dlaczego (reason) i gdzie jest pełny wpis (officialSource); dla pozostałych null |
checkedAt | Data sprawdzenia |
Dla numeru z innego państwa działa tak samo — np. niemiecki numer sprawdzisz przez GET /vies/DE/811128135?format=json. Prefiks kraju (DE, PL) idzie w ścieżce jako {kraj}, a sam numer bez prefiksu jako {numer}.
Polskie numery VAT — zmiana od 26.09.2026
VIES nie mówi, czy polski numer VAT należy do spółki, czy do osoby fizycznej prowadzącej działalność — a adres osoby fizycznej jest daną osobową i bywa jej adresem zamieszkania. Dlatego od 26.09.2026 dla każdego numeru PL zamiast adresu zwracamy tylko miejscowość: pole address ma wartość null, miejscowość jest w polu city, a pole privacy mówi, co pominęliśmy i gdzie jest pełny wpis (Wykaz podatników VAT na gov.pl; naturalPerson ma wartość null, bo VIES tego nie rozstrzyga). Takie odpowiedzi mają nagłówki X-Robots-Tag: noindex i Cache-Control: private, max-age=3600, a strona HTML nie ma nazwy w tytule ani w danych strukturalnych. Numery z pozostałych państw zwracamy bez zmian. Pełne dane polskiej spółki, z adresem siedziby, daje /nip/{nip}.
W Pythonie
Z biblioteką requests całość to kilka linii — warto od razu sprawdzić valid:
import requests
def waliduj_vat_ue(kraj: str, numer: str) -> dict:
r = requests.get(f"https://skanfirmy.pl/vies/{kraj}/{numer}?format=json", timeout=10)
r.raise_for_status()
data = r.json()
if not data["valid"]:
raise ValueError(f"Numer VAT-UE {kraj}{numer} jest nieaktywny w VIES")
return data
d = waliduj_vat_ue("PL", "5260250995")
print(d["name"])
# ORANGE POLSKA SPÓŁKA AKCYJNA
Każda odpowiedź (także błędna) niesie pole result, więc rozgałęzienie możesz oprzeć na jednej wartości zamiast na samym kodzie HTTP. Kluczowe: literówka a numer niezarejestrowany to dwa różne stany — błędny format to result: "invalid_format" (HTTP 400), a poprawny, lecz niezarejestrowany numer to valid: false z result: "not_registered" (HTTP 200). Dzięki temu nie mylisz pomyłki w numerze z realnym brakiem rejestracji.
W JavaScripcie
const r = await fetch("https://skanfirmy.pl/vies/PL/5260250995?format=json");
if (r.ok) {
const d = await r.json();
console.log(d.valid, d.name);
}
W PHP
$ch = curl_init("https://skanfirmy.pl/vies/PL/5260250995?format=json");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$d = json_decode(curl_exec($ch), true);
echo $d["valid"] ? $d["name"] : "numer nieaktywny";
Krajowy VAT i dane rejestrowe — jednym NIP-em
VIES odpowiada na pytanie o unijny numer VAT. Jeśli sprawdzasz polską firmę i potrzebujesz krajowego statusu VAT (Wykaz VAT / Biała Lista), wpisu w KRS i numeru REGON (poza osobami fizycznymi), użyj /nip/{nip}?format=json — łączy te źródła w jednej odpowiedzi. Pozostałe endpointy (wszystkie GET → JSON, bez klucza):
/vies/{kraj}/{numer}— walidacja unijnego numeru VAT (VIES, Komisja Europejska)/nip/{nip}— status VAT + Biała Lista + KRS + REGON (poza osobami fizycznymi)/nips/{lista}— wiele NIP-ów naraz (rozdzielonych przecinkami)/regon/{nip}— dane z rejestru REGON (GUS)
Dla agentów AI pod adresem https://skanfirmy.pl/mcp stoi serwer Model Context Protocol (MCP) z narzędziem do walidacji unijnego VAT (i kilkoma innymi do NIP, KRS i REGON) — również bez klucza. Mapa endpointów dla modeli jest w llms.txt, a pełna specyfikacja maszynowa w OpenAPI 3.1. Walidację numeru VAT-UE w interfejsie zrobisz w narzędziu VIES (unijny VAT).
Publiczny endpoint a typowe płatne API VIES
Większość komercyjnych nakładek REST na VIES działa w modelu freemium — konto, klucz API i dzienny limit zapytań w bezpłatnym progu. Ten endpoint jest publiczny i bezpłatny, a poza samym valid zwraca też nazwę, adres i datę sprawdzenia. Różnice w skrócie:
| Typowe płatne API VIES | skanfirmy.pl /vies | |
|---|---|---|
| Klucz API | wymagany | niepotrzebny |
| Rejestracja / konto | tak | nie |
| Limit w bezpłatnym progu | zwykle jest | 20 zapytań na 10 s z jednego IP, bez limitu dziennego |
| Format odpowiedzi | REST/JSON | REST/JSON |
| Serwer MCP dla agentów AI | zwykle brak | tak |
| Zwraca | zwykle samo valid | valid + nazwa + adres (dla numerów PL — miejscowość) + data sprawdzenia |
| Model | freemium / abonament | bezpłatnie |
To nie jest oficjalne API VIES — dane pochodzą z tego samego źródła (system VIES Komisji Europejskiej), tylko udostępnione jednym zapytaniem GET.
Skąd pochodzą dane i czym to nie jest
Dane pochodzą wprost z systemu VIES prowadzonego przez Komisję Europejską. To niezależne narzędzie — nie jest oficjalnym API VIES ani z nim powiązane; jedynie udostępnia jego dane w wygodniejszej formie. Nazwę i adres VIES zwraca tylko wtedy, gdy dane państwo członkowskie je ujawnia, a wartość valid odzwierciedla stan w chwili z pola requestDate — status może się później zmienić.
Najczęstsze pytania
Czy potrzebny jest klucz API albo rejestracja?
Nie. Endpoint /vies/{kraj}/{numer} jest publiczny — zwraca JSON po dodaniu ?format=json, bez klucza API, bez zakładania konta i bez dziennego limitu zapytań.
Jak sprawdzić unijny numer VAT (VAT-UE) w formacie JSON?
Wyślij GET na https://skanfirmy.pl/vies/{KRAJ}/{NUMER}?format=json, gdzie KRAJ to dwuliterowy kod państwa UE (np. DE, PL), a NUMER to numer VAT bez prefiksu kraju. W odpowiedzi dostaniesz pole valid oraz — jeśli państwo je udostępnia — nazwę i adres podatnika.
Czym to się różni od usługi VIES (SOAP)?
Oficjalna usługa VIES to SOAP z operacją checkVat, kopertami XML i odpowiedzią, którą trzeba samodzielnie sparsować. Nasz endpoint wykonuje to zapytanie po stronie serwera i zwraca gotowy JSON, więc po Twojej stronie zostaje jedno zapytanie GET.
Dlaczego nazwa i adres bywają puste?
Nazwę i adres VIES zwraca wyłącznie wtedy, gdy dane państwo członkowskie je ujawnia — część krajów tego nie robi i wówczas pola name oraz address są puste. To ograniczenie po stronie VIES; miarodajną odpowiedzią o ważności numeru pozostaje pole valid. Wyjątek: dla polskich numerów od 26.09.2026 sami podajemy zamiast adresu tylko miejscowość (pole city), bo numer może należeć do osoby fizycznej prowadzącej działalność (RODO).
Czy sprawdzenie odróżnia literówkę w numerze od numeru niezarejestrowanego?
Tak. Błędny format numeru (albo kod kraju spoza UE) zwraca result: "invalid_format" z kodem HTTP 400, a poprawny, lecz niezarejestrowany numer zwraca valid: false z result: "not_registered" i kodem 200. Gdy VIES lub rejestr danego państwa jest chwilowo niedostępny, dostajesz result: "source_unavailable" (HTTP 502/503). Dzięki temu nie mylisz pomyłki w numerze z realnym brakiem rejestracji — a to częsty problem, bo wiele weryfikatorów zwraca w obu przypadkach po prostu „nie znaleziono".
Czy korzystanie jest płatne?
Nie. Endpoint jest bezpłatny i bez rejestracji. Dane pochodzą wprost z systemu VIES prowadzonego przez Komisję Europejską, a wartość valid odzwierciedla stan z chwili z pola requestDate.