For developers · API + SDKs + MCP

Build on the AI-regulation dataset.

One audited JSON API — plus an MCP connector for your assistant. Every record source-linked, every endpoint versioned. Free self-serve key, no card.

$ pip install ai-law-trackerPYTHON
$ npm i @ailawtracker/ai-law-trackerJS / TS
BASE URLhttps://ai-law-tracker.com/api/v1
Quickstart

First call in under a minute

curl200 OK
$ curl "https://ai-law-tracker.com/api/v1/laws
        ?scope=state&jurisdiction=california" \
  -H "X-API-Key: alt_free_k3y"

{ "api_version": "v1",
  "data": [  ] }
quickstart.pyPYTHON
from ai_law_tracker import Client

alt = Client(api_key="alt_free_k3y")
laws = alt.laws.list(
    scope="state",
    jurisdiction="california")
quickstart.tsJS / TS
import { Client }
  from "@ailawtracker/ai-law-tracker";

const alt =
  new Client({ apiKey: "alt_free_k3y" });
const laws = await alt.laws.list({
  scope: "state",
  jurisdiction: "california" });
The surface

32 versioned endpoints, 4 scopes

Full API reference →
Laws & search8 ENDPOINTS
GET /v1/lawsGET /v1/laws/{id}GET /v1/search+ 5 more
Statutes, rules and enforcement actions with full citation trails.
Obligations & risk7 ENDPOINTS
GET /v1/obligationsGET /v1/penaltiesGET /v1/deadlines+ 4 more
Who must do what, by when — plus penalties and a reproducible risk score.
Changes & webhooks7 ENDPOINTS
GET /v1/changesPOST /v1/webhooksGET /v1/feed+ 4 more
A diff feed of the law — poll it, or subscribe to signed webhooks on change.
Meta & account10 ENDPOINTS
GET /v1/jurisdictionsGET /v1/healthGET /v1/me+ 7 more
Jurisdiction lists, theme taxonomy, dataset freshness, keys and usage.
MCP connector

25 tools in Claude & ChatGPT

Query the dataset straight from your assistant — search laws, pull deadlines, compare jurisdictions and cite primary sources without leaving the conversation.

Connect the MCP server
search_ai_lawsget_ai_lawlist_recent_changesget_ai_obligationsget_ai_penaltiesget_ai_deadlineslist_jurisdictionsget_law_sources+ 17 more
Pricing

Start free. Scale when you do.

Full pricing →
Developer
$29/mo
120 req/min · 5,000/day
Higher limits, deep pagination, the change feed and record history for apps in production.
Choose Developer
Pro
$99/mo
300 req/min · 50,000/day
Full change-feed history, the interpreted obligations layer and priority support.
Choose Pro
Business
$299/mo
1,000 req/min · 500,000/day
Multiple keys, higher quotas and an SLA for teams that ship on the data.
Choose Business
Full API reference

Everything, in detail

Read-only, versioned access to every AI law and bill we track — US state & federal, the EU, and globally — with a changelog you can poll and HMAC-signed webhooks for changes. Get a free key in seconds.

Get a free keyWhat paid unlocksUse in Claude / ChatGPTInteractive referenceDashboardOpenAPI 3.1 specPostman collectionPricing
Base URL https://ai-law-tracker.com/api/v1
Ground truth for AI regulation: cited, deterministic, machine-readable.

Ask a general-purpose chatbot which AI laws apply to you and it will produce a fluent, confident, unciteable answer — and sometimes a statute that does not exist. This API answers the same question from a curated corpus of primary sources, with no language model anywhere in the path. Every obligation, deadline and penalty we return is retrieved verbatim from a real record and carries the government URL it came from. Same input, same output, every time.

Why teams pay — what paid unlocks

The free tier is not a crippled dataset — it is the full record quality at low volume. What you buy is the interpreted layer above the raw law, the change stream beneath it, and the headroom to run both in production.

The moat
The interpreted obligation layer

Turns "here is the statute" into "here is what you must do, by when, or you owe what."

Raw law records tell you a bill exists. /v1/obligations, /v1/assess and /v1/penalties answer the question a compliance team actually has: given this jurisdiction, sector and AI use, which duties attach, what is the deadline, who enforces it, and what is the penalty. The derivation runs through the same deterministic engine as our paid compliance report — no LLM in the path — so it cannot invent a statute, a deadline or a fine. Each item ships with its citation, the enforcing body, a primary-source URL and a source_tier you can audit.

GET /v1/obligationsPOST /v1/assessGET /v1/penaltiesGET /v1/sectors
Penalties open at Developer; obligations and assessments at Pro. Lower tiers get a 1-item preview, never a blank wall.
The reason to stay
Know the moment a law moves

