e-Gov法令検索(https://laws.e-gov.go.jp/)は、デジタル庁が運営する法令データベースです。収録されている法令データはAPIを通じて取得できるため、アプリケーションやスクリプトから日本の法令情報をプログラムで扱う際に活用されています。本記事では、e-Gov法令API v1の主要なエンドポイントと、レスポンスとして返されるXMLの構造について、公開仕様に基づいて解説します。
e-Gov法令APIとは
e-Gov法令APIは、デジタル庁が提供する法令データの取得インターフェースです。HTTPリクエストを送ると、法令の一覧情報や条文の全文データをXML形式で受け取ることができます。
利用に際してAPIキーは不要で、パブリックなエンドポイントとして公開されています。レスポンスはXMLのみで、JSON形式には対応していません。リクエスト先のドメインは laws.e-gov.go.jp であり、現在公開されているのはv1のエンドポイントです(出典:e-Gov法令検索)。
なお、大量のデータを自動取得する用途では、サーバーへの負荷を考慮してリクエスト間にインターバルを設けることが推奨されます。APIの利用規約・仕様変更については、e-Gov法令検索の公式情報を参照してください。
e-Gov法令APIは、法令データをプログラムで扱いたい開発者・研究者・データサイエンティストにとって有用なリソースです。たとえば、特定の法令の条文を定期的に取得してデータベースへ格納するスクリプトや、法改正の有無を検知するツールの作成などに活用されています。ただし、APIが返す条文は現在施行中の現行版のみであり、過去の時点の条文を取得する機能はv1では提供されていません。法令の改正前後の条文を比較したい場合は、e-Gov法令検索の沿革機能を別途参照することになります。
主要なエンドポイント
e-Gov法令API v1 には、用途の異なる2つの主要エンドポイントが用意されています。法令の一覧を取得する lawlists エンドポイントと、特定の法令の条文全文を取得する lawdata エンドポイントです。どちらもGETリクエストのみで利用でき、認証・APIキーは不要です。レスポンスはすべてXML形式で返され、JSONには対応していません。リクエストに際して特別なヘッダーの設定は不要ですが、User-Agentを適切に設定することが望ましい場合があります。
2つのエンドポイントの典型的な使い方は、まず lawlists で全法令または特定カテゴリの一覧を取得して目的の法令IDを特定し、次に lawdata でその法令IDを指定して条文全文を取得するという2段階のフローです。法令IDが事前に分かっている場合は lawdata エンドポイントに直接アクセスすることもできます。APIのベースURLは https://laws.e-gov.go.jp/api/1/ で、すべてのエンドポイントはHTTPSアクセスを前提としています。
法令一覧の取得(lawlists)
カテゴリ番号を指定して、そのカテゴリに属する法令の一覧をXMLで取得します。取得できる情報は法令ID・法令名・法令番号・公布年月日などです。
GET https://laws.e-gov.go.jp/api/1/lawlists/{カテゴリ番号}
カテゴリ番号と対象法令の対応は以下のとおりです(出典:e-Gov法令検索)。
| カテゴリ番号 | 対象 |
|---|---|
| 1 | 全法令 |
| 2 | 憲法・法律 |
| 3 | 政令・勅令 |
| 4 | 府省令・規則 |
取得できる法令の一覧は、法令全集のカテゴリ別一覧ページでもブラウザから確認できます(憲法・法律、政令・勅令、府省令・規則)。
レスポンスのXMLには、各法令の情報が LawNameListInfo 要素として繰り返し含まれます。各要素に含まれる主なフィールドは次のとおりです。
| フィールド名 | 内容 |
|---|---|
LawId | 法令ID(例:417AC0000000086) |
LawName | 法令名称(例:会社法) |
LawNo | 法令番号(例:平成十七年法律第八十六号) |
PromulgationDate | 公布年月日 |
カテゴリ1(全法令)を取得すると、現時点で8,000件を超える法令情報が一括で返されます。XMLの総サイズが大きくなるため、特定カテゴリのみを取得したい場合はカテゴリ番号を絞り込んで利用することでデータ量を削減できます。
レスポンスXMLのルート要素は DataRoot で、その下に ApplData 要素があり、複数の LawNameListInfo 要素が並ぶ構造です。各 LawNameListInfo は1件の法令に対応しており、法令IDと法令名の両方が含まれています。取得した一覧を目的の法令名で絞り込む場合は、プログラム内で部分一致検索を行う方法が汎用的です。たとえば「税」を含む法令名で絞り込めば、所得税法・法人税法・消費税法など税に関連する法律をまとめて取得することができます。
取得したXMLを処理する際は、LawNameListInfo 要素をすべて反復して各フィールドを取り出す実装が一般的です。以下はPythonでの簡単な処理例です。
import urllib.request, xml.etree.ElementTree as ET
url = "https://laws.e-gov.go.jp/api/1/lawlists/2"
with urllib.request.urlopen(url) as res:
root = ET.fromstring(res.read())
for item in root.iter("LawNameListInfo"):
law_id = item.findtext("LawId", "")
law_name = item.findtext("LawName", "")
print(law_id, law_name)
法令本文の取得(lawdata)
法令IDを指定して、法令の条文全文をXMLで取得します。取得できる情報は法令名・法令番号・施行日・本則・附則などの条文全体です。
GET https://laws.e-gov.go.jp/api/1/lawdata/{法令ID}
レスポンスのXMLには LawFullText 要素に条文の全体構造が含まれます。主要な属性・要素の概要は次のとおりです(出典:e-Gov法令検索)。
| 要素・属性 | 内容 |
|---|---|
Law[@Category] | 法令の種別(Act: 法律、CabinetOrder: 政令 等) |
Law[@EnforcementDate] | 施行日 |
LawNum | 法令番号 |
LawTitle | 法令名称 |
MainProvision | 本則(条文本体) |
SupplProvision | 附則 |
条文の階層構造(編・章・節・条・項・号)も対応するXML要素として表現されています。条文本体のテキストを取り出す場合は Sentence 要素の内容を参照します。法令によっては表(テーブル)や図が含まれる場合があります。
条文テキストを取り出す際の基本的な流れとして、まず Law 要素の Category 属性と EnforcementDate 属性で法令種別と施行日を確認し、次に LawBody 要素の下にある MainProvision(本則)を処理します。条文の内容は Article(条)→ Paragraph(項)→ Item(号)という階層で整理されており、テキストは末端の Sentence 要素に格納されています。Article 要素の Num 属性には条番号が格納されているため、特定の条を検索する際はこの属性値を参照します。
法令名(LawTitle)を取得する場合のXMLパスは ApplData/LawFullText/Law/LawBody/LawTitle です。Pythonでの取得例を示します。
import urllib.request, xml.etree.ElementTree as ET
law_id = "417AC0000000086"
url = f"https://laws.e-gov.go.jp/api/1/lawdata/{law_id}"
with urllib.request.urlopen(url) as res:
xml = ET.fromstring(res.read())
title = xml.find(".//LawTitle")
if title is not None:
print(title.text) # => 会社法
法令IDの読み方
法令IDは英数字で構成される固定長の文字列です(例:417AC0000000086)。
法令IDはe-Gov法令検索の各法令ページのURLに含まれており、ブラウザのアドレスバーから確認できます。例えば会社法のURLは https://laws.e-gov.go.jp/law/417AC0000000086 であり、末尾の 417AC0000000086 が法令IDです。APIリクエストのパスには、このIDをそのまま使用します。
# 例:会社法(417AC0000000086)の本文を取得する場合
GET https://laws.e-gov.go.jp/api/1/lawdata/417AC0000000086
法令IDの先頭数字は公布年(西暦の下2〜3桁)に相当し、続く英字は法令の種別を示します。例えば AC は法律(Act)、CO は政令(Cabinet Order)、M は省令(Ministerial Order)に対応しています。ただし、法令IDの命名規則の詳細についてはe-Gov法令検索の公式ドキュメントを参照してください。
APIを使わずとも、法令IDに対応する条文はブラウザで直接閲覧できます。例えば法令ID 417AC0000000086 に対応する会社法の条文はこちらから参照できます。法令一覧のカテゴリ別ページは法令全集のトップから確認できます。
レスポンスの確認方法
ブラウザのアドレスバーにAPIのURLを直接入力するか、curl コマンドを使うことで手軽に動作確認ができます。
# 法令一覧(憲法・法律)の取得
curl "https://laws.e-gov.go.jp/api/1/lawlists/2"
# 会社法の条文全文の取得
curl "https://laws.e-gov.go.jp/api/1/lawdata/417AC0000000086"
XMLが返ってくれば正常にAPIへアクセスできています。ブラウザで確認する場合、Firefoxは整形されたXMLツリーとして表示する機能を持っています。Chromeではテキストとして表示されるため、拡張機能を利用するか curl 経由でファイルに保存して確認する方法が手軽です。
大量のデータを自動取得する場合は、サーバーへの負荷に配慮してリクエスト間隔を設けてください。また、取得したXMLをパースする際はエンコーディングに注意が必要で、レスポンスはUTF-8で返されます。
xmllint --format - コマンドを curl の出力にパイプで渡すと、XMLをインデント整形して表示できるため、要素の階層構造を目視で確認するのに便利です。Pythonスクリプトを書く前にこの方法で構造を把握しておくと、XPathや要素名のタイポを防ぎやすくなります。また、法令IDが正しいかどうかを確認する際は、まず lawlists で一覧を取得して法令名と法令IDを照合したうえで lawdata にアクセスするというデバッグ手順が有効です。
条文XMLの階層構造
lawdata で取得できるXMLは、日本の法令の論理的な階層(編・章・節・条・項・号)に対応した要素構造を持っています。主要な要素名と対応する法令上の概念は以下のとおりです(出典:e-Gov法令検索)。
| XML要素名 | 対応する法令上の概念 |
|---|---|
Part | 編 |
Chapter | 章 |
Section | 節 |
Subsection | 款 |
Division | 目 |
Article | 条 |
Paragraph | 項 |
Item | 号 |
Subitem1 | イ・ロ等の細目 |
Sentence | 文(条文の最小テキスト単位) |
条文テキストは Sentence 要素の内容として格納されており、一つの Paragraph(項)に複数の Sentence が含まれることもあります。表(テーブル)を含む条文では Table 要素が、図や様式が含まれる場合は別途添付ファイルへの参照要素が含まれることがあります。法令によってはすべての階層要素が存在するわけではなく、章・節を持たずに条が直接 MainProvision の下に並ぶ構造の法令もあります。
XMLを処理する際は、まず MainProvision(本則)と SupplProvision(附則)を区別し、目的に応じて参照範囲を絞ることが効率的です。特定の条番号の条文を取得したい場合は、Article 要素の Num 属性を参照することで条番号を識別できます。
XMLのエラーレスポンス
APIへのリクエストが正常に処理されなかった場合でもHTTPステータスコードが200で返されることがあり、レスポンスXML内の結果コード(Result 要素など)で成否を判定する必要があります。存在しない法令IDを指定した場合や不正なカテゴリ番号を指定した場合は、条文データが含まれないエラーレスポンスが返される場合があります(出典:e-Gov法令検索)。
実装の際は simplexml_load_string()(PHP)や xml.etree.ElementTree(Python)等でパース処理を行う前に、レスポンスが正常なXMLかどうかを確認するエラーハンドリングを設けることが推奨されます。
ネットワーク障害やサーバー側の一時的な問題によりレスポンスが取得できない場合に備え、タイムアウト設定とリトライ処理を実装しておくことも実用上有効です。Pythonの urllib.request.urlopen() では timeout パラメータで接続・読み込みの上限時間を指定できます。レスポンスが空の場合やXMLのパースに失敗した場合でもプログラムが停止しないよう、例外処理(try/except)を適切に組み合わせ、エラー内容をログに記録するように実装しておくと、問題が発生した際の調査がしやすくなります。
法令種別と法令IDの構成
法令IDは15文字の英数字で構成されており、先頭部分に法令の公布年と種別に関する情報が含まれています。以下は主な種別コードと法令の種類の対応です(出典:e-Gov法令検索)。
| 種別コード | 法令の種類 |
|---|---|
AC | 法律(Act) |
CO | 政令(Cabinet Order) |
IO | 勅令(Imperial Order) |
M | 省令・府令(Ministerial Order) |
RJNJ | 規則(Rule) |
法令IDの先頭数字は公布年の下2〜3桁に相当します。例えば 417AC0000000086 は平成17年(2005年)公布の法律(AC)であることを示しており、会社法に対応します。また 340AC0000000033 は昭和40年(1965年)公布の法律で所得税法に対応します。ただし、法令IDの詳細な命名規則についてはe-Gov法令検索の公式情報を参照してください。
法令IDを事前に把握していない場合は、まず lawlists エンドポイントで法令一覧を取得し、LawName(法令名)で絞り込んで対応する LawId を取得するのが一般的な手順です。法令名で完全一致検索することも、前方一致的に絞り込むことも、取得したリストをプログラム内でフィルタリングすることで実現できます。
利用上の注意
APIの仕様・エンドポイントのパスは予告なく変更される場合があります。本番利用の前にe-Gov法令検索のAPIドキュメントで最新の仕様を確認することを推奨します。
また、APIを通じて取得できるのは法令の条文テキストであり、e-Gov法令検索が提供する検索機能の全てがAPIで利用できるわけではありません。法令の制定・改廃履歴や詳細な附属資料については、e-Gov法令検索のWebサイトから直接確認する方法もあわせてご活用ください。
取得した法令データを二次利用する場合は、e-Gov法令検索の利用規約および政府標準利用規約を確認のうえ、出典の表記など必要な対応を行ってください。また、APIが返す条文は施行日時点の現行版であり、過去の時点の条文を取得する機能は現在のv1では提供されていません。法令の改正前後の条文を比較したい場合は、e-Gov法令検索の沿革機能や官報のアーカイブを参照する必要があります。
APIリクエストの結果をローカルにキャッシュすることで、繰り返しアクセスによるサーバー負荷を軽減しつつ処理速度を向上させることができます。ただし、法令は随時改正されることがあるため、キャッシュの有効期限を適切に設定し、定期的に最新データを取得し直す仕組みを設けることが望ましいです。特に Law[@EnforcementDate] 属性(施行日)は改正のたびに変化するため、施行日の変化を検知してキャッシュを更新するような実装が有効です。法令の改正サイクルは法令によって異なり、毎年度改正される税法から、ほとんど改正されない法律まで様々ですので、キャッシュのTTLは用途と対象法令に応じて調整することが推奨されます。