配送業者別の追跡番号フォーマット完全ガイド

追跡番号は単なるランダムな文字列ではありません。実はその中に、配送業者の識別情報やチェックディジットが含まれており、番号のフォーマットを理解するだけで配送業者を特定できることもあります。

本記事では、世界の主要配送業者の追跡番号フォーマットを網羅的に解説し、自動識別のアプローチもご紹介します。

追跡番号フォーマットが重要な理由

追跡番号のフォーマットを理解しておくと、以下のようなメリットがあります:

  • 入力ミスの即時検出 — フォーマットに合わないものを早期に弾ける
  • 配送業者の自動識別 — ユーザーにキャリアを選ばせる手間を省ける
  • バリデーションの強化 — チェックディジットで正当性を検証できる
  • 不正追跡の防止 — 無効な番号でのAPI呼び出しを防ぎ、レート制限を節約できる

UPU S10 国際標準フォーマット

万国郵便連合(UPU)は、国際郵便物の追跡番号として S10標準 を定めています。このフォーマットは世界中の郵便事業者が採用しており、非常に広く使われています。

EA 123 456 789 JP
│  └─────────┘  │
│   8桁の連番   │
│  + 1桁チェック │
│               │
サービス種別     発送国コード(ISO 3166)
(EMS=E, 小包=C, 書留=R)

フォーマット: [A-Z]{2}[0-9]{9}[A-Z]{2}(合計13文字)

位置内容
1〜2文字目サービス種別EA(EMS)、CP(小包)、RR(書留)
3〜10文字目連番(8桁)12345678
11文字目チェックディジット9
12〜13文字目発送国コードJP(日本)、KR(韓国)、US(米国)

チェックディジットの計算には、重み付き合計をMod 11で算出する方式が使われます。

韓国の配送業者

CJ大韓通運(CJ Logistics)

フォーマット: 数字10〜12桁
例: 123456789012
正規表現: /^[0-9]{10,12}$/

韓国最大手の配送業者で、追跡番号は10〜12桁の数字のみで構成されます。先頭の数字でサービス種別を区別できる場合があります。

ロッテ宅配(Lotte Global Logistics)

フォーマット: 数字12桁
例: 123456789012
正規表現: /^[0-9]{12}$/

ロッテ宅配の追跡番号は一貫して12桁の数字です。

ハンジン宅配(Hanjin Express)

フォーマット: 数字10〜12桁
例: 1234567890
正規表現: /^[0-9]{10,12}$/

CJ大韓通運と同様のフォーマットですが、番号の範囲帯で区別が可能です。

郵便局宅配(Korea Post)

国内小包と国際郵便でフォーマットが異なります。

国内小包: 数字13桁
例: 1234567890123
正規表現: /^[0-9]{13}$/

国際郵便: UPU S10標準
例: EE123456789KR
正規表現: /^[A-Z]{2}[0-9]{9}[A-Z]{2}$/

日本の配送業者

ヤマト運輸(Kuroneko Yamato)

フォーマット: 数字12桁(ハイフン区切り:4-4-4)
例: 1234-5678-9012
正規表現: /^[0-9]{12}$/ または /^[0-9]{4}-[0-9]{4}-[0-9]{4}$/

ヤマト運輸の追跡番号は12桁で、伝票上は4桁ずつハイフンで区切られて表示されます。末尾1桁がチェックディジットとなっています(7で割った余り)。

佐川急便(Sagawa Express)

フォーマット: 数字12桁
例: 123456789012
正規表現: /^[0-9]{12}$/

佐川急便も12桁の数字ですが、ヤマト運輸とは番号の範囲帯が異なります。

日本郵便(Japan Post)

国内ゆうパック: 数字11〜12桁(ハイフン区切り:4-4-4)
例: 1234-5678-9012
正規表現: /^[0-9]{11,12}$/

国際郵便: UPU S10標準
例: EJ123456789JP
正規表現: /^[A-Z]{2}[0-9]{9}[A-Z]{2}$/

レターパック: 数字12桁
例: 123456789012

日本郵便は扱うサービスが多く、フォーマットもサービスごとに異なります。

米国の配送業者

USPS(United States Postal Service)

USPSは複数のフォーマットを使用しています。

Priority Mail: 数字22桁(先頭が94で始まる)
例: 9400111899223100001234
正規表現: /^94[0-9]{20}$/

Certified Mail: 数字20桁(先頭が70で始まる)
例: 70123456789012345678
正規表現: /^70[0-9]{18}$/

国際郵便: UPU S10標準
例: EC123456789US
正規表現: /^[A-Z]{2}[0-9]{9}[A-Z]{2}$/

FedEx

Express: 数字12桁
例: 123456789012
正規表現: /^[0-9]{12}$/