A signed webhook the moment a record changes — instead of re-crawling the dataset on a timer.

Every observed insert and update lands in an append-only history, exposed as /v1/changes and the human-scannable /v1/feed with field-level diffs (status: "In committee" → "Passed House"). Poll it with a cursor, or stop polling entirely: subscribe a webhook and each change is delivered as an HMAC-SHA256-signed POST, retried with backoff and dead-lettered if your endpoint stays down. This is what a static PDF tracker structurally cannot give you.

GET /v1/changesGET /v1/feedGET /v1/laws/{id}/historyPOST /v1/webhooks
The change feed and per-record history open at Developer, and the window widens with tier. Webhooks open at Pro.
The scale
Built to run in production

See the full data quality for free. Pay when you put it in front of your users.

A free key returns the complete record — full fields, full filters — so you can evaluate the data properly before spending anything. What paid tiers add is production capacity: higher rate limits and durable daily quotas, deep pagination, bulk export at Business, and commercial use without the attribution backlink the free tier requires.

GET /v1/meGET /v1/lawsGET /v1/search
Volume, pagination depth and bulk export climb with each tier.
What the interpreted layer actually returns

A live record from the deterministic engine — not a mock-up. This page renders it by calling the same code /v1/obligations runs, so it always matches what the endpoint would answer today.

GET /v1/obligations?jurisdiction=colorado&sector=hr-recruiting&use=hiring
{
  "law": "NYC Local Law 144 (Automated Employment Decision Tools)",
  "jurisdiction": "New York",
  "layer": "landscape",
  "lifecycle": "in_force",
  "in_force": true,
  "not_yet_effective": false,
  "effective_date": "2023-07-05",
  "applies_because": "Notable New York AI law, included for the national landscape. It binds businesses in New York — it may not apply to you unless you operate there.",
  "obligation": "Employers using automated employment decision tools to screen candidates or employees for NYC positions must conduct an annual independent bias audit, publish a summary on the employer website, notify candidates at least 10 business days in advance, and offer an alternative selection process on request.",
  "deadline": null,
  "penalty": "$500 for first violation; $500 to $1,500 for each subsequent violation, per day per candidate; DCWP enforcement",
  "status": null,
  "citation": "NYC Admin. Code Section 20-870 et seq.; 6 RCNY Sections 5-300 to 5-304 (effective July 5, 2023)",
  "government_body": "NYC Department of Consumer and Worker Protection",
  "may_not_apply": true,
  "source_url": "https://www.nyc.gov/site/dca/about/automated-employment-decision-tools.page",
  "source_tier": "primary"
}

Note source_url and source_tier: every obligation is traceable to the government page it came from, and you can tell a primary source from a secondary one. Informational only — not legal advice.

What each tier unlocks

Every cell below is read straight from the capability matrix the API enforces at request time — this table cannot promise something the gate would refuse. Prices and billing live on the pricing page.

CapabilityFreeDeveloperProBusiness
Interpreted obligation layer
Obligations — GET /v1/obligations
Opens at Pro
Preview (1 item)Preview (1 item)FullFull
Risk assessment — POST /v1/assess
Opens at Pro
Preview (1 item)Preview (1 item)FullFull
Penalties & enforcement — GET /v1/penalties
Opens at Developer
Preview (1 item)FullFullFull
Change intelligence
Change feed — /v1/changes, /v1/feed
Developer+
30-day window90-day windowFull history
Per-record history — /v1/laws/{id}/history
Developer+
30-day window365-day windowFull history
HMAC-signed change webhooks
Pro+
3 endpoints25 endpoints
Volume & access
Records per request25100100100
Pagination depth (max offset)200100,000500,0005,000,000
Rate limit60/min · 2,000/day120/min · 5,000/day300/min · 50,000/day1,000/min · 500,000/day
Bulk exportIncluded

Enterprise is quoted per contract: unlimited API requests (no monthly quota, no overage) with 2,000 req/min guaranteed, full history, unlimited webhooks, bulk export, and OEM/resale terms — subject to Fair Use (we reach out before we throttle; bulk redistribution needs a licence). See /terms#fair-use.

See pricing & subscribeStart free

Quick start

Every endpoint works anonymously at a low rate. Add your key to raise the limit and identify your app.

cURL
# List the 5 most recently updated records
curl "https://ai-law-tracker.com/api/v1/laws?limit=5&sort=updated_at&order=desc" \
  -H "X-API-Key: alt_free_9f3c…"
