Reverse geocoding

Reverse geocoding for Swedish addresses

Send a WGS84 coordinate and get the nearest official Swedish addresses, with the road the point is on: its speed limit, road owner and surface. POST /v1/reverse-geocode answers the nearest current addresses to a WGS84 coordinate from Lantmäteriet's address register, nearest first, each with distance_m, the distance in metres.

The call

Request

curl -X POST https://api.kartpunkt.se/v1/reverse-geocode \
  -H "Authorization: Bearer $KARTPUNKT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"point":{"lat":59.8599,"lon":17.6443}}'

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": null,
      "score": 1,
      "distance_m": 1.83
    }
  ],
  "road": {
    "name": "Järngatan",
    "road_number": null,
    "road_class": 8,
    "speed_limit_kmh": 30,
    "speed_limit_varies": false,
    "owner": "municipal",
    "surface": "paved",
    "municipality_code": "0380",
    "distance_m": 1.83,
    "fallback": false
  },
  "provenance": {
    "synthetic": true,
    "network": {
      "id": "snap_01m45nmn6mfey8z9wvaf31nb9n",
      "dataset": "nvdb",
      "source_date": "2026-10-05",
      "built_at": "2026-10-05T09:17:11.764Z",
      "graph": "snap_01m45nmnryfey8z9x29xcd08tq"
    },
    "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"
      },
      {
        "id": "nvdb",
        "name": "Trafikverket, NVDB",
        "licence": "CC0-1.0",
        "attribution": "Vägdata från NVDB, Trafikverket, CC0 1.0",
        "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.

Each result is an address: a stable id, the label to show and store, the street, number and letter, postnummer, postort, kommun, län and distrikt, the point in WGS84 and what it marks (position_type). road is the nearest drivable road with a name or a number within 100 m, or null.

For a vehicle

For a vehicle's position, such as a trip's start or end, send radius_m 5000, distinct street and limit 3. You get the nearest address of each of the three nearest streets, and choose the street the vehicle drove on: at a junction the nearest door is often on the cross street. More in trip logs.

Request

curl -X POST https://api.kartpunkt.se/v1/reverse-geocode \
  -H "Authorization: Bearer $KARTPUNKT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"point":{"lat":59.8599,"lon":17.6443},"radius_m":5000,"distinct":"street","limit":3}'

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": null,
      "score": 1,
      "distance_m": 1.83
    },
    {
      "id": "se.syn.syn-0000taj",
      "type": "address",
      "label": "Bredstigen 11, 756 46 Uppsala",
      "street": "Bredstigen",
      "number": 11,
      "letter": null,
      "postcode": "75646",
      "locality": "Uppsala",
      "municipality_code": "0380",
      "municipality": "Uppsala",
      "county_code": "03",
      "county": "Uppsala län",
      "district_code": "903805",
      "district": "Uppsala landsbygd",
      "point": {
        "lat": 59.85826774209593,
        "lon": 17.64290149051346
      },
      "position_type": "driveway",
      "match_type": null,
      "score": 1,
      "distance_m": 198.02
    },
    {
      "id": "se.syn.syn-0000t9s",
      "type": "address",
      "label": "Örnvägen 2, 753 45 Uppsala",
      "street": "Örnvägen",
      "number": 2,
      "letter": null,
      "postcode": "75345",
      "locality": "Uppsala",
      "municipality_code": "0380",
      "municipality": "Uppsala",
      "county_code": "03",
      "county": "Uppsala län",
      "district_code": "903804",
      "district": "Uppsala västra",
      "point": {
        "lat": 59.86256320677179,
        "lon": 17.645462724134184
      },
      "position_type": "building",
      "match_type": null,
      "score": 1,
      "distance_m": 303.78
    }
  ],
  "road": {
    "name": "Järngatan",
    "road_number": null,
    "road_class": 8,
    "speed_limit_kmh": 30,
    "speed_limit_varies": false,
    "owner": "municipal",
    "surface": "paved",
    "municipality_code": "0380",
    "distance_m": 1.83,
    "fallback": false
  },
  "provenance": {
    "synthetic": true,
    "network": {
      "id": "snap_01m45nmn6mfey8z9wvaf31nb9n",
      "dataset": "nvdb",
      "source_date": "2026-10-05",
      "built_at": "2026-10-05T09:17:11.764Z",
      "graph": "snap_01m45nmnryfey8z9x29xcd08tq"
    },
    "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"
      },
      {
        "id": "nvdb",
        "name": "Trafikverket, NVDB",
        "licence": "CC0-1.0",
        "attribution": "Vägdata från NVDB, Trafikverket, CC0 1.0",
        "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.

When nothing is near

No address within radius_m (2000 m unless you send another, at most 50000) is a 200 with an empty results list, never an error. limit sets how many addresses you get, 1 to 10.

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.