The technical details of the Austrian social security number (SVNR)
How the Austrian social security number (SVNR) is structured, what information it contains and how to validate it.

The Austrian social security number is a central identifier in the Austrian social security system. People often keep it for life, and it is needed in many places. But how is the number structured? Why is it so important, and how can you check whether it is valid? This post covers the technical details of the SVNR.
What is the SVNR and why is it needed?
The SVNR is a unique identification number that the Austrian social insurance system assigns to every insured person. It ensures that all of a person's relevant data in the healthcare system, unemployment insurance and pension system can be matched to them unambiguously. The SVNR is used, for example:
-
to identify patients when they see a doctor,
-
for billing in healthcare,
-
for pension insurance,
-
when employers register employees for social insurance, and
-
to pay out sick pay or other social benefits.
The SVNR lets the system record every insured person reliably and unambiguously, which makes processing benefits and applications easier and lowers administrative costs. The SVNR is also stored on the e-card, the Austrian health insurance card.
The structure of the SVNR
The SVNR consists of ten digits. Its structure follows a fixed pattern:
-
The first three digits are a serial number (the first digit is never zero)
-
The fourth digit is a check digit
-
In most cases, the last six digits are the insured person's date of birth
The exact structure looks like this:
LLL P GGGGGGThe SVNR contains no spaces. They are only added here for readability.
-
LLLis the individual serial number, -
Pis a check digit used to detect input errors and validate the number, -
GGGGGGis the date of birth.
When the date of birth doesn't match
Overflow
More people may be born on a single day than the three-digit serial number can hold. This overflow is handled with fictitious months in the date of birth, so there are SVNRs with month 13, 14 or 15 in the date of birth. People whose date of birth is unknown are sometimes assigned a fictitious month as well.
People over 100
Take a person born in 1920, for example. This person would be 104 years old today. Since the SVNR only has two digits for the year of birth, there is no way to tell automatically whether the person was born in 1920 or 2020.
The upshot: you cannot rely on the date of birth in the SVNR, so it should not be used for automated data processing. For input forms, I recommend two separate fields, one for the SVNR and one for the date of birth.
Validating the SVNR
The SVNR has a check digit calculated by a fixed mathematical rule, which makes it easy to check whether a number is valid. The check digit is calculated with the following algorithm:
-
Write down all 10 digits of the SVNR.
-
Multiply each digit by its weight from the table below.
-
Add up the results.
-
Calculate the remainder using the modulo 11 method, i.e. divide the sum by the prime number 11.
-
The remainder must match the fourth digit (the check digit) of the SVNR.
| L | L | L | P | G | G | G | G | G | G |
|---|---|---|---|---|---|---|---|---|---|
| 3 | 7 | 9 | 0 | 5 | 8 | 4 | 2 | 1 | 6 |
Why does validation matter?
Checking the SVNR catches input errors early, before they cause problems. This matters most when the number is typed in by hand, for example at the doctor's or in administrative forms. Software we developed for ordering lab tests also validates the number when patient master data is transferred, so that no incorrect data is sent.
Validation with Kotlin
package at.agsolutions.util
object SvnrValidator {
private val WEIGHTS = arrayOf(3, 7, 9, 0, 5, 8, 4, 2, 1, 6)
private val REGEX = Regex("^[0-9]+\$")
fun validate(svnr: String): Boolean {
if (svnr.length != 10 || !REGEX.matches(svnr) || svnr.first() == '0') {
return false
}
return calculateChecksum(svnr) == svnr[3].digitToInt()
}
private fun calculateChecksum(svnr: String): Int = svnr
.toCharArray()
.map { it.digitToInt() }
.foldIndexed(initial = 0) { index, sum, digit ->
sum + WEIGHTS[index] * digit
}
.mod(11)
}Validation with TypeScript
const calculateChecksum = (svnr: string): number => {
const weights = [3, 7, 9, 0, 5, 8, 4, 2, 1, 6];
let sum = 0;
for (let i = 0; i < weights.length; i++) {
sum += weights[i] * parseInt(svnr[i]);
}
sum %= 11;
return sum;
};
export const isValidSvnr = (svnr: string): boolean => {
if (svnr.length !== 10 || !/^[0-9]+$/.test(svnr) || svnr.charAt(0) === '0') {
return false;
}
return calculateChecksum(svnr) === parseInt(svnr.charAt(3));
};Further information
Got a similar project in mind?
In a free initial call we look at your situation and tell you what's realistic and what the next step looks like.

// about the author
Alexander J. Gassner, MSc
Founder and managing director of agsolutions, with more than 15 years in software development (MSc Software Engineering, FH Hagenberg). Builds and runs business-critical software from requirements to operations: Kotlin, Spring Boot and React in the code, Kubernetes, Pulumi and GitOps in operations, as an Exoscale Certified Solution Architect.