JavaScript (fetch)
const res = await fetch(
  "https://ai-law-tracker.com/api/v1/laws?scope=state&jurisdiction=colorado",
  { headers: { "X-API-Key": process.env.ALT_API_KEY } }
);
const { data, meta } = await res.json();

Use it in Claude & ChatGPT

The same data is exposed as an MCP (Model Context Protocol) server, so you can ask Claude or ChatGPT about AI regulation and it will query this dataset live — laws, jurisdictions, news, the change feed, and the interpreted obligations / penalties / risk layer. No key works at the anonymous tier; paste your key to unlock full tiers.

MCP endpoint https://ai-law-tracker.com/api/mcp (Streamable HTTP)
Claude — custom connector
  1. Claude.ai → Settings → Connectors → Add custom connector.
  2. URL: https://ai-law-tracker.com/api/mcp
  3. Under Request headers, add x-api-key = your AI Law Tracker key (optional — skip it to try the anonymous tier).
  4. Save, then ask e.g. “What AI hiring laws apply in California?”
ChatGPT — Custom GPT Action
  1. Create a GPT → Configure → Actions → Import from URL.
  2. Schema URL: https://ai-law-tracker.com/api/v1/openapi.json
  3. Authentication → API Key, custom header name X-API-Key, paste your key.
  4. In ChatGPT developer mode you can instead add the MCP endpoint above as an app.

Full setup notes (including the Connectors Directory / GPT Store path) live in docs/MCP-CONNECTOR.md. The connector is read-only and returns informational data — not legal advice.

Authentication

Pass your key on every request in either header:

X-API-Key: alt_free_9f3c…
# or
Authorization: Bearer alt_free_9f3c…

A missing key is fine — you're served as anonymous at the per-IP cap. An invalid or revoked key returns 401/403. Keep keys server-side.

Get a free key

Enter your email — we'll mint a free-tier key and send it over. No card, no wait.

One active key per email. By requesting a key you agree to the Terms. Data is CC BY 4.0 — attribution required on the free tier.

Rate limits

Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Over the limit returns 429 with Retry-After.

TierPer minutePer day
Anonymous (no key)20500
Free602,000
Developer1205,000
Pro30050,000
Business1,000500,000

Need more? See paid tiers →

Endpoints

GET/v1/health
Liveness + backend status
Example request
curl "https://ai-law-tracker.com/api/v1/health" \
  -H "X-API-Key: alt_free_9f3c…"
Example response
{
  "api_version": "v1",
  "status": "ok",
  "backend": "supabase",
  "records": 697
}
GET/v1/laws
List legal records (filter, sort, paginate)

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).

ParamInTypeDescription
scopequerystate | federal | eu | globalFilter by scope.
jurisdictionquerystringExact jurisdiction slug (e.g. colorado, eu, us-federal, canada).
statusquerystringCase-insensitive substring match on status.
in_forcequerybooleanFilter by the in_force flag.
updated_sincequerystringOnly records updated at/after this ISO timestamp.
qquerystringSubstring search over title + summary.
sortqueryupdated_at | record_date | title
orderqueryasc | desc
limitqueryinteger
offsetqueryinteger
Example request
curl "https://ai-law-tracker.com/api/v1/laws?scope=state&jurisdiction=value" \
  -H "X-API-Key: alt_free_9f3c…"
Example response
{
  "api_version": "v1",
  "data": [
    {
      "id": "5f9c2b0a-1e34-4d21-9a77-0c1b2d3e4f56",
      "scope": "state",
      "jurisdiction": { "slug": "colorado", "name": "Colorado", "abbr": "CO" },
      "identifier": "SB 24-205",
      "title": "Consumer Protections for Artificial Intelligence",
      "record_type": "bill",
      "status": "Signed — effective 2026-02-01",
      "in_force": null,
      "record_date": "2024-05-17T00:00:00Z",
      "summary": "Requires developers and deployers of high-risk AI systems to use reasonable care to avoid algorithmic discrimination…",
      "source": "leg.colorado.gov",
      "official_url": "https://leg.colorado.gov/bills/sb24-205",
      "updated_at": "2026-07-05T14:02:11Z",
      "attribution": "Data by AI Law Tracker (CC BY 4.0) — https://ai-law-tracker.com"
    }
  ],
  "meta": { "total": 564, "count": 1, "limit": 20, "offset": 0 }
}
GET/v1/laws/{id}
Get one record by uuid
ParamInTypeDescription
id *pathstring
Example request
curl "https://ai-law-tracker.com/api/v1/laws/5f9c2b0a-…" \
  -H "X-API-Key: alt_free_9f3c…"
