jGrants APIで補助金・助成金を検索する
jGrants(Jグランツ)は、国や自治体の補助金・助成金を電子申請できる政府のポータルで、募集中の制度を検索できる公開APIが用意されています。APIキーの登録は不要で、補助金の名称・上限額・締切・対象地域・対象従業員規模といった情報がそのまま取れるため、補助金の検索サービスや、自社が使える制度の定期チェックを自動化する用途に向いています。ただしパラメータの必須条件が独特で、素直に書くと400エラーから抜け出せません。このガイドでは、実際に叩いて確認した仕様と癖を整理します。
jGrants APIで取れるデータ
取得できるのは「公募中(または過去の)補助金の募集要項」の情報です。一覧検索では、title(補助金の正式名称)、subsidy_max_limit(補助上限額・円)、target_area_search(対象地域)、target_number_of_employees(対象の従業員規模)、acceptance_start_datetime / acceptance_end_datetime(募集の開始・終了日時)が返ります。
詳細取得では、これに加えて subsidy_catch_phrase(キャッチコピー)、detail(HTML形式の詳細本文)、use_purpose(利用目的)、industry(対象業種)、target_area_detail(対象地域の詳細)、subsidy_rate(補助率)、project_end_deadline(事業終了期限)、front_subsidy_detail_page_url(jGrants公式サイトの該当ページURL)などが取れます。
一方で、採択結果・採択率・予算の執行状況といった統計データは提供されていません。あくまで「これから応募できる制度を探す」ためのAPIです。
検索APIの叩き方(パラメータは4つとも必須)
一覧検索のエンドポイントは `https://api.jgrants-portal.go.jp/exp/v1/public/subsidies` です。認証は不要で、APIキーなしでそのまま叩けます。
ここが最大の関門です。keyword(検索語)、sort(並び順の基準)、order(昇順/降順)、acceptance(募集中に限るか)の4つが、すべて必須です。1つでも欠けると `{"message":"Bad request"}` とともに HTTP 400 が返ります。特に引っかかりやすいのが acceptance で、「省略すれば募集中も終了済みも全部返る」という直感的な挙動ではなく、省略した時点で400になります。値の指定は必須で、1 が募集中のみです。
任意パラメータとして use_purpose(利用目的)、industry(業種)、target_number_of_employees(従業員規模)、target_area_search(対象地域)が使えます。ただし地域や業種での絞り込みは完全一致の文字列指定で、たとえば target_area_search=東京都 のように正確な表記を渡す必要があります。指定できる値の一覧は公式ドキュメントに見当たらないため、実データから逆引きして候補を集めるのが現実的です。
詳細取得は `https://api.jgrants-portal.go.jp/exp/v1/public/subsidies/id/{id}` です。id は一覧レスポンスの id フィールド(例: a0WJ200000CDapgMAD)を使います。なお公式ドキュメント上には詳細取得APIのv2(`/exp/v2/public/subsidies/id/{id}`)も存在します。
実装でハマる5つの落とし穴
1つ目は、keyword に最小文字数があることです。1文字だと400になります。実際に keyword=省 で叩くと Bad request が返り、keyword=省エ(2文字)にすると200で結果が返りました。ユーザーの入力をそのまま渡す作りにするなら、2文字未満は手前で弾いてください。
2つ目は、詳細APIが「存在しないID」でも404を返さないことです。デタラメなIDを渡しても HTTP 200 が返り、中身が `{"metadata":{"resultset":{"count":0}},"result":[]}` という空配列になります。HTTPステータスだけを見て成功判定すると、存在しない補助金を「取得成功」として扱ってしまいます。result の長さが0かどうかを明示的に確認する必要があります。
3つ目は、一覧と詳細で日時のフォーマットが違うことです。同じ補助金でも、一覧では `2026-07-24T08:30:00.000Z`(秒・ミリ秒あり)、詳細では `2026-06-19T06:00Z`(秒・ミリ秒なし)という形で返ってきました。片方の形式だけを前提にしたパーサーを書くと、もう片方で壊れます。
4つ目は、name フィールドが補助金名ではないことです。name には `S-00009341` のような内部管理コードが入っており、表示に使うべき正式名称は title です。名前が紛らわしいので取り違えやすく、画面に意味不明なコードが出て初めて気づくことになります。同様に institution_name(実施機関名)は、一覧レスポンスでは常に null で、詳細を取得して初めて値が入ります。
5つ目は、ページングが無いことです。一覧検索にページ指定のパラメータが見当たらず、ヒットした分がすべて一度に返ってきます。実際に acceptance=0(終了済みを含む)で幅広い語を検索したところ、3,113件がそのまま1つのJSONで返りました。広いキーワードで検索すると巨大なレスポンスになるため、タイムアウトやメモリを意識した実装が要ります。
細かい点では、industry(業種)は複数カテゴリが `建設業 / 製造業 / ...` のように " / " 区切りの1つの文字列で連結されて返ります。配列ではないので、分割が必要です。また subsidy_rate(補助率)は `2/3 以内又は 1/2 以内` のようなフリーテキストで、数値としては扱えません。
利用条件について(要確認)
APIキーは不要で、利用料もかかりません。ただし、jGrants APIに固有の利用規約・ライセンス条項については、公式のAPIドキュメントページ上で明示的な記載を見つけられませんでした。政府標準利用規約やCC BYに準拠しているという説明を二次情報で見かけることはありますが、一次情報として確認できていません。
商用サービスに組み込む場合や、取得データを再配布する場合は、デジタル庁のドキュメントを直接確認するか、問い合わせて条件を明確にしてから進めることをおすすめします。「たぶんオープンデータだから自由」と決めつけないほうが安全です。
実際に叩いてみる(jGrants・登録不要)
jGrants の公開APIは登録不要で、keyword(2文字以上・必須)と acceptance(1=募集中)で補助金を検索できます。metadata.resultset.count に総件数、result[] に各補助金が入ります。詳細は result[].id を /subsidies/id/{id} に渡して取得します。
curl -s "https://api.jgrants-portal.go.jp/exp/v1/public/subsidies?keyword=IT&sort=created_date&order=DESC&acceptance=1"
# 実際のレスポンス(抜粋)
{
"metadata": { "resultset": { "count": 17 } },
"result": [{
"id": "a0WJ200000CDbyeMAD",
"name": "S-00009406",
"title": "…プログラム/…技術の開発…の公募",
"acceptance_end_datetime": "2026-07-24T03:00:00.000Z",
"target_area_search": "全国",
"subsidy_max_limit": 0
}]
}出典
元システムエンジニア。Web系アプリ開発6年+ソリューション9年、IT実務およそ15年。個人開発者として、政府オープンデータや各府省のAPIを実際に叩いて検証し、「何が取れるか」「実装時にどこで詰まるか」「どう活用するか」を一次検証にもとづいて記録しています。
運営者・検証方針について →