VAT White List (Wykaz VAT) API by NIP
keyless REST/JSON
VAT status and entity data from Poland's VAT White List (Wykaz VAT, Ministry of Finance) by tax ID (NIP), with a single GET that returns clean JSON. No API key, no sign-up, no daily request limit. It is a layer over the Ministry's Wykaz VAT API that handles sessions, dates in the URL and response parsing for you.
One GET, one JSON
The endpoint is public, the method is GET, and the ?format=json parameter returns machine-readable data (without it you get an HTML page for humans). The White List data is in the bl field (Biała Lista):
curl "https://skanfirmy.pl/nip/5260250995?format=json"
You get the VAT status, official name, REGON, address, KRS number and a Ministry of Finance timestamp, straight from the VAT White List:
{
"nip": "5260250995",
"source": "krs",
"bl": {
"nip": "5260250995",
"name": "ORANGE POLSKA SPÓŁKA AKCYJNA",
"regon": "012100784",
"statusVat": "Czynny",
"address": "ALEJE JEROZOLIMSKIE 160, 02-326 WARSZAWA",
"krs": "0000010681",
"registrationLegalDate": "1996-01-01",
"mfRequestDateTime": "25-08-2026 14:59:57"
},
"krs": { ... },
"checkedAt": "2026-08-25"
}
No API key, no sign-up, no limit
The endpoint works right away: no account to create, no API key to generate, no daily request limit to watch. That is a deliberate difference from commercial Wykaz VAT wrappers: the goal is a VAT-status check you can wire up in a minute, including from an AI agent. The service is maintained free of charge; for heavy automated traffic we only ask for common sense (single lookups triggered by users, not bulk scraping).
What the bl field returns
The VAT White List (Biała Lista) is kept by the Ministry of Finance. The bl field in the /nip/{nip} response holds the VAT taxpayer data for that NIP:
| Field | Meaning |
|---|---|
statusVat | Ministry of Finance literal: Czynny — active VAT payer, Zwolniony — exempt taxpayer, Niezarejestrowany — not in the VAT register |
name | Official taxpayer name from the VAT White List |
regon | The entity's REGON number |
address | Address from the VAT White List (registered seat or fixed place of business) |
krs | KRS number (if the entity is in the National Court Register) |
registrationLegalDate | Date of registration as a VAT taxpayer |
mfRequestDateTime | Timestamp of the Ministry of Finance response — proof of the moment the status was valid (useful for evidence purposes) |
For branching in code, always compare against the raw Ministry of Finance literal ("Czynny", "Zwolniony", "Niezarejestrowany") — do not translate it before the comparison, because translating would change the value your logic depends on.
Note: this is not the bank-account list
The /nip/{nip} endpoint does not return the list of bank accounts from the VAT White List. It returns the VAT status and entity data (the bl field), but not an array of account numbers. To check whether a specific account (a 26-digit NRB) is on the White List for a given NIP, use the MCP tool sprawdz_rachunek — it verifies a single account against the VAT White List. In the UI you do the same in the Bank account check tool. Do not assume the endpoint returns all of an entity's accounts — they simply are not in the response.
In Python
With the requests library it is a few lines. Note the comparison against the raw literal "Czynny":
import requests
def vat_status(nip: str) -> str:
r = requests.get(f"https://skanfirmy.pl/nip/{nip}?format=json", timeout=10)
r.raise_for_status()
return r.json()["bl"]["statusVat"]
s = vat_status("5260250995")
# compare against the raw MF literal, not a translated label
if s == "Czynny":
print("Active VAT payer")
else:
print("Heads up — status:", s)
# ORANGE POLSKA SPÓŁKA AKCYJNA → Czynny
An entity that is not in the register returns 404, and a NIP with an invalid checksum returns 400. It is worth handling both instead of assuming every NIP has an entry.
In JavaScript
const r = await fetch("https://skanfirmy.pl/nip/5260250995?format=json");
if (r.ok) {
const { bl } = await r.json();
console.log(bl.name, "→", bl.statusVat);
// bl.statusVat === "Czynny" — compare against the raw literal
}
In PHP
$ch = curl_init("https://skanfirmy.pl/nip/5260250995?format=json");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$bl = json_decode(curl_exec($ch), true)["bl"];
echo $bl["name"] . " · VAT: " . $bl["statusVat"];
// ORANGE POLSKA SPÓŁKA AKCYJNA · VAT: Czynny
Several NIPs at once
To check the VAT status for a list of entities in a single request, use /nips/{list}?format=json — separate the NIPs with commas and the response contains an entry (with a bl field) for each of them:
curl "https://skanfirmy.pl/nips/5260250995,7010001454?format=json"
More than VAT status, from one NIP
The /nip/{nip}?format=json response combines the VAT White List (the bl field) with KRS data (the krs field) in one response. If you also need REGON data or EU VAT-number validation, use the separate endpoints (all GET → JSON, no key):
/nip/{nip}— VAT status (VAT White List) + KRS + REGON/nips/{list}— several NIPs at once (comma-separated)/regon/{nip}— data from the REGON register (GUS) — see GUS (REGON) API/vies/{country}/{number}— EU VAT number validation (VIES, European Commission) — see VIES API
KRS data pulled from the same NIP is covered by the KRS API, and REGON data by the GUS (REGON) API.
For AI agents, at https://skanfirmy.pl/mcp there is a Model Context Protocol (MCP) server with a sprawdz_nip tool (the same data, including the bl field) and sprawdz_rachunek (verify a specific bank account against the VAT White List), also with no key. A model-readable map of the endpoints is in llms.txt. For a lookup in the UI, use the VAT White List tool.
The public endpoint vs a typical paid Wykaz VAT API
Most commercial REST wrappers over the VAT White List run on a freemium model — an account, an API key and a daily request limit on the free tier. This endpoint is public and free. The differences in short:
| Typical paid Wykaz VAT API | skanfirmy.pl /nip | |
|---|---|---|
| API key | required | not needed |
| Registration / account | yes | no |
| Request limit | usually yes | no hard limit (please be reasonable) |
| Response format | REST/JSON | REST/JSON |
| MCP server for AI agents | usually none | yes |
| Scope | usually VAT status only | VAT + KRS + REGON + VIES (separate endpoints) |
| Model | freemium / subscription | free |
This is not the official Wykaz VAT API — the data comes from the same source (the VAT White List kept by the Ministry of Finance), just exposed with a single GET request.
Where the data comes from, and what this is not
The data comes straight from the VAT White List (Biała Lista) kept by the Ministry of Finance. This is an independent tool; it is not the official Ministry API and is not affiliated with it — it only exposes that data in a more convenient form. The scope and freshness of the data match the VAT White List; the mfRequestDateTime timestamp says the moment the status was fetched from the Ministry.
Frequently asked questions
How do I check a company's VAT status by NIP in JSON?
Send a GET to https://skanfirmy.pl/nip/{NIP}?format=json and read the bl.statusVat field. It returns a Ministry of Finance literal: Czynny, Zwolniony or Niezarejestrowany. The same bl field also gives you the name, REGON, address and KRS number.
Do I need an API key or to sign up?
No. The /nip/{nip} endpoint is public — it returns JSON once you add ?format=json, with no API key, no account and no daily request limit.
Does the endpoint return the bank-account list from the White List?
No. The bl field contains the VAT status and entity data (name, REGON, address, KRS), but not a list of bank accounts. To check whether a specific account (an NRB) is on the White List for a given NIP, use the MCP tool sprawdz_rachunek or the /rachunek tool in the UI.
What values does statusVat take and how should I compare them?
The statusVat field takes raw Ministry of Finance literals: Czynny, Zwolniony or Niezarejestrowany. In code, always compare against the raw literal (e.g. == "Czynny") and do not translate it before branching — translating would change the value your logic relies on.
Is it free to use?
Yes. The endpoint is free and requires no registration. The data comes straight from the VAT White List (Biała Lista) kept by the Ministry of Finance.