Example response
{
  "api_version": "v1",
  "data": {
    "id": "5f9c2b0a-1e34-4d21-9a77-0c1b2d3e4f56",
    "scope": "state",
    "jurisdiction": { "slug": "colorado", "name": "Colorado", "abbr": "CO" },
    "identifier": "SB 24-205",
    "title": "Consumer Protections for Artificial Intelligence",
    "status": "Signed — effective 2026-02-01",
    "official_url": "https://leg.colorado.gov/bills/sb24-205",
    "updated_at": "2026-07-05T14:02:11Z",
    "attribution": "Data by AI Law Tracker (CC BY 4.0) — https://ai-law-tracker.com"
  }
}
GET/v1/laws/{id}/history
Full change timeline for one record

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.

ParamInTypeDescription
id *pathstring
Example request
curl "https://ai-law-tracker.com/api/v1/laws/5f9c2b0a-…/history" \
  -H "X-API-Key: alt_free_9f3c…"
GET/v1/changes
Unified changelog (poll for what changed since X)

Time-ordered feed of every observed insert/update across the dataset, unioned from the append-only history of legal records and jurisdiction summaries. Poll with ?since=<meta.cursor>. TIER-GATING: Developer+ only — anonymous/Free callers get 403 tier_upgrade_required (the change feed is the paid differentiator). The lookback window is clamped per tier (Developer 30-day, Pro 90-day, Business/Enterprise full) — see meta.window.

ParamInTypeDescription
sincequerystringOnly changes observed after this ISO timestamp (pass the previous response meta.cursor to poll).
scopequerystate | federal | eu | globalFilter by scope.
jurisdictionquerystringExact jurisdiction slug.
entityquerylaw_record | jurisdictionRestrict to one dataset (default: both).
significantquerybooleanDrop internal metadata-only updates (keeps inserts + real field changes).
orderqueryasc | descOrder by observed_at.
limitqueryinteger
offsetqueryinteger
Example request
curl "https://ai-law-tracker.com/api/v1/changes?since=value&scope=state" \
  -H "X-API-Key: alt_free_9f3c…"
Example response
{
  "api_version": "v1",
  "data": [
    {
      "event_id": "a1b2c3d4-0000-4444-8888-abcdef012345",
      "entity": "law_record",
      "record_id": "5f9c2b0a-1e34-4d21-9a77-0c1b2d3e4f56",
      "scope": "state",
      "jurisdiction": { "slug": "washington", "name": "Washington", "abbr": "WA" },
      "identifier": "HB 1170",
      "change_kind": "update",
      "changed_fields": ["status"],
      "field_changes": [{ "field": "status", "from": "In committee", "to": "Passed House" }],
      "observed_at": "2026-07-07T09:15:44.512Z",
      "attribution": "Data by AI Law Tracker (CC BY 4.0) — https://ai-law-tracker.com"
    }
  ],
  "meta": {
    "count": 1, "limit": 50, "offset": 0, "order": "desc",
    "cursor": "2026-07-07T09:15:44.512Z",
    "window": { "tier": "free", "lookback_days": 90, "clamped": false }
  }
}
GET/v1/feed
Lean stream of recent significant changes

Convenience view over /changes with significant=true and no value diffs — the newest meaningful changes, human-scannable. TIER-GATING: same as /changes — Developer+ only (403 tier_upgrade_required for anonymous/Free).

ParamInTypeDescription
sincequerystringOnly changes observed after this ISO timestamp (pass the previous response meta.cursor to poll).
scopequerystate | federal | eu | globalFilter by scope.
jurisdictionquerystringExact jurisdiction slug.
entityquerylaw_record | jurisdictionRestrict to one dataset (default: both).
limitqueryinteger
Example request
curl "https://ai-law-tracker.com/api/v1/feed?since=value&scope=state" \
  -H "X-API-Key: alt_free_9f3c…"
GET/v1/jurisdictions
List covered jurisdictions with record counts
ParamInTypeDescription
scopequerystate | federal | eu | global
Example request
curl "https://ai-law-tracker.com/api/v1/jurisdictions?scope=state" \
  -H "X-API-Key: alt_free_9f3c…"
Example response
{
  "api_version": "v1",
  "data": [
    { "slug": "california", "name": "California", "abbr": "CA", "scope": "state", "count": 55 },
    { "slug": "eu", "name": "European Union", "abbr": "EU", "scope": "eu", "count": 12 }
  ],
  "meta": { "count": 74 }
}
GET/v1/countries
National (global-scope) jurisdictions with record counts
Example request
curl "https://ai-law-tracker.com/api/v1/countries" \
  -H "X-API-Key: alt_free_9f3c…"
GET/v1/states
US state jurisdictions with record counts
Example request
curl "https://ai-law-tracker.com/api/v1/states" \
  -H "X-API-Key: alt_free_9f3c…"
