---
title: "Api Changes"
method: GET
path: "/api/v1/{country}/changes"
tags: ["api"]
---

# Api Changes

`GET /api/v1/{country}/changes`

## Request

- Base URL: `https://legalize.dev` (the document declares no server; this is the origin it was published from)
- URL: `https://legalize.dev/api/v1/{country}/changes`
- Auth: API key in header `Authorization`

What changed in this country's corpus, oldest first.

The pull half of the webhooks: same events, same `data` payload, no endpoint
to host. Poll it with `since` once, then follow `next_cursor` — that is the
only gap-free way to resume, because a night's events all carry the same
detection timestamp.

A change is what the daily sync found: a law added, its metadata or text
updated, its status turned to repealed, or a new amendment recorded. It says
*what* moved and *when*, with the `sha` to diff against — not which article
was touched.

## Path parameters

- `country` string, required

## Query parameters

- `since` string, nullable: Only changes detected on or after this date (YYYY-MM-DD).
- `cursor` integer, nullable: Resume after this change id. Use `next_cursor` from the previous page.
- `limit` integer

## Response `200`

Successful Response

- ChangesResponse
  - `country` string, required
  - `count` integer, required
  - `next_cursor` integer, nullable, required
  - `has_more` boolean, required
  - `changes` Change[], required
    - `id` integer, required
    - `event` string, required
    - `country` string, required
    - `law_id` string, required
    - `detected_at` string, date-time, required
    - `data` object, required

## Other responses

- `401`: Missing, malformed, or invalid API key
- `422`: Validation Error
- `429`: Monthly quota exceeded. Includes Retry-After header.

---

[API](https://skmtc.dev/legalize/apis/legalize-api.md) · [All operations](https://skmtc.dev/legalize/apis/legalize-api/llms.txt) · [OpenAPI document](https://skmtc.dev/legalize/apis/legalize-api/revisions/305b67a14660?raw)
