# Validate Swedish addresses

> Check an address a customer typed, at checkout or in a CRM, against Lantmäteriet's register: what is wrong is reported, never silently corrected.
>
> https://kartpunkt.se/en/address-validation

`POST /v1/addresses/validate` checks that an address exists exactly as given in Lantmäteriet's address register, and reports what is wrong in `issues` instead of silently correcting it. Use it at checkout or sign-up, before you ship to an address or store it, and in a CRM to check the addresses you hold.

## The call

Request:

```sh

curl -X POST https://api.kartpunkt.se/v1/addresses/validate \
  -H "Authorization: Bearer $KARTPUNKT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"street":"Järngatan","number":2,"letter":"C","postcode":"75541"}'

```

Answer:

```json

{
  "valid": false,
  "match": {
    "id": "se.syn.syn-0000uvt",
    "type": "address",
    "label": "Järngatan 2, 755 41 Uppsala",
    "street": "Järngatan",
    "number": 2,
    "letter": null,
    "postcode": "75541",
    "locality": "Uppsala",
    "municipality_code": "0380",
    "municipality": "Uppsala",
    "county_code": "03",
    "county": "Uppsala län",
    "district_code": "903802",
    "district": "Uppsala södra",
    "point": {
      "lat": 59.859903789196885,
      "lon": 17.64433171466342
    },
    "position_type": "driveway",
    "match_type": "partial",
    "score": 1
  },
  "issues": [
    "letter_not_found"
  ],
  "suggestions": [],
  "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-05"
      }
    ]
  }
}

```

A test key's answer: the addresses are synthetic (`provenance.synthetic: true`), and `road` is NVDB's.

The customer typed 2C, and the register has no letter C at Järngatan 2 in 755 41. `valid` is false, `issues` says `letter_not_found`, and `match` is the closest address, for you to compare with what was typed. It is never a correction made for you.

## What issues can say

- `street_not_found`: no such street; `suggestions` holds search hits for what was sent.
- `number_not_found`: the street has no such number; `suggestions` holds the nearest numbers on the street.
- `letter_not_found`: the number has no such letter.
- `postcode_mismatch`: the postnummer sent is not the address's.
- `locality_mismatch`: the postort or kommun sent is not the address's.
- `ambiguous`: what was sent fits several addresses.

`valid` is true only when `issues` is empty.

## In an address form

For the form itself, `POST /v1/geocode` is autocomplete that tolerates typos: misspellings, å, ä and ö typed without diacritics, and abbreviations such as sthlm. It answers street-level hits until a house number is typed. Each hit says in `match_type` whether it is `exact`, `corrected` (a word was read as a misspelling: ask the user) or `partial`.

Request:

```sh

curl -X POST https://api.kartpunkt.se/v1/geocode \
  -H "Authorization: Bearer $KARTPUNKT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q":"jarngatan 2 upsala","limit":1}'

```

Answer:

```json

{
  "results": [
    {
      "id": "se.syn.syn-0000uvt",
      "type": "address",
      "label": "Järngatan 2, 755 41 Uppsala",
      "street": "Järngatan",
      "number": 2,
      "letter": null,
      "postcode": "75541",
      "locality": "Uppsala",
      "municipality_code": "0380",
      "municipality": "Uppsala",
      "county_code": "03",
      "county": "Uppsala län",
      "district_code": "903802",
      "district": "Uppsala södra",
      "point": {
        "lat": 59.859903789196885,
        "lon": 17.64433171466342
      },
      "position_type": "driveway",
      "match_type": "corrected",
      "score": 6.057753791356872
    }
  ],
  "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-05"
      }
    ]
  }
}

```

A test key's answer: the addresses are synthetic (`provenance.synthetic: true`), and `road` is NVDB's.

## Know when an address you hold changes

Store each address's `id` with its `label`. `POST /v1/addresses/changes` then says, for up to 20 stored ids at a time, whether each is unchanged, changed or closed since a date you give.

## Price

Test keys are free on every plan and answer from the synthetic dataset. Live calls need a paid plan and an account approved for live access. All prices are in Swedish kronor, excl. VAT.

| Plan | Price, excl. VAT | Includes |
| --- | --- | --- |
| Utvecklare | SEK 0 | 2,000 calculations a month; 1,000 test requests a day; Test addresses in the same format as live data; Jobs are included from Bas |
| Bas | SEK 490 a month | 5,000 calculations/month included; 25,000 live calls a month; 10,000 addresses a day; +50,000 calculations/month as an add-on |
| Pro | SEK 1,990 a month | 50,000 calculations/month included; 200,000 live calls a month; 50,000 addresses a day |
| Avtal | by quote | Vendors: priced per municipality; Operators: priced per vehicle; Network version and source in every answer; The API runs in the EU; Data processing agreement: draft on request |

[Create a test key](https://kartpunkt.se/konto) on your account page (the account pages are in Swedish), read [how to start](https://kartpunkt.se/en/developers), or see [all plans](https://kartpunkt.se/en/pricing).