GET/v1/categories
Dataset facets: record_type + scope distributions
Example request
curl "https://ai-law-tracker.com/api/v1/categories" \
  -H "X-API-Key: alt_free_9f3c…"
GET/v1/news
AI-law news headlines (filter, keyword, date range; newest-first)

The audited AI-regulation news feed (headline + short excerpt + publisher + source URL — never full article text). Free/anon get a TASTE: fewer results, shallow pagination, only the newest headlines (a recency window) and the excerpt withheld. Developer+ gets the full archive, high volume and the excerpt. meta.window shows the tier recency floor; meta.gated + meta.upgrade show what was limited.

ParamInTypeDescription
scopequerystate | federal | eu | globalFilter by scope.
jurisdictionquerystringExact jurisdiction slug (e.g. california, federal, eu, global).
qquerystringKeyword substring search over the headline + excerpt.
fromquerystringOnly headlines published on/after this date (YYYY-MM-DD). Free/anon are clamped to their recency window (see meta.window).
sincequerystringAlias for `from` — poll for headlines since a date.
toquerystringOnly headlines published on/before this date (YYYY-MM-DD).
limitqueryintegerFree/anon are capped lower (a taste).
offsetqueryinteger
Example request
curl "https://ai-law-tracker.com/api/v1/news?scope=state&jurisdiction=value" \
  -H "X-API-Key: alt_free_9f3c…"
GET/v1/sectors
Sector index (valid slugs for /obligations, /penalties, /assess)
Example request
curl "https://ai-law-tracker.com/api/v1/sectors" \
  -H "X-API-Key: alt_free_9f3c…"
GET/v1/obligations
Derived AI-law obligations for a jurisdiction / sector / use

The interpreted "what must I do" layer — who must do what, by when, or owe what penalty — for the given context. Every obligation is grounded in a real law record + its primary source (no LLM). Provide at least a jurisdiction or a sector. NOT legal advice. Paid feature (Pro+); lower tiers receive a one-item preview (meta.preview=true) with an upgrade hint.

ParamInTypeDescription
jurisdictionquerystringA US state slug (e.g. california) OR a covered country slug (e.g. canada, eu-germany). See /jurisdictions.
sectorquerystringA sector slug (see /sectors), e.g. healthcare, finance, hr-recruiting.
usequerystringComma-separated AI uses: hiring, customer, content, analytics, product, other.
decision_impactqueryhiring_firing | credit_insurance | healthcare | housing | internal_only | not_sureWhat the AI decides about people (escalates applicability).
Example request
curl "https://ai-law-tracker.com/api/v1/obligations?jurisdiction=value&sector=value" \
  -H "X-API-Key: alt_free_9f3c…"
GET/v1/penalties
Penalty & enforcement dataset for the applicable laws

Per applicable law: the monetary/other penalty, enforcing body, citation, and primary source, plus a sector-level penalty-structure summary (full result only). Provide at least a jurisdiction or a sector. Paid feature (Developer+); lower tiers receive a one-item preview.

ParamInTypeDescription
jurisdictionquerystringA US state slug (e.g. california) OR a covered country slug (e.g. canada, eu-germany). See /jurisdictions.
sectorquerystringA sector slug (see /sectors), e.g. healthcare, finance, hr-recruiting.
Example request
curl "https://ai-law-tracker.com/api/v1/penalties?jurisdiction=value&sector=value" \
  -H "X-API-Key: alt_free_9f3c…"
POST/v1/assess
Company profile → applicable obligations + 1–10 risk score

The compliance-report engine (deterministic, no LLM — cannot hallucinate) as an API. POST a business profile; get the applicable AI-law obligations plus a reproducible 1–10 risk score with a named factor breakdown. state + sector are required. Paid feature (Pro+); lower tiers receive a preview (risk band + counts + one sample obligation; factor breakdown withheld).

Example request
curl "https://ai-law-tracker.com/api/v1/assess" \
  -X POST \
  -H "X-API-Key: alt_free_9f3c…"
POST/v1/keys
Self-serve: issue a FREE API key by email

Submit an email to mint a free-tier key. The plaintext key is emailed to that address (your durable copy — find it again there anytime) AND returned once in this response. We never store the plaintext server-side. One active free key per email; abusive request rates are throttled per IP.

Example request
curl "https://ai-law-tracker.com/api/v1/keys" \
  -X POST -H "Content-Type: application/json" \
  -d '{"email":"you@company.com"}'
