For developers · REST and MCP

GUS / REGON API by NIP
REST/JSON, no API key

Company data from Poland's REGON register (GUS BIR) 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 GUS BIR service (SOAP) that handles the login, sessions and XML 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):

curl "https://skanfirmy.pl/regon/5260250995?format=json"

You get the official name, REGON number, registered address and legal form, straight from the REGON register kept by Statistics Poland (GUS):

{
  "nip": "5260250995",
  "source": "regon-gus",
  "regon": "012100784",
  "dane": {
    "regon": "012100784",
    "nip": "5260250995",
    "nazwa": "ORANGE POLSKA SPÓŁKA AKCYJNA",
    "wojewodztwo": "MAZOWIECKIE",
    "powiat": "Warszawa",
    "gmina": "Ochota",
    "miejscowosc": "Warszawa",
    "kodPocztowy": "02-326",
    "ulica": "Aleje Jerozolimskie",
    "nrNieruchomosci": "160",
    "typ": "P",
    "dataZakonczenia": ""
  },
  "checkedAt": "2026-08-23"
}

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 GUS wrappers: the goal is an integration 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).

Instead of GUS BIR SOAP

The official Statistics Poland service is BIR 1.1: SOAP with a Zaloguj → DaneSzukajPodmioty → Wyloguj sequence, a session id in a header, XML envelopes and MTOM responses. It works, but wiring it up can take an afternoon. Our endpoint runs that whole sequence server-side and returns ready JSON, so on your side it stays a single GET.

What /regon/{nip} returns:

FieldMeaning
regonThe entity's REGON number
nazwaOfficial name from the REGON register
wojewodztwo, powiat, gmina, miejscowosc, kodPocztowy, ulica, nrNieruchomosci, nrLokaluRegistered address (for legal persons)
typGUS literal: P — legal person, F — natural person (incl. sole proprietors), LP/LF — local units
dataZakonczeniaDate business ceased (empty if the entity is active)

For sole proprietors (natural person, typ: "F") a NIP lookup in the REGON register returns the name, REGON and type; the address fields stay empty (a limitation on the GUS side, not in our layer).

In Python

With the requests library it is a few lines:

import requests

def regon_data(nip: str) -> dict:
    r = requests.get(f"https://skanfirmy.pl/regon/{nip}?format=json", timeout=10)
    r.raise_for_status()
    return r.json()["dane"]

d = regon_data("5260250995")
print(d["nazwa"], "· REGON", d["regon"])
# ORANGE POLSKA SPÓŁKA AKCYJNA · REGON 012100784

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/regon/5260250995?format=json");
if (r.ok) {
  const { dane } = await r.json();
  console.log(dane.nazwa, dane.regon);
}

In PHP

$ch = curl_init("https://skanfirmy.pl/regon/5260250995?format=json");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$dane = json_decode(curl_exec($ch), true)["dane"];
echo $dane["nazwa"] . " · REGON " . $dane["regon"];

More than REGON, from one NIP

If, besides GUS data, you need VAT status and a KRS entry, use /nip/{nip}?format=json: it combines the VAT register (White List, Ministry of Finance), KRS and the REGON number in one response. The other endpoints (all GET → JSON, no key):

  • /regon/{nip} — data from the REGON register (GUS)
  • /nip/{nip} — VAT status + White List + KRS + REGON
  • /nips/{list} — several NIPs at once (comma-separated)
  • /vies/{country}/{number} — EU VAT number validation (VIES, European Commission)

For AI agents, at https://skanfirmy.pl/mcp there is a Model Context Protocol (MCP) server with a sprawdz_regon tool (and several others for NIP, KRS and VIES), also with no key. A model-readable map of the endpoints is in llms.txt. For a lookup in the UI, use the REGON (GUS) tool.

The public endpoint vs a typical paid GUS API

Most commercial REST wrappers over the GUS register 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 GUS APIskanfirmy.pl /regon
API keyrequirednot needed
Registration / accountyesno
Free-tier limitusually yesno hard limit (please be reasonable)
Response formatREST/JSONREST/JSON
MCP server for AI agentsusually noneyes
Scopeusually GUS/REGON data onlyREGON + VAT White List, KRS, VIES (separate endpoints)
Modelfreemium / subscriptionfree

This is not the official GUS API — the data comes from the same source (the REGON register, BIR service), just exposed with a single GET request.

Where the data comes from, and what this is not

The data comes straight from the REGON register kept by Statistics Poland (GUS) (the BIR service). This is an independent tool; it is not the official GUS API and is not affiliated with it — it only exposes GUS data in a more convenient form. The scope and freshness of the data match the GUS register.

Frequently asked questions

Do I need an API key or to sign up?

No. The /regon/{nip} endpoint is public — it returns JSON once you add ?format=json, with no API key, no account and no daily request limit.

How is this different from the GUS BIR (SOAP) service?

The official GUS BIR 1.1 service is SOAP with login, a session, XML envelopes and MTOM responses. Our endpoint runs that sequence server-side and returns ready JSON, so on your side it stays a single GET request.

How do I get Polish company data from GUS by NIP in JSON?

Send a GET to https://skanfirmy.pl/regon/{NIP}?format=json. The response contains the name, REGON number, registered address and legal form of the entity from the REGON register.

Does it work for sole proprietors?

Yes. For natural persons running a business (typ: "F") the REGON register returns the name, REGON and entity type. The address fields stay empty — a limitation of the data GUS exposes in search, not of our layer.

Is it free to use?

Yes. The endpoint is free and requires no registration. The data comes straight from the REGON register kept by Statistics Poland (GUS).