Address validation

Validate Swedish addresses

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

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

{
  "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

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

{
  "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.

PlanPrice, excl. VATIncludes
UtvecklareSEK 02,000 calculations a month; 1,000 test requests a day; Test addresses in the same format as live data; Jobs are included from Bas
BasSEK 490 a month5,000 calculations/month included; 25,000 live calls a month; 10,000 addresses a day; +50,000 calculations/month as an add-on
ProSEK 1,990 a month50,000 calculations/month included; 200,000 live calls a month; 50,000 addresses a day
Avtalby quoteVendors: 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 on your account page (the account pages are in Swedish), read how to start, or see all plans.