Skip to main content

Universal law information API client library

Project description

lawpy

Universal law information API client library.

Features

  • Multi-country support: Access law APIs from multiple countries (currently Korea)
  • Simple interface: Intuitive API design for easy integration
  • Type-safe: Full type hints for better IDE support
  • KRClient first: One ergonomic entry point for implemented Korean APIs
  • Generated KR coverage: 98 Korean law.go.kr target clients are generated from specs; 8 are generated-only until public wrappers are added

Installation

pip install lawpy

Quick Start

Installed help

If you installed lawpy without cloning the repository, start here:

import lawpy

print(lawpy.help())
print(lawpy.help("kr"))
print(lawpy.help("generated"))

The same guide is available from the shell:

python -m lawpy.help kr

Korean Law API

Set your API key (email ID) as an environment variable:

export LAWPY_API_KEY="your-email-id"

Or pass it directly:

from lawpy import KRClient

# Using environment variable
client = KRClient()

# Or pass api_key directly
client = KRClient(api_key="your-api-key")

KRClient is the main ergonomic object for Korean law.go.kr data. It combines the current public wrappers for laws, precedents, administrative rules, notices, annexes, forms, local ordinances, local notices, legal terminology, legal interpretations, constitutional decisions, administrative review decisions, committee decisions, ministry interpretations, and treaties. KoreanLawClient remains available as a compatibility alias.

Search for laws

laws = client.search_laws("민법", per_page=5)
for law in laws:
    print(f"{law.law_name} (ID: {law.law_id})")

Get detailed law information

law_detail = client.get_law_detail(law_id="001706")
print(f"Law: {law_detail.law_name_korean}")
print(f"Ministry: {law_detail.ministry}")
print(f"Promulgation Date: {law_detail.promulgation_date}")
print(f"Enforcement Date: {law_detail.enforcement_date}")

# Access articles
for article in law_detail.articles[:3]:
    print(f"Article {article.number}: {article.title}")
    for paragraph in article.paragraphs:
        print(f"  {paragraph.content}")

Get specific article

law_detail = client.get_law_detail(law_id="001706", article_number=1)

Get law by MST (master number)

law_detail = client.get_law_detail(mst=123456)

Get original text

law_detail = client.get_law_detail(law_id="001706", language="ORI")

Get current law list

laws = client.get_law_list(per_page=10)
for law in laws:
    print(f"{law.law_name} (Effective: {law.enforcement_date})")

Get law amendment history

history = client.get_law_history(query="민법", per_page=10)
for h in history:
    print(f"{h.law_name} ({h.promulgation_date})")

Get detailed law history

history_detail = client.get_law_history_detail(mst=9094)
print(history_detail)  # Returns HTML text

Get old/new law comparison metadata

old_new = client.search_law_old_and_new(query="민법", per_page=10)
print(old_new[0])

Get old/new law comparison detail

old_new_detail = client.get_law_old_and_new_detail(law_id="009682")
print(old_new_detail)

Get law abbreviations

abbrs = client.search_law_abbreviations(start_date=20240101, end_date=20240131)
print(abbrs)

Get law/article change history

changes = client.search_law_change_history(registered_date=20240101)
article_changes = client.search_law_article_change_history(law_id="009682", article_number=2)

Generated-only KR targets

KR v1 includes generated clients for 98 public law.go.kr targets. KRClient wraps 90 of them today: law, elaw, oldAndNew, lsAbrv, lsHstInf, lsJoHstInf, prec, admrul, licbyl, admbyl, ordinbyl, ordin, lstrm, lstrmAI, dlytrm, lstrmRlt, dlytrmRlt, lstrmRltJo, joRltLstrm, lsRlt, aiSearch, aiRltLs, expc, detc, decc, acr, baiPvcs, ecc, eiac, fsc, ftc, iaciac, kcc, nhrck, nlrc, oclt, ppc, sfc, the *CgmExpc ministry interpretation targets, school, trty, couseAdmrul, couseLs, couseOrdin, lawjosub, eflawjosub, lnkLs, lnkOrd, drlaw, lsDelegated, oneview, and thdCmp. The remaining 8 targets are generated-only; import those clients directly from lawpy.kr.generated.

