本文へスキップ

e-Gov法令API v2のエラーコードと制限:404・400の実測一覧、Base64、巨大法令のサイズ

e-Gov法令API v2で存在しないID・不正なasof・不正なパラメータを実際に叩き、ステータスコードとエラー本文を一覧化。Base64と文字コード、Accept と response_format の優先順位、民法・会社法・所得税法の取得サイズと所要時間を2026年9月14日のcurl実測で記録しました。

codeagent.jp編集部 更新 約7分

e-Gov法令API v2のエラーは、API本体が返す codemessage のJSON、フレームワークが返す timestamp 付きJSON、サーバー手前が返すHTMLの3系統に分かれます。 どの形で返ってきたかを見れば、パラメータの値が悪いのか、リクエストの組み立てが壊れているのかを一段目で切り分けられます。

この記事は、存在しないID・不正な日付・不正なパラメータを2026年9月14日に実際に叩いて、ステータスコードと本文を記録したものです。あわせてBase64と文字コード、Acceptresponse_format の優先順位、民法・会社法・所得税法の取得サイズと所要時間も実測しました。エンドポイントごとの正常系は逆引きリファレンスを参照してください。

  1. API本体のエラーは code で判定する。 400004(日付)、400044(asof の下限)、404001(0件)、404004(本文なし)が実務で当たりやすい4つです。
  2. 0件の表現がエンドポイントで違う。 laws は200の空配列、keywordlaw_revisions は404です。
  3. asof は2017-04-01以降のみ。 それより前はデータ整備の対象外で、400になります。
  4. 巨大法令はgzipで受ける。 所得税法の全文JSONは16.4MBですが、--compressed なら662KBで届きます。

エラーの3系統を見分ける

同じ400でも本文の形が違います。実際に返ってきた3つを並べます。

# 1. API本体(application/json): パラメータの値が不正
{"code":"400004","message":"日付(asof等)が誤っています。"}
# 2. フレームワーク既定(application/json): 必須パラメータ欠落・未知パス
{"timestamp":"2026-09-14T04:29:20.884+00:00","status":400,"error":"Bad Request","path":"/api/2/keyword"}
# 3. サーバー手前(text/html): URLに角括弧をそのまま含めた
<!doctype html><html lang="en"><head><title>HTTP Status 400 – Bad Request</title>...

1はOpenAPI定義の error_info スキーマどおりで、code の先頭3桁がHTTPステータスに対応します。2は keyword を付けずに /keyword を呼んだときと、存在しないパス /api/2/nope(404)で返りました。3は elm=LawTitle[1] のように角括弧をエンコードせずに送ったときで、レスポンスヘッダは Server: CloudFrontX-Cache: Error from cloudfront でした。3が出たらパラメータの値ではなくURLの組み立てを疑います。

なお POST /laws は405で本文が Method Not Allowed の18バイト、Accept: text/html は406で Not Acceptable でした。

実測したエラー一覧

リクエストステータスcodemessage
law_data/999AC9999999999404404004指定のパラメータで取得できる法令本文ファイルは存在しません。
law_data/322AC0000000049_19000101_000000000000000(存在しない履歴ID)404404004同上
law_file/xml/999AC9999999999404404004同上
attachment/999AC9999999999_19000101_000000000000000404404004同上
law_revisions/999AC9999999999404404001取得結果が0件です。
keyword?keyword=生成AI(0件)404404001取得結果が0件です。
laws?law_title=民法&limit=0200total_count 0、laws は空配列
law_data/...?asof=2025-13-45400400004日付(asof等)が誤っています。
law_data/...?asof=20250601(ハイフンなし)400400004同上
law_data/...?asof=1900-01-01400400044法令の時点(asof)には2017-04-01以降を指定してください。
law_data/...?asof=2099-01-01200未施行の版 ..._20281223_...(UnEnforced)が返る
laws?law_type=Foo400400001法令種別(law_type、law_num_type)が誤っています。
laws?limit=abc400400007取得件数(limit)が数字ではありません。
laws?limit=-1400400027取得件数(limit)が負値(異常値)です。
keyword?keyword=電子計算機&limit=1001400400005取得件数(limit)は1件以上1000件以内を指定してください。
keyword?keyword=(空)400400019検索ワード(keyword)が未設定又は誤っています。
law_data/...?elm=Foo_1 / elm=MainProvision-Article_9999400400021要素(elm)に合致する要素が法令本文に存在しません。
law_data/...?json_format=medium400400045JSONレスポンスの形式(json_format)が誤っています。
laws?response_format=yaml400400040レスポンス形式(response_format)が誤っています。
law_file/pdf/322AC0000000049400400042ファイル種別(file_type)が誤っています。
law_revisions/...?law_title=%2F^労働基準法$%2F(スラッシュをエンコード)400400033法令名又は法令略称(law_title)が誤っています。

