Official Python client for the Legalize API
Project description
legalize
Official Python client for the Legalize API — legal texts as structured, versioned data.
pip install legalize
from legalize import Legalize
client = Legalize(api_key="leg_...")
for law in client.laws.iter(country="es", law_type="ley_organica"):
print(law.id, law.title)
Why this SDK
- Typed end-to-end. Pydantic v2 models generated from the canonical
OpenAPI spec.
py.typedships in the wheel.mypy --strictclean. - Sync by default, async when you need it.
LegalizeandAsyncLegalizeexpose the same resource API and error types — swap one for the other without rewriting your call sites. - Retries with backoff built in. Honors
Retry-After, handles 429/5xx, exponential delay with jitter, all configurable. - Webhook verification is a one-liner. Constant-time HMAC compare, 5-minute anti-replay window, clock-skew tolerant.
- No magic, no frameworks. One client, one method per endpoint.
Quick tour
List, iterate, search
# One page
page = client.laws.list(country="es", page=1, per_page=50)
print(page.total, len(page.items))
# Auto-paginated iterator (fetches pages as needed)
for law in client.laws.iter(country="es", status="vigente"):
...
# Full-text search
results = client.laws.search(country="es", q="protección de datos")
Time-travel
Every law has a git-tracked history. Retrieve it at any past revision:
commits = client.laws.commits(country="es", law_id="ley_organica_3_2018")
past = client.laws.at_commit(
country="es",
law_id="ley_organica_3_2018",
sha=commits.items[-1].sha,
)
print(past.content) # Markdown at that revision
Async
import asyncio
from legalize import AsyncLegalize
async def main():
async with AsyncLegalize(api_key="leg_...") as client:
page = await client.laws.list(country="es")
async for law in client.laws.iter(country="fr"):
print(law.id)
asyncio.run(main())
Webhooks
Verify a signed delivery in one call:
from legalize import Webhook, WebhookVerificationError
try:
event = Webhook.verify(
payload=request.body, # raw bytes
sig_header=request.headers["X-Legalize-Signature"],
timestamp=request.headers["X-Legalize-Timestamp"],
secret=os.environ["LEGALIZE_WHSEC"],
)
except WebhookVerificationError:
return Response(status_code=400)
if event.type == "law.updated":
...
Working Flask and FastAPI receivers in
examples/.
Configuration
Zero-config (recommended for servers + Kubernetes)
Set the environment and just instantiate:
export LEGALIZE_API_KEY=leg_live_...
# Optional:
export LEGALIZE_BASE_URL=https://legalize.dev
export LEGALIZE_API_VERSION=v1
from legalize import Legalize
client = Legalize() # picks everything up from the environment
Explicit
from legalize import Legalize, RetryPolicy
client = Legalize(
api_key="leg_...",
base_url="https://legalize.dev",
api_version="v1", # negotiated via Legalize-API-Version
timeout=30.0,
retry=RetryPolicy(max_retries=5, initial_delay=0.5, max_delay=10.0),
default_headers={"X-Correlation-Id": "..."},
)
Precedence: explicit argument > environment variable > built-in default.
The full cross-SDK contract is documented in
ENVIRONMENT.md.
Read rate-limit headers from the last response:
client.countries.list()
resp = client.last_response
print(resp.headers.get("X-RateLimit-Remaining"))
Errors
All errors inherit from LegalizeError. Catch the specific one you care
about and let the rest bubble:
from legalize import (
AuthenticationError, # 401 — bad/missing key
ForbiddenError, # 403
NotFoundError, # 404
InvalidRequestError, # 400
ValidationError, # 422
RateLimitError, # 429 — retried automatically by default
ServerError, # 5xx
APIConnectionError, # network failure
APITimeoutError, # timeout
WebhookVerificationError,
)
Every APIError exposes .status_code, .code, .body, and
.response for debugging.
Compatibility
- Python 3.10, 3.11, 3.12, 3.13
- Linux, macOS, Windows
httpx≥ 0.27,pydantic≥ 2.6
Links
- API reference
- Monorepo (sources for all language SDKs)
- Changelog
- Contributing
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file legalize-0.1.1.tar.gz.
File metadata
- Download URL: legalize-0.1.1.tar.gz
- Upload date:
- Size: 24.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0bf84e814b4c325ba65eb0c79fa65bb31c091bd0297d183f8ad026a73a70b148
|
|
| MD5 |
98c996f67046cbb704e113422836c0fc
|
|
| BLAKE2b-256 |
e029743b70f81b8ec1f3048cbcb68733ad194b2cb199acb8d1ea6c3175bf7793
|
Provenance
The following attestation bundles were made for legalize-0.1.1.tar.gz:
Publisher:
python-publish.yml on legalize-dev/legalize-sdks
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
legalize-0.1.1.tar.gz -
Subject digest:
0bf84e814b4c325ba65eb0c79fa65bb31c091bd0297d183f8ad026a73a70b148 - Sigstore transparency entry: 1342469901
- Sigstore integration time:
-
Permalink:
legalize-dev/legalize-sdks@49931a341fd6288c8748cd3a55d50b71273b59d5 -
Branch / Tag:
refs/tags/python-v0.1.1 - Owner: https://github.com/legalize-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@49931a341fd6288c8748cd3a55d50b71273b59d5 -
Trigger Event:
push
-
Statement type:
File details
Details for the file legalize-0.1.1-py3-none-any.whl.
File metadata
- Download URL: legalize-0.1.1-py3-none-any.whl
- Upload date:
- Size: 29.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
236761faf65239b4946e035ed632a80a846308b5923e19911315865a7eedf302
|
|
| MD5 |
c129681ffe5a48407b096272a5fd409c
|
|
| BLAKE2b-256 |
89ddc8b25cf778c686e3fb65be4f812da643bc1773028069ed0e0e47578d26c5
|
Provenance
The following attestation bundles were made for legalize-0.1.1-py3-none-any.whl:
Publisher:
python-publish.yml on legalize-dev/legalize-sdks
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
legalize-0.1.1-py3-none-any.whl -
Subject digest:
236761faf65239b4946e035ed632a80a846308b5923e19911315865a7eedf302 - Sigstore transparency entry: 1342469903
- Sigstore integration time:
-
Permalink:
legalize-dev/legalize-sdks@49931a341fd6288c8748cd3a55d50b71273b59d5 -
Branch / Tag:
refs/tags/python-v0.1.1 - Owner: https://github.com/legalize-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@49931a341fd6288c8748cd3a55d50b71273b59d5 -
Trigger Event:
push
-
Statement type: