# POST /v1/optimize/check

> Index: https://kartpunkt.se/llms.txt

operationId: `checkPlan`. Check a given plan of vehicles' routes.
Tag: `planning`.

Your own routes, timed and loaded on the network as POST /v1/optimize times its own and in its shapes, so the two compare field for field. What a route breaks is answered in violations and a task in no route in unassigned: a broken plan is answered, never refused. To have the plan made for you, use POST /v1/optimize; above the synchronous limits, send the same input as a job.

## Request

`POST https://api.kartpunkt.se/v1/optimize/check` with `Authorization: Bearer $KARTPUNKT_API_KEY` and `Content-Type: application/json`, from your backend (never browser code: the key would leak, and CORS is not enabled).

Example body:

```json
{
  "vehicles": [
    {
      "id": "bus1",
      "start": {
        "lat": 63.720434,
        "lon": 19.348226,
        "street": "Skolvägen"
      },
      "end": {
        "lat": 63.72059,
        "lon": 19.342166,
        "street": "Skolvägen"
      },
      "capacity": {
        "seats": 20
      },
      "time_window": {
        "start": "2026-10-13T07:00:00.000Z",
        "end": "2026-10-13T07:01:00.000Z"
      }
    }
  ],
  "stops": [
    {
      "id": "s1",
      "at": {
        "lat": 63.724508,
        "lon": 19.339523,
        "street": "Norrgatan"
      },
      "pickup": {
        "seats": 4
      },
      "service_s": 30
    },
    {
      "id": "s2",
      "at": {
        "lat": 63.718529,
        "lon": 19.418702,
        "street": "Östbyvägen"
      },
      "pickup": {
        "seats": 2
      },
      "service_s": 30
    },
    {
      "id": "s3",
      "at": {
        "lat": 63.725224,
        "lon": 19.282034,
        "street": "Skogsbyvägen"
      },
      "pickup": {
        "seats": 1
      }
    }
  ],
  "profile": "car_fastest",
  "routes": [
    {
      "vehicle_id": "bus1",
      "visits": [
        {
          "kind": "stop",
          "id": "s1"
        },
        {
          "kind": "stop",
          "id": "s2"
        }
      ]
    }
  ]
}
```

JSON body:

- `vehicles` (array of object, 1..5 items, required)
  - `id` (string, max 64 chars, required): Your own id for the vehicle, echoed in the answer and never stored. Unique among the vehicles, stops and shipments of one request.
  - `start` ([StreetPoint](https://api.kartpunkt.se/docs/shapes/StreetPoint.md), required): Where the vehicle starts: a depot, a garage.
  - `end` ([StreetPoint](https://api.kartpunkt.se/docs/shapes/StreetPoint.md), optional): Where it must end; left out, its route ends at its last task.
  - `capacity` (object, optional): What the vehicle carries at most, per dimension you name, e.g. { "seats": 4, "wheelchair": 1 }: whole numbers. A dimension left out is 0.
  - `dimensions` ([Vehicle](https://api.kartpunkt.se/docs/shapes/Vehicle.md), optional): The vehicle's weight, axle load, height, width, length and hazmat, on a profile whose takes_vehicle is true in GET /v1/profiles (hgv). A road whose recorded limit is below it is not used for this vehicle. The plan's matrix is computed once per distinct dimensions sent.
  - `time_window` (object, optional): When the vehicle is available: it leaves start no earlier and reaches end no later. Left out, any time: its visits' arrival and departure are null, and only the _s fields time them.
    - `start` (string, date-time (RFC 3339, with offset), required): From (RFC 3339 with offset).
    - `end` (string, date-time (RFC 3339, with offset), required): Until (RFC 3339 with offset).
  - `max_travel_s` (integer <= 86400, optional): At most this many seconds driving, from start to end; waiting and service not counted.
  - `skills` (array of string, max 64 chars, 0..20 items, optional): Your own strings: what this vehicle can do.
- `stops` (array of object, 0..25 items, optional, default [])
  - `id` (string, max 64 chars, required): Your own id for the stop, echoed in the answer and never stored. Unique among the vehicles, stops and shipments of one request.
  - `at` ([StreetPoint](https://api.kartpunkt.se/docs/shapes/StreetPoint.md) | [AddressIdPlace](https://api.kartpunkt.se/docs/shapes/AddressIdPlace.md), required): Where: { lat, lon, street? } as every point, or { address_id, as_of? } to route from the address's own point. Each address id resolved is metered as an address read and the call as a live call (kp_live_ keys); a stop whose id resolves to no address served is answered unassigned_address_id, not refused.
  - `pickup` (object, optional): Loaded at this stop and carried to the vehicle's end (passengers boarding, bins emptied into the truck), per dimension you name, e.g. { "seats": 4, "wheelchair": 1 }: whole numbers. A dimension left out is 0.
  - `delivery` (object, optional): Loaded at the vehicle's start and set down here (meals, parcels from the depot), per dimension you name, e.g. { "seats": 4, "wheelchair": 1 }: whole numbers. A dimension left out is 0.
  - `service_s` (integer 0..86400, optional, default 0): Seconds spent at the place, after arrival and any wait.
  - `time_windows` (array of object, 1..4 items, optional): When service may start here: one or more windows. Left out, any time within the vehicle's.
    - `start` (string, date-time (RFC 3339, with offset), required): From (RFC 3339 with offset).
    - `end` (string, date-time (RFC 3339, with offset), required): Until (RFC 3339 with offset).
  - `skills` (array of string, max 64 chars, 0..20 items, optional): Your own strings, e.g. 'wheelchair_lift', 'crane': a task goes only to a vehicle with every skill it names.
- `shipments` (array of object, 0..12 items, optional, default [])
  - `id` (string, max 64 chars, required): Your own id for the shipment, echoed in the answer and never stored. Unique among the vehicles, stops and shipments of one request.
  - `pickup` (object, required): Where the amount is picked up.
    - `at` ([StreetPoint](https://api.kartpunkt.se/docs/shapes/StreetPoint.md) | [AddressIdPlace](https://api.kartpunkt.se/docs/shapes/AddressIdPlace.md), required): Where: { lat, lon, street? } as every point, or { address_id, as_of? } to route from the address's own point. Each address id resolved is metered as an address read and the call as a live call (kp_live_ keys); a stop whose id resolves to no address served is answered unassigned_address_id, not refused.
    - `service_s` (integer 0..86400, optional, default 0): Seconds spent at the place, after arrival and any wait.
    - `time_windows` (array of object, 1..4 items, optional): When service may start here: one or more windows. Left out, any time within the vehicle's.
      - `start` (string, date-time (RFC 3339, with offset), required): From (RFC 3339 with offset).
      - `end` (string, date-time (RFC 3339, with offset), required): Until (RFC 3339 with offset).
  - `delivery` (object, required): Where it is set down: by the same vehicle, after the pickup.
    - `at` ([StreetPoint](https://api.kartpunkt.se/docs/shapes/StreetPoint.md) | [AddressIdPlace](https://api.kartpunkt.se/docs/shapes/AddressIdPlace.md), required): Where: { lat, lon, street? } as every point, or { address_id, as_of? } to route from the address's own point. Each address id resolved is metered as an address read and the call as a live call (kp_live_ keys); a stop whose id resolves to no address served is answered unassigned_address_id, not refused.
    - `service_s` (integer 0..86400, optional, default 0): Seconds spent at the place, after arrival and any wait.
    - `time_windows` (array of object, 1..4 items, optional): When service may start here: one or more windows. Left out, any time within the vehicle's.
      - `start` (string, date-time (RFC 3339, with offset), required): From (RFC 3339 with offset).
      - `end` (string, date-time (RFC 3339, with offset), required): Until (RFC 3339 with offset).
  - `amount` (object, optional): What travels from pickup to delivery, per dimension you name, e.g. { "seats": 4, "wheelchair": 1 }: whole numbers. A dimension left out is 0.
  - `max_ride_s` (integer <= 86400, optional): At most this many seconds from leaving the pickup to arriving at the delivery. Checked on the plan made without it: a shipment over it is taken out and answered unassigned_max_ride, never re-planned.
  - `skills` (array of string, max 64 chars, 0..20 items, optional): Your own strings, e.g. 'wheelchair_lift', 'crane': a task goes only to a vehicle with every skill it names.
- `avoid` ([Avoid](https://api.kartpunkt.se/docs/shapes/Avoid.md), optional)
- `prefer` (array of [Preference](https://api.kartpunkt.se/docs/shapes/Preference.md), 0..6 items, optional): Facts to prefer to keep off, on any profile, each once. Left out or [], the profile's own weighing.
- `profile` ([Profile](https://api.kartpunkt.se/docs/shapes/Profile.md), required): How the legs are weighed: see GET /v1/profiles. A plan's durations are each leg's as /v1/route answers it.
- `facts` (array of "speed_limit" | "road_owner" | "surface" | "road_class" | "network" | "gcm_type" | "municipality" | "road_name" | "road_number" | "traffic_safety_class" | "built_up" | "lit" | "separated" | "ferry" | "motorway" | "fast_road" | "speed_limit_varies" | "unlit_outside_built_up" | "traffic_volume" | "crossings_without_refuge" | "crossings_unknown_refuge" | "level_crossings" | "max_weight" | "max_axle_load" | "max_height" | "max_width" | "max_length" | "bearing_class" | "hgv_banned" | "hazmat_banned" | "hazmat_route" | "timed_restriction" | "structure" | "barriers", 0..34 items, optional): The facts to report over each leg: see GET /v1/facts. With facts or geometry, the answer has legs.
- `geometry` ("geojson" | "polyline6" | "none", optional, default "none"): Each leg's line and its stretches with road references: GeoJSON, an encoded polyline at 6 decimals, or not at all (the default).
- `network` ([NetworkSelector](https://api.kartpunkt.se/docs/shapes/NetworkSelector.md), optional)
- `routes` (array of object, 0..5 items, required): The plan to check: per vehicle, its visits in order. A task in no route is answered in unassigned; an id naming nothing sent, a visit of the wrong kind, a task visited twice or a vehicle twice is refused 400 invalid_request.
  - `vehicle_id` (string, max 64 chars, required): The vehicle's id, as sent in vehicles.
  - `visits` (array of object, 0..49 items, required): The vehicle's tasks in the order it visits them, its start and end left out: they are the vehicle's own. The kind and id of an optimize answer's visits, without start and end, are a plan.
    - `kind` ("stop" | "pickup" | "delivery", required): 'stop' for a stop; 'pickup' or 'delivery' for a shipment's two places.
    - `id` (string, max 64 chars, required): The stop's or shipment's id, as sent in stops or shipments.

## Response 200

Example:

```json
{
  "feasible": false,
  "routes": [
    {
      "vehicle_id": "bus1",
      "visits": [
        {
          "kind": "start",
          "id": null,
          "snap_m": 11.96,
          "street_matched": true,
          "arrival": "2026-10-13T07:00:00.000Z",
          "departure": "2026-10-13T07:01:00.000Z",
          "arrival_s": 0,
          "waiting_s": 0,
          "service_s": 0,
          "load": {
            "seats": 0
          },
          "distance_m": 0,
          "duration_s": 0
        },
        {
          "kind": "stop",
          "id": "s1",
          "snap_m": 11.98,
          "street_matched": true,
          "arrival": "2026-10-13T07:02:00.000Z",
          "departure": "2026-10-13T07:03:00.000Z",
          "arrival_s": 77,
          "waiting_s": 0,
          "service_s": 30,
          "load": {
            "seats": 4
          },
          "distance_m": 860,
          "duration_s": 77.4
        },
        {
          "kind": "stop",
          "id": "s2",
          "snap_m": 15.02,
          "street_matched": true,
          "arrival": "2026-10-13T07:04:00.000Z",
          "departure": "2026-10-13T07:05:00.000Z",
          "arrival_s": 327,
          "waiting_s": 0,
          "service_s": 30,
          "load": {
            "seats": 6
          },
          "distance_m": 4350,
          "duration_s": 219.7
        },
        {
          "kind": "end",
          "id": null,
          "snap_m": 14.97,
          "street_matched": true,
          "arrival": "2026-10-13T07:06:00.000Z",
          "departure": "2026-10-13T07:07:00.000Z",
          "arrival_s": 526,
          "waiting_s": 0,
          "service_s": 0,
          "load": {
            "seats": 6
          },
          "distance_m": 3790,
          "duration_s": 169.3
        }
      ],
      "legs": null,
      "distance_m": 9000.1,
      "duration_s": 526,
      "waiting_s": 0,
      "service_s": 60
    }
  ],
  "unassigned": [
    {
      "kind": "stop",
      "id": "s3",
      "reason": "unassigned_not_in_plan",
      "message": "The plan you sent places this task in no route. Add it to a vehicle's visits, or leave it out of stops and shipments if it is planned elsewhere.",
      "blocked_by": null
    }
  ],
  "violations": [],
  "totals": {
    "vehicles_used": 1,
    "distance_m": 9000.1,
    "duration_s": 526,
    "waiting_s": 0,
    "service_s": 60
  },
  "provenance": {
    "synthetic": true,
    "network": {
      "id": "snap_01k7exampleexampleexample0",
      "dataset": "nvdb",
      "source_date": "2026-10-13",
      "built_at": "2026-10-13T07:08:00.000Z",
      "graph": "snap_01k7exampleexampleexample0",
      "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"
      }
    ]
  }
}
```

- `feasible` (boolean): true when no route breaks anything and every task is in a route: violations and unassigned are both [].
- `routes` (array of object): One per vehicle in routes with a visit, in the order of vehicles sent: optimize's route shape, timed and loaded as optimize times and loads a plan.
  - `vehicle_id` (string): The vehicle's id, as sent.
  - `visits` (array of object): In the order driven: start, each task, end (where one was sent).
    - `kind` ("start" | "stop" | "pickup" | "delivery" | "end"): 'start' and 'end' are the vehicle's own; 'stop' a stop; 'pickup' and 'delivery' a shipment's two places.
    - `id` (string | null): The stop's or shipment's id; null at the vehicle's start and end.
    - `snap_m` (number | null): Straight-line metres from the point sent to where it meets the profile's network; not included in distance_m. null when no road of the network lies within 500 m: the status is then no_road_near.
    - `street_matched` (boolean | null): Whether the place met the road of the street sent; null without a street, and at a place sent as an address id (the answer holds nothing of the address).
    - `arrival` (string | null): RFC 3339, in the offset of the vehicle's time_window; null without one.
    - `departure` (string | null): RFC 3339: arrival, any wait and service_s later; null without a time_window.
    - `arrival_s` (number): Seconds from leaving start to arriving here.
    - `waiting_s` (number): Seconds waited here for a time window to open.
    - `service_s` (number): Seconds of service here, as sent.
    - `load` (object): On board when leaving here, per dimension named in the request.
    - `distance_m` (number): Metres along the network from the previous visit (0 at start).
    - `duration_s` (number): Seconds driving from the previous visit at free flow (0 at start).
  - `legs` (array of object | null): With facts or geometry, one leg from each visit to the next, in order: visits.length − 1 of them. null without either.
    - `status` ("ok" | "no_path" | "ferry_required" | "no_road_near" | "avoided_road_required"): Whether a path joins the two points, and why not: 'ok', a path. 'no_road_near': no road within 500 m of an end. 'no_path': the network joins none. 'ferry_required': only a ferry does. 'avoided_road_required': only what avoid keeps off does, or an end lies on it. Each is a 200 answer, not an error: see "When there is no path".
    - `distance_m` (number | null): Metres along the network between where the ends meet it; null unless status is 'ok'.
    - `duration_s` (number | null): Seconds at free flow: the posted limit, capped at 80 km/h on hgv, and 5 km/h on foot. No traffic. null unless status is 'ok'.
    - `facts` (object): The facts asked for, over the path.
    - `geometry` (object | string | null, optional): The path as one line, in the format asked; null unless status is 'ok'. Left out with geometry 'none'.
      - `type` ("LineString")
      - `coordinates` (array of array of number)
    - `avoid_m` (array of number | null): With avoid.stretches, the path's metres on each stretch, in the order sent, 0 for one it does not touch: metres, never a verdict. null without stretches, or unless status is 'ok'.
    - `snap_m` (number | null): Straight-line metres from the origin's point to where this path starts; without a path, to where the origin met the network. It is not included in distance_m. null only when the origin met no road within 500 m (no_road_near).
    - `street_matched` (boolean | null): With a street sent with the origin: true when this path starts on a road of that name, false when on another. null when no street was sent, or the origin met no road.
    - `destination_snap_m` (number | null): The same as snap_m, for the destination.
    - `destination_street_matched` (boolean | null): The same as street_matched, for the destination.
    - `blocked_by` (array of object | null): With 'avoided_road_required', the avoid entries in the way; null otherwise. Of those the path without avoid runs along or crosses, each that, lifted alone, lets a path keep off the rest; where none alone does, all of them. Where an end meets the network on a road kept off, with no other way on, those that keep off its road.
      - `field` ("stretches" | "facts" | "values"): The list in avoid the entry was sent in.
      - `index` (integer): Its index in that list, from 0.
      - `id` (string | null): The id sent with it; null where none was.
    - `segments` (array of [Segment](https://api.kartpunkt.se/docs/shapes/Segment.md)): The leg's stretches with their road references (ADR-0013), in order; with geometry, each with its line.
  - `distance_m` (number): Metres along the network over the whole route.
  - `duration_s` (number): Seconds from leaving start to the last visit: driving, waiting and service.
  - `waiting_s` (number): Seconds waited for time windows to open, over the route.
  - `service_s` (number): Seconds of service, over the route.
- `unassigned` (array of object): Every stop and shipment in no route, with why. [] when the plan places every one.
  - `kind` ("stop" | "shipment"): Whether id names a stop or a shipment.
  - `id` (string): The stop's or shipment's id, as sent.
  - `reason` ("unassigned_not_in_plan" | "unassigned_address_id" | "unassigned_unreachable"): Why, as a code from ERRORS. unassigned_not_in_plan: no route places it. unassigned_address_id: its address id resolves to no address served, so its visits leave the route and the rest is checked as sent. unassigned_unreachable: no road joins it to the visit before or after.
  - `message` (string): The code's message from ERRORS, saying what to change; with unassigned_unreachable, the message for its cause.
  - `blocked_by` (array of object | null): With unassigned_unreachable where only roads kept off by avoid reach the task: what in avoid is in the way, as route's blocked_by. null otherwise.
    - `field` ("stretches" | "facts" | "values"): The list in avoid the entry was sent in.
    - `index` (integer): Its index in that list, from 0.
    - `id` (string | null): The id sent with it; null where none was.
  - `unreachable` ([Unreachable](https://api.kartpunkt.se/docs/shapes/Unreachable.md), optional): With unassigned_unreachable: which place, where it met the network and why no vehicle reaches it. Absent with every other reason. met is null for a place sent as an address id: the answer holds no point of the address.
  - `unresolved` ([Unresolved](https://api.kartpunkt.se/docs/shapes/Unresolved.md), optional): With unassigned_address_id: which place's address id resolved to no address served, and why. Absent with every other reason.
- `violations` (array of object): Everything the routes break, by route and visit in order. [] when the plan holds.
  - `code` ("plan_capacity" | "plan_time_window" | "plan_vehicle_time_window" | "plan_skills" | "plan_max_travel" | "plan_shipment_order" | "plan_max_ride"): What is broken, as a code from ERRORS: its page at /errors/{code} says what to change.
  - `message` (string): The code's message from ERRORS.
  - `vehicle_id` (string): The vehicle whose route breaks it.
  - `visit` (integer): Where: the index in the answered route's visits, 0 being start. It is the visit late or over capacity, the end for the vehicle's time_window and max_travel_s, and a shipment's delivery, else its pickup.
  - `kind` ("stop" | "pickup" | "delivery" | "end"): The kind of the visit at that index.
  - `id` (string | null): The stop's or shipment's id; null at the end.
  - `dimension` (string | null): With plan_capacity, the dimension over capacity; null otherwise.
  - `over` (number | null): By how much: seconds late or over for plan_time_window, plan_vehicle_time_window, plan_max_travel and plan_max_ride; the amount over capacity for plan_capacity; null for plan_skills and plan_shipment_order.
- `totals` (object): The routes summed.
  - `vehicles_used` (integer): Vehicles with at least one task.
  - `distance_m` (number): Metres, every route's together.
  - `duration_s` (number): Seconds, every route's duration_s together.
  - `waiting_s` (number): Seconds waited, every route's together.
  - `service_s` (number): Seconds of service, every route's together.
- `provenance` ([Provenance](https://api.kartpunkt.se/docs/shapes/Provenance.md))

## Errors

Every error is `{ error, message, param?, doc_url }`; `message` says what to do next. All codes: [https://api.kartpunkt.se/errors](https://api.kartpunkt.se/errors). What to do on each, with retries: [https://api.kartpunkt.se/docs/recipes/errors-and-retries.md](https://api.kartpunkt.se/docs/recipes/errors-and-retries.md).

- [`invalid_request`](https://api.kartpunkt.se/errors/invalid_request) (400): The request does not match the API schema. Fix the fields named in this message; see /openapi.json.
- [`unauthorized`](https://api.kartpunkt.se/errors/unauthorized) (401): Missing or unknown API key. Send it as 'Authorization: Bearer <key>' (or 'x-api-key'), read from the KARTPUNKT_API_KEY environment variable. The user creates a kp_test_ key on their Kartpunkt account page (https://kartpunkt.se/konto) and puts it in KARTPUNKT_API_KEY themselves; never ask them to paste a key into chat.
- [`live_access_required`](https://api.kartpunkt.se/errors/live_access_required) (403): This account is not approved for live data: kp_live_ keys are for customers under contract. Use a kp_test_ key. To ask for live access, the account holder writes to hej@kartpunkt.se, or orders a plan at https://kartpunkt.se/konto#plan.
- [`use_not_permitted`](https://api.kartpunkt.se/errors/use_not_permitted) (403): This operation would use a data source in a way its licence or approval does not allow (see GET /v1/sources). It cannot be answered for this key.
- [`network_unavailable`](https://api.kartpunkt.se/errors/network_unavailable) (404): No network snapshot matches that id or as_of. List the snapshots with GET /v1/networks and send one of their ids, or leave network out for the active one.
- [`network_not_active`](https://api.kartpunkt.se/errors/network_not_active) (409): That network snapshot is not the one served now, and answers on another snapshot are computed as jobs. Send the same input to POST /v1/jobs with this operation, then read GET /v1/jobs/{id}.
- [`profile_unavailable`](https://api.kartpunkt.se/errors/profile_unavailable) (409): This profile cannot be answered on the network snapshot asked for: it was built without the data the profile needs (see GET /v1/profiles and the snapshot's manifest at GET /v1/networks/{id}). Use another profile or a newer snapshot.
- [`network_pruned`](https://api.kartpunkt.se/errors/network_pruned) (410): That network snapshot was pruned: its tables and graph are deleted, so nothing can be answered on it again, as a job or otherwise. Leave network out to answer on the active network, and store that answer's provenance.network.id; GET /v1/networks lists the snapshots that are not pruned.
- [`too_large`](https://api.kartpunkt.se/errors/too_large) (413): Too much for one synchronous call. Send the same input to POST /v1/jobs with this operation and read the result from GET /v1/jobs/{id}, or split it.
- [`quota_exceeded`](https://api.kartpunkt.se/errors/quota_exceeded) (429): Request limit or plan quota reached (per minute, per day, or the account plan's monthly quota). Wait the number of seconds in the Retry-After header, then retry; without Retry-After, no wait helps: tell the account holder what this message says.
- [`internal_error`](https://api.kartpunkt.se/errors/internal_error) (500): Something failed on our side. Retry after a few seconds; if it keeps failing, contact hej@kartpunkt.se.
- [`live_data_unavailable`](https://api.kartpunkt.se/errors/live_data_unavailable) (503): Live data is not available yet: it opens when Kartpunkt's import of Lantmäteriet's address register completes. Use a kp_test_ key until then.
- [`routing_unavailable`](https://api.kartpunkt.se/errors/routing_unavailable) (503): Road distances and routes are not available yet: Kartpunkt's road graph from Trafikverket's NVDB has not been built. Try again later.

## Limits

| Limit | Synchronous | As a job (`POST /v1/jobs`, `operation: "check_plan"`) |
| --- | --- | --- |
| `stops` | 25 | 500 |
| `shipments` | 12 | 250 |
| `vehicles` | 5 | 50 |
| Distinct locations (stops, shipments' pickups and deliveries, vehicles' starts and ends) | 30 | 600 |
| An `avoid` entry with `mode: "barrier"` | refused 413 `too_large` | allowed |
| Ways of the network `avoid` keeps off | 20000 | 20000 |
| `prefer` (items) | 6 | 6 |
| `facts` (items) | 34 | 34 |
| `routes` (items) | 5 | 50 |
| Request body | 1 MB | 8 MB |

Above a synchronous limit the call is refused (413 `too_large`, or 400 `invalid_request` naming the field); send the same input as a job.

## Metering

Calculations: 1 per stop and per shipment sent.