未知のパラメータ(foo=bar)は無視されて200でした。タイプミスしたパラメータ名はエラーにならず、絞り込みが効かないまま結果が返るので、件数が想定より多いときはパラメータ名を確認してください。

asof の下限2017-04-01は、ヘルプにある「平成29年4月1日時点以降の法令データ整備を実施」という記述と一致します。それ以前の条文はこのAPIでは取れません。

0件の返り方はエンドポイントで違う

laws(0件でも200)
keyword / law_revisions(0件は404)
ステータス
200
404
本文
total_count 0、count 0、laws は空配列
code 404001「取得結果が0件です。」
next_offset
キー自体が無い
(エラー本文のため無し)
クライアント側の扱い
count を見る
404 かつ code 404001 なら「0件」、404004 なら「IDが違う」
存在しないID
law_id=存在しないID でも 200 の空配列
law_revisions は 404001、law_data は 404004
2026-09-14 の実測。404 を一律にエラー扱いすると「単に0件」と「IDが間違い」を区別できなくなる

law_data の404004は「本文ファイルが無い」の意味で、存在しない法令IDでも、存在するIDに存在しない履歴IDを付けたときでも同じコードでした。law_revisions の404001は「一覧が0件」です。エージェントに渡すときは、この2つのコードを「止まるべきエラー」ではなく「検索条件を見直す合図」として扱うよう指示しておくと、無理に別の法令で埋める挙動を防げます。

Accept と response_format の優先順位

response_format を付けない場合は Accept ヘッダで形式が決まり、判断できなければJSONです。組み合わせを変えて laws?law_id=322AC0000000049&limit=1 を呼びました。

Accept なし -> 200 application/json
Accept: application/json -> 200 application/json
Accept: application/xml -> 200 application/xml <laws_response>...
Accept: application/xml + response_format=json -> 200 application/json(response_format が優先)
Accept: text/html -> 406 "Not Acceptable"
Accept: application/xml + law_type=Foo -> 400 application/xml <ErrorInfo><code>400001</code>...

エラー本文も形式に追従し、XMLでは <ErrorInfo> 要素で返ります。JSONの Content-Typeapplication/json だけで charset の指定がありません。中身はUTF-8で、XML(law_file/xml)は <?xml version="1.0" encoding="UTF-8" standalone="no"?> の宣言付きでした。Shift_JISで返ることはなかったので、受け側はUTF-8固定で問題ありません。

Base64 になる条件と確認方法

law_data は外側の response_format(既定 json)と本文の law_full_text_format を別々に指定でき、2つが食い違うときだけ law_full_text がBase64になります。 労働基準法で確認しました。

Terminal window
curl -s "https://laws.e-gov.go.jp/api/2/law_data/322AC0000000049?law_full_text_format=xml" \
| python -c "import json,sys,base64; t=json.load(sys.stdin)['law_full_text']; print(len(t), t[:24]); print(base64.b64decode(t)[:60])"
531044 PExhdyBFcmE9IlNob3dhIiBM
b'<Law Era="Showa" Lang="ja" LawType="Act" Num="049" PromulgateDay="07"'

law_full_textPExhdy... で始まっていたらBase64です(<Law をBase64にした先頭がこの並びになります)。復号すると398,281バイトのXMLで、同じ法令を response_format=xml で取ったときの本文とサイズが一致しました。復号の実装はPython実装の記事に、XMLをMCP用JSONに変換する設計はXML→JSONの記事にあります。

Base64を避けたいだけなら、JSONが欲しいときは law_full_text_format を付けない、XMLが欲しいときは response_format=xml にする、の二択で済みます。

巨大法令のサイズと所要時間

大きな法令をどの形式で取ると何バイトになるか、5本で測りました。json_fulllaw_data の既定、json_lightjson_format=lightxmlresponse_format=xmlb64 はJSON応答に law_full_text_format=xml を付けたもの、file_xmllaw_file/xmlgzjson_fullcurl --compressed で受けたときの転送量です。

法令json_fulljson_lightxmlb64file_xmlgz所要時間(json_full)
日本国憲法81,72570,50577,463102,49476,20711,6360.16秒
労働基準法419,817339,023399,678532,090398,33745,4770.25秒
民法1,618,3441,413,3091,634,2602,178,2181,632,975162,3910.30秒
会社法3,034,2372,716,4643,173,1684,230,0763,171,829272,7940.94秒
所得税法16,404,1459,705,00616,443,28821,923,56516,441,924662,1111.61秒
全文 JSON(law_data 既定)の応答サイズ
日本国憲法 0.08MB
労働基準法 0.42MB
民法 1.62MB
会社法 3.03MB
所得税法 16.4MB
curl の size_download で計測(2026-09-14)。gzip 受信なら所得税法でも 0.66MB / https://laws.e-gov.go.jp/api/2/law_data/<law_id>

