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

  • RuttoptimeringPOST /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.

  • RuttkontrollPOST /v1/optimize/check

    Tidsätter era egna rutter, i er ordning, och svarar med det som bryter mot kapacitet, tidsfönster och övriga villkor.

  • JobbPOST /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 på sidan för utvecklare.

Prova och kom igång