---
title: "List legal records (filter, sort, paginate)"
method: GET
path: "/laws"
---

# List legal records (filter, sort, paginate)

`GET /laws`

## Request

- Base URL: `https://ai-law-tracker.com/api/v1`
- URL: `https://ai-law-tracker.com/api/v1/laws`
- Auth: one of:
  - none
  - API key in header `X-API-Key`
  - HTTP bearer

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

## Query parameters

- `scope` 'state' | 'federal' | 'eu' | 'global'
- `jurisdiction` string
- `status` string
- `in_force` boolean
- `updated_since` string, date-time
- `q` string
- `sort` 'updated_at' | 'record_date' | 'title'
- `order` 'asc' | 'desc'
- `limit` integer
- `offset` integer

## Response `200`

A page of records.

- object
  - `api_version` string
  - `data` Record[]
    - `id` string, uuid: Stable primary key (the /v1/laws/{id} path key).
    - `scope` 'state' | 'federal' | 'eu' | 'global'
    - `jurisdiction` object
      - `slug` string
      - `name` string, nullable
      - `abbr` string, nullable
    - `identifier` string, nullable
    - `title` string, nullable
    - `record_type` string, nullable
    - `status` string, nullable: Rich free-text status verbatim from the source.
    - `in_force` boolean, nullable: Set only where the source states it explicitly; else null.
    - `record_date` string, date-time, nullable
    - `summary` string, nullable
    - `source` string, nullable
    - `official_url` string, nullable: Primary/official (.gov) link where available.
    - `updated_at` string, date-time, nullable: Last CHANGED — advanced only on a real content diff.
    - `checked_at` string, date-time, nullable: Last VERIFIED — bumped every time the source was successfully re-checked, even when unchanged.
    - `attribution` string
  - `meta` object
    - `total` integer
    - `count` integer
    - `limit` integer
    - `offset` integer

## Other responses

- `400`: Invalid parameter
- `429`: Rate limited
- `503`: Backend unavailable

---

[API](https://skmtc.dev/ai-law-tracker/apis/ai-law-tracker-public-laws-api.md) · [All operations](https://skmtc.dev/ai-law-tracker/apis/ai-law-tracker-public-laws-api/llms.txt) · [OpenAPI document](https://skmtc.dev/ai-law-tracker/apis/ai-law-tracker-public-laws-api/revisions/25403268a853?raw)