Example response
{
  "api_version": "v1",
  "key": "alt_free_9f3c…  (shown once on screen; also emailed to you)",
  "key_prefix": "alt_free_9f3c",
  "id": "7c0d…",
  "tier": "free",
  "email": "you@company.com",
  "email_delivery": { "delivered": true },
  "note": "Copy your key now — shown once on this screen. We also emailed it to you, so you can always find it again in that email."
}
GET/v1/me
Your account: tier, limits & live usage (requires an API key)

Returns the presenting key's own account — tier, effective rate/quota limits, live durable usage (requests used today + this month, from the api_usage counter), remaining, reset times, and the capabilities the tier unlocks. The key IS the credential; no separate login. Powers the self-serve dashboard at /developers/dashboard. This call itself counts as one request.

🔑 Requires an API key
Example request
curl "https://ai-law-tracker.com/api/v1/me" \
  -H "X-API-Key: alt_free_9f3c…"
Example response
{
  "api_version": "v1",
  "data": {
    "key_prefix": "alt_free_9f3c",
    "tier": "free",
    "owner": "y••••@company.com",
    "revoked": false,
    "created_at": "2026-07-08T12:00:00Z",
    "last_used_at": "2026-07-09T14:22:07Z",
    "limits": { "per_min": 60, "per_day": 2000, "per_month": 60000 },
    "usage": {
      "tracking": true,
      "day":   { "used": 137, "limit": 2000,  "remaining": 1863,  "resets_in_seconds": 35080 },
      "month": { "used": 4210, "limit": 60000, "remaining": 55790, "resets_in_seconds": 2110480 }
    },
    "capabilities": {
      "list_max": 25, "full_fields": true, "advanced_filters": true,
      "changes_window_days": null, "history_window_days": null,
      "webhooks": 0, "bulk_export": false
    }
  }
}
DELETE/v1/me
Revoke your own key (requires an API key)

Self-service revoke of the presenting key. Irreversible — the key can no longer authenticate afterwards. Create a new key to keep using the API.

🔑 Requires an API key
Example request
curl "https://ai-law-tracker.com/api/v1/me" \
  -X DELETE \
  -H "X-API-Key: alt_free_9f3c…"
Example response
{
  "api_version": "v1",
  "data": {
    "key_prefix": "alt_free_9f3c",
    "tier": "free",
    "owner": "y••••@company.com",
    "revoked": false,
    "created_at": "2026-07-08T12:00:00Z",
    "last_used_at": "2026-07-09T14:22:07Z",
    "limits": { "per_min": 60, "per_day": 2000, "per_month": 60000 },
    "usage": {
      "tracking": true,
      "day":   { "used": 137, "limit": 2000,  "remaining": 1863,  "resets_in_seconds": 35080 },
      "month": { "used": 4210, "limit": 60000, "remaining": 55790, "resets_in_seconds": 2110480 }
    },
    "capabilities": {
      "list_max": 25, "full_fields": true, "advanced_filters": true,
      "changes_window_days": null, "history_window_days": null,
      "webhooks": 0, "bulk_export": false
    }
  }
}
POST/v1/webhooks
Subscribe to change events (Pro+ · requires an API key)

Create a webhook. When a matching legal record change is observed, an HMAC-SHA256-signed POST is delivered to target_url. The signing_secret is returned ONCE in this response. Verify each delivery (see x-webhooks). TIER-GATING: Pro+ only (Free/Developer allowance = 0 → 403 tier_upgrade_required). Per-key subscription cap: Pro 3, Business 25, Enterprise unlimited.

🔑 Requires an API key
Example request
curl "https://ai-law-tracker.com/api/v1/webhooks" \
  -X POST \
  -H "X-API-Key: alt_pro_…" \
  -H "Content-Type: application/json" \
  -d '{"target_url":"https://your-app.com/hooks/alt"}'
Example response
{
  "api_version": "v1",
  "data": {
    "id": "b3c4…",
    "target_url": "https://your-app.com/hooks/alt",
    "events": ["law.created", "law.updated"],
    "active": true,
    "signing_secret": "whsec_… (shown once)",
    "created_at": "2026-07-08T12:00:00Z"
  }
}
GET/v1/webhooks
List this key's webhooks
🔑 Requires an API key
Example request
curl "https://ai-law-tracker.com/api/v1/webhooks" \
  -H "X-API-Key: alt_free_9f3c…"
Example response
{
  "api_version": "v1",
  "data": {
    "id": "b3c4…",
    "target_url": "https://your-app.com/hooks/alt",
    "events": ["law.created", "law.updated"],
    "active": true,
    "signing_secret": "whsec_… (shown once)",
    "created_at": "2026-07-08T12:00:00Z"
  }
}
GET/v1/webhooks/{id}
Get one subscription
🔑 Requires an API key
ParamInTypeDescription
id *pathstring
Example request
curl "https://ai-law-tracker.com/api/v1/webhooks/5f9c2b0a-…" \
  -H "X-API-Key: alt_free_9f3c…"
