Ruttoptimering

# Ruttoptimering via API, på Trafikverkets vägnät

Ni skickar fordon och stopp, och API:et svarar vilket fordon som tar vilka stopp, i vilken ordning och när, med varje sträcka tidsatt på Trafikverkets vägnät NVDB.

## Operationerna

-   **Ruttoptimering**[`POST /v1/optimize`](https://api.kartpunkt.se/docs#tag/planning/POST/v1/optimize)
    
    Fördelar stopp och sändningar på fordonen inom kapacitet och tidsfönster. Ett stopp som inget fordon kan ta står i unassigned, med skälet.
    
-   **Ruttkontroll**[`POST /v1/optimize/check`](https://api.kartpunkt.se/docs#tag/planning/POST/v1/optimize/check)
    
    Tidsätter era egna rutter, i er ordning, och svarar med det som bryter mot kapacitet, tidsfönster och övriga villkor.
    
-   **Jobb**[`POST /v1/jobs`](https://api.kartpunkt.se/docs#tag/jobs/POST/v1/jobs)
    
    Samma indata som jobb, för en plan större än ett anrop tar. Jobb ingår från Bas.
    

## Ett anrop och dess svar

Två bilar med plats för 30 kärl var, och tio stopp som hämtar mellan 4 och 8 kärl. Målet är kortast total tid.

```
POST https://api.kartpunkt.se/v1/optimize
Authorization: Bearer $KARTPUNKT_API_KEY
Content-Type: application/json

{
  "vehicles": [
    {
      "id": "bil-1",
      "start": {"lat": 55.929161, "lon": 13.560304},
      "end": {"lat": 55.929161, "lon": 13.560304},
      "capacity": {"karl": 30}
    },
    {
      "id": "bil-2",
      "start": {"lat": 55.929161, "lon": 13.560304},
      "end": {"lat": 55.929161, "lon": 13.560304},
      "capacity": {"karl": 30}
    }
  ],
  "stops": [
    {
      "id": "h01",
      "at": {"lat": 55.936634, "lon": 13.551388},
      "pickup": {"karl": 8},
      "service_s": 240
    },
    {
      "id": "h02",
      "at": {"lat": 55.941993, "lon": 13.546969},
      "pickup": {"karl": 6},
      "service_s": 180
    }
    // … 8 stopp till
  ],
  "objective": "duration",
  "profile": "car_fastest",
  "geometry": "geojson"
}
```

Svaret från api.kartpunkt.se, inspelat 2026-10-25. Rader som börjar med // … är utelämnade.

```
{
  "routes": [
    {
      "vehicle_id": "bil-1",
      "visits": [
        {
          "kind": "start",
          "id": null,
          "snap_m": 0.03,
          "street_matched": null,
          "arrival": null,
          "departure": null,
          "arrival_s": 0,
          "waiting_s": 0,
          "service_s": 0,
          "load": {"karl": 0},
          "distance_m": 0,
          "duration_s": 0
        },
        {
          "kind": "stop",
          "id": "h04",
          "snap_m": 0.06,
          "street_matched": null,
          "arrival": null,
          "departure": null,
          "arrival_s": 269,
          "waiting_s": 0,
          "service_s": 150,
          "load": {"karl": 5},
          "distance_m": 2991.3,
          "duration_s": 268.7
        }
        // … 5 besök till
      ],
      "distance_m": 9958.8,
      "duration_s": 1729,
      "waiting_s": 0,
      "service_s": 870
      // … legs, varje sträcka med sin linje
    }
    // … 1 rutt till
  ],
  "unassigned": [],
  "totals": {
    "vehicles_used": 2,
    "distance_m": 17532.8,
    "duration_s": 3178,
    "waiting_s": 0,
    "service_s": 1680
  },
  "provenance": {
    "synthetic": false,
    "network": {
      "id": "snap_01m5jtxeacfk49vqky0fy1myje",
      "dataset": "nvdb",
      "source_date": "2026-10-13",
      "built_at": "2026-10-22T22:15:11.949Z",
      "graph": "snap_01m5k1bmzgfk49vt8z6wche2jr",
      "profile": "car_fastest",
      "experimental": false
    },
    "sources": [
      {
        "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-13"
      }
    ]
  }
}
```

## Vad svaret innehåller

Varje rutt har sina besök med ankomst, väntan, last och sträcka från förra besöket, och `totals` summerar planen. Ett stopp som inget fordon kan ta står i `unassigned` med ett skäl och vad ni kan ändra; en plan som inte går ihop besvaras alltså, den avvisas inte.

`provenance` anger nätversionen planen räknades på, NVDB:s leverans och källhänvisningen. Svaret är dokumenterat och daterat med nätversion.

## Pröva en plan ni redan har

Samma tio stopp i listans ordning, fem per bil, gick till `/v1/optimize/check`. Svaret blev `"feasible": false`: bil-1 lastar 3 kärl mer än det får plats vid stopp h05 (`plan_capacity`). Ruttkontrollen räknar på samma vägnät och i samma fält som ruttoptimeringen, så de två planerna går att jämföra fält för fält.

## Hur stor en plan kan vara

En plan direkt till `/v1/optimize` svarar i samma anrop. En större plan går som jobb, upp till ett par hundra hämtpunkter i ett jobb. Gränserna står under [Gränser](https://kartpunkt.se/utvecklare#granser) på sidan för utvecklare.

## Prova och kom igång

-   [Prova ruttoptimering och ruttkontroll på kartan, utan nyckel](https://kartpunkt.se/#prova-ruttoptimering)
-   [Skapa en gratis testnyckel](https://kartpunkt.se/konto). Den räknar på NVDB:s riktiga vägnät, med testadresser i samma format som livedata.
-   Fälten och felkoderna står i [API-referensen](https://api.kartpunkt.se/docs#tag/planning/POST/v1/optimize), och integrationen för en kodagent på [sidan för utvecklare](https://kartpunkt.se/utvecklare). Vad planerna kostar står under [Priser](https://kartpunkt.se/priser).

> Skicka fordon och stopp, få tillbaka vilket fordon som tar vilka stopp, i vilken ordning och när, tidsatt på NVDB:s vägnät. Och pröva en plan ni redan har.
>
> https://kartpunkt.se/ruttoptimering
