インボイス番号(登録番号)を検証する方法
適格請求書発行事業者の登録番号を、形式・チェックディジット・登録の有無・請求書日付時点の有効性まで確認する方法。無料の検証ツールと API の使い分けも解説します。
受け取った請求書に記載された登録番号が本当に有効なのかを確かめる作業には、実際には段階があります。多くの実装は最初の段階で止まっており、そこが問題になります。
検証には 4 つの段階がある
| 段階 | 何を確かめるか | どこまでで分かるか |
|---|---|---|
| 形式 | 「T」+13桁になっているか | ローカル |
| チェックディジット | 数字の並びとして成立しているか | ローカル |
| 多くの実装はここで止まる | ||
| 登録の有無 | 実際に登録されているか | 登録簿が必要 |
| 日付時点の有効性 | 請求書の日付時点で有効だったか | 変更履歴が必要 |
1 と 2 だけを実装して「検証した」としている例をよく見かけますが、形式として正しい未登録の番号はいくらでも作れます。 段階 2 の合格は「番号として成立している」以上のことを何も意味しません。
段階 1・2:手元でできること
登録番号は「T」+13桁です。法人の場合、その 13 桁は法人番号と一致し、先頭 1 桁が残り 12 桁に対するチェックディジットになっています。桁の入れ替えのような入力誤りは、この段階で検出できます。
無料で使えるライブラリを公開しています。ネットワーク接続も API キーも不要です。
npm install @daichodo/validate
import { isValid } from '@daichodo/validate';
isValid('T8000000000001'); // true
Python も同様です。
pip install daichodo-validate
チェックディジットは個人事業者にも適用されます
登録番号はすべてチェックディジットを満たします。個人事業者も例外ではありません。 2026年9月5日に登録簿全体で実測しました。全件データと直近の差分、あわせて 5,421,496 件のうち、法人・個人事業者・人格のない社団等のすべてが検証を通り、例外はゼロ件でした。
個人事業者の 13 桁は法人番号ではありません。抽出した 5 万件のうち、580 万件の法人番号登録簿に存在したものはゼロ件です。しかし採番規則が同じであるため、チェックディジットは同様に成立します。
実務上重要なのはここです。番号だけでは、法人か個人事業者かを判別できません。判別できるのは登録簿への照会のみです。「チェックディジットから法人番号が得られたか」で分岐している実装は、意図とは別の問いに答えています。
逆向きの誤りのほうが深刻で、これは当社自身が実測するまで作り込んでいたものです。チェックディジットの不一致を「個人事業者だから有効」として扱うと、実在する番号はすべて検証を通る以上、打ち間違いも架空の番号もすべて受け入れてしまいます。 1 桁の入力ミスがそのまま通過します。
段階 3:実際に登録されているか
ここからは登録簿への照会が必要です。国税庁の公表サイトでも確認できますが、件数が増えると手作業では現実的でなくなります。
curl https://api.daichodo.com/v1/invoice-issuers/T8000000000001 \
-H "Authorization: Bearer dc_ test_ ..."
未登録であれば 404 が返ります。形式が不正な場合は 400 です。この 2 つを区別してください。「番号ではない」と「番号だが登録されていない」は、経理処理の上で意味が異なります。
氏名が null でも「該当なし」ではありません
国税庁は個人事業者の氏名・住所を公表データから除外しています。個人事業者のレコードは、日付を保持したまま氏名が null で返ります。
name === null を「見つからなかった」と解釈するのが最も多い誤りです。
段階 4:請求書の日付時点で有効だったか
実務で本当に必要なのはこの段階です。
仕入税額控除の可否は、その請求書の日付時点での登録状況によって決まります。今日時点で失効している事業者でも、請求書の日付時点では有効だったかもしれません。現在の状態だけを見ていると、この判断を誤ります。
curl "https://api.daichodo.com/v1/invoice-issuers/T8000000000001/validity?on=2024-06-30" \
-H "Authorization: Bearer dc_ test_ ..."
{
"registration_ number": "T8000000000001",
"on": "2024-06-30",
"valid": true,
"reason": "valid",
"registered_ on": "2023-10-01",
"ended_ on": null
}
この判定は当社が蓄積してきた差分データから返しています。公表サイト側の稼働状況や利用制限に左右されません。
時点指定の判定は有料プランの機能です。ステージ 1 と 2(形式とチェックディジット)はどのプランでも無料で、上記の npm パッケージにはキーも不要です。
なお、個人事業者も日付の項目は保持しているため、この判定は法人・個人を問わず機能します。
実装するときの現実的な指針
- 段階 1・2 は手元で。無料のライブラリで十分です
- 段階 3・4 は登録簿が必要。自前で取り込むか、API を使うか
- 自前で取り込む場合、差分ファイルの公開期間に注意してください。期間を過ぎたファイルは取得できなくなり、取りこぼした日は再取得できません
よくある質問
インボイス番号の形式は?
「T」+13桁の数字です。法人の場合、13桁は法人番号と一致します。個人事業者の13桁は法人番号ではありませんが、採番規則が同じためチェックディジットは同様に成立します。番号だけでは法人か個人事業者かを判別できず、判別には登録簿の照会が必要です。
チェックディジットだけで有効性を判定できますか?
できません。チェックディジットが確認するのは形式の妥当性のみで、実際に登録されているかは登録簿への照会が必要です。形式として正しい未登録の番号はいくらでも作れます。
請求書の日付時点で有効だったかはどう確認しますか?
現在の状態では判断できません。仕入税額控除の可否は請求書の日付時点の登録状況で決まるため、過去の日付を指定した有効性判定が必要です。