DELETE/v1/webhooks/{id}
Unsubscribe
🔑 Requires an API key
ParamInTypeDescription
id *pathstring
Example request
curl "https://ai-law-tracker.com/api/v1/webhooks/5f9c2b0a-…" \
  -X DELETE \
  -H "X-API-Key: alt_free_9f3c…"
GET/v1/accuracy
Public accuracy ledger — source-health summary + change-observation stats

The machine-readable form of the public /accuracy page. Returns the latest source-liveness sweep summary (how many cited sources were checked, verified live, confirmed broken, or unverified), the count of confirmed-broken sources in the review queue, and the total append-only change-observations on record. Free/public: no tier gate, rate-limited like any endpoint. Every figure is a live count over real rows.

Example request
curl "https://ai-law-tracker.com/api/v1/accuracy" \
  -H "X-API-Key: alt_free_9f3c…"
GET/v1/enforcement
AI enforcement actions + litigation (agency actions and civil dockets; newest-first) — Enterprise only

AI-related regulatory enforcement (FTC/DOJ/SEC/state AG actions, etc.) and civil litigation (federal court dockets), over the same six AET fields — agency, respondent, allegation, outcome, penalty, statutory basis — plus forum for litigation rows. `change_type` tells the two lanes apart. ONLY status approved/published rows are ever returned: every draft the automated watch crons write starts pending and is invisible here until reviewed, so an empty data[] with meta.total: 0 is the expected response while a batch awaits approval — not an error. TIER-GATING: Enterprise-only. Anonymous, Free, and every self-serve paid tier (Developer $29 / Pro $99 / Business $299) get a hard 403 tier_upgrade_required — there is no teaser and no partial access below Enterprise. Same hard-gate pattern as /v1/changes, /v1/feed, and /v1/webhooks.

ParamInTypeDescription
scopequerystate | federal | eu | globalFilter by scope.
jurisdictionquerystringExact jurisdiction slug.
qquerystringKeyword substring search over title + summary.
agencyquerystringSubstring match on the acting agency/regulator (e.g. FTC, DOJ, California Attorney General).
change_typequeryenforcement | litigationRestrict to one lane: enforcement (agency actions) or litigation (civil dockets). Default: both.
date_fromquerystringOnly items recorded on/after this date (YYYY-MM-DD).
date_toquerystringOnly items recorded on/before this date (YYYY-MM-DD).
limitqueryinteger
offsetqueryinteger
Example request
curl "https://ai-law-tracker.com/api/v1/enforcement?scope=state&jurisdiction=value" \
  -H "X-API-Key: alt_free_9f3c…"
GET/v1/sectors/{sector}
One sector: overview + derived obligations & penalties

The free awareness OVERVIEW of a sector (name, risk, enforcement bodies, federal penalty structure) plus the DERIVED per-law obligations & penalties. The overview is open to every tier; the derived obligations/penalties are the interpreted layer — full for Pro+, a one-item preview (meta.preview=true) + upsell below. NOT legal advice.

ParamInTypeDescription
sector *pathstringA sector slug (see /sectors).
Example request
curl "https://ai-law-tracker.com/api/v1/sectors/{sector}" \
  -H "X-API-Key: alt_free_9f3c…"
GET/v1/deadlines
Upcoming AI-law effective / compliance dates (JSON or iCal)

A forward-looking compliance calendar derived deterministically from the curated corpus — each entry carries the VERBATIM source deadline text + primary-source URL (no fabricated dates; a jurisdiction whose deadline text has no explicit date is only counted in meta.undated). Free for every tier. Pass ?format=ical (alias ics) for an RFC 5545 .ics you can subscribe to (webcal). The interpreted "what must I do about each deadline" layer is on /obligations + /assess.

ParamInTypeDescription
scopequerystate | federal | eu | globalFilter by scope.
jurisdictionquerystringExact jurisdiction slug (e.g. california, eu-germany).
upcomingquerybooleanOnly future dates (default). Set false (or all=true) to include past effective dates.
formatqueryjson | ical | icsical/ics returns a text/calendar .ics feed.
Example request
curl "https://ai-law-tracker.com/api/v1/deadlines?scope=state&jurisdiction=value" \
  -H "X-API-Key: alt_free_9f3c…"
GET/v1/bills
Curated landmark-bill index

The named, name-searchable AI laws (valid slugs for /bills/{slug}), from the primary-sourced landmark registry. Free.