読み取れることを3つ挙げます。

  • Base64は素の1.33倍。 所得税法では16.4MBが21.9MBに膨らみます。JSONとXMLを混ぜないだけで転送量が減ります。
  • gzipが最も効く。 law_dataAccept-Encoding: gzip に応じて所得税法を662KB(4%)まで圧縮しました。law_file--compressed を付けても16.4MBのままで、圧縮されません。
  • json_format=light は所得税法で約4割減。 速度目的というより、構造を簡素にする目的のオプションです。

所要時間はすべて2秒以内で、curlでは所得税法(16.4MB)でも問題なく取れました。30回連続で law_data を呼んでもすべて200で、レート制限には当たりませんでしたが、公式資料に制限値の記載は見当たらず、応答ヘッダは Cache-Control: max-age=0, no-cache, no-store で毎回オリジンまで届きます。定期実行では自分で間隔を空け、本文の一括取得が目的なら公式が案内しているXML一括ダウンロードを使う方が向いています。

Windows で日本語パラメータが化ける

Windowsで検証していて、law_title=民法 が0件になる現象に当たりました。原因はcurlに渡る日本語のバイト列です。-w '%{url_effective}' で実際に送ったURLを表示すると分かります。

Git Bash(MSYS)から curl.exe -> law_title=%96%af%96%40 (Shift_JIS)→ 0件
PowerShell 7.6 から curl.exe -> law_title=%E6%B0%91%E6%B3%95 (UTF-8) → 11件

同じ --data-urlencode "law_title=民法" でも、呼び出す殻によってUTF-8で渡るかShift_JISで渡るかが変わりました。原因が分からない0件は、まず url_effective を見てください。回避策は、あらかじめパーセントエンコードした文字列を渡すか、URL オブジェクトにエンコードを任せられるNode.jsやPythonで呼ぶことです(TypeScript実装の記事では URL.searchParams に任せています)。

まとめ

  • エラーは3系統。codemessage のJSONならパラメータの値、timestamp 付きなら必須パラメータやパス、HTMLならURLの組み立て(角括弧など)を疑う
  • 0件は laws が200の空配列、keywordlaw_revisions が404(404001)。law_data の存在しないIDは404004
  • asof は2017-04-01以降のみ(400044)。未来日付は未施行の版が返る
  • response_formatAccept より優先。text/html は406。JSONとXMLを混ぜたときだけBase64
  • 所得税法の全文JSONは16.4MB、gzipなら662KB。law_file は圧縮されない。30連続でもレート制限には当たらなかった

エラーを「失敗」で一括りにせず、コードごとに「条件を見直す」「IDを確定し直す」「URLを直す」と対応を分けておくと、エージェントに任せたときにも黙って別の法令で埋める挙動を防げます。その線引きは法令をAIで扱うときの安全境界の考え方と同じです。

この記事の情報・検証メモ
Tags
公開日
情報確認
参考リンク
3件
更新性
定期更新
更新管理

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

検証メモ
e-Gov法令API v2 / OpenAPI 2.1.139 curl 実行日 2026-09-14(Windows 11、Git Bash と PowerShell 7.6)
図解を保存・共有

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

e-Gov法令API v2のエラーコードと制限:404・400の実測一覧、Base64、巨大法令のサイズ 失敗は3系統。API本体のJSON、フレームワークのJSON、手前のHTMLのどれかで原因の層が分かる エラーの3系統:API本体: 400/404 で code 400004 のような JSON。フレームワーク: 必須パラメータ欠落や未知パスは timestamp 付き JSON。サーバー手前: 角括弧をそのまま送ると HTML の 400。 数値で確認した制限:asof は 2017-04-01 以降のみ(コード 400044)。keyword の limit は 1000 まで。laws には上限が見当たらない。所得税法の全文 JSON は 16.4MB、gzip で 662KB。 形式と文字コード:response_format は Accept より優先。text/html は 406。JSON+XML の組み合わせだけ law_full_text が Base64。Windows の Git Bash から curl に日本語を渡すと Shift_JIS になることがある。
e-Gov法令API v2のエラーコードと制限:404・400の実測一覧、Base64、巨大法令のサイズ 記事の要約 2026.09.14 運用Tips・トラブルシュート
Primary sources

一次情報・参考リンク

About the author
codeagent.jp編集部

Claude Code / Codex / MCP を個人開発サイト運用と公開MCPサーバー開発で試し、一次情報・検証ログ・失敗例をもとに整理します。