Norwegian fødselsnummer check digits
Enter the first nine digits of a Norwegian fødselsnummer and get both control digits: 010190000 gets 8 and 3 and becomes 01019000083. Paste a full eleven-digit number to catch a typo before a form or payroll file is saved. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Fnr
- 010190000
- Calculation mode
- Compute
- Input
- 010190000
- Control digit 1
- 8
- Control digit 2
- 3
- Control digits
- 83
The Norwegian national identity number (fødselsnummer) is an eleven-digit code used across health services, banking, payroll, taxation, and digital identity workflows in Norway. The last two digits are control digits derived from fixed official weight vectors under a modulo-eleven rule. A single mistyped birth-date digit or individual number often breaks that checksum, so validating the control digits before accepting a form, partner file, or registry import catches many keying errors early.
What the Norwegian fødselsnummer control digits are and how the weights work
A fødselsnummer identifies individuals in Norwegian public and private systems. The first control digit, often called k1, multiplies the first nine digits left to right by the fixed sequence three, seven, six, one, eight, nine, four, five, and two. The products are summed, and the control digit is eleven minus that sum modulo eleven.
If the result is eleven the digit is zero; if the result is ten the nine-digit body is not assignable — no valid first control digit exists. The second control digit, k2, multiplies the first ten digits (the nine-digit body plus k1) by five, four, three, two, seven, six, five, four, three, and two, then applies the same eleven-minus-modulo rule, again treating ten as invalid. When someone types an eleven-digit number whose last two digits no longer match these recomputed values, validation fails.
The same rule catches OCR noise, partial pastes, and off-by-one errors in HR onboarding, bank KYC forms, and ETL jobs that re-key identity numbers from paper or PDFs. This tool implements those official weight vectors on pure digits after optional space and hyphen stripping.
It does not query the Norwegian Tax Administration, prove that a person exists, assign a century from the individual number, or interpret D-numbers (temporary identities with day of month plus forty) beyond the same arithmetic on digits — only that the digit string is consistent under the published dual control-digit algorithm. Compared with Luhn mod-ten used on payment cards, the fødselsnummer scheme uses two fixed left-to-right weight vectors and modulo eleven, so you must not reuse a Luhn validator on Norwegian identity fields.
Compared with Polish NIP or Argentine CUIT single-digit schemes, Norway requires two control digits with distinct weights, which is why a dedicated capability avoids false confidence from a generic check-digit utility.
Where Norwegian fødselsnummer checks fit identity, payroll, and commercial workflows
Employer onboarding and payroll platforms store a fødselsnummer for tax reporting and benefits; a single mistyped digit during entry can send filings to the wrong person or fail downstream authorization later. Validate mode at entry blocks the save when valid is false and can show the expected control pair so the clerk corrects the form before the record is written. Banks and payment providers that collect a Norwegian identity number for KYC can recompute both control digits without calling an external registry, filtering OCR noise and partial captures early.
Product teams that already expose general Luhn or ISO 7064 check tools should still use this fødselsnummer-specific capability for Norwegian identity fields so weights, length bounds, dual digits, and spacing format match the domain. Educational and SEO landings that rank for phrases such as norwegian fodselsnummer check or norway personnummer validator need a live free tool whose browser path matches automation so tutorial screenshots stay accurate.
Do not treat a passing fødselsnummer check as proof that the person is correctly identified, alive, authorized, present in the population register, or eligible for a service — it only proves the digit string is consistent under the official Norwegian dual control-digit algorithm.
What you can do with it
Audit identity columns in partner and payroll files
Batch-validate every fødselsnummer in a CSV import and quarantine rows whose control digits no longer match the recomputed expected pair.
FAQ
What are the Norwegian fødselsnummer control digits?
They are the two trailing digits of the eleven-digit national identity number. k1 uses weights 3,7,6,1,8,9,4,5,2 over the first nine digits; k2 uses 5,4,3,2,7,6,5,4,3,2 over the first ten. Each is modulo 11 (11 maps to 0; 10 means invalid).
What happens with letters, spaces, or wrong length?
Provide digits 0-9 only (optional spaces/hyphens); compute needs nine digits and validate needs eleven. Failed validation tasks are not billed.
Is the Norwegian fødselsnummer check tool free?
The browser tool is free and runs locally.
How are the two fødselsnummer control digits calculated?
The first nine digits are multiplied by 3, 7, 6, 1, 8, 9, 4, 5 and 2 and summed; eleven minus the remainder modulo 11 gives the first control digit. The second uses the first ten digits with the weights 5, 4, 3, 2, 7, 6, 5, 4, 3 and 2 in the same way.
Why do some nine-digit bodies have no valid fødselsnummer?
When the calculation of a control digit gives 10, there is no digit that fits, so that body cannot be assigned. A result of 11 simply becomes 0. The tool reports such a body instead of inventing a number.
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/fnr-norway \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"fnr":"010190000"}'const res = await fetch("https://api.kit.forhosting.com/enc/fnr-norway", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"fnr": "010190000"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/enc/fnr-norway",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"fnr": "010190000"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/enc/fnr-norway", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"fnr":"010190000"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"fnr":"010190000"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/enc/fnr-norway", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"fnr": "010190000"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "enc.fnr_norway",
"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
This capability computes both control digits for a nine-digit payload (date of birth plus individual number, with or without spaces or hyphens), or validates a full eleven-digit fødselsnummer that already includes the trailing pair, and it reports bad input instead of silently inventing digits. Use it free in the browser or call the KIT API at the published price; both paths run the same deterministic arithmetic with no network lookup and no population-register query.
What the Norwegian fødselsnummer control digits are and how the weights work
The layout is eleven decimal digits: six digits for day, month, and year of birth (DDMMYY), three digits for the individual number (which also encodes century and gender conventions used by the population register), and two trailing control digits. Those last two digits are not chosen freely — they are completely determined by a public algorithm so that most single-digit substitutions and many swaps fail a checksum.
How to compute both control digits or validate a full fødselsnummer
Send an fnr field that contains digits zero through nine, optionally separated by spaces or hyphens. Mode validate expects a complete eleven-digit number including both control digits (for example 01019000083 or 010190 00083). Empty strings, missing fnr, invalid mode values, and wrong lengths (not nine digits for compute, not eleven for validate) fail before any weighted sum runs and are not billed. Letters, other punctuation, double hyphens, or leading or trailing hyphens are rejected as malformed input with invalid_input so you never accept a silently cleaned value. Mode compute is the default: provide exactly nine digits without the control pair (for example 010190000 for birth date 01.01.90 and individual number 000), and the engine returns control_digit_1 and control_digit_2 as one-character strings, control_digits as the two-digit suffix, with_check as the full eleven-digit string, and formatted as the common DDMMYY XXXXX display form. If either weighted sum would produce a control digit of ten under the modulo-eleven mapping, compute mode fails with invalid_input because no valid eleven-digit fødselsnummer exists for that body. The response reports valid true when both recomputed digits match the trailing pair, and always includes control_digit_1, control_digit_2, payload without the last two digits, and formatted for consistent display; when expected digits exist they are also returned as expected_control_digit_1, expected_control_digit_2, and expected_control_digits. Because the path is pure parse with no clock, random source, or network, the same input always yields the same JSON on the free browser tool and on the API. At $0.002 per successful request you can gate bulk imports, onboarding forms, and ETL jobs without negotiating a custom tier. Prefer compute when you assemble a number from a known date and individual sequence; prefer validate when a user, partner file, or scanned label supplies a full number and you need a boolean gate before a registry or master-data lookup.
Where Norwegian fødselsnummer checks fit identity, payroll, and commercial workflows
Healthcare and public-sector integrations often receive identity numbers from partner CSV files where a wrong trailing digit would reject a whole batch; a deterministic oracle that returns valid and with_check lets importers flag rows before they hit production.
Integration use cases
Gate fødselsnummer fields on HR and customer forms
When a user submits a full eleven-digit number, call validate mode and block the save when valid is false, showing expected_control_digits to help correct a mistype before the record is written.
Compute control digits when minting or completing IDs
From a DDMMYY date and three-digit individual number, call compute mode and store with_check or formatted so every new string carries the correct trailing pair before print or export.
Technical questions
How do I compute fødselsnummer control digits with this API?
POST with fnr set to the nine payload digits (spaces or hyphens optional) and mode compute (or omit mode). The response includes control_digit_1, control_digit_2, control_digits, with_check, and formatted as DDMMYY XXXXX.
How do I validate a full Norwegian fødselsnummer?
POST with the full eleven-digit string and mode validate. The response includes valid, the given control digits, payload, formatted, and when computable the expected control digits.