本文へスキップ

国会会議録検索APIの使い方:発言検索・会議録取得・ページングをcurlで実測(キー不要)

国立国会図書館の国会会議録検索システムAPIを2026年9月14日に実測。speech・meeting・meeting_listの3エンドポイント、主要パラメータ、JSONの項目、ページング、全角半角の扱い、無効な院名が黙って無視される癖まで、実際の出力を根拠に解説します。

SHAYOUWORLD 更新 約6分

国会会議録検索システムのAPIは、APIキーも利用申請も不要で、発言1件単位まで JSON で取得できます。 一方で、1回の上限が100件(会議単位は10件)、既定の応答がXML、無効なパラメータ値が黙って無視されるなど、AIエージェントに渡す前に知っておくべき癖があります。

この記事は、公式の仕様ページを読んだうえで、2026年9月14日に実際にリクエストを投げた結果をもとに書いています。日本の公共データAPI 5選では他の公共APIとの比較にとどめていたので、ここでは国会会議録APIだけを深掘りします。MCPサーバーにする手順は続編の国会会議録APIをMCPサーバー化するにまとめました。

先に押さえること

  1. エンドポイントは3つ。 speech(発言単位)、meeting(会議単位)、meeting_list(会議一覧)で、URLは https://kokkai.ndl.go.jp/api/ の直下です。
  2. 上限は100件(会議単位は10件)。 nextRecordPositionstartRecord に渡して繰り返します。
  3. 全角・半角は正規化される。 生成AI生成AI は同じ1,161件でした。
  4. 失敗しないエラーがある。 nameOfHouse=衆院 はエラーにならず、フィルタが外れた件数が返ります。

3つのエンドポイントと上限

公式ページに記載されているエンドポイントと上限は次のとおりです。いずれも GET で、検索条件はクエリ文字列(UTF-8 で URL エンコード)で渡します。

出力形式URLmaximumRecords の範囲(既定)
会議単位簡易出力https://kokkai.ndl.go.jp/api/meeting_list1〜100(30)
会議単位出力https://kokkai.ndl.go.jp/api/meeting1〜10(3)
発言単位出力https://kokkai.ndl.go.jp/api/speech1〜100(30)

使い分けは「本文がどの粒度で欲しいか」で決まります。

speech(発言単位)
meeting(会議単位)
1レコード
発言1件。speech に本文全文
会議1回。speechRecord 配列に全発言
上限
100件
10件
実測サイズ
1件で約1.2KB、100件で約136KB
衆院内閣委員会1回(208発言)で約160KB
向く用途
キーワード検索、発言者追跡、出典付き引用
1つの会議の流れを最初から最後まで読む
出典URL
speechURL(発言番号付き)と meetingURL
meetingURL と各発言の speechURL
2026-09-14 に recordPacking=json で実測したサイズ

meeting_listmeeting から本文を抜いた軽量版で、speechRecord には speechIDspeechOrderspeakerspeechURL だけが入ります。会議の一覧を出してから、必要な会議だけ meeting で全文を引く、という2段構えに向いています。

まず1件取ってみる

any に検索語、maximumRecords に件数、recordPacking=json を付けます。recordPacking を省略すると XML が返るので、JSON で扱うなら毎回付けます。

Terminal window
curl -s "https://kokkai.ndl.go.jp/api/speech?any=%E7%94%9F%E6%88%90AI&maximumRecords=1&recordPacking=json"

実際の応答(本文は省略)です。

{
"numberOfRecords": 1161,
"numberOfReturn": 1,
"startRecord": 1,
"nextRecordPosition": 2,
"speechRecord": [
{
"speechID": "122115391X00120260723_026",
"issueID": "122115391X00120260723",
"imageKind": "会議録",
"searchObject": 26,
"session": 221,
"nameOfHouse": "参議院",
"nameOfMeeting": "沖縄・北方問題及び地方に関する特別委員会、総務委員会連合審査会",
"issue": "第1号",
"date": "2026-07-23",
"closing": null,
"speechOrder": 26,
"speaker": "岸真紀子",
"speakerYomi": "きしまきこ",
"speakerGroup": "立憲民主・無所属",
"speakerPosition": null,
"speakerRole": null,
"speech": "○岸真紀子君 今法律の議論をしているので、…",
"startPage": 0,
"speechURL": "https://kokkai.ndl.go.jp/txt/122115391X00120260723/26",
"meetingURL": "https://kokkai.ndl.go.jp/txt/122115391X00120260723",
"pdfURL": null
}
]
}

覚えておく項目は4つです。

  • speechID会議録ID_発言番号(3桁) の形式で、後から speechID= で完全一致検索できます
  • issueID は21桁の会議録IDで、meetingissueID= に渡すとその会議の全発言が取れます
  • speechURL は発言番号付きの公式ページ、meetingURL は会議録全体のページです
  • speech 本文は ○発言者名  で始まり、改行は \r\n です

nextRecordPosition は次ページがあるときだけ入ります。最終ページでは JSON からキーごと消えました(後述)。