from lawpy.kr.generated.acrSpecialDecc import GeneratedAcrspecialdeccClient

client = GeneratedAcrspecialdeccClient(api_key="your-api-key")
decisions = client.search_acrSpecialDeccs(query="영업정지", display=10, page=1)
row = decisions[0].model_dump(by_alias=True)

Run import lawpy; print(lawpy.help("generated")) or see docs/kr/generated-coverage.md for the generated target matrix.

Specs and codegen policy

The Korean specs, code generator, generated clients, generated models, and generated tests are public. The project treats reproducible generation, coverage documentation, and CI as the maintenance contract rather than hiding source specs.

API Key

To use the Korean Law API, you need an API key:

  1. Visit Korean Law Open API
  2. Sign up and get your email ID as API key
  3. Set it as environment variable: LAWPY_API_KEY

Development

# Clone repository
git clone https://github.com/statpan/lawpy.git
cd lawpy

# Install development dependencies
uv sync --extra dev

# Run tests
uv run pytest

# Run linting
uv run ruff check src/lawpy tests
uv run ruff format src/lawpy tests

# Type checking
uv run mypy src/lawpy

# Build package
uv build

Project Structure

lawpy/
├── src/lawpy/
│   ├── __init__.py
│   ├── client.py          # Base client class
│   ├── exceptions.py      # Exception definitions
│   ├── models.py         # Data models
│   └── kr/             # Korean API modules
│       ├── __init__.py
│       ├── base.py       # Base class for Korean clients
│       ├── client.py     # KRClient integrated Korean client
│       ├── law.py       # Law (법령) APIs
│       ├── administrative_rule.py # Administrative rule (행정규칙) wrapper
│       ├── annex_form.py # Annex/form (별표·서식) wrapper
│       ├── ordinance.py # Local ordinance (자치법규) wrapper
│       ├── legal_terminology.py # Legal terminology (법령용어) wrapper
│       ├── legal_knowledge_base.py # Legal knowledge-base (법령정보지식베이스) wrapper
│       ├── legal_interpretation.py # Legal interpretation (법령해석례) wrapper
│       ├── constitutional_decision.py # Constitutional decision (헌재결정례) wrapper
│       ├── administrative_review_decision.py # Administrative review decision (행정심판례) wrapper
│       ├── precedent.py # Precedent (판례) wrapper
│       ├── treaty.py # Treaty (조약) wrapper
│       ├── generated/   # 98 spec-generated Korean API clients
│       └── README.md     # Korean API documentation
└── tests/
    ├── test_kr.py       # Korean API tests
    └── test_generated/  # Generated client tests

Roadmap

  • Add more countries (Japan, China, etc.)
  • Add public wrappers for generated-only Korean targets
  • Add async support
  • Add caching layer

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

MIT License - see LICENSE for details.

Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lawpy-0.2.0.tar.gz (243.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lawpy-0.2.0-py3-none-any.whl (229.2 kB view details)

Uploaded Python 3

File details

Details for the file lawpy-0.2.0.tar.gz.

File metadata

  • Download URL: lawpy-0.2.0.tar.gz
  • Upload date:
  • Size: 243.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for lawpy-0.2.0.tar.gz
Algorithm Hash digest
SHA256 16e90289365a56398c52b620673a60785748fa2666d8b59d45a73a27729c7c25
MD5 f947e9e3f2b3d1b23e2d8700e40e0221
BLAKE2b-256 034186e8c54ed201014734ce099e2ec9113b2228460a3c325bf19b9b21ceb39e

See more details on using hashes here.

Provenance

The following attestation bundles were made for lawpy-0.2.0.tar.gz:

Publisher: release.yml on StatPan/lawpy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file lawpy-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: lawpy-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 229.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for lawpy-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8a70512a714a24ae123cd31d37bef57f97cbbe3989565fdf0bf87dc80c932670
MD5 3f9a138a90a77455c1c8975abd26106f
BLAKE2b-256 83ce27c8e4f7ec5935709df1e1a9938f89c0ab044f6d11f54e1f8d9c75ff7208

See more details on using hashes here.

Provenance

The following attestation bundles were made for lawpy-0.2.0-py3-none-any.whl:

Publisher: release.yml on StatPan/lawpy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page