Daichodo

Validating numbers

Format and check-digit validation for corporate numbers and registration numbers. Free, and unmetered.

The specification is published by the NTA and anyone can implement it in an afternoon. Metering something a customer could reimplement that quickly would be theatre.

Over the API

Up to 100 numbers per request. No authentication required.

curl -X POST https://api.daichodo.com/v1/validate \
  -H "content-type: application/json" \
  -d '{"numbers": ["T8000000000001", "8000000000001", "not-a-number"]}'
{
  "results": [
    { "value": "T8000000000001", "valid": true, "reason": null,
      "corporate_number": "8000000000001" },
    { "value": "8000000000001", "valid": true, "reason": null,
      "corporate_number": "8000000000001" },
    { "value": "not-a-number", "valid": false,
      "reason": "must be exactly 13 digits", "corporate_number": null }
  ]
}

Separators and whitespace are stripped before the check, so values pasted straight out of an invoice or a spreadsheet are fine.

As a library

If you would rather not make a network call at all, the same logic is published as open source.

npm install @daichodo/validate
import { isValid } from '@daichodo/validate';

isValid('8000000000001'); // true
isValid('T8000000000001'); // true
pip install daichodo-validate

How the check digit works

A corporate number is 13 digits, where the leading digit is a checksum over the other twelve. It catches transposed digits and similar slips.

A registration number is T plus 13 digits, and the same check applies to every one of them — corporations and sole traders alike. Measured over the whole register on 2026-09-05: 5,421,496 numbers, zero exceptions.

A sole trader's 13 digits are not a corporate number and will not be found in the corporate register, but they come from the same numbering scheme, so the check digit holds. The number alone cannot tell you which kind of entity it belongs to — only a lookup can.

A failed check digit therefore means a typo or a fabrication, and is returned as valid: false. Until 2026-09-05 this endpoint returned valid: true for those, excusing them as sole traders; that accepted every mistyped number.

Validating is not looking up

Validation answers only "is this a well-formed number". Whether it is actually registered is a lookup.

Well-formed numbers that were never registered are trivial to generate.