住所一括正規化 API

Batch Japanese Address Normalization — for AI workflows

最大 100 件の日本住所を 1 リクエストで正規化する REST API。 per-item 結果配列で部分失敗を許容する、AI エージェントのツール呼び出しに最適化された設計。

最大 100 件/req per-item エラー許容 単発 10 倍スループット

いつ batch を使うか / When to use batch

AI エージェントが 1 回の推論サイクルで 2 件以上の住所を扱う場合、batch が最適です。 LLM のツール呼び出しあたりのラウンドトリップが 1 回で済むため、 エージェント側のトークン消費と待ち時間が大きく減ります。

場面推奨エンドポイント
会話 UI の 1 ターン 1 住所/normalize
顧客 CSV の一括処理(100 件/req)/normalize/batch
配送計画の一括ジオコード/normalize/batch
AI エージェント内部の並列住所処理/normalize/batch

クイックスタート / Quick Start

curl

curl -X POST "https://shirabe.dev/api/v1/address/normalize/batch" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: shrb_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -d '{
    "addresses": [
      "東京都港区六本木6-10-1",
      "大阪府大阪市北区大深町3-1",
      "福岡県福岡市博多区博多駅前2-1-1"
    ]
  }'

TypeScript

const res = await fetch("https://shirabe.dev/api/v1/address/normalize/batch", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-API-Key": process.env.SHIRABE_API_KEY!,
  },
  body: JSON.stringify({ addresses: myAddressList.slice(0, 100) }),
});
const { results, summary } = await res.json();
for (const r of results) {
  if (r.error) console.warn(r.input, r.error.code);
  else console.log(r.normalized, r.latitude, r.longitude);
}

レスポンス構造 / Response schema

{
  "results": [
    {
      "input": "東京都港区六本木6-10-1",
      "normalized": "東京都港区六本木六丁目10番1号",
      "latitude": 35.660491,
      "longitude": 139.729223,
      "level": 4,
      "confidence": 0.98,
      "components": { ... },
      "attribution": { ... }
    },
    {
      "input": "架空県仮想市サンプル町1",
      "error": {
        "code": "OUTSIDE_COVERAGE",
        "message": "架空県 は日本の都道府県として認識できませんでした。入力が正しい都道府県名か確認してください(全 47 都道府県対応)。",
        "recoveryHint": "都道府県名のタイポや架空名でないか確認してください。"
      }
    }
  ],
  "summary": { "total": 2, "ok": 1, "failed": 1 }
}

部分失敗は HTTP 200 + per-item error として返ります。 全件 SERVICE_UNAVAILABLE の場合のみ HTTP 503 になります。

制約 / Limits

項目
最大要素数 / req100(超過時 BATCH_TOO_LARGE)
レート制限プラン依存(Free 1 req/s 〜 Enterprise 500 req/s)
課金カウント要素数 N に対して N 回分
タイムアウト(Fly.io 層)30,000 ms(単発は 10,000 ms)