Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/ai-law-tracker-com:ai-law-tracker-com-laws-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: AI Law Tracker — Public Laws API
version: v1
description: Read-only, versioned JSON API over the audited AI-regulation dataset (US state + federal, EU, and global). FREE beta. Data is CC BY 4.0 — attribution required. Informational only, not legal advice.
license:
name: CC BY 4.0
url: https://creativecommons.org/licenses/by/4.0/
servers:
- url: https://ai-law-tracker.com/api/v1
security:
- {}
- ApiKeyAuth: []
- BearerAuth: []
tags:
- name: Laws
paths:
/laws:
get:
summary: List legal records (filter, sort, paginate)
description: 'TIER-GATING: filters and sorting (scope, jurisdiction, status, in_force, updated_since, sort, order) are honoured at EVERY tier including anonymous — they are documented query semantics, so they are never silently dropped. What Free/anonymous callers get instead is low volume and shallow pagination: anon 5 rows per page with a trimmed field envelope, free-key 25 rows with the full field set. Developer+ raises the page size and unlocks deep pagination, the change feed and per-record history. When a request is capped, the response echoes meta.gated + an upgrade hint (it is never a hard error).'
parameters:
- name: scope
in: query
schema:
type: string
enum:
- state
- federal
- eu
- global
description: Filter by scope.
- name: jurisdiction
in: query
schema:
type: string
description: Exact jurisdiction slug (e.g. colorado, eu, us-federal, canada).
- name: status
in: query
schema:
type: string
description: Case-insensitive substring match on status.
- name: in_force
in: query
schema:
type: boolean
description: Filter by the in_force flag.
- name: updated_since
in: query
schema:
type: string
format: date-time
description: Only records updated at/after this ISO timestamp.
- name: q
in: query
schema:
type: string
description: Substring search over title + summary.
- name: sort
in: query
schema:
type: string
enum:
- updated_at
- record_date
- title
default: updated_at
- name: order
in: query
schema:
type: string
enum:
- asc
- desc
default: desc
- name: limit
in: query
schema:
type: integer
default: 20
maximum: 100
- name: offset
in: query
schema:
type: integer
default: 0
responses:
'200':
description: A page of records.
content:
application/json:
schema:
type: object
properties:
api_version:
type: string
data:
type: array
items:
$ref: '#/components/schemas/Record'
meta:
type: object
properties:
total:
type: integer
count:
type: integer
limit:
type: integer
offset:
type: integer
'400':
description: Invalid parameter
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Rate limited
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'503':
description: Backend unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
operationId: listLaws
tags:
- Laws
/laws/{id}:
get:
summary: Get one record by uuid
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: The record
content:
application/json:
schema:
type: object
properties:
data:
$ref: '#/components/schemas/Record'
'404':
description: Not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
operationId: getLaw
tags:
- Laws
/laws/{id}/history:
get:
summary: Full change timeline for one record
description: 'Every snapshot of the record (ascending observed_at), each with change_kind, changed_fields and the record values as of that snapshot. TIER-GATING: Developer+ only — anonymous/Free callers get 403 tier_upgrade_required. Lookback window climbs by tier: Developer 30 days, Pro 365 days, Business/Enterprise full history.'
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: The record timeline.
content:
application/json:
schema:
type: object
properties:
api_version:
type: string
data:
type: object
properties:
record_id:
type: string
format: uuid
count:
type: integer
timeline:
type: array
items:
type: object
properties:
observed_at:
type: string
format: date-time
change_kind:
type: string
enum:
- insert
- update
changed_fields:
type:
- array
- 'null'
items:
type: string
source_run_id:
type:
- string
- 'null'
format: uuid
record:
$ref: '#/components/schemas/Record'
'404':
description: Not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'503':
description: Backend unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
operationId: getLawHistory
tags:
- Laws
/laws/{id}/sources:
get:
summary: Source URLs backing one record (tiered primary/secondary)
description: A record's own official/.gov link plus the curated jurisdiction sources, each tiered primary/secondary. Basic tiers (anon/Free) get primary sources only; Developer+ get the full set incl. secondary/analysis links. Only real held URLs — never fabricated.
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: The record sources.
'404':
description: Not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'503':
description: Backend unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
operationId: listLawSources
tags:
- Laws
/laws/{id}/citations:
get:
summary: Citation projection for one record
description: A record's identifier, title, audited alternate names, and a formatting-convenience suggested citation over public metadata (labelled — never an official cite). Free at every tier.
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: The record citations.
'404':
description: Not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'503':
description: Backend unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
operationId: listLawCitations
tags:
- Laws
components:
schemas:
Error:
type: object
properties:
api_version:
type: string
error:
type: object
properties:
code:
type: string
example: rate_limited
message:
type: string
docs:
type: string
retry_after:
type: integer
description: Seconds (429 only).
required:
- code
- message
Record:
type: object
properties:
id:
type: string
format: uuid
description: Stable primary key (the /v1/laws/{id} path key).
scope:
type: string
enum:
- state
- federal
- eu
- global
jurisdiction:
type: object
properties:
slug:
type: string
example: colorado
name:
type:
- string
- 'null'
example: Colorado
abbr:
type:
- string
- 'null'
example: CO
identifier:
type:
- string
- 'null'
example: HB 251212
title:
type:
- string
- 'null'
record_type:
type:
- string
- 'null'
example: bill
status:
type:
- string
- 'null'
description: Rich free-text status verbatim from the source.
in_force:
type:
- boolean
- 'null'
description: Set only where the source states it explicitly; else null.
record_date:
type:
- string
- 'null'
format: date-time
summary:
type:
- string
- 'null'
source:
type:
- string
- 'null'
example: openstates.org
official_url:
type:
- string
- 'null'
description: Primary/official (.gov) link where available.
updated_at:
type:
- string
- 'null'
format: date-time
description: Last CHANGED — advanced only on a real content diff.
checked_at:
type:
- string
- 'null'
format: date-time
description: Last VERIFIED — bumped every time the source was successfully re-checked, even when unchanged.
attribution:
type: string
example: Data by AI Law Tracker (CC BY 4.0) — https://ai-law-tracker.com
securitySchemes:
ApiKeyAuth:
type: apiKey
in: header
name: X-API-Key
BearerAuth:
type: http
scheme: bearer
x-news:
description: GET /v1/news copyright + tier gate. We serve ONLY the headline, a short excerpt, the publisher name and the source URL — never full article text. Free = a taste (newest headlines only, low volume, excerpt withheld); Developer+ = the full archive, high volume + the excerpt.
recency_window_days:
anonymous: 14
free_key: 45
developer: null
pro: null
business: null
excerpt: Developer+ only (withheld on the free/anon taste).
x-webhooks:
description: Outbound change notifications. Subscribe with POST /v1/webhooks; deliveries are POSTed to target_url with an HMAC-SHA256 signature.
events:
- law.created
- law.updated
payload:
$ref: '#/components/schemas/WebhookPayload'
headers:
X-ALT-Signature: sha256=<hex HMAC-SHA256 of `${timestamp}.${rawBody}` under your signing_secret>
X-ALT-Timestamp: Unix seconds; folded into the signed content (reject if skew is large).
X-ALT-Event: law.created | law.updated
X-ALT-Delivery: Delivery uuid — use as an idempotency key.
X-ALT-Webhook-Id: The subscription uuid.
delivery: At-least-once. Up to 6 attempts with exponential backoff; 10 consecutive failures auto-disable the webhook. De-duplicate on X-ALT-Delivery / event_id.
verify_example_node: "const crypto = require('crypto');\nfunction verify(req, secret) {\n const ts = req.headers['x-alt-timestamp'];\n const sig = (req.headers['x-alt-signature'] || '').replace(/^sha256=/, '');\n const expected = crypto.createHmac('sha256', secret).update(`${ts}.${req.rawBody}`).digest('hex');\n const a = Buffer.from(sig), b = Buffer.from(expected);\n return a.length === b.length && crypto.timingSafeEqual(a, b);\n}"
x-rate-limits:
description: 'A KEY IS REQUIRED on every data endpoint (since 2026-08-20); a keyless request answers 401 key_required. Free keys are self-serve and need no card — POST /v1/keys, or https://ai-law-tracker.com/developers#get-key. Open without a key: /v1/health, /v1/openapi.json, /v1/keys, /v1/checkout, /v1/auth, /v1/us-law/taxonomy and /v1/us-law/jurisdictions. Per-key limits are enforced by the gate; every response carries X-RateLimit-Limit/Remaining/Reset and a 429 includes Retry-After. Per-key overrides (rate_limit/daily_limit/monthly_limit) take precedence over the tier defaults — GET /v1/me always reports YOUR effective numbers.'
keyless: not served — 401 key_required (see the open-endpoint list above)
free_key: 60 req/min, 300 req/day, 9000 req/month
starter: 150 req/min, 5000 req/day, 150000 req/month
pro: 300 req/min, 10000 req/day, 300000 req/month
business: 1000 req/min, 15000 req/day, 450000 req/month
oem: 1500 req/min, 20000 req/day, 600000 req/month
enterprise: 2000 req/min, 2000000 req/day (custom above this — contact sales)
us_law_platform:
us_free: US Law — Free — 60 req/min, 500 req/day, 750 records/day
us_entry: US Law — Starter — 100 req/min, 5000 req/day, 2500 records/day
us_solo: US Law — Solo — 150 req/min, 10000 req/day, 2800 records/day
us_starter: US Law — Pro — 300 req/min, 25000 req/day, 3100 records/day
us_pro: US Law — Business — 600 req/min, 100000 req/day, 75000 records/day
us_enterprise: US Law — Enterprise — 2000 req/min, 500000 req/day, 250000 records/day
x-pricing:
description: Two product lines over two corpora. AI Law Tracker sells the AI-specific corpus (/laws, /search, /news, the interpreted obligations layer); the US Law Platform sells the general US-law corpus (/us-law) and is metered on RECORDS SERVED rather than requests. A key is licensed for one line or the other (or both). See https://ai-law-tracker.com/pricing.
ai_law:
- id: free
name: Free
price_usd_month: 0
self_serve: false
note: Demo & prototyping
- id: starter
name: Starter
price_usd_month: 49
self_serve: true
note: Ship your first integration
- id: pro
name: Pro
price_usd_month: 99
self_serve: true
note: AI products & vendors
- id: business
name: Business
price_usd_month: 299
self_serve: true
note: Vendors, firms & gov-affairs
- id: oem
name: OEM / White-label
price_usd_month: 499
self_serve: false
note: Embed & redistribute the data
- id: enterprise
name: Enterprise
price_usd_month: null
self_serve: false
note: Big 4, insurers & RegTech platforms
us_law:
- id: us_free
name: US Law — Free
price_usd_month: 0
records_per_day: 750
self_serve: false
note: Evaluate the corpus before you commit
- id: us_entry
name: US Law — Starter
price_usd_month: 99
records_per_day: 2500
self_serve: true
note: Evaluate in production, on one project
- id: us_solo
name: US Law — Solo
price_usd_month: 199
records_per_day: 2800
self_serve: true
note: One developer, one application
- id: us_starter
name: US Law — Pro
price_usd_month: 499
records_per_day: 3100
self_serve: true
note: A team building on the corpus, over the API
- id: us_pro
name: US Law — Business
price_usd_month: 1500
records_per_day: 75000
self_serve: false
note: Pipelines & bulk export, under licence
- id: us_enterprise
name: US Law — Enterprise
price_usd_month: null
records_per_day: 250000
self_serve: false
note: Platforms, insurers & redistribution
retired:
- id: developer
name: Developer
price_usd_month: 29
note: Withdrawn from sale 2026-08-19. Existing keys keep every limit and capability they had; no new checkout is accepted. Replaced by Starter ($49).
x-attribution: Data by AI Law Tracker (CC BY 4.0) — https://ai-law-tracker.com