主要パラメータ

公式ページのパラメータのうち、実務で使う頻度が高いものを整理します。全体で2,000バイトの上限があり、検索条件が1つもないと400エラーになります。

パラメータ意味書式・制約
any検索語半角スペース区切りで AND、部分一致
nameOfHouse院名衆議院 参議院 両院 両院協議会 のみ
nameOfMeeting会議名スペース区切りで OR、部分一致
speaker発言者名スペース区切りで OR、部分一致
from / until開会日の範囲YYYY-MM-DD。既定は 0000-01-01 〜 9999-12-31
sessionFrom / sessionTo国会回次3桁までの自然数。片方だけなら完全一致
speakerRole発言者役割証人 参考人 公述人 のみ
speakerPosition / speakerGroup肩書き・会派部分一致
searchRange検索対象箇所冒頭 本文 冒頭・本文
speechID / issueID発言ID・会議録ID完全一致
startRecord / maximumRecords開始位置・件数上限は表のとおり

同じ検索語 生成AI に条件を足していったときの件数です(2026-09-14 実測、いずれも speech)。

1,161件
any=生成AI
条件なし。衆議院637 + 参議院524
120件
any=生成AI 著作権
スペース区切りは AND
419件
nameOfMeeting=内閣委員会 総務委員会
会議名側は OR
2件
searchRange=冒頭
本文を外すとほぼ消える
https://kokkai.ndl.go.jp/api/speech に maximumRecords=1&recordPacking=json を付けて実行

他に確認した組み合わせは、speaker=片山さつき で4件、sessionFrom=221&sessionTo=221 で283件、speakerRole=参考人 で61件でした。

実測で分かった検索の癖

全角・半角は同じ扱い

any=生成AIany=生成AI はどちらも1,161件、単独の AIAI はどちらも12,590件でした。会議録本文は英字が全角(生成AI)で書かれていますが、検索側で正規化されているので、クライアントで変換する必要はありません。

一方、生成 AI のようにスペースを入れると 生成 AND AI の2語検索になり、1,324件と増えます。「生成AI」という語を引きたいならスペースを入れない、が正解です。

部分一致なので短い語は広く当たる

speaker=岸田speaker=岸田文雄 は同じ7件でした。部分一致は便利ですが、AI のような短い語は AIDS のような別語にも当たりうるので、件数が多いときは会議名や日付で絞ります。

無効な院名はエラーにならない

ここが一番の落とし穴でした。nameOfHouse=衆院 を渡すと エラーにならず、条件なしと同じ1,161件 が返ります。仕様上の許容値は 衆議院 参議院 両院 両院協議会 だけで、それ以外は黙って無視されるようです。

nameOfHouse=衆議院 -> 637件
nameOfHouse=参議院 -> 524件
nameOfHouse=衆院 -> 1161件(条件なしと同じ)

対照的に speakerRole=大臣 は400で止まります。

{"message":"(19011)検索条件の入力に誤りがあります。","details":["(0) (19028)speakerRole:発言者役割を証人/参考人/公述人で入力してください。"]}

エラーになるパラメータと無視されるパラメータが混在しているので、エージェントに使わせるなら院名は列挙型で固定し、API に任せないほうが安全です。

ページングと最終ページの判定

生成AI の1,161件を100件ずつ取ると、応答ヘッダ部分はこう動きました。

startRecord=1 -> numberOfReturn=100, nextRecordPosition=101
startRecord=101 -> numberOfReturn=100, nextRecordPosition=201
...
startRecord=1101 -> numberOfReturn=61, nextRecordPosition なし(キーが消える)
startRecord=5000 -> 400 (19004) startRecordには 1から検索件数までの値を指定してください。

つまり「nextRecordPosition が返ってきたらその値を次の startRecord に入れる、返ってこなければ終わり」です。numberOfRecords を超える位置を指定すると400になるので、総件数から回数を先に計算するより、nextRecordPosition の有無で回すほうが壊れにくいです。

会議単位で全発言を取る

会議一覧から会議録IDを取り、meeting で全文を引く流れです。

Terminal window
# 2026年4月の衆議院内閣委員会を一覧
curl -s "https://kokkai.ndl.go.jp/api/meeting_list?nameOfMeeting=%E5%86%85%E9%96%A3%E5%A7%94%E5%93%A1%E4%BC%9A&nameOfHouse=%E8%A1%86%E8%AD%B0%E9%99%A2&from=2026-04-01&until=2026-04-30&maximumRecords=3&recordPacking=json"
# 会議録IDを指定して全発言を取得
curl -s "https://kokkai.ndl.go.jp/api/meeting?issueID=122104889X00820260424&recordPacking=json"

一覧は9件ヒットし、先頭は4月24日の第8号(issueID=122104889X00820260424)でした。meeting で引くと speechRecord が208件、応答は約160KBです。先頭の発言は speechOrder: 0speaker: "会議録情報" で、本文は出席委員の名簿です。

