Turkey tax ID format: VKN and TCKN check digit validator
Paste a 10-digit Turkish tax number or an 11-digit identity number to see whether its length and check digits are well formed. The check runs in your browser; nothing is sent or stored. Free, no sign-up required.
Turkish tax ID format: 10 or 11 digits
A Turkish tax ID has 10 digits for companies and for foreigners without a foreign identity number, and 11 digits for people who use their identity number as their tax number. The checker reads the length and applies the matching check-digit test.
| Number | Digits | Used by |
|---|---|---|
| Tax number (vergi kimlik numarası, VKN) | 10 | Companies and other entities; foreigners without a foreign identity number |
| Turkish identity number (T.C. kimlik numarası, TCKN) | 11 | Turkish citizens, as their tax number since 1 July 2006 |
| Foreign identity number (yabancı kimlik numarası) | 11, starting with 9 | Foreigners who hold one, as their tax number since 1 July 2010 |
The dates come from Tax Identification Number General Communiqués No. 3 (Resmî Gazete, 29 August 2006) and No. 4 (22 May 2010). Turkey has no separate VAT number: a company's VAT ID is its 10-digit tax number, which is why the Turkey VAT number check guide starts with this format test. How a foreigner gets a number is in Turkish tax number for foreigners.
How the tax number (VKN) check digit works
The 10th digit of a tax number is a check digit computed from the first nine. We found no official publication of the formula; the steps below are the ones open-source validators use, and Fincode's own published tax number passes them.
- Give the first nine digits positions from 9 down to 1: the first digit is position 9 and the ninth digit position 1.
- For each digit, add its position and keep the last digit of the sum: c = (digit + position) mod 10.
- If c is not 0, multiply it by 2 to the power of the position and take the remainder after dividing by 9; a remainder of 0 counts as 9. If c is 0, the digit adds nothing.
- Add the nine results. The check digit is (10 − total mod 10) mod 10.
Worked example: Fincode's own tax number, 3882015834, as printed on its company information page. This is the calculator's default value.
| Digit | Position | c | c × 2position mod 9 |
|---|---|---|---|
| 3 | 9 | 2 | 7 |
| 8 | 8 | 6 | 6 |
| 8 | 7 | 5 | 1 |
| 2 | 6 | 8 | 8 |
| 0 | 5 | 5 | 7 |
| 1 | 4 | 5 | 8 |
| 5 | 3 | 8 | 1 |
| 8 | 2 | 0 | 0 (skipped) |
| 3 | 1 | 4 | 8 |
The results add up to 46, so the check digit is (10 − 6) mod 10 = 4, which is the number's last digit: well formed. With 5 as the last digit, 3882015835, the test fails.
For any nine digits exactly one check digit passes, so one in ten random 10-digit numbers is well formed. The test catches any single mistyped digit; it cannot show that a number exists.
How the identity number (TCKN) check digits work
An 11-digit identity number never starts with 0, and its last two digits are check digits. With the digits written d1 to d11:
d10 = (7 × (d1 + d3 + d5 + d7 + d9) − (d2 + d4 + d6 + d8)) mod 10
d11 = (d1 + d2 + … + d10) mod 10
This page prints no number that passes these tests, because any such number could be a real person's. As a failing example, 01234567890 fails at once, since an identity number cannot start with 0. Again we found no official publication of the formula; it is the one open-source validators use. Foreign identity numbers start with 9, and no official text gives their check digits either: the checker applies the same rule to them and says so under the field.
An identity number is personal data under Article 3 of Personal Data Protection Law No. 6698, which covers any information about an identified or identifiable person. Check only numbers you are entitled to process, and do not log or share them.
The same checks in Python and JavaScript
Both versions test the format and check digits only. They were run on 6 November 2026 with Python 3.11 and Node.js 24: the three examples print the results shown in the comments, and the two versions gave the same verdict on 170,000 test numbers, as did an independent implementation.
def vkn_is_well_formed(number: str) -> bool:
"""Turkish tax number (VKN): 10 digits and a matching check digit."""
if len(number) != 10 or not (number.isascii() and number.isdigit()):
return False
digits = [int(ch) for ch in number]
total = 0
for i, digit in enumerate(digits[:9]):
position = 9 - i # 9 for the first digit, 1 for the ninth
c = (digit + position) % 10
if c:
r = c * 2 ** position % 9
total += r if r else 9
return (10 - total % 10) % 10 == digits[9]
def tckn_is_well_formed(number: str) -> bool:
"""Identity number (TCKN): 11 digits, no leading 0, two matching check digits."""
if len(number) != 11 or not (number.isascii() and number.isdigit()) or number[0] == "0":
return False
d = [int(ch) for ch in number]
tenth = (7 * sum(d[0:9:2]) - sum(d[1:8:2])) % 10
return d[9] == tenth and d[10] == sum(d[:10]) % 10
print(vkn_is_well_formed("3882015834")) # True: Fincode's published tax number
print(vkn_is_well_formed("3882015835")) # False: last digit changed
print(tckn_is_well_formed("01234567890")) # False: cannot start with 0
function vknIsWellFormed(number) {
if (!/^\d{10}$/.test(number)) return false;
const d = [...number].map(Number);
let total = 0;
for (let i = 0; i < 9; i++) {
const position = 9 - i; // 9 for the first digit, 1 for the ninth
const c = (d[i] + position) % 10;
if (c) total += (c * 2 ** position) % 9 || 9;
}
return (10 - (total % 10)) % 10 === d[9];
}
function tcknIsWellFormed(number) {
if (!/^[1-9]\d{10}$/.test(number)) return false;
const d = [...number].map(Number);
const odd = d[0] + d[2] + d[4] + d[6] + d[8];
const even = d[1] + d[3] + d[5] + d[7];
const tenth = (((7 * odd - even) % 10) + 10) % 10;
const sum = d.slice(0, 10).reduce((a, b) => a + b, 0);
return d[9] === tenth && d[10] === sum % 10;
}
console.log(vknIsWellFormed("3882015834")); // true: Fincode's published tax number
console.log(vknIsWellFormed("3882015835")); // false: last digit changed
console.log(tcknIsWellFormed("01234567890")); // false: cannot start with 0
What a pass does not tell you
- Registration: whether the Revenue Administration (GİB) issued the number, and to whom, needs an official query; the VAT number check guide above lists the routes open to a foreign team.
- Identity: a well-formed number can be someone else's, and a format test does not replace any identity check that a rule requires.
- Activity: a company's number can be well formed while the company is closed.
In a form, the test is an early typing check with the official query behind it. Fincode builds fintech apps from a written scope; if yours needs checks like these, see Fincode's fintech app development.
Which values to enter
- Tax number or identity number: 10 or 11 digits. Spaces, dots and dashes are ignored, and a TR prefix before 10 digits, which some systems add to VAT numbers, is set aside with a note.
The result shows the type read from the length, the number of digits and which check-digit test passed or failed. It never shows what a failing digit should be.
Frequently asked questions
What is the format of a Turkish tax ID number?
Companies, and foreigners without a foreign identity number, have a 10-digit tax number. Turkish citizens use their 11-digit identity number, and foreigners who hold one use their 11-digit foreign identity number, which starts with 9.
Is the Turkish VAT number the same as the tax number?
Yes. Turkey issues no separate VAT number; a company's VAT ID is its 10-digit tax number.
How can I verify that a Turkish tax number is real?
Only an official query can show that. This checker tests the format and check digit, which catches typing errors; GİB's verification and the routes open to foreign teams are covered in the Turkey VAT number check guide.
Does this tool store or send the number I type?
No. The check runs in your browser with no request to any server, the field has autocomplete turned off, and nothing is saved.
Can a well-formed tax number still be fake?
Yes. One in ten random 10-digit numbers passes the tax number test, so a pass shows only that the digits are consistent, not that the number was issued or is active.
Sources
- Resmî Gazete: Tax Identification Number General Communiqué No. 3, identity numbers as tax numbers, 29 August 2006, No. 26274 (Turkish) (opens in a new tab)
- Resmî Gazete: Tax Identification Number General Communiqué No. 4, foreign identity numbers, 22 May 2010, No. 27588 (Turkish) (opens in a new tab)
- Mevzuat: Personal Data Protection Law No. 6698, Article 3 (Turkish) (opens in a new tab)
- python-stdnum: Turkish tax number (VKN) module, open-source check-digit rule (opens in a new tab)
- python-stdnum: Turkish identity number (T.C. Kimlik) module, open-source check-digit rule (opens in a new tab)
This calculator is general information, not tax, legal or investment advice. Results depend on the values you enter; rates, ceilings and amounts in Turkey change often, so check the date of each figure and the official source, and ask a licensed adviser about your own situation. Sources, checks and corrections: see the editorial policy.
Related guides
Fincode also builds exchange integrations and trading software. See our services.