# POST /v1/addresses/changes

> Index: https://kartpunkt.se/llms.txt

operationId: `checkAddressChanges`. What changed for stored addresses.
Tag: `addresses`.

For address ids stored from earlier answers, what happened since a date: each is `unchanged`, `changed` with the fields that differ, `closed` or `unknown`. It answers only for the ids sent; there is no feed of the register. See the recipe "Keeping stored addresses current".

## Request

`POST https://api.kartpunkt.se/v1/addresses/changes` with `Authorization: Bearer $KARTPUNKT_API_KEY` and `Content-Type: application/json`, from your backend (never browser code: the key would leak, and CORS is not enabled).

Example body:

```json
{
  "ids": [
    "se.syn.syn-0000t9b",
    "se.syn.not-an-address",
    "se.lm.not-in-this-dataset"
  ],
  "since": "2026-10-13"
}
```

JSON body:

- `ids` (array of string, max 100 chars, 1..20 items, required): The address ids to check, as stored from earlier answers' `id`; split a longer list into several calls. A kp_test_ key's ids are checked against the synthetic dataset only, a kp_live_ key's against the live one. An id sent twice is answered once.
- `since` (string, date YYYY-MM-DD, required): The date (YYYY-MM-DD) the stored addresses were last known current: the `provenance.sources[].updated` of the answer they came from, not the day they were stored. Changes dated after it are reported. It is at most today (UTC) and at most 24 months back, the history kept; with no stored date, send the earliest accepted.

## Response 200

Example:

```json
{
  "results": [
    {
      "id": "se.syn.syn-0000t9b",
      "status": "unchanged"
    },
    {
      "id": "se.syn.not-an-address",
      "status": "unknown"
    },
    {
      "id": "se.lm.not-in-this-dataset",
      "status": "unknown"
    }
  ],
  "provenance": {
    "synthetic": true,
    "sources": [
      {
        "id": "synthetic",
        "name": "Kartpunkt synthetic test addresses",
        "licence": "CC0-1.0",
        "attribution": "Syntetiska testadresser från Kartpunkt, inte verkliga adresser.",
        "url": "https://creativecommons.org/publicdomain/zero/1.0/",
        "updated": "2026-10-13"
      }
    ]
  }
}
```

- `results` (array of [AddressChange](https://api.kartpunkt.se/docs/shapes/AddressChange.md)): One result per distinct id sent, in the order sent. Never empty: an id with nothing to report is 'unchanged' or 'unknown'.
- `provenance` ([Provenance](https://api.kartpunkt.se/docs/shapes/Provenance.md))

## Errors

Every error is `{ error, message, param?, doc_url }`; `message` says what to do next. All codes: [https://api.kartpunkt.se/errors](https://api.kartpunkt.se/errors). What to do on each, with retries: [https://api.kartpunkt.se/docs/recipes/errors-and-retries.md](https://api.kartpunkt.se/docs/recipes/errors-and-retries.md).

- [`invalid_request`](https://api.kartpunkt.se/errors/invalid_request) (400): The request does not match the API schema. Fix the fields named in this message; see /openapi.json.
- [`unauthorized`](https://api.kartpunkt.se/errors/unauthorized) (401): Missing or unknown API key. Send it as 'Authorization: Bearer <key>' (or 'x-api-key'), read from the KARTPUNKT_API_KEY environment variable. The user creates a kp_test_ key on their Kartpunkt account page (https://kartpunkt.se/konto) and puts it in KARTPUNKT_API_KEY themselves; never ask them to paste a key into chat.
- [`live_access_required`](https://api.kartpunkt.se/errors/live_access_required) (403): This account is not approved for live data: kp_live_ keys are for customers under contract. Use a kp_test_ key. To ask for live access, the account holder writes to hej@kartpunkt.se, or orders a plan at https://kartpunkt.se/konto#plan.
- [`use_not_permitted`](https://api.kartpunkt.se/errors/use_not_permitted) (403): This operation would use a data source in a way its licence or approval does not allow (see GET /v1/sources). It cannot be answered for this key.
- [`quota_exceeded`](https://api.kartpunkt.se/errors/quota_exceeded) (429): Request limit or plan quota reached (per minute, per day, or the account plan's monthly quota). Wait the number of seconds in the Retry-After header, then retry; without Retry-After, no wait helps: tell the account holder what this message says.
- [`internal_error`](https://api.kartpunkt.se/errors/internal_error) (500): Something failed on our side. Retry after a few seconds; if it keeps failing, contact hej@kartpunkt.se.
- [`live_data_unavailable`](https://api.kartpunkt.se/errors/live_data_unavailable) (503): Live data is not available yet: it opens when Kartpunkt's import of Lantmäteriet's address register completes. Use a kp_test_ key until then.

## Limits

| Limit | Synchronous |
| --- | --- |
| `ids` (items) | 20 |
| Request body | 1 MB |

## Metering

With a `kp_live_` key, one live call per request; each address in the answer counts toward the plan's daily address limit.