{
"speechID": "122104889X00820260424_000",
"speechOrder": 0,
"speaker": "会議録情報",
"speech": "令和八年四月二十四日(金曜日)\r\n    午前九時開議\r\n 出席委員\r\n…",
"startPage": 1,
"createTime": "2026-09-10 00:06:32",
"updateTime": "2026-09-10 10:55:03",
"speechURL": "https://kokkai.ndl.go.jp/txt/122104889X00820260424/0"
}

2点注意です。speechOrder: 0 は発言ではなく会議録の冒頭情報なので、発言者集計から外します。もう1つ、createTime が 2026-09-10 になっているとおり、4月24日の会議が API で取れるようになったのは9月に入ってからです。会議録の掲載には時間差があり、「直近の会議は未収録」を前提に設計します。

エラー応答の形

JSON 指定時のエラーは message(と入力誤りなら details)を持つ JSON で、HTTP 400 で返ります。実測した3つです。

検索条件なし -> {"message":"(19007)検索条件を指定してください。"}
maximumRecords=101 -> (19011) + details "(19005)maximumRecordsには1~100の値を指定してください。"
from=2026/04/01 -> (19011) + details "(19012)from:開会日付をYYYY-MM-DD形式で入力してください。"

コード番号は公式ページの一覧と一致しています。混雑時は 19001 が返るとされていますが、今回は遭遇しませんでした。

AIエージェントから使うときの前提

公式ページの「利用上のお願い」には、短時間の大量アクセスを遠慮すること、機械的アクセスでは多重リクエストを避け数秒の間隔を空けることが書かれています。加えて、発言の著作権は発言者に帰属し、利用は原則として著作権者の許諾が必要(権利制限規定の適用等を除く)とされています。エージェントに使わせるときの最低限の約束は次の4つです。

  1. 院名・役割は列挙型で固定する。 無効値が黙殺されるので、モデルの自由入力を API に直接渡さない
  2. maximumRecords の上限をサーバー側で小さく固定する。 100件×本文は1回で136KBになり、コンテキストを圧迫する
  3. リクエストは直列化し、間隔を空ける。 数秒の間隔は公式の依頼事項
  4. speechIDspeechURL を必ず残す。 要約が正しいかを人間が原文で確認できる状態を保つ

この4点をそのままコードに落としたのが国会会議録APIをMCPサーバー化する記事です。すでに公開されている @codeagentjp/houan-mcp の使いどころはhouan-mcpの7つのユースケースにまとめてあります。

まとめ

  • 国会会議録検索APIは手続不要。speech(発言)、meeting(会議)、meeting_list(会議一覧)の3エンドポイント
  • 上限は発言・一覧が100件、会議が10件。nextRecordPosition がなくなるまで startRecord を進める
  • 全角・半角は正規化済み。スペースは AND(any)と OR(nameOfMeetingspeaker)で意味が違う
  • nameOfHouse の無効値はエラーにならず無視される。speakerRole の無効値は400。エージェントには列挙型で渡す
  • 会議録の掲載には時間差がある。speechOrder: 0 は冒頭情報で発言ではない

API 自体は素直ですが、「失敗が失敗の形をしていない」ケースが1つあることだけは、e-Gov法令API v2の時点指定で見た現行条文の黙殺と同じ種類の落とし穴です。院名の固定と出典IDの保持を、最初から設計に入れてください。

この記事の情報・検証メモ
Tags
公開日
情報確認
参考リンク
1件
更新性
長く使える
更新管理

仕様・料金・提供範囲が変わりやすいテーマは、公開日・更新日・情報確認日を分けて管理します。 導入前には必ず記事末尾の一次情報と公式ドキュメントで最新状況を確認してください。

検証メモ
curl / Python urllib 実行日 2026-09-14 国会会議録検索システム 検索用API(https://kokkai.ndl.go.jp/api/)
図解を保存・共有

記事の要点を1枚にまとめました。画像は新しいタブで開いて保存できます。

国会会議録検索APIの使い方:発言検索・会議録取得・ページングをcurlで実測(キー不要) 国会会議録APIは手続不要で発言単位まで引けるが、上限100件・無効値の黙殺・掲載遅延を前提に設計する 3つのエンドポイント:speech は発言単位、最大100件で本文付き。meeting は会議単位、最大10件で全発言を含む。meeting_list は会議の一覧、本文を含まない。 実測で分かった癖:全角AIと半角AIは同じ件数、正規化されている。院名に無効値を渡してもエラーにならず無視される。speakerRole は証人・参考人・公述人以外で400。 エージェントに渡す前提:speechID と speechURL を出典として保持する。nextRecordPosition が消えるまでが全件。数秒間隔・同時実行なしを守る。
国会会議録検索APIの使い方:発言検索・会議録取得・ページングをcurlで実測(キー不要) 記事の要約 2026.09.14 入門・導入ガイド
Primary sources

一次情報・参考リンク

About the author
SHAYOUWORLD

日本の公共データAPIを使うMCPサーバーを作って公開し、ローカルLLMを自分のGPUで測った記録を、一次情報・検証ログ・失敗例とあわせて整理します。