Ground: 数字15桁
例: 012345678901234
正規表現: /^[0-9]{15}$/

SmartPost: 数字20〜22桁
例: 61299998820821171811
正規表現: /^[0-9]{20,22}$/

Door Tag: 数字12桁(DTで始まる場合あり)
例: DT123456789012

UPS

1Z追跡番号: 1Z + 英数字16桁
例: 1Z9999999999999999
正規表現: /^1Z[A-Z0-9]{16}$/

Mail Innovations: 数字22桁(92で始まる)
例: 9261290100130612345678
正規表現: /^92[0-9]{20}$/

UPSの追跡番号は「1Z」で始まるため、他のキャリアとの識別が非常に容易です。

欧州の配送業者

DHL

DHLはサービスによってフォーマットが大きく異なります。

DHL Express: 数字10桁
例: 1234567890
正規表現: /^[0-9]{10}$/

DHL Paket(ドイツ国内): 数字12〜20桁
例: 00340433836536373345
正規表現: /^[0-9]{12,20}$/

DHL eCommerce: 英数字10〜39桁(GMで始まる場合あり)
例: GM123456789012345678

Royal Mail(イギリス)

Tracked: 英字2文字 + 数字9桁 + GB
例: AB123456789GB
正規表現: /^[A-Z]{2}[0-9]{9}GB$/

Special Delivery: 英字2文字 + 数字9桁 + GB(SDで始まる)
例: SD123456789GB

Royal Mailの国際追跡番号はUPU S10標準に準拠しています。

WhereParcelの自動検出機能

上記のフォーマットをすべて把握しておくのは大変です。WhereParcelのAPIには、追跡番号から配送業者を自動検出する機能が備わっています。

// キャリアを指定せずに追跡
const response = await fetch('https://api.whereparcel.com/v2/track', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer YOUR_API_KEY:YOUR_SECRET_KEY'
  },
  body: JSON.stringify({
    trackingItems: [{ carrier: 'auto', trackingNumber: '1Z9999999999999999' }]  // 自動検出モード
  })
});

const result = await response.json();
console.log(result.data.carrier);
// → "us.ups"(自動的にUPSと識別)

複数のキャリア候補がある場合は、候補リストを返します:

{
  "success": true,
  "data": {
    "candidates": [
      { "carrier": "kr.cjlogistics", "confidence": 0.85 },
      { "carrier": "kr.hanjin", "confidence": 0.72 }
    ]
  }
}

バリデーションのヒント

追跡番号のバリデーションをアプリケーションに組み込む際のポイントをまとめます。

基本的なバリデーション

function validateTrackingNumber(trackingNumber) {
  // 前後の空白を除去
  const cleaned = trackingNumber.trim().replace(/[\s-]/g, '');

  // 空文字チェック
  if (!cleaned) return { valid: false, reason: '追跡番号が入力されていません' };

  // 長さチェック(一般的に9〜34文字)
  if (cleaned.length < 9 || cleaned.length > 34) {
    return { valid: false, reason: '追跡番号の桁数が不正です' };
  }

  // 使用可能な文字チェック(英数字のみ)
  if (!/^[A-Za-z0-9]+$/.test(cleaned)) {
    return { valid: false, reason: '使用できない文字が含まれています' };
  }

  return { valid: true, cleaned };
}

S10チェックディジットの検証

function verifyS10CheckDigit(trackingNumber) {
  // S10フォーマット: AA123456789BB
  const match = trackingNumber.match(/^[A-Z]{2}(\d{8})(\d)[A-Z]{2}$/);
  if (!match) return false;

  const digits = match[1].split('').map(Number);
  const checkDigit = parseInt(match[2]);
  const weights = [8, 6, 4, 2, 3, 5, 9, 7];

  const sum = digits.reduce((acc, d, i) => acc + d * weights[i], 0);
  const remainder = 11 - (sum % 11);
  const expected = remainder === 10 ? 0 : remainder === 11 ? 5 : remainder;

  return checkDigit === expected;
}

入力フォームでのUX改善

  • ハイフンやスペースは自動的に除去する(ユーザーが伝票の表記通りに入力する場合がある)
  • リアルタイムでフォーマットを検証し、即座にフィードバックを表示する
  • 追跡番号をコピー&ペーストした際に前後の空白を自動除去する
  • 可能であれば、入力中にキャリア候補を表示する

まとめ

追跡番号のフォーマットは配送業者ごとに異なりますが、それぞれに規則性があります。この規則性を活用することで、入力バリデーション、キャリア自動識別、チェックディジット検証など、ユーザー体験を大幅に向上させる機能を実装できます。

WhereParcelのAPIを使えば、これらのフォーマットの違いを気にすることなく、carrier: 'auto' で自動的にキャリアを識別して追跡できます。詳しくはAPIドキュメントをご覧ください。