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.
https://ai-law-tracker.com/api/v1Ask 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.
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/sectorsA 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/webhooksSee 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/searchA 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.
{
"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.
| Capability | Free | Developer | Pro | Business |
|---|---|---|---|---|
| Interpreted obligation layer | ||||
| Obligations — GET /v1/obligations Opens at Pro | Preview (1 item) | Preview (1 item) | Full | Full |
| Risk assessment — POST /v1/assess Opens at Pro | Preview (1 item) | Preview (1 item) | Full | Full |
| Penalties & enforcement — GET /v1/penalties Opens at Developer | Preview (1 item) | Full | Full | Full |
| Change intelligence | ||||
| Change feed — /v1/changes, /v1/feed Developer+ | — | 30-day window | 90-day window | Full history |
| Per-record history — /v1/laws/{id}/history Developer+ | — | 30-day window | 365-day window | Full history |
| HMAC-signed change webhooks Pro+ | — | — | 3 endpoints | 25 endpoints |
| Volume & access | ||||
| Records per request | 25 | 100 | 100 | 100 |
| Pagination depth (max offset) | 200 | 100,000 | 500,000 | 5,000,000 |
| Rate limit | 60/min · 2,000/day | 120/min · 5,000/day | 300/min · 50,000/day | 1,000/min · 500,000/day |
| Bulk export | — | — | — | Included |
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.
Quick start
Every endpoint works anonymously at a low rate. Add your key to raise the limit and identify your app.
# 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…"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.
https://ai-law-tracker.com/api/mcp (Streamable HTTP)- Claude.ai → Settings → Connectors → Add custom connector.
- URL:
https://ai-law-tracker.com/api/mcp - Under Request headers, add
x-api-key= your AI Law Tracker key (optional — skip it to try the anonymous tier). - Save, then ask e.g. “What AI hiring laws apply in California?”
- Create a GPT → Configure → Actions → Import from URL.
- Schema URL:
https://ai-law-tracker.com/api/v1/openapi.json - Authentication → API Key, custom header name
X-API-Key, paste your key. - 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
Rate limits
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Over the limit returns 429 with Retry-After.
| Tier | Per minute | Per day |
|---|---|---|
| Anonymous (no key) | 20 | 500 |
| Free | 60 | 2,000 |
| Developer | 120 | 5,000 |
| Pro | 300 | 50,000 |
| Business | 1,000 | 500,000 |
Need more? See paid tiers →
Endpoints
/v1/healthcurl "https://ai-law-tracker.com/api/v1/health" \
-H "X-API-Key: alt_free_9f3c…"{
"api_version": "v1",
"status": "ok",
"backend": "supabase",
"records": 697
}/v1/lawsTIER-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).
| Param | In | Type | Description |
|---|---|---|---|
| scope | query | state | federal | eu | global | Filter by scope. |
| jurisdiction | query | string | Exact jurisdiction slug (e.g. colorado, eu, us-federal, canada). |
| status | query | string | Case-insensitive substring match on status. |
| in_force | query | boolean | Filter by the in_force flag. |
| updated_since | query | string | Only records updated at/after this ISO timestamp. |
| q | query | string | Substring search over title + summary. |
| sort | query | updated_at | record_date | title | |
| order | query | asc | desc | |
| limit | query | integer | |
| offset | query | integer |
curl "https://ai-law-tracker.com/api/v1/laws?scope=state&jurisdiction=value" \
-H "X-API-Key: alt_free_9f3c…"{
"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 }
}/v1/laws/{id}| Param | In | Type | Description |
|---|---|---|---|
| id * | path | string |
curl "https://ai-law-tracker.com/api/v1/laws/5f9c2b0a-…" \
-H "X-API-Key: alt_free_9f3c…"{
"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"
}
}/v1/laws/{id}/historyEvery 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.
| Param | In | Type | Description |
|---|---|---|---|
| id * | path | string |
curl "https://ai-law-tracker.com/api/v1/laws/5f9c2b0a-…/history" \
-H "X-API-Key: alt_free_9f3c…"/v1/changesTime-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.
| Param | In | Type | Description |
|---|---|---|---|
| since | query | string | Only changes observed after this ISO timestamp (pass the previous response meta.cursor to poll). |
| scope | query | state | federal | eu | global | Filter by scope. |
| jurisdiction | query | string | Exact jurisdiction slug. |
| entity | query | law_record | jurisdiction | Restrict to one dataset (default: both). |
| significant | query | boolean | Drop internal metadata-only updates (keeps inserts + real field changes). |
| order | query | asc | desc | Order by observed_at. |
| limit | query | integer | |
| offset | query | integer |
curl "https://ai-law-tracker.com/api/v1/changes?since=value&scope=state" \
-H "X-API-Key: alt_free_9f3c…"{
"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 }
}
}/v1/feedConvenience 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).
| Param | In | Type | Description |
|---|---|---|---|
| since | query | string | Only changes observed after this ISO timestamp (pass the previous response meta.cursor to poll). |
| scope | query | state | federal | eu | global | Filter by scope. |
| jurisdiction | query | string | Exact jurisdiction slug. |
| entity | query | law_record | jurisdiction | Restrict to one dataset (default: both). |
| limit | query | integer |
curl "https://ai-law-tracker.com/api/v1/feed?since=value&scope=state" \
-H "X-API-Key: alt_free_9f3c…"/v1/jurisdictions| Param | In | Type | Description |
|---|---|---|---|
| scope | query | state | federal | eu | global |
curl "https://ai-law-tracker.com/api/v1/jurisdictions?scope=state" \
-H "X-API-Key: alt_free_9f3c…"{
"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 }
}/v1/search| Param | In | Type | Description |
|---|---|---|---|
| q * | query | string | |
| scope | query | state | federal | eu | global | Filter by scope. |
| jurisdiction | query | string | Exact jurisdiction slug (e.g. colorado, eu, us-federal, canada). |
| status | query | string | Case-insensitive substring match on status. |
| in_force | query | boolean | Filter by the in_force flag. |
| updated_since | query | string | Only records updated at/after this ISO timestamp. |
| sort | query | updated_at | record_date | title | |
| order | query | asc | desc | |
| limit | query | integer | |
| offset | query | integer |
curl "https://ai-law-tracker.com/api/v1/search?q=value&scope=state" \
-H "X-API-Key: alt_free_9f3c…"/v1/countriescurl "https://ai-law-tracker.com/api/v1/countries" \
-H "X-API-Key: alt_free_9f3c…"/v1/statescurl "https://ai-law-tracker.com/api/v1/states" \
-H "X-API-Key: alt_free_9f3c…"/v1/categoriescurl "https://ai-law-tracker.com/api/v1/categories" \
-H "X-API-Key: alt_free_9f3c…"/v1/newsThe 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.
| Param | In | Type | Description |
|---|---|---|---|
| scope | query | state | federal | eu | global | Filter by scope. |
| jurisdiction | query | string | Exact jurisdiction slug (e.g. california, federal, eu, global). |
| q | query | string | Keyword substring search over the headline + excerpt. |
| from | query | string | Only headlines published on/after this date (YYYY-MM-DD). Free/anon are clamped to their recency window (see meta.window). |
| since | query | string | Alias for `from` — poll for headlines since a date. |
| to | query | string | Only headlines published on/before this date (YYYY-MM-DD). |
| limit | query | integer | Free/anon are capped lower (a taste). |
| offset | query | integer |
curl "https://ai-law-tracker.com/api/v1/news?scope=state&jurisdiction=value" \
-H "X-API-Key: alt_free_9f3c…"/v1/sectorscurl "https://ai-law-tracker.com/api/v1/sectors" \
-H "X-API-Key: alt_free_9f3c…"/v1/obligationsThe 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.
| Param | In | Type | Description |
|---|---|---|---|
| jurisdiction | query | string | A US state slug (e.g. california) OR a covered country slug (e.g. canada, eu-germany). See /jurisdictions. |
| sector | query | string | A sector slug (see /sectors), e.g. healthcare, finance, hr-recruiting. |
| use | query | string | Comma-separated AI uses: hiring, customer, content, analytics, product, other. |
| decision_impact | query | hiring_firing | credit_insurance | healthcare | housing | internal_only | not_sure | What the AI decides about people (escalates applicability). |
curl "https://ai-law-tracker.com/api/v1/obligations?jurisdiction=value§or=value" \
-H "X-API-Key: alt_free_9f3c…"/v1/penaltiesPer 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.
| Param | In | Type | Description |
|---|---|---|---|
| jurisdiction | query | string | A US state slug (e.g. california) OR a covered country slug (e.g. canada, eu-germany). See /jurisdictions. |
| sector | query | string | A sector slug (see /sectors), e.g. healthcare, finance, hr-recruiting. |
curl "https://ai-law-tracker.com/api/v1/penalties?jurisdiction=value§or=value" \
-H "X-API-Key: alt_free_9f3c…"/v1/assessThe 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).
curl "https://ai-law-tracker.com/api/v1/assess" \
-X POST \
-H "X-API-Key: alt_free_9f3c…"/v1/keysSubmit 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.
curl "https://ai-law-tracker.com/api/v1/keys" \
-X POST -H "Content-Type: application/json" \
-d '{"email":"you@company.com"}'{
"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."
}/v1/meReturns 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.
curl "https://ai-law-tracker.com/api/v1/me" \
-H "X-API-Key: alt_free_9f3c…"{
"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
}
}
}/v1/meSelf-service revoke of the presenting key. Irreversible — the key can no longer authenticate afterwards. Create a new key to keep using the API.
curl "https://ai-law-tracker.com/api/v1/me" \
-X DELETE \
-H "X-API-Key: alt_free_9f3c…"{
"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
}
}
}/v1/webhooksCreate 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.
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"}'{
"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"
}
}/v1/webhookscurl "https://ai-law-tracker.com/api/v1/webhooks" \
-H "X-API-Key: alt_free_9f3c…"{
"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"
}
}/v1/webhooks/{id}| Param | In | Type | Description |
|---|---|---|---|
| id * | path | string |
curl "https://ai-law-tracker.com/api/v1/webhooks/5f9c2b0a-…" \
-H "X-API-Key: alt_free_9f3c…"/v1/webhooks/{id}| Param | In | Type | Description |
|---|---|---|---|
| id * | path | string |
curl "https://ai-law-tracker.com/api/v1/webhooks/5f9c2b0a-…" \
-X DELETE \
-H "X-API-Key: alt_free_9f3c…"/v1/accuracyThe 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.
curl "https://ai-law-tracker.com/api/v1/accuracy" \
-H "X-API-Key: alt_free_9f3c…"/v1/enforcementAI-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.
| Param | In | Type | Description |
|---|---|---|---|
| scope | query | state | federal | eu | global | Filter by scope. |
| jurisdiction | query | string | Exact jurisdiction slug. |
| q | query | string | Keyword substring search over title + summary. |
| agency | query | string | Substring match on the acting agency/regulator (e.g. FTC, DOJ, California Attorney General). |
| change_type | query | enforcement | litigation | Restrict to one lane: enforcement (agency actions) or litigation (civil dockets). Default: both. |
| date_from | query | string | Only items recorded on/after this date (YYYY-MM-DD). |
| date_to | query | string | Only items recorded on/before this date (YYYY-MM-DD). |
| limit | query | integer | |
| offset | query | integer |
curl "https://ai-law-tracker.com/api/v1/enforcement?scope=state&jurisdiction=value" \
-H "X-API-Key: alt_free_9f3c…"/v1/sectors/{sector}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.
| Param | In | Type | Description |
|---|---|---|---|
| sector * | path | string | A sector slug (see /sectors). |
curl "https://ai-law-tracker.com/api/v1/sectors/{sector}" \
-H "X-API-Key: alt_free_9f3c…"/v1/deadlinesA 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.
| Param | In | Type | Description |
|---|---|---|---|
| scope | query | state | federal | eu | global | Filter by scope. |
| jurisdiction | query | string | Exact jurisdiction slug (e.g. california, eu-germany). |
| upcoming | query | boolean | Only future dates (default). Set false (or all=true) to include past effective dates. |
| format | query | json | ical | ics | ical/ics returns a text/calendar .ics feed. |
curl "https://ai-law-tracker.com/api/v1/deadlines?scope=state&jurisdiction=value" \
-H "X-API-Key: alt_free_9f3c…"/v1/billsThe named, name-searchable AI laws (valid slugs for /bills/{slug}), from the primary-sourced landmark registry. Free.
curl "https://ai-law-tracker.com/api/v1/bills" \
-H "X-API-Key: alt_free_9f3c…"/v1/bills/{slug}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).
| Param | In | Type | Description |
|---|---|---|---|
| slug * | path | string | A bill slug (see /bills). |
curl "https://ai-law-tracker.com/api/v1/bills/{slug}" \
-H "X-API-Key: alt_free_9f3c…"/v1/laws/{id}/sourcesA 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.
| Param | In | Type | Description |
|---|---|---|---|
| id * | path | string |
curl "https://ai-law-tracker.com/api/v1/laws/5f9c2b0a-…/sources" \
-H "X-API-Key: alt_free_9f3c…"/v1/laws/{id}/citationsA 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.
| Param | In | Type | Description |
|---|---|---|---|
| id * | path | string |
curl "https://ai-law-tracker.com/api/v1/laws/5f9c2b0a-…/citations" \
-H "X-API-Key: alt_free_9f3c…"/v1/auth/tokenA 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.
curl "https://ai-law-tracker.com/api/v1/auth/token" \
-X POST \
-H "X-API-Key: alt_free_9f3c…"/v1/reportGenerate 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.
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.
| Header | Meaning |
|---|---|
| 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. |
Verify each delivery before trusting it — recompute the signature over `${timestamp}.${rawBody}`:
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).
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.