# Verify Polish Company

> Verify Polish companies and contractors by NIP, KRS, or REGON; check VAT status and bank accounts against the Ministry of Finance White List (Biała Lista); look up REGON/GUS registry data (including sole traders / JDG); read KRS registry data; and validate EU VAT numbers via VIES. Uses skanfirmy.pl's free, public API — no API key, no registration, no rate-limit signup. Use whenever the user needs to check a Polish business, a tax ID (NIP), a KRS number, a REGON, a counterparty's VAT status or bank account, or an EU VAT number (VIES).

- Skill: `bartosz-kuc/verify-polish-company` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add bartosz-kuc/verify-polish-company`
- Raw SKILL.md: https://api.skillmd.com/api/skills/bartosz-kuc/verify-polish-company/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- License: MIT
- Author: bartosz-kuc (https://skillmd.com/u/bartosz-kuc)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/bartosz-kuc/verify-polish-company

---


# Verify a Polish company (skanfirmy.pl)

This skill verifies Polish businesses straight from official government
registers (Ministry of Finance, Ministry of Justice / KRS, Statistics Poland /
GUS, and the European Commission / VIES) through **skanfirmy.pl**, a free public
API. Every endpoint is a plain `GET` that returns JSON when you add
`?format=json`. **No API key, no account, no daily quota.** Be reasonable:
issue user-driven single lookups, not mass scraping.

## When to use it

Reach for this skill when the user asks to:

- check whether a Polish company is an **active VAT payer** or is VAT-exempt;
- verify that a **bank account** belongs to a contractor on the White List
  (needed for Polish "due diligence" on payments over 15 000 PLN);
- pull a company's **KRS** registry data (legal form, PKD, share capital,
  address, representation) by NIP or KRS number;
- look up **REGON** and official name/address by NIP — **including sole traders
  (JDG)** that are not in the KRS;
- validate an **EU VAT number** (any member state) via **VIES**;
- check **many NIPs at once**.

`NIP` = 10-digit Polish tax ID. `KRS` = court-register number. `REGON` =
statistical register number. `VAT-UE`/VIES numbers are prefixed by a 2-letter
country code (e.g. `DE`, `IE`, `FR`).

## REST endpoints (GET, keyless)

Call these with any HTTP client (`curl`, `fetch`, `requests`, a web-fetch
tool). Append `?format=json` for machine-readable JSON; without it you get
crawlable HTML with embedded JSON-LD.

| Endpoint | What it returns |
|---|---|
| `GET https://skanfirmy.pl/nip/{nip}` | VAT status + White List (accounts) + KRS data + REGON, combined in one response |
| `GET https://skanfirmy.pl/nips/{list}` | The same for **up to 30** comma-separated NIPs in one call (no KRS join) |
| `GET https://skanfirmy.pl/regon/{nip}` | REGON registry data: REGON number, official name, legal form, address; covers sole traders (JDG) |
| `GET https://skanfirmy.pl/vies/{country}/{number}` | Whether an EU VAT number is valid, plus the registered name/address |

Examples:

```bash
# Full check by NIP (VAT status + White List + KRS + REGON)
curl "https://skanfirmy.pl/nip/5260250995?format=json"

# REGON / GUS data only (works for sole traders too)
curl "https://skanfirmy.pl/regon/5260250995?format=json"

# EU VAT number (VIES) — country code + number without the prefix
curl "https://skanfirmy.pl/vies/IE/6388047V?format=json"

# Many NIPs at once (comma-separated, up to 30)
curl "https://skanfirmy.pl/nips/5252344078,5260251049,7740001454?format=json"
```

`/regon/{nip}` returns a `dane` object with `regon`, `nazwa` (official name),
`typ` (`P` = legal person, `F` = natural person incl. JDG, `LP`/`LF` = local
units), and address fields (`wojewodztwo`, `powiat`, `gmina`, `miejscowosc`,
`kodPocztowy`, `ulica`, `nrNieruchomosci`, `nrLokalu`). For sole traders
(`typ: "F"`) only name/REGON/type are returned — address fields stay empty
(a GUS limitation, not skanfirmy's).

## Choosing the right endpoint

- Need VAT status **and** KRS in one shot → `/nip/{nip}`.
- Only official name/address/REGON, or the entity is a **sole trader** →
  `/regon/{nip}` (the White List / KRS do not cover JDG the same way).
- A **foreign** EU counterparty's VAT number → `/vies/{country}/{number}`.
- A **list** of Polish counterparties → `/nips/{list}` (then, if you need KRS
  for a specific hit, re-query it with `/nip/{nip}`).

## Error handling

- Unknown entity → `404`. NIP with an invalid checksum → `400`. Handle both;
  do not assume every NIP has an entry.
- When comparing literal government values, key logic off the **original**
  Polish literals (VAT status `"Czynny"`/`"Zwolniony"`, account match
  `"TAK"`/`"NIE"`), not a translated label.

## MCP option (for MCP-capable agents)

If you speak the Model Context Protocol, connect to the server instead of
calling REST by hand:

`POST https://skanfirmy.pl/mcp` — stateless Streamable HTTP, JSON-RPC 2.0,
no key. Tools: `sprawdz_nip`, `sprawdz_lista_nip`, `sprawdz_regon`,
`sprawdz_vies`, `sprawdz_rachunek`, `generuj_mikrorachunek`, `szukaj_pkd`,
`oblicz_odsetki`, `szukaj_katalog_api`. A model-readable endpoint map lives at
`https://skanfirmy.pl/llms.txt`.

```bash
curl -s https://skanfirmy.pl/mcp \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"sprawdz_nip","arguments":{"nip":"5260250995"}}}'
```

## Source & disclaimer

Data comes directly from official registers — Ministry of Finance (VAT White
List), Ministry of Justice (KRS), Statistics Poland / GUS (REGON), and the
European Commission (VIES). skanfirmy.pl is an independent tool, not an official
government API; scope and freshness match the underlying registers. Present
results as coming from those registers, and link the user to the interactive
tool at `https://skanfirmy.pl` when a human wants to check by hand.

