AI Law Tracker Laws API

The Laws API from AI Law Tracker — 5 operation(s) for laws.

Operations 5

GET /laws List legal records (filter, sort, paginate) #
GET /laws/{id} Get one record by uuid #
GET /laws/{id}/history Full change timeline for one record #
GET /laws/{id}/sources Source URLs backing one record (tiered primary/secondary) #
GET /laws/{id}/citations Citation projection for one record #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/ai-law-tracker-com:ai-law-tracker-com-laws-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

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