Demo
Prova Kartpunkt
Två frågor besvarade med Trafikverkets vägnät (NVDB), och adressökning med inspelade svar. Bredvid varje svar står anropet som ger samma svar från er egen kod. Utan konto och nyckel, och det du klickar loggas inte.
- ≤ 30 km/h
- 40 km/h
- 50 km/h
- 60 km/h
- 70–80 km/h
- 90–120 km/h
- ingen gräns
Gångvägen från ett hem till ett mål, som vägen till bussen eller en leverans sista bit, färgad efter det NVDB registrerar längs den. Dra hemmet, klicka på kartan eller flytta det med knapparna, så räknas vägen om.
Gångtid 45 min · Längd 3,8 km
via Varbergsvägen
Trafikmiljö längs vägen: 1,1 km på väg med 70+ km/h, längs själva körbanan: Varbergsvägen. 88 m på väg med 70+ km/h, längs själva körbanan: Strevavägen. 1,4 km obelyst utanför tätort. 1 passage med okänd refug över väg med 60+ km/h.
Fakta ur NVDB, inte en bedömning av vägen.
Vägar längs vägen 13 vägar
nätversion snap_01m46vmhn0enf9wyy9h5mh5fc6 · NVDB 2026-09-29
Vägdata från NVDB, Trafikverket, CC0 1.0
Flytta hemmet 150 m åt gången, eller dra det på kartan:
Klicka var som helst på kartan: demon svarar med närmaste väg och vad NVDB vet om den. För fyra förslag visas också adressen, som ett inspelat svar från testdata.
Närmaste väg
Lindholmsplatsen
- Hastighetsgräns
- 50 km/h
- Väghållare
- Kommunen
- Slitlager
- Belagd
- Avstånd från punkten
- 9 m
- Vägreferens
- 20526:2060033@0.000000-0.706989
nätversion snap_01m46vmhn0enf9wyy9h5mh5fc6 · NVDB 2026-09-29
Vägdata från NVDB, Trafikverket, CC0 1.0
Adress: inspelat svar från testdata
- Lidbystigen 1, 418 21 Göteborg · 16 m
- Humleholmsvägen 31, 413 66 Göteborg · 172 m
- Fläderbygatan 2, 418 50 Göteborg · 195 m
Testdata: adresserna ser verkliga ut men finns inte. Med en nyckel svarar /v1/reverse-geocode med adressen vid punkten direkt; demon läser inga adresser.
För utvecklare
Samma anrop från er egen kod, med nyckeln i miljövariabeln KARTPUNKT_API_KEY. Markerat i svaret: provenance, ref och facts.
POST /v1/route
Inspelat svar från demon
curl https://api.kartpunkt.se/v1/route \
-H "Authorization: Bearer $KARTPUNKT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"origin":{"lat":57.462,"lon":12.115},"destination":{"lat":57.4874,"lon":12.0873},"profile":"walk","facts":["speed_limit","road_name","road_number","road_owner","surface","network","fast_road","unlit_outside_built_up","crossings_without_refuge","crossings_unknown_refuge"],"geometry":"geojson"}'const res = await fetch("https://api.kartpunkt.se/v1/route", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KARTPUNKT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"origin": {
"lat": 57.462,
"lon": 12.115
},
"destination": {
"lat": 57.4874,
"lon": 12.0873
},
"profile": "walk",
"facts": [
"speed_limit",
"road_name",
"road_number",
"road_owner",
"surface",
"network",
"fast_road",
"unlit_outside_built_up",
"crossings_without_refuge",
"crossings_unknown_refuge"
],
"geometry": "geojson"
}),
})
const answer = await res.json(){ … 16 fält }
"segments": [ … 46 st ],
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 8 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 6 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 12 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 6 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 7 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 14 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 3 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 8 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 7 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 6 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 6 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 6 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 4 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 5 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 16 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 8 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 9 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 4 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 7 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 4 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 3 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 3 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 3 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 3 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 8 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 3 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 3 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 3 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 3 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 5 st ]
{ … 4 fält }
"facts": { … 10 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
"facts": { … 10 fält },
"speed_limit": { … 4 fält },
"road_name": { … 8 fält },
"road_number": { … 2 fält },
"road_owner": { … 3 fält },
"surface": { … 2 fält },
"network": { … 2 fält },
"geometry": { … 2 fält },
"coordinates": [ … 170 st ]
"provenance": { … 3 fält },
"network": { … 7 fält },
"sources": [ … 1 st ]
{ … 6 fält }
nätversion snap_01m46vmhn0enf9wyy9h5mh5fc6 · NVDB 2026-09-29
Vägdata från NVDB, Trafikverket, CC0 1.0
För utvecklare
Samma anrop från er egen kod, med nyckeln i miljövariabeln KARTPUNKT_API_KEY. Markerat i svaret: provenance, ref och facts.
POST /v1/roads/nearby
Inspelat svar från demon
curl https://api.kartpunkt.se/v1/roads/nearby \
-H "Authorization: Bearer $KARTPUNKT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"point":{"lat":57.7069,"lon":11.9387},"radius_m":60,"limit":1,"facts":["road_name","road_number","speed_limit","road_owner","surface"]}'const res = await fetch("https://api.kartpunkt.se/v1/roads/nearby", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KARTPUNKT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"point": {
"lat": 57.7069,
"lon": 11.9387
},
"radius_m": 60,
"limit": 1,
"facts": [
"road_name",
"road_number",
"speed_limit",
"road_owner",
"surface"
]
}),
})
const answer = await res.json(){ … 2 fält }
"roads": [ … 1 st ],
{ … 7 fält }
"facts": { … 5 fält },
"geometry": { … 2 fält }
"coordinates": [ … 5 st ]
"provenance": { … 3 fält }
"network": { … 5 fält },
"sources": [ … 1 st ]
{ … 6 fält }
nätversion snap_01m46vmhn0enf9wyy9h5mh5fc6 · NVDB 2026-09-29
Vägdata från NVDB, Trafikverket, CC0 1.0
POST /v1/reverse-geocode
Inspelat svar från testdata
curl https://api.kartpunkt.se/v1/reverse-geocode \
-H "Authorization: Bearer $KARTPUNKT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"point":{"lat":57.7069,"lon":11.9387},"radius_m":5000,"distinct":"street","limit":3}'const res = await fetch("https://api.kartpunkt.se/v1/reverse-geocode", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KARTPUNKT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"point": {
"lat": 57.7069,
"lon": 11.9387
},
"radius_m": 5000,
"distinct": "street",
"limit": 3
}),
})
const answer = await res.json(){ … 3 fält }
"results": [ … 3 st ],
{ … 19 fält },
"point": { … 2 fält },
{ … 19 fält },
"point": { … 2 fält },
{ … 19 fält }
"point": { … 2 fält },
"road": { … 10 fält },
"provenance": { … 3 fält }
"network": { … 5 fält },
"sources": [ … 2 st ]
{ … 6 fält },
{ … 6 fält }
Adresserna är testdata: de ser verkliga ut men finns inte. Demon läser inga adresser; med en nyckel svarar /v1 direkt, från testdata med en testnyckel och från Lantmäteriets adressregister med en livenyckel.
nätversion snap_01m481nr59fezs7pcmbff9jjwq · NVDB 2026-10-06
Syntetiska testadresser från Kartpunkt, inte verkliga adresser. · Vägdata från NVDB, Trafikverket, CC0 1.0
Sök en adress
Adresserna här är inspelade svar från testdata: de ser verkliga ut men finns inte. Demon läser inga adresser. Med en testnyckel svarar /v1 direkt från testdata, och med en livenyckel från Lantmäteriets adressregister.
Inspelat svar från testdata
Sök medan du skriver
Närmaste inspelade sökning: Kungsgatan 12
- Kungsgatan 12, 414 90 GöteborgAdress
- Kungsgatan 12, 905 16 UmeåAdress
- Kungsgatan 12, 585 93 MyråAdress
- Kungsgatan 12, 255 98 HögsjöAdress
- Kungsgatan 12, 931 91 FlyåkerAdress
För utvecklare
Samma anrop från er egen kod, med nyckeln i miljövariabeln KARTPUNKT_API_KEY. Markerat i svaret: provenance, ref och facts.
POST /v1/geocode
Inspelat svar från testdata
curl https://api.kartpunkt.se/v1/geocode \
-H "Authorization: Bearer $KARTPUNKT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"q":"Kungsgatan 12","limit":5}'const res = await fetch("https://api.kartpunkt.se/v1/geocode", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KARTPUNKT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"q": "Kungsgatan 12",
"limit": 5
}),
})
const answer = await res.json(){ … 2 fält }
"results": [ … 5 st ],
{ … 18 fält },
"point": { … 2 fält },
{ … 18 fält },
"point": { … 2 fält },
{ … 18 fält },
"point": { … 2 fält },
{ … 18 fält },
"point": { … 2 fält },
{ … 18 fält }
"point": { … 2 fält },
"provenance": { … 2 fält }
"sources": [ … 1 st ]
{ … 6 fält }
Adresserna är testdata: de ser verkliga ut men finns inte. Demon läser inga adresser; med en nyckel svarar /v1 direkt, från testdata med en testnyckel och från Lantmäteriets adressregister med en livenyckel.
Syntetiska testadresser från Kartpunkt, inte verkliga adresser.
Fler inspelade svar: kontrollera en adress, och adressen vid en punkt
Inspelat svar från testdata
Kontrollera en adress med ett stavfel
Skickat: Kungsgtan 12, 41490
Adressen finns inte som den skrevs: gatan hittades inte.
Kandidater, bäst först. Inget rättas i tysthet: ni väljer.
- Kungsgatan 12, 414 90 GöteborgAdress
- Kungsgatan 12, 905 16 UmeåAdress
- Kungsgatan 12, 585 93 MyråAdress
- Kungsgatan 12, 255 98 HögsjöAdress
- Kungsgatan 12, 931 91 FlyåkerAdress
För utvecklare
Samma anrop från er egen kod, med nyckeln i miljövariabeln KARTPUNKT_API_KEY. Markerat i svaret: provenance, ref och facts.
POST /v1/addresses/validate
Inspelat svar från testdata
curl https://api.kartpunkt.se/v1/addresses/validate \
-H "Authorization: Bearer $KARTPUNKT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"street":"Kungsgtan","number":12,"postcode":"41490"}'const res = await fetch("https://api.kartpunkt.se/v1/addresses/validate", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KARTPUNKT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"street": "Kungsgtan",
"number": 12,
"postcode": "41490"
}),
})
const answer = await res.json(){ … 5 fält }
"issues": [ … 1 st ],
"suggestions": [ … 5 st ],
{ … 18 fält },
"point": { … 2 fält },
{ … 18 fält },
"point": { … 2 fält },
{ … 18 fält },
"point": { … 2 fält },
{ … 18 fält },
"point": { … 2 fält },
{ … 18 fält }
"point": { … 2 fält },
"provenance": { … 2 fält }
"sources": [ … 1 st ]
{ … 6 fält }
Adresserna är testdata: de ser verkliga ut men finns inte. Demon läser inga adresser; med en nyckel svarar /v1 direkt, från testdata med en testnyckel och från Lantmäteriets adressregister med en livenyckel.
Syntetiska testadresser från Kartpunkt, inte verkliga adresser.
Inspelat svar från testdata
Adressen vid en punkt
Punkten 57.69, 11.98 i Göteborg, med det anrop /llms.txt rekommenderar för en körjournal: närmaste adress på var och en av de tre närmaste gatorna.
- Humletunakroken 6, 411 20 Göteborg2 m
- Bredängskroken 1, 415 83 Göteborg71 m
- Snickarallén 3, 417 28 Göteborg74 m
För utvecklare
Samma anrop från er egen kod, med nyckeln i miljövariabeln KARTPUNKT_API_KEY. Markerat i svaret: provenance, ref och facts.
POST /v1/reverse-geocode
Inspelat svar från testdata
curl https://api.kartpunkt.se/v1/reverse-geocode \
-H "Authorization: Bearer $KARTPUNKT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"point":{"lat":57.69,"lon":11.98},"radius_m":5000,"distinct":"street","limit":3}'const res = await fetch("https://api.kartpunkt.se/v1/reverse-geocode", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KARTPUNKT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"point": {
"lat": 57.69,
"lon": 11.98
},
"radius_m": 5000,
"distinct": "street",
"limit": 3
}),
})
const answer = await res.json(){ … 3 fält }
"results": [ … 3 st ],
{ … 19 fält },
"point": { … 2 fält },
{ … 19 fält },
"point": { … 2 fält },
{ … 19 fält }
"point": { … 2 fält },
"road": { … 10 fält },
"provenance": { … 3 fält }
"network": { … 5 fält },
"sources": [ … 2 st ]
{ … 6 fält },
{ … 6 fält }
Adresserna är testdata: de ser verkliga ut men finns inte. Demon läser inga adresser; med en nyckel svarar /v1 direkt, från testdata med en testnyckel och från Lantmäteriets adressregister med en livenyckel.
nätversion snap_01m481nr59fezs7pcmbff9jjwq · NVDB 2026-10-06
Syntetiska testadresser från Kartpunkt, inte verkliga adresser. · Vägdata från NVDB, Trafikverket, CC0 1.0
Ruttoptimering
Vilket fordon som kör till vilka stopp, i vilken ordning och när, inom fordonens platser och stoppens tidsfönster. Planen här är ett inspelat svar från testdata, på testdatas påhittade ort Ruttby och dess påhittade vägar. Orten ligger på verkliga koordinater väster om Umeå, och med en nyckel räknar /v1/optimize samma punkter på NVDB:s riktiga vägnät där.
Inspelat svar från testdata
Två fordon, tolv stopp
Varje fordon har åtta platser och utgår från depån. Varje stopp har ett antal att hämta och ett tidsfönster. Färst fordon först, sedan kortast körtid. 2 fordon kör 10 av 12 stopp på 26 min tillsammans; 2 stopp tas inte med.
fordon-1
5 stopp · 9,3 km · 13 min, från 07:03 till 07:16
- 1Norrgatan 20, Ruttbytidsfönster 07:00–07:4507:05, 1 ombord
- 2Norrgatan 30, Ruttbytidsfönster 07:00–07:4507:06, 3 ombord
- 3Östbyvägen 3, Östbytidsfönster 07:10–07:3007:10, 4 ombord
- 4Åvägen 5, Ruttbytidsfönster 07:00–07:4507:13, 5 ombord
- 5Skolvägen 30, Ruttbytidsfönster 07:00–07:4507:15, 7 ombord
fordon-2
5 stopp · 6,3 km · 13 min, från 06:59 till 07:11
- 1Snedgatan 2, Ruttbytidsfönster 07:00–07:4507:00, 1 ombord
- 2Norrgatan 5, Ruttbytidsfönster 07:00–07:4507:01, 3 ombord
- 3Hörnvägen 2, Ruttbytidsfönster 07:00–07:4507:02, 4 ombord
- 4Sörbygatan 2, Sörbytidsfönster 07:00–07:4507:06, 5 ombord
- 5Banvägen 4, Ruttbytidsfönster 07:00–07:4507:09, 7 ombord
Tas inte med
- Skogsbyvägen 1, Ruttbyinget fordon når stoppet längs vägnätet (
unassigned_unreachable) - Fjärdvägen 99, Ruttbystoppet behöver mer plats än något fordon har (
unassigned_capacity)
För utvecklare
Samma anrop från er egen kod, med nyckeln i miljövariabeln KARTPUNKT_API_KEY. Markerat i svaret: provenance, ref och facts.
POST /v1/optimize
Inspelat svar från testdata
curl https://api.kartpunkt.se/v1/optimize \
-H "Authorization: Bearer $KARTPUNKT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"vehicles":[{"id":"fordon-1","start":{"lat":63.72059,"lon":19.342166,"street":"Skolvägen"},"end":{"lat":63.72059,"lon":19.342166,"street":"Skolvägen"},"capacity":{"seats":8},"time_window":{"start":"2026-10-12T06:45:00+02:00","end":"2026-10-12T08:15:00+02:00"}},{"id":"fordon-2","start":{"lat":63.72059,"lon":19.342166,"street":"Skolvägen"},"end":{"lat":63.72059,"lon":19.342166,"street":"Skolvägen"},"capacity":{"seats":8},"time_window":{"start":"2026-10-12T06:45:00+02:00","end":"2026-10-12T08:15:00+02:00"}}],"stops":[{"id":"s1","at":{"lat":63.720434,"lon":19.348226,"street":"Skolvägen"},"pickup":{"seats":2},"service_s":60,"time_windows":[{"start":"2026-10-12T07:00:00+02:00","end":"2026-10-12T07:45:00+02:00"}]},{"id":"s2","at":{"lat":63.724508,"lon":19.339523,"street":"Norrgatan"},"pickup":{"seats":2},"service_s":60,"time_windows":[{"start":"2026-10-12T07:00:00+02:00","end":"2026-10-12T07:45:00+02:00"}]},{"id":"s3","at":{"lat":63.724205,"lon":19.337043,"street":"Snedgatan"},"pickup":{"seats":1},"service_s":60,"time_windows":[{"start":"2026-10-12T07:00:00+02:00","end":"2026-10-12T07:45:00+02:00"}]},{"id":"s4","at":{"lat":63.724312,"lon":19.348417,"street":"Norrgatan"},"pickup":{"seats":1},"service_s":60,"time_windows":[{"start":"2026-10-12T07:00:00+02:00","end":"2026-10-12T07:45:00+02:00"}]},{"id":"s5","at":{"lat":63.724128,"lon":19.354473,"street":"Norrgatan"},"pickup":{"seats":2},"service_s":60,"time_windows":[{"start":"2026-10-12T07:00:00+02:00","end":"2026-10-12T07:45:00+02:00"}]},{"id":"s6","at":{"lat":63.724471,"lon":19.331202,"street":"Hörnvägen"},"pickup":{"seats":1},"service_s":60,"time_windows":[{"start":"2026-10-12T07:00:00+02:00","end":"2026-10-12T07:45:00+02:00"}]},{"id":"s7","at":{"lat":63.7175,"lon":19.335812,"street":"Banvägen"},"pickup":{"seats":2},"service_s":60,"time_windows":[{"start":"2026-10-12T07:00:00+02:00","end":"2026-10-12T07:45:00+02:00"}]},{"id":"s8","at":{"lat":63.716325,"lon":19.353879,"street":"Åvägen"},"pickup":{"seats":1},"service_s":60,"time_windows":[{"start":"2026-10-12T07:00:00+02:00","end":"2026-10-12T07:45:00+02:00"}]},{"id":"s9","at":{"lat":63.718529,"lon":19.418702,"street":"Östbyvägen"},"pickup":{"seats":1},"service_s":60,"time_windows":[{"start":"2026-10-12T07:10:00+02:00","end":"2026-10-12T07:30:00+02:00"}]},{"id":"s10","at":{"lat":63.719246,"lon":19.301609,"street":"Sörbygatan"},"pickup":{"seats":1},"service_s":60,"time_windows":[{"start":"2026-10-12T07:00:00+02:00","end":"2026-10-12T07:45:00+02:00"}]},{"id":"s11","at":{"lat":63.725224,"lon":19.282034,"street":"Skogsbyvägen"},"pickup":{"seats":1},"service_s":60,"time_windows":[{"start":"2026-10-12T07:00:00+02:00","end":"2026-10-12T07:45:00+02:00"}]},{"id":"s12","at":{"lat":63.743072,"lon":19.376064,"street":"Fjärdvägen"},"pickup":{"seats":9},"service_s":60,"time_windows":[{"start":"2026-10-12T07:00:00+02:00","end":"2026-10-12T07:45:00+02:00"}]}],"objective":"vehicles_then_duration","profile":"car_fastest","geometry":"geojson"}'const res = await fetch("https://api.kartpunkt.se/v1/optimize", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KARTPUNKT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"vehicles": [
{
"id": "fordon-1",
"start": {
"lat": 63.72059,
"lon": 19.342166,
"street": "Skolvägen"
},
"end": {
"lat": 63.72059,
"lon": 19.342166,
"street": "Skolvägen"
},
"capacity": {
"seats": 8
},
"time_window": {
"start": "2026-10-12T06:45:00+02:00",
"end": "2026-10-12T08:15:00+02:00"
}
},
{
"id": "fordon-2",
"start": {
"lat": 63.72059,
"lon": 19.342166,
"street": "Skolvägen"
},
"end": {
"lat": 63.72059,
"lon": 19.342166,
"street": "Skolvägen"
},
"capacity": {
"seats": 8
},
"time_window": {
"start": "2026-10-12T06:45:00+02:00",
"end": "2026-10-12T08:15:00+02:00"
}
}
],
"stops": [
{
"id": "s1",
"at": {
"lat": 63.720434,
"lon": 19.348226,
"street": "Skolvägen"
},
"pickup": {
"seats": 2
},
"service_s": 60,
"time_windows": [
{
"start": "2026-10-12T07:00:00+02:00",
"end": "2026-10-12T07:45:00+02:00"
}
]
},
{
"id": "s2",
"at": {
"lat": 63.724508,
"lon": 19.339523,
"street": "Norrgatan"
},
"pickup": {
"seats": 2
},
"service_s": 60,
"time_windows": [
{
"start": "2026-10-12T07:00:00+02:00",
"end": "2026-10-12T07:45:00+02:00"
}
]
},
{
"id": "s3",
"at": {
"lat": 63.724205,
"lon": 19.337043,
"street": "Snedgatan"
},
"pickup": {
"seats": 1
},
"service_s": 60,
"time_windows": [
{
"start": "2026-10-12T07:00:00+02:00",
"end": "2026-10-12T07:45:00+02:00"
}
]
},
{
"id": "s4",
"at": {
"lat": 63.724312,
"lon": 19.348417,
"street": "Norrgatan"
},
"pickup": {
"seats": 1
},
"service_s": 60,
"time_windows": [
{
"start": "2026-10-12T07:00:00+02:00",
"end": "2026-10-12T07:45:00+02:00"
}
]
},
{
"id": "s5",
"at": {
"lat": 63.724128,
"lon": 19.354473,
"street": "Norrgatan"
},
"pickup": {
"seats": 2
},
"service_s": 60,
"time_windows": [
{
"start": "2026-10-12T07:00:00+02:00",
"end": "2026-10-12T07:45:00+02:00"
}
]
},
{
"id": "s6",
"at": {
"lat": 63.724471,
"lon": 19.331202,
"street": "Hörnvägen"
},
"pickup": {
"seats": 1
},
"service_s": 60,
"time_windows": [
{
"start": "2026-10-12T07:00:00+02:00",
"end": "2026-10-12T07:45:00+02:00"
}
]
},
{
"id": "s7",
"at": {
"lat": 63.7175,
"lon": 19.335812,
"street": "Banvägen"
},
"pickup": {
"seats": 2
},
"service_s": 60,
"time_windows": [
{
"start": "2026-10-12T07:00:00+02:00",
"end": "2026-10-12T07:45:00+02:00"
}
]
},
{
"id": "s8",
"at": {
"lat": 63.716325,
"lon": 19.353879,
"street": "Åvägen"
},
"pickup": {
"seats": 1
},
"service_s": 60,
"time_windows": [
{
"start": "2026-10-12T07:00:00+02:00",
"end": "2026-10-12T07:45:00+02:00"
}
]
},
{
"id": "s9",
"at": {
"lat": 63.718529,
"lon": 19.418702,
"street": "Östbyvägen"
},
"pickup": {
"seats": 1
},
"service_s": 60,
"time_windows": [
{
"start": "2026-10-12T07:10:00+02:00",
"end": "2026-10-12T07:30:00+02:00"
}
]
},
{
"id": "s10",
"at": {
"lat": 63.719246,
"lon": 19.301609,
"street": "Sörbygatan"
},
"pickup": {
"seats": 1
},
"service_s": 60,
"time_windows": [
{
"start": "2026-10-12T07:00:00+02:00",
"end": "2026-10-12T07:45:00+02:00"
}
]
},
{
"id": "s11",
"at": {
"lat": 63.725224,
"lon": 19.282034,
"street": "Skogsbyvägen"
},
"pickup": {
"seats": 1
},
"service_s": 60,
"time_windows": [
{
"start": "2026-10-12T07:00:00+02:00",
"end": "2026-10-12T07:45:00+02:00"
}
]
},
{
"id": "s12",
"at": {
"lat": 63.743072,
"lon": 19.376064,
"street": "Fjärdvägen"
},
"pickup": {
"seats": 9
},
"service_s": 60,
"time_windows": [
{
"start": "2026-10-12T07:00:00+02:00",
"end": "2026-10-12T07:45:00+02:00"
}
]
}
],
"objective": "vehicles_then_duration",
"profile": "car_fastest",
"geometry": "geojson"
}),
})
const answer = await res.json(){ … 4 fält }
"routes": [ … 2 st ],
{ … 7 fält },
"visits": [ … 7 st ],
{ … 12 fält },
"load": { … 1 fält },
{ … 12 fält },
"load": { … 1 fält },
{ … 12 fält },
"load": { … 1 fält },
{ … 12 fält },
"load": { … 1 fält },
{ … 12 fält },
"load": { … 1 fält },
{ … 12 fält },
"load": { … 1 fält },
{ … 12 fält }
"load": { … 1 fält },
"legs": [ … 6 st ],
{ … 12 fält },
"geometry": { … 2 fält },
"coordinates": [ … 4 st ]
"segments": [ … 3 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält }
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 12 fält },
"geometry": { … 2 fält },
"coordinates": [ … 3 st ]
"segments": [ … 2 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält }
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 12 fält },
"geometry": { … 2 fält },
"coordinates": [ … 5 st ]
"segments": [ … 4 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält }
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 12 fält },
"geometry": { … 2 fält },
"coordinates": [ … 4 st ]
"segments": [ … 3 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält }
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 12 fält },
"geometry": { … 2 fält },
"coordinates": [ … 3 st ]
"segments": [ … 2 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält }
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 12 fält }
"geometry": { … 2 fält },
"coordinates": [ … 2 st ]
"segments": [ … 1 st ]
{ … 4 fält }
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 7 fält }
"visits": [ … 7 st ],
{ … 12 fält },
"load": { … 1 fält },
{ … 12 fält },
"load": { … 1 fält },
{ … 12 fält },
"load": { … 1 fält },
{ … 12 fält },
"load": { … 1 fält },
{ … 12 fält },
"load": { … 1 fält },
{ … 12 fält },
"load": { … 1 fält },
{ … 12 fält }
"load": { … 1 fält },
"legs": [ … 6 st ],
{ … 12 fält },
"geometry": { … 2 fält },
"coordinates": [ … 3 st ]
"segments": [ … 2 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält }
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 12 fält },
"geometry": { … 2 fält },
"coordinates": [ … 3 st ]
"segments": [ … 2 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält }
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 12 fält },
"geometry": { … 2 fält },
"coordinates": [ … 4 st ]
"segments": [ … 3 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält }
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 12 fält },
"geometry": { … 2 fält },
"coordinates": [ … 4 st ]
"segments": [ … 3 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält }
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 12 fält },
"geometry": { … 2 fält },
"coordinates": [ … 7 st ]
"segments": [ … 6 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält }
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 12 fält }
"geometry": { … 2 fält },
"coordinates": [ … 6 st ]
"segments": [ … 5 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält },
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
{ … 4 fält }
"geometry": { … 2 fält }
"coordinates": [ … 2 st ]
"unassigned": [ … 2 st ],
{ … 5 fält },
{ … 5 fält }
"totals": { … 5 fält },
"provenance": { … 3 fält }
"network": { … 7 fält },
"sources": [ … 1 st ]
{ … 6 fält }
Punkterna är adresser i testdatas påhittade ort Ruttby, som ligger på verkliga koordinater väster om Umeå. Planen på /prova är inspelad på testdatas påhittade vägnät för orten. Med en nyckel räknar /v1/optimize samma punkter på NVDB:s riktiga vägnät där, med en testnyckel som med en livenyckel, så samma anrop ger en annan plan. Skicka era egna punkter.
Beräknad på testdatans påhittade vägnät (syntetiskt), nät snap_01m4r5arrje04t6p4z2j6ntdgy.