2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

法人番号だけで取引先情報をゼロ円で取得する仕組みを作った【gBizINFO API × TypeScript 全コード】

2
Last updated at Posted at 2026-05-15

gBizINFO を含む日本の行政 API は、pay-per-call-mcp から Claude 経由でまとめて利用できます。

この記事でわかること

  • gBizINFO(経済産業省)API の概要と無料利用方法
  • 法人番号・企業名からの会社情報取得(TypeScript)
  • 財務情報・特許・許認可データの取得方法
  • 国税庁インボイス API との組み合わせ活用例
  • 取引先与信調査を自動化する実装パターン

はじめに

gBizINFO(jGBizINFO)は、経済産業省が運営する法人情報データベースです。法人番号をキーに、企業の基本情報・財務情報・認定・許認可・表彰・特許などを一括取得できます。

項目 内容
提供元 経済産業省
料金 無料
認証 不要(APIキー不要)
形式 JSON
公式サイト https://info.gbiz.go.jp

API 仕様

ベース URL

https://info.gbiz.go.jp/hojin/v1

主なエンドポイント

エンドポイント 説明
GET /hojin/{corporateNumber} 法人番号で基本情報取得
GET /hojin キーワード・条件で法人検索
GET /hojin/{corporateNumber}/finance 財務情報
GET /hojin/{corporateNumber}/certification 認定情報

法人番号は 13桁の数字です(国税庁の T付き番号から先頭の「T」を除いたもの)。


型定義

// types/gbizinfo.ts

export interface GBizHojin {
  corporate_number: string;
  name: string;
  kana: string | null;
  name_en: string | null;
  postal_code: string | null;
  location: string | null;
  prefecture_name: string | null;
  city_name: string | null;
  phone_number: string | null;
  founding_year: string | null;
  capital_stock: number | null;
  employee_number: string | null;
  update_date: string;
  close_date: string | null;
  close_cause: string | null;
}

export interface GBizResponse<T> {
  metadata: {
    totalCount: number;
    totalPage: number;
    page: number;
  };
  hojin_infos: T[];
}

実装

単一法人の情報取得

// lib/gbizinfo.ts

const GBIZ_API_BASE = "https://info.gbiz.go.jp/hojin/v1";

export async function getCompanyInfo(
  corporateNumber: string
): Promise<GBizHojin | null> {
  if (!/^\d{13}$/.test(corporateNumber)) {
    throw new Error(`不正な法人番号: ${corporateNumber}(13桁の数字である必要があります)`);
  }

  const url = `${GBIZ_API_BASE}/hojin/${corporateNumber}`;
  let res: Response;
  try {
    res = await fetch(url, {
      headers: { Accept: "application/json" },
      signal: AbortSignal.timeout(10_000),
    });
  } catch (err) {
    throw new Error(`gBizINFO API リクエスト失敗: ${err instanceof Error ? err.message : String(err)}`);
  }

  if (res.status === 404) return null;
  if (!res.ok) throw new Error(`gBizINFO API エラー: ${res.status} ${res.statusText}`);

  const data = await res.json() as GBizResponse<GBizHojin>;
  return data.hojin_infos[0] ?? null;
}

複数法人の一括取得

export async function getMultipleCompanyInfo(
  corporateNumbers: string[],
  concurrency = 5
): Promise<Map<string, GBizHojin | null>> {
  const results = new Map<string, GBizHojin | null>();

  for (let i = 0; i < corporateNumbers.length; i += concurrency) {
    const chunk = corporateNumbers.slice(i, i + concurrency);
    const chunkResults = await Promise.allSettled(
      chunk.map(async (num) => ({ num, info: await getCompanyInfo(num) }))
    );

    for (const r of chunkResults) {
      if (r.status === "fulfilled") {
        results.set(r.value.num, r.value.info);
      } else {
        console.warn(`取得失敗: ${r.reason}`);
      }
    }

    if (i + concurrency < corporateNumbers.length) {
      await new Promise((r) => setTimeout(r, 200));
    }
  }

  return results;
}

キーワード検索

export interface GBizSearchOptions {
  name?: string;
  prefecture?: string;
  business_type?: string;
  page?: number;
  limit?: number;
}

export async function searchCompanies(
  options: GBizSearchOptions
): Promise<GBizResponse<GBizHojin>> {
  const params = new URLSearchParams();
  if (options.name)          params.set("name",          options.name);
  if (options.prefecture)    params.set("prefecture",    options.prefecture);
  if (options.business_type) params.set("business_type", options.business_type);
  params.set("page",  String(options.page  ?? 1));
  params.set("limit", String(options.limit ?? 10));

  const res = await fetch(`${GBIZ_API_BASE}/hojin?${params}`, {
    headers: { Accept: "application/json" },
    signal: AbortSignal.timeout(10_000),
  });

  if (!res.ok) throw new Error(`検索エラー: ${res.status}`);
  return res.json() as Promise<GBizResponse<GBizHojin>>;
}

実行例

const company = await getCompanyInfo("4010001052596"); // トヨタ自動車
if (company) {
  console.log(`名称: ${company.name}`);
  console.log(`所在地: ${company.location}`);
  console.log(`資本金: ${company.capital_stock?.toLocaleString()}円`);
  console.log(`設立: ${company.founding_year}`);
}

出力例:

名称: トヨタ自動車株式会社
所在地: 愛知県豊田市トヨタ町1番地
資本金: 397,049,973,200円
設立: 1937

国税庁インボイス API との組み合わせ

async function verifyCompany(corporateNumber: string) {
  const [gbiz, nta] = await Promise.all([
    getCompanyInfo(corporateNumber),
    verifyInvoiceNumber(`T${corporateNumber}`),
  ]);

  return {
    corporateNumber,
    gbizName: gbiz?.name ?? null,
    ntaName:  nta.trader?.name ?? null,
    isInvoiceActive: nta.isActive,
  };
}

注意点

  • 個人事業主は登録なし — gBizINFO は法人のみ対象
  • 閉鎖法人close_date が入っている場合は閉鎖済み
  • データの鮮度 — 登記変更直後は反映に時差が生じる場合がある

まとめ

  • gBizINFO API は無料・認証不要で法人番号から企業情報を取得できる
  • 国税庁インボイス API・freee API と組み合わせると与信・経理業務の自動化が可能
  • 複数法人の一括取得は Promise.allSettled + 間隔制御で安全に並列処理

Claude から法人情報を調べる


試したい人へ

英語の Glama Playground が苦手な人は、以下のコマンドで日本のターミナルから動かせます:

npx -y pay-per-call-mcp@latest
# → 8 つのデモ API がすぐ使えます

設定不要、課金なし、サインアップ不要。

よくある質問

Q. gBizINFO は認証なしで使えますか?

A. はい、gBizINFO API は完全無料・認証不要です。APIキーの取得やアカウント登録は一切不要で、法人番号さえあればすぐに情報を取得できます。

Q. 法人番号がわからない場合はどうすれば?

A. 国税庁の「法人番号公表サイト」(https://www.houjin-bangou.nta.go.jp/)で社名から検索できます。また gBizINFO の /v1/hojin エンドポイントは企業名での検索にも対応しています。

Q. 取引先の与信チェックに使えますか?

A. 売上高・従業員数・設立年などの基本情報は取得できます。ただし信用スコアや支払い履歴は含まれないため、本格的な与信調査には帝国データバンクなどの専門サービスと組み合わせることを推奨します。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?