{
  "info": {
    "_postman_id": "a11a7c3e-0000-4000-8000-a11a7c3e0001",
    "name": "AI Law Tracker — Public Laws API (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.\n\nGenerated from the live OpenAPI contract (`https://ai-law-tracker.com/api/v1/openapi.json`) by `scripts/build-postman-collection.mjs`. Do not hand-edit.\n\n**Setup:** open the collection variables and set `apiKey` to your key. A free key (no card) is issued by `POST /keys` with your email — see https://ai-law-tracker.com/developers. Without a key the API still answers on the anonymous tier at a lower rate limit, so you can run most requests immediately.\n\nAuth is sent as the `X-API-Key` header at collection level; every request inherits it.\n\nAttribution (required by the data licence): Data by AI Law Tracker (CC BY 4.0) — https://ai-law-tracker.com\n\nInformational only — not legal advice. Data may be incomplete or lag the source; verify against the official_url before relying on it.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "apikey",
    "apikey": [
      {
        "key": "key",
        "value": "X-API-Key",
        "type": "string"
      },
      {
        "key": "value",
        "value": "{{apiKey}}",
        "type": "string"
      },
      {
        "key": "in",
        "value": "header",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://ai-law-tracker.com/api/v1",
      "type": "string",
      "description": "API base URL (versioned)."
    },
    {
      "key": "apiKey",
      "value": "",
      "type": "string",
      "description": "Your AI Law Tracker API key. Leave blank to call the anonymous tier."
    }
  ],
  "item": [
    {
      "name": "Account",
      "item": [
        {
          "name": "POST /keys — Self-serve: issue a FREE API key by email",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/keys",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "keys"
              ]
            },
            "description": "Self-serve: issue a FREE API key by email\n\nSubmit 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.\n\n\n`POST /keys`\n\noperationId: `createApiKey`",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"you@example.com\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /me — Your account: tier, limits & live usage (requires an API key)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/me",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "me"
              ]
            },
            "description": "Your account: tier, limits & live usage (requires an API key)\n\nReturns 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.\n\n\n`GET /me`\n\noperationId: `getMe`"
          },
          "response": []
        },
        {
          "name": "DELETE /me — Revoke your own key (requires an API key)",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/me",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "me"
              ]
            },
            "description": "Revoke your own key (requires an API key)\n\nSelf-service revoke of the presenting key. Irreversible — the key can no longer authenticate afterwards. Create a new key to keep using the API.\n\n\n`DELETE /me`\n\noperationId: `deleteMe`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Auth",
      "item": [
        {
          "name": "POST /auth/token — Self-serve: issue a FREE API token by email",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/auth/token",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "auth",
                "token"
              ]
            },
            "description": "Self-serve: issue a FREE API token by email\n\nA 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.\n\n\n`POST /auth/token`\n\noperationId: `createAuthToken`",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"you@example.com\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Bills",
      "item": [
        {
          "name": "GET /bills — Curated landmark-bill index",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/bills",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "bills"
              ]
            },
            "description": "Curated landmark-bill index\n\nThe named, name-searchable AI laws (valid slugs for /bills/{slug}), from the primary-sourced landmark registry. Free.\n\n\n`GET /bills`\n\noperationId: `listBills`"
          },
          "response": []
        },
        {
          "name": "GET /bills/{slug} — One landmark bill: sources, citations, cross-links",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/bills/:slug",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "bills",
                ":slug"
              ],
              "variable": [
                {
                  "key": "slug",
                  "value": "<slug>",
                  "description": "A bill slug (see /bills)."
                }
              ]
            },
            "description": "One landmark bill: sources, citations, cross-links\n\nOne 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).\n\n\n`GET /bills/{slug}`\n\noperationId: `getBill`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Changelog",
      "item": [
        {
          "name": "GET /changes — Unified changelog (poll for what changed since X)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/changes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "changes"
              ],
              "query": [
                {
                  "key": "since",
                  "value": "2026-01-01T00:00:00Z",
                  "description": "Only changes observed after this ISO timestamp (pass the previous response meta.cursor to poll).",
                  "disabled": true
                },
                {
                  "key": "scope",
                  "value": "state",
                  "description": "Filter by scope.",
                  "disabled": true
                },
                {
                  "key": "jurisdiction",
                  "value": "",
                  "description": "Exact jurisdiction slug.",
                  "disabled": true
                },
                {
                  "key": "entity",
                  "value": "law_record",
                  "description": "Restrict to one dataset (default: both).",
                  "disabled": true
                },
                {
                  "key": "significant",
                  "value": "false",
                  "description": "Drop internal metadata-only updates (keeps inserts + real field changes).",
                  "disabled": true
                },
                {
                  "key": "order",
                  "value": "desc",
                  "description": "Order by observed_at.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "50",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "0",
                  "description": "",
                  "disabled": true
                }
              ]
            },
            "description": "Unified changelog (poll for what changed since X)\n\nTime-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.\n\n\n`GET /changes`\n\noperationId: `listChanges`"
          },
          "response": []
        },
        {
          "name": "GET /feed — Lean stream of recent significant changes",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/feed",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "feed"
              ],
              "query": [
                {
                  "key": "since",
                  "value": "2026-01-01T00:00:00Z",
                  "description": "Only changes observed after this ISO timestamp (pass the previous response meta.cursor to poll).",
                  "disabled": true
                },
                {
                  "key": "scope",
                  "value": "state",
                  "description": "Filter by scope.",
                  "disabled": true
                },
                {
                  "key": "jurisdiction",
                  "value": "",
                  "description": "Exact jurisdiction slug.",
                  "disabled": true
                },
                {
                  "key": "entity",
                  "value": "law_record",
                  "description": "Restrict to one dataset (default: both).",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "50",
                  "description": "",
                  "disabled": true
                }
              ]
            },
            "description": "Lean stream of recent significant changes\n\nConvenience 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).\n\n\n`GET /feed`\n\noperationId: `getFeed`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Compliance",
      "item": [
        {
          "name": "GET /obligations — Derived AI-law obligations for a jurisdiction / sector / use",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/obligations",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "obligations"
              ],
              "query": [
                {
                  "key": "jurisdiction",
                  "value": "",
                  "description": "A US state slug (e.g. california) OR a covered country slug (e.g. canada, eu-germany). See /jurisdictions.",
                  "disabled": true
                },
                {
                  "key": "sector",
                  "value": "",
                  "description": "A sector slug (see /sectors), e.g. healthcare, finance, hr-recruiting.",
                  "disabled": true
                },
                {
                  "key": "use",
                  "value": "",
                  "description": "Comma-separated AI uses: hiring, customer, content, analytics, product, other.",
                  "disabled": true
                },
                {
                  "key": "decision_impact",
                  "value": "hiring_firing",
                  "description": "What the AI decides about people (escalates applicability).",
                  "disabled": true
                }
              ]
            },
            "description": "Derived AI-law obligations for a jurisdiction / sector / use\n\nThe 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.\n\n\n`GET /obligations`\n\noperationId: `listObligations`"
          },
          "response": []
        },
        {
          "name": "GET /penalties — Penalty & enforcement dataset for the applicable laws",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/penalties",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "penalties"
              ],
              "query": [
                {
                  "key": "jurisdiction",
                  "value": "",
                  "description": "A US state slug (e.g. california) OR a covered country slug (e.g. canada, eu-germany). See /jurisdictions.",
                  "disabled": true
                },
                {
                  "key": "sector",
                  "value": "",
                  "description": "A sector slug (see /sectors), e.g. healthcare, finance, hr-recruiting.",
                  "disabled": true
                }
              ]
            },
            "description": "Penalty & enforcement dataset for the applicable laws\n\nPer 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.\n\n\n`GET /penalties`\n\noperationId: `listPenalties`"
          },
          "response": []
        },
        {
          "name": "POST /assess — Company profile → applicable obligations + 1–10 risk score",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/assess",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "assess"
              ]
            },
            "description": "Company profile → applicable obligations + 1–10 risk score\n\nThe 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).\n\n\n`POST /assess`\n\noperationId: `createAssessment`",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"state\": \"\",\n  \"sector\": \"\",\n  \"ai_decision_impact\": \"hiring_firing\",\n  \"bias_audit\": \"recent\",\n  \"ai_policy\": \"formal\",\n  \"ai_source\": \"custom\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /report — On-demand AI compliance report (PDF or signed link) — the $79 report engine as an API",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/report",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "report"
              ]
            },
            "description": "On-demand AI compliance report (PDF or signed link) — the $79 report engine as an API\n\nGenerate 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.\n\n\n`POST /report`\n\noperationId: `createReport`",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"state\": \"\",\n  \"sector\": \"\",\n  \"ai_decision_impact\": \"hiring_firing\",\n  \"bias_audit\": \"recent\",\n  \"ai_policy\": \"formal\",\n  \"ai_source\": \"custom\",\n  \"format\": \"json\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Deadlines",
      "item": [
        {
          "name": "GET /deadlines — Upcoming AI-law effective / compliance dates (JSON or iCal)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/deadlines",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "deadlines"
              ],
              "query": [
                {
                  "key": "scope",
                  "value": "state",
                  "description": "Filter by scope.",
                  "disabled": true
                },
                {
                  "key": "jurisdiction",
                  "value": "",
                  "description": "Exact jurisdiction slug (e.g. california, eu-germany).",
                  "disabled": true
                },
                {
                  "key": "upcoming",
                  "value": "true",
                  "description": "Only future dates (default). Set false (or all=true) to include past effective dates.",
                  "disabled": true
                },
                {
                  "key": "format",
                  "value": "json",
                  "description": "ical/ics returns a text/calendar .ics feed.",
                  "disabled": true
                }
              ]
            },
            "description": "Upcoming AI-law effective / compliance dates (JSON or iCal)\n\nA 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.\n\n\n`GET /deadlines`\n\noperationId: `listDeadlines`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Laws",
      "item": [
        {
          "name": "GET /laws — List legal records (filter, sort, paginate)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/laws",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "laws"
              ],
              "query": [
                {
                  "key": "scope",
                  "value": "state",
                  "description": "Filter by scope.",
                  "disabled": true
                },
                {
                  "key": "jurisdiction",
                  "value": "",
                  "description": "Exact jurisdiction slug (e.g. colorado, eu, us-federal, canada).",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "Case-insensitive substring match on status.",
                  "disabled": true
                },
                {
                  "key": "in_force",
                  "value": "true",
                  "description": "Filter by the in_force flag.",
                  "disabled": true
                },
                {
                  "key": "updated_since",
                  "value": "2026-01-01T00:00:00Z",
                  "description": "Only records updated at/after this ISO timestamp.",
                  "disabled": true
                },
                {
                  "key": "q",
                  "value": "",
                  "description": "Substring search over title + summary.",
                  "disabled": true
                },
                {
                  "key": "sort",
                  "value": "updated_at",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "order",
                  "value": "desc",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "0",
                  "description": "",
                  "disabled": true
                }
              ]
            },
            "description": "List legal records (filter, sort, paginate)\n\nTIER-GATING: every tier returns the SAME record shape, but Free/anonymous callers are capped to a small page (anon 5, free 25 rows) with shallow pagination — enough to evaluate the data, not to run in production. Advanced filters (scope, jurisdiction, status, in_force, updated_since) and sorting unlock at Developer. When a request is capped, the response echoes meta.gated + an upgrade hint (it is never a hard error).\n\n\n`GET /laws`\n\noperationId: `listLaws`"
          },
          "response": []
        },
        {
          "name": "GET /laws/{id} — Get one record by uuid",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/laws/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "laws",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "00000000-0000-0000-0000-000000000000",
                  "description": ""
                }
              ]
            },
            "description": "Get one record by uuid\n\n\n`GET /laws/{id}`\n\noperationId: `getLaw`"
          },
          "response": []
        },
        {
          "name": "GET /laws/{id}/history — Full change timeline for one record",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/laws/:id/history",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "laws",
                ":id",
                "history"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "00000000-0000-0000-0000-000000000000",
                  "description": ""
                }
              ]
            },
            "description": "Full change timeline for one record\n\nEvery 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.\n\n\n`GET /laws/{id}/history`\n\noperationId: `getLawHistory`"
          },
          "response": []
        },
        {
          "name": "GET /laws/{id}/sources — Source URLs backing one record (tiered primary/secondary)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/laws/:id/sources",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "laws",
                ":id",
                "sources"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "00000000-0000-0000-0000-000000000000",
                  "description": ""
                }
              ]
            },
            "description": "Source URLs backing one record (tiered primary/secondary)\n\nA 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.\n\n\n`GET /laws/{id}/sources`\n\noperationId: `listLawSources`"
          },
          "response": []
        },
        {
          "name": "GET /laws/{id}/citations — Citation projection for one record",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/laws/:id/citations",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "laws",
                ":id",
                "citations"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "00000000-0000-0000-0000-000000000000",
                  "description": ""
                }
              ]
            },
            "description": "Citation projection for one record\n\nA 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.\n\n\n`GET /laws/{id}/citations`\n\noperationId: `listLawCitations`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "News",
      "item": [
        {
          "name": "GET /news — AI-law news headlines (filter, keyword, date range; newest-first)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/news",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "news"
              ],
              "query": [
                {
                  "key": "scope",
                  "value": "state",
                  "description": "Filter by scope.",
                  "disabled": true
                },
                {
                  "key": "jurisdiction",
                  "value": "",
                  "description": "Exact jurisdiction slug (e.g. california, federal, eu, global).",
                  "disabled": true
                },
                {
                  "key": "q",
                  "value": "",
                  "description": "Keyword substring search over the headline + excerpt.",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "2026-01-01",
                  "description": "Only headlines published on/after this date (YYYY-MM-DD). Free/anon are clamped to their recency window (see meta.window).",
                  "disabled": true
                },
                {
                  "key": "since",
                  "value": "2026-01-01",
                  "description": "Alias for `from` — poll for headlines since a date.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "2026-01-01",
                  "description": "Only headlines published on/before this date (YYYY-MM-DD).",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Free/anon are capped lower (a taste).",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "0",
                  "description": "",
                  "disabled": true
                }
              ]
            },
            "description": "AI-law news headlines (filter, keyword, date range; newest-first)\n\nThe 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.\n\n\n`GET /news`\n\noperationId: `listNews`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Reference data",
      "item": [
        {
          "name": "GET /jurisdictions — List covered jurisdictions with record counts",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/jurisdictions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "jurisdictions"
              ],
              "query": [
                {
                  "key": "scope",
                  "value": "state",
                  "description": "",
                  "disabled": true
                }
              ]
            },
            "description": "List covered jurisdictions with record counts\n\n\n`GET /jurisdictions`\n\noperationId: `listJurisdictions`"
          },
          "response": []
        },
        {
          "name": "GET /countries — National (global-scope) jurisdictions with record counts",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/countries",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "countries"
              ]
            },
            "description": "National (global-scope) jurisdictions with record counts\n\n\n`GET /countries`\n\noperationId: `listCountries`"
          },
          "response": []
        },
        {
          "name": "GET /states — US state jurisdictions with record counts",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/states",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "states"
              ]
            },
            "description": "US state jurisdictions with record counts\n\n\n`GET /states`\n\noperationId: `listStates`"
          },
          "response": []
        },
        {
          "name": "GET /categories — Dataset facets: record_type + scope distributions",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/categories",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "categories"
              ]
            },
            "description": "Dataset facets: record_type + scope distributions\n\n\n`GET /categories`\n\noperationId: `listCategories`"
          },
          "response": []
        },
        {
          "name": "GET /sectors — Sector index (valid slugs for /obligations, /penalties, /assess)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/sectors",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "sectors"
              ]
            },
            "description": "Sector index (valid slugs for /obligations, /penalties, /assess)\n\n\n`GET /sectors`\n\noperationId: `listSectors`"
          },
          "response": []
        },
        {
          "name": "GET /sectors/{sector} — One sector: overview + derived obligations & penalties",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/sectors/:sector",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "sectors",
                ":sector"
              ],
              "variable": [
                {
                  "key": "sector",
                  "value": "<sector>",
                  "description": "A sector slug (see /sectors)."
                }
              ]
            },
            "description": "One sector: overview + derived obligations & penalties\n\nThe 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.\n\n\n`GET /sectors/{sector}`\n\noperationId: `getSector`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Search",
      "item": [
        {
          "name": "GET /search — Search records by title/summary text",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/search?q=",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "search"
              ],
              "query": [
                {
                  "key": "q",
                  "value": "",
                  "description": "(required)",
                  "disabled": false
                },
                {
                  "key": "scope",
                  "value": "state",
                  "description": "Filter by scope.",
                  "disabled": true
                },
                {
                  "key": "jurisdiction",
                  "value": "",
                  "description": "Exact jurisdiction slug (e.g. colorado, eu, us-federal, canada).",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "Case-insensitive substring match on status.",
                  "disabled": true
                },
                {
                  "key": "in_force",
                  "value": "true",
                  "description": "Filter by the in_force flag.",
                  "disabled": true
                },
                {
                  "key": "updated_since",
                  "value": "2026-01-01T00:00:00Z",
                  "description": "Only records updated at/after this ISO timestamp.",
                  "disabled": true
                },
                {
                  "key": "sort",
                  "value": "updated_at",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "order",
                  "value": "desc",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "0",
                  "description": "",
                  "disabled": true
                }
              ]
            },
            "description": "Search records by title/summary text\n\n\n`GET /search`\n\noperationId: `searchLaws`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Status & meta",
      "item": [
        {
          "name": "GET /health — Liveness + backend status",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/health",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "health"
              ]
            },
            "description": "Liveness + backend status\n\n\n`GET /health`\n\noperationId: `getHealth`"
          },
          "response": []
        },
        {
          "name": "GET /accuracy — Public accuracy ledger — source-health summary + change-observation stats",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/accuracy",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "accuracy"
              ]
            },
            "description": "Public accuracy ledger — source-health summary + change-observation stats\n\nThe 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.\n\n\n`GET /accuracy`\n\noperationId: `getAccuracy`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Webhooks",
      "item": [
        {
          "name": "GET /webhooks — List this key's webhooks",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks"
              ]
            },
            "description": "List this key's webhooks\n\n\n`GET /webhooks`\n\noperationId: `listWebhooks`"
          },
          "response": []
        },
        {
          "name": "POST /webhooks — Subscribe to change events (Pro+ · requires an API key)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks"
              ]
            },
            "description": "Subscribe to change events (Pro+ · requires an API key)\n\nCreate 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.\n\n\n`POST /webhooks`\n\noperationId: `createWebhook`",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"target_url\": \"\",\n  \"scope\": \"state\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /webhooks/{id} — Get one subscription",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "00000000-0000-0000-0000-000000000000",
                  "description": ""
                }
              ]
            },
            "description": "Get one subscription\n\n\n`GET /webhooks/{id}`\n\noperationId: `getWebhook`"
          },
          "response": []
        },
        {
          "name": "DELETE /webhooks/{id} — Unsubscribe",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "00000000-0000-0000-0000-000000000000",
                  "description": ""
                }
              ]
            },
            "description": "Unsubscribe\n\n\n`DELETE /webhooks/{id}`\n\noperationId: `deleteWebhook`"
          },
          "response": []
        }
      ]
    }
  ]
}