Example request
curl "https://ai-law-tracker.com/api/v1/bills" \
  -H "X-API-Key: alt_free_9f3c…"
GET/v1/bills/{slug}
One landmark bill: sources, citations, cross-links

One curated bill — core fields, tiered source URLs, citations (identifier + audited alternate names), and cross-links. Where a matching legal_records row exists, the response binds the live change timeline (links.history → /laws/{id}/history). Primary-sourced; the DB binding is best-effort (a miss omits the link, never fabricates it).

ParamInTypeDescription
slug *pathstringA bill slug (see /bills).
Example request
curl "https://ai-law-tracker.com/api/v1/bills/{slug}" \
  -H "X-API-Key: alt_free_9f3c…"
GET/v1/laws/{id}/sources
Source URLs backing one record (tiered primary/secondary)

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.

ParamInTypeDescription
id *pathstring
Example request
curl "https://ai-law-tracker.com/api/v1/laws/5f9c2b0a-…/sources" \
  -H "X-API-Key: alt_free_9f3c…"
GET/v1/laws/{id}/citations
Citation projection for one record

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.

ParamInTypeDescription
id *pathstring
Example request
curl "https://ai-law-tracker.com/api/v1/laws/5f9c2b0a-…/citations" \
  -H "X-API-Key: alt_free_9f3c…"
POST/v1/auth/token
Self-serve: issue a FREE API token by email

A conventional token endpoint over the same key store as POST /keys. Submit an email; get a free-tier token, emailed once (durable copy) and returned once here. Only ever mints a FREE token (no privilege escalation); the owner/HMAC secret is never exposed. Paid tiers are granted via Polar checkout (POST /checkout). Throttled per IP; one active token per email.

Example request
curl "https://ai-law-tracker.com/api/v1/auth/token" \
  -X POST \
  -H "X-API-Key: alt_free_9f3c…"
POST/v1/report
On-demand AI compliance report (PDF or signed link) — the $79 report engine as an API

Generate the personalized, source-grounded AI-law compliance report for a business profile — the SAME deterministic engine behind the $79 /compliance-report product (no LLM in the grounded path — it cannot invent a statute, deadline, or penalty). POST state + sector (+ optional AI-use profile). Default response is JSON: the risk assessment (1–10 score + obligations) plus a signed `report.download_url` for the rendered PDF. Pass `format:"pdf"` (or send `Accept: application/pdf`) to stream the PDF binary inline instead. Paid feature (Pro+) with a monthly report quota per tier (Pro 5/mo, Business 25/mo); when the quota is exhausted the endpoint returns 402 with an upgrade / single-report hint. Lower tiers receive a preview (risk band + counts + one sample obligation) with the PDF/download withheld behind an upgrade hint. Informational only — NOT legal advice.

🔑 Requires an API key
Example request
curl "https://ai-law-tracker.com/api/v1/report" \
  -X POST \
  -H "X-API-Key: alt_free_9f3c…"

Webhooks & signature verification

Subscribe with POST /v1/webhooks. Each change is delivered as an HMAC-SHA256-signed POST to your target_url. The signing_secret is returned once when you create the webhook.

HeaderMeaning
X-ALT-Signaturesha256=<hex HMAC-SHA256 of `${timestamp}.${rawBody}` under your signing_secret>
X-ALT-TimestampUnix seconds; folded into the signed content (reject if skew is large).
X-ALT-Eventlaw.created | law.updated
X-ALT-DeliveryDelivery uuid — use as an idempotency key.
X-ALT-Webhook-IdThe subscription uuid.

Verify each delivery before trusting it — recompute the signature over `${timestamp}.${rawBody}`:

Node.js — verify a delivery
const crypto = require('crypto');
function verify(req, secret) {
  const ts = req.headers['x-alt-timestamp'];
  const sig = (req.headers['x-alt-signature'] || '').replace(/^sha256=/, '');
  const expected = crypto.createHmac('sha256', secret).update(`${ts}.${req.rawBody}`).digest('hex');
  const a = Buffer.from(sig), b = Buffer.from(expected);
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}

Errors

Every error uses one uniform shape:

{
  "api_version": "v1",
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded for the minute window. Retry in 42s.",
    "docs": "https://ai-law-tracker.com/developers",
    "retry_after": 42
  }
}

Common codes: invalid_key (401), revoked_key (403), not_found (404), rate_limited (429), backend_unavailable (503).

License & attribution

Data is licensed CC BY 4.0 — free to use commercially with attribution. Attribution is mandatory on the free tier (a dofollow link to ai-law-tracker.com) and optional on paid tiers. Informational only — not legal advice. Verify against each record's official_url before relying on it.