Poland REGON check digit
Type the base 12345678 and get check digit 5, so the full REGON is 123456785. It also validates complete 9- and 14-digit numbers, including the parent part inside a local-unit number, so typos are caught early. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Number
- 12345678
- Calculation mode
- Compute
- Input
- 12345678
- Form
- 9
- Check digit
- 5
REGON is the Polish statistical identification number assigned by Główny Urząd Statystyczny (GUS) in the National Official Business Register (Rejestr Gospodarki Narodowej). Most entities receive a nine-digit REGON; local units of multi-site organisations receive a fourteen-digit REGON whose first nine digits match the parent entity. The final digit of each form is a check digit produced with fixed official weights and a modulo-eleven rule that maps remainder ten to zero. This capability implements that rule only: compute mode accepts eight base digits for a nine-digit REGON or thirteen base digits for a fourteen-digit REGON and returns the check digit plus the full number; validate mode accepts a full nine- or fourteen-digit string and reports whether the trailing digit matches the recomputed expected value.
How the REGON check digit is calculated (9-digit and 14-digit forms)
Under the GUS specification, a standard REGON is always nine decimal digits. To compute it, multiply those eight digits by the official weight sequence eight, nine, two, three, four, five, six, seven, sum the products, and take the sum modulo eleven. If the remainder is ten, the check digit is zero; otherwise the remainder itself is the check digit.
A fourteen-digit REGON extends the nine-digit form with five extra digits that identify a local unit of a multi-site organisation. Again the sum is taken modulo eleven, and remainder ten becomes zero. Validation recomputes the expected digit for the submitted length and compares it to the last character; for fourteen-digit numbers this tool also reports whether the embedded nine-digit parent REGON still passes its own check, so a corrupted head is not hidden behind a lucky trailing digit.
The algorithm is deterministic and local: no REGON registry call, no clock, and no randomness. Compared with generic Luhn or PESEL tools, the search intent here is narrow: people who need a Poland REGON check digit calculator for eight- or thirteen-digit bases, or a nine- and fourteen-digit REGON validator, not a personal identity or payment tool.
Where REGON check digits fit real Polish business workflows
Accounting and e-invoicing platforms receive eight-digit internal bases during sandbox onboarding and must append the official GUS check digit before a REGON appears on invoices, JPK exports, or contractor directories. Marketplaces and B2B portals validate nine-digit REGON numbers at supplier registration so a single transposition does not create a phantom entity and a rejected KSeF or EDI document.
Multi-site retail and logistics operators recompute the fourteen-digit local-unit check digit when a warehouse or branch is added under a parent REGON, and they re-check the embedded nine-digit head so local-unit files never drift from the parent record. ETL jobs that load contractor master files walk every REGON column in a CSV or ERP export, call validate mode, and quarantine rows where valid is false—catching both human edits and off-by-one bugs in generators.
What you can do with it
Audit REGON columns in contractor master data
Batch-validate every nine- and fourteen-digit REGON in an ERP, CRM, or e-invoicing CSV and quarantine rows whose check digit no longer matches the recomputed expected value.
FAQ
What is a REGON check digit?
It is the final digit of a Polish REGON statistical number, computed with official GUS weights and a mod-11 rule (remainder ten becomes zero), so typing and scanning errors are usually caught before the number is stored or billed.
Is the REGON check digit tool free?
The browser tool is free and runs locally.
How is the REGON check digit calculated?
Multiply the first eight digits by the weights 8, 9, 2, 3, 4, 5, 6, 7, add the results and divide by 11. The remainder is the check digit, except that a remainder of 10 becomes 0. For 12345678 the digit is 5.
What is a 14-digit REGON?
It identifies a local unit, such as a branch or warehouse, of an organisation with several sites. Its first nine digits are the parent REGON, four more identify the unit, and the last digit is a second check digit with its own weights.
Does a valid REGON mean the company is active?
No. A correct check digit only shows that the number is well formed. The tool does not look anything up in the official register, so it cannot tell whether the entity is active, licensed or still registered.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/enc/regon-poland \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"number":"12345678"}'const res = await fetch("https://api.kit.forhosting.com/enc/regon-poland", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"number": "12345678"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/enc/regon-poland",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"number": "12345678"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/enc/regon-poland", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"number":"12345678"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"number":"12345678"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/enc/regon-poland", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"number": "12345678"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "enc.regon_poland",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Non-numeric input and wrong lengths fail with invalid_input instead of silent stripping, so you never persist a half-cleaned identifier. The same pure arithmetic runs free in the browser and at the published API price, with no network lookup of the REGON registry and no claim that a valid checksum means the entity is active, licensed, or still enrolled.
How the REGON check digit is calculated (9-digit and 14-digit forms)
Positions one through eight form the payload issued for the legal entity or unit; position nine is the check digit. Positions one through nine are the parent REGON (including its own check digit); positions ten through thirteen are the local unit payload; position fourteen is a second check digit. That trailing digit uses a different official weight sequence over the first thirteen digits: two, four, eight, five, zero, nine, seven, three, six, one, two, four, eight.
Input contract, modes, and error behaviour
Send a number field that contains only characters zero through nine. Wrong length is an explicit error that names the mode and the length you sent—eight or thirteen for compute, nine or fourteen for validate—so client forms can show a clear message without guessing. Empty strings, missing number, and invalid mode values fail before any weighted sum runs and are not billed. Failed validation tasks that reject bad shape are not charged; a well-formed nine- or fourteen-digit string that simply has the wrong check digit returns valid false without throwing. Spaces, hyphens, letters, and decimal points are rejected as non-numeric input with invalid_input so a silently stripped value never reaches storage. Mode compute is the default: the engine requires exactly eight digits for a nine-digit REGON or exactly thirteen digits for a fourteen-digit REGON, returns check_digit as a one-character string, returns with_check as the full number you can print or persist, and also returns form (nine or fourteen), length, and the weight vector used for audit trails. When computing a fourteen-digit REGON from thirteen digits, the response also includes base9 and base9_valid so you can see whether the embedded nine-digit head still matches the official eight-digit weights. Mode validate accepts exactly nine or fourteen digits; the response reports valid true when the trailing digit matches the recomputed expected_check_digit, and always includes payload (digits without the last one), check_digit, expected_check_digit, form, and length. For fourteen-digit validation, base9_valid and trailing_valid are both required for valid true, so a damaged parent REGON is never accepted just because the fourteenth digit happens to match. Alias keys such as digits, regon, and code are accepted for the same payload field so integrations that already speak “regon” do not need a rename. Because the path is pure parse with no clock, random source, or network, the same JSON body always yields the same JSON result on the free browser tool and on the API at $0.002 per successful request.
Where REGON check digits fit real Polish business workflows
Do not treat a passing REGON check as proof that the entity is active in the REGON register, VAT-registered, or licensed for a given activity; it only proves the check digit is consistent with the payload under the official GUS weights used for Polish statistical numbers.
Integration use cases
Complete an 8-digit REGON base for invoice fixtures
Call compute mode with eight digits, store with_check, and use the nine-digit REGON in test invoices, JPK samples, or sandbox contractor records.
Validate typed or imported REGON numbers at entry
When a form, partner feed, or scanner submits nine or fourteen digits, call validate mode and block registration when valid is false, showing expected_check_digit to help correct a single mistype.
Technical questions
How do I compute a REGON check digit with this API?
POST with number set to exactly eight digits (nine-digit REGON) or thirteen digits (fourteen-digit REGON) and mode compute (or omit mode). The response includes check_digit, with_check, form, and the weight vector used.
How do I validate a full nine- or fourteen-digit REGON?
POST with the nine- or fourteen-digit string and mode validate. The response includes valid, check_digit, expected_check_digit, and payload (digits without the last one). Fourteen-digit validation also reports base9_valid for the embedded parent REGON.
What happens with wrong length, letters, or hyphens?
Non-numeric input and lengths other than eight or thirteen (compute) or nine or fourteen (validate) are rejected with invalid_input. Failed validation tasks are not billed.