> ## Documentation Index
> Fetch the complete documentation index at: https://developers.kardinal.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Parcel & express

> Pickup/drop-off point rounds gated by capacity, zone preference, a mixed last-mile fleet, and predictive traffic on one urban network.

A parcel and express network runs a mixed fleet — vans, bikes, walkers — out of one or a few urban depots, serving high-volume same-day and next-day deliveries alongside PUDO (pickup/drop-off point) rounds. Drivers tend to specialize in a sector they know, and travel time in a dense city center is dominated by traffic that's largely predictable hour to hour.

## What makes this vertical distinctive

* **PUDO gated by capacity** — a PUDO pickup only gets scheduled once the vehicle still has room for it, not on a fixed slot regardless of load.
* **Preferred zones** — drivers are softly tied to their usual sector, and only pulled elsewhere once it's been served or would otherwise overflow.
* **Mixed last-mile fleet** — vans, bikes, and walkers each cover the part of the city they're actually suited to.
* **Predictive traffic** — forecast travel time is baked into the route calculation itself, not patched onto the result afterward.

## Combined example

```json theme={null}
{
  "resources": [
    {
      "id": "van-1",
      "vehicleProfile": { "type": "car", "withTraffic": true },
      "capacities": { "parcels": 40, "weight": 600, "nbDeliveries": 8, "nbPickups": 2 },
      "preferredStopTags": ["zone:usual-sector-7"]
    },
    {
      "id": "bike-1",
      "vehicleProfile": { "type": "bicycle" },
      "capacities": { "parcels": 12, "weight": 50, "nbDeliveries": 8, "nbPickups": 2 },
      "tags": ["zone:dense-center"]
    },
    {
      "id": "walker-1",
      "vehicleProfile": { "type": "pedestrian" },
      "capacities": { "parcels": 6, "weight": 20, "nbDeliveries": 8, "nbPickups": 2 },
      "tags": ["zone:pedestrian-only"]
    }
  ],
  "orders": [
    {
      "id": "order-standard-delivery",
      "stops": [
        {
          "type": "single",
          "id": "stop-customer-1",
          "position": { "lon": 2.3622, "lat": 48.8386 },
          "kind": "delivery",
          "operationDuration": "PT8M",
          "capacities": { "parcels": 1, "weight": 150, "nbDeliveries": 1 },
          "tags": ["zone:usual-sector-7"]
        }
      ]
    },
    {
      "id": "order-late-pickup",
      "stops": [
        {
          "type": "single",
          "id": "stop-pudo-pickup",
          "position": { "lon": 2.3222, "lat": 48.8716 },
          "kind": "pickup",
          "operationDuration": "PT3M",
          "capacities": { "parcels": 1, "weight": 15, "nbPickups": 1 }
        }
      ]
    }
  ],
  "additionalConstraints": [
    {
      "type": "atLeastOneValidCapacity",
      "capacities": { "nbDeliveries": 0, "nbPickups": 0, "weight": 300 },
      "name": "pudo-pickup-once-under-300kg"
    }
  ]
}
```

### Gating a pickup by remaining capacity

`order-late-pickup`'s stop carries no time window of its own. Instead, every delivery stop carries `nbDeliveries: 1` and the PUDO pickup carries `nbPickups: 1`, both counters also declared on each resource, and an `atLeastOneValidCapacity` constraint requires, at every stop, at least one of three things to hold: no delivery left on board (`nbDeliveries: 0`), no pickup done yet (`nbPickups: 0`), or no more than 300 kg on board (`weight: 300`). Since `nbPickups` never drops back to `0` once the pickup is loaded, the engine can only place it once the vehicle's deliveries are done or its load is light enough, which in practice pushes it toward the end of a round rather than the start. See [Sequencing pickups after deliveries](/guides/advanced-constraints#sequencing-pickups-after-deliveries) for the same pattern traced step by step.

### Preferred zones

`van-1.preferredStopTags: ["zone:usual-sector-7"]` is matched against the same tag on `stop-customer-1`. This is a soft pull, scored through the `maximizePreferredStops` objective, not a hard restriction — a van without spare capacity in its sector still gets sent to overflow stops tagged `zone:overflow` elsewhere. It's the same `preferredStopTags` mechanism [Driver skills and qualifications](/guides/advanced-constraints#driver-skills-and-qualifications) documents for a skill preference, applied here to a zone instead.

### Mixed last-mile fleet

`vehicleProfile.type` differs per resource (`car`, `bicycle`, `pedestrian`), each sized with its own `capacities` — a walker carries a handful of parcels, a van dozens. The engine assigns each stop to whichever profile can legally and practically reach it. See [Vehicle profiles](/reference/data-model#vehicle-profiles).

### Predictive traffic

`van-1.vehicleProfile.withTraffic: true` makes the engine use forecast travel times for that vehicle's legs instead of free-flow distances, so the plan already accounts for congestion rather than needing a correction pass after the fact.

## Full payload

<Accordion title="Full payload — ready to submit as POST /plans">
  The preceding example isolates the four mechanisms this vertical needs; this expands it to the scale of a real working day — a full fleet schedule (`workingTimeWindow`, `departure`, `arrival`), the complete `objectives` list, and enough orders to look like an actual route rather than a minimal illustration. Submit it as-is via [`POST /plans`](/api-reference/plan/create-a-plan) — the service assigns the plan's `id`, so don't include one of your own.

  ```json theme={null}
  {
    "tz": "Europe/Paris",
    "resources": [
      {
        "id": "van-1",
        "vehicleProfile": { "type": "car", "withTraffic": true },
        "workingTimeWindow": { "begin": "2026-08-03T07:00:00Z", "end": "2026-08-03T17:00:00Z" },
        "departure": { "lon": 2.3522, "lat": 48.8566 },
        "arrival": { "lon": 2.3522, "lat": 48.8566 },
        "capacities": { "parcels": 40, "weight": 600, "volume": 3.5, "highValueParcels": 8, "nbDeliveries": 8, "nbPickups": 2 },
        "preferredStopTags": ["zone:usual-sector-7"],
        "breaks": [{ "type": "timeWindowBreak", "duration": "PT45M", "timeWindow": { "begin": "2026-08-03T12:00:00Z", "end": "2026-08-03T14:00:00Z" } }]
      },
      {
        "id": "van-2",
        "vehicleProfile": { "type": "car", "withTraffic": true },
        "workingTimeWindow": { "begin": "2026-08-03T07:00:00Z", "end": "2026-08-03T17:00:00Z" },
        "departure": { "lon": 2.3522, "lat": 48.8566 },
        "arrival": { "lon": 2.3522, "lat": 48.8566 },
        "capacities": { "parcels": 40, "weight": 600, "nbDeliveries": 8, "nbPickups": 2 },
        "breaks": [{ "type": "timeWindowBreak", "duration": "PT45M", "timeWindow": { "begin": "2026-08-03T12:00:00Z", "end": "2026-08-03T14:00:00Z" } }]
      },
      {
        "id": "bike-1",
        "vehicleProfile": { "type": "bicycle" },
        "workingTimeWindow": { "begin": "2026-08-03T07:00:00Z", "end": "2026-08-03T17:00:00Z" },
        "departure": { "lon": 2.3522, "lat": 48.8566 },
        "arrival": { "lon": 2.3522, "lat": 48.8566 },
        "capacities": { "parcels": 12, "weight": 50, "nbDeliveries": 8, "nbPickups": 2 },
        "tags": ["zone:dense-center"]
      },
      {
        "id": "walker-1",
        "vehicleProfile": { "type": "pedestrian" },
        "workingTimeWindow": { "begin": "2026-08-03T07:00:00Z", "end": "2026-08-03T17:00:00Z" },
        "departure": { "lon": 2.3522, "lat": 48.8566 },
        "arrival": { "lon": 2.3522, "lat": 48.8566 },
        "capacities": { "parcels": 6, "weight": 20, "nbDeliveries": 8, "nbPickups": 2 },
        "tags": ["zone:pedestrian-only"]
      }
    ],
    "orders": [
      {
        "id": "order-paired-shipment",
        "stops": [
          { "type": "single", "id": "stop-pickup-shop", "position": { "lon": 2.3672, "lat": 48.8666 }, "kind": "pickup", "operationDuration": "PT4M", "capacities": { "parcels": 1, "weight": 12, "nbPickups": 1 } },
          { "type": "single", "id": "stop-delivery-customer", "position": { "lon": 2.3322, "lat": 48.8646 }, "kind": "delivery", "operationDuration": "PT3M", "capacities": { "parcels": 1, "weight": 12, "nbDeliveries": 1 } }
        ],
        "successiveStops": false
      },
      {
        "id": "order-standard-delivery",
        "stops": [
          {
            "type": "single",
            "id": "stop-customer-1",
            "position": { "lon": 2.3622, "lat": 48.8386 },
            "kind": "delivery",
            "operationDuration": "PT8M",
            "capacities": { "parcels": 1, "weight": 150, "nbDeliveries": 1 },
            "tags": ["zone:usual-sector-7", "customer-slot"],
            "authorizedTimeWindows": [{ "begin": "2026-08-03T08:00:00Z", "end": "2026-08-03T18:00:00Z" }],
            "preferredTimeWindows": [{ "begin": "2026-08-03T14:00:00Z", "end": "2026-08-03T16:00:00Z" }]
          }
        ]
      },
      {
        "id": "order-late-pickup",
        "stops": [{ "type": "single", "id": "stop-pudo-pickup", "position": { "lon": 2.3222, "lat": 48.8716 }, "kind": "pickup", "operationDuration": "PT3M", "capacities": { "parcels": 1, "weight": 15, "nbPickups": 1 } }]
      },
      {
        "id": "order-delivery-0",
        "stops": [{ "type": "single", "id": "stop-delivery-0", "position": { "lon": 2.3622, "lat": 48.8386 }, "kind": "delivery", "operationDuration": "PT2M", "capacities": { "parcels": 1, "weight": 100, "nbDeliveries": 1 }, "tags": ["zone:usual-sector-7"] }]
      },
      {
        "id": "order-delivery-1",
        "stops": [{ "type": "single", "id": "stop-delivery-1", "position": { "lon": 2.3402, "lat": 48.8426 }, "kind": "delivery", "operationDuration": "PT2M", "capacities": { "parcels": 1, "weight": 100, "nbDeliveries": 1 }, "tags": ["zone:usual-sector-7"] }]
      },
      {
        "id": "order-delivery-2",
        "stops": [{ "type": "single", "id": "stop-delivery-2", "position": { "lon": 2.3772, "lat": 48.8516 }, "kind": "delivery", "operationDuration": "PT2M", "capacities": { "parcels": 1, "weight": 100, "nbDeliveries": 1 }, "tags": ["zone:usual-sector-7"] }]
      },
      {
        "id": "order-delivery-3",
        "stops": [{ "type": "single", "id": "stop-delivery-3", "position": { "lon": 2.3222, "lat": 48.8716 }, "kind": "delivery", "operationDuration": "PT2M", "capacities": { "parcels": 1, "weight": 100, "nbDeliveries": 1 }, "tags": ["zone:overflow"] }]
      },
      {
        "id": "order-delivery-4",
        "stops": [{ "type": "single", "id": "stop-delivery-4", "position": { "lon": 2.3572, "lat": 48.8786 }, "kind": "delivery", "operationDuration": "PT2M", "capacities": { "parcels": 1, "weight": 100, "nbDeliveries": 1 }, "tags": ["zone:overflow"] }]
      },
      {
        "id": "order-delivery-5",
        "stops": [{ "type": "single", "id": "stop-delivery-5", "position": { "lon": 2.3442, "lat": 48.8306 }, "kind": "delivery", "operationDuration": "PT2M", "capacities": { "parcels": 1, "weight": 100, "nbDeliveries": 1 }, "tags": ["zone:overflow"] }]
      }
    ],
    "objectives": ["maximizeMandatoryStops", "minimizeResources", "minimizeDelay", "minimizeLargestTourDuration", "maximizePreferredStops", "minimizeDistance", "minimizeWorkingDuration"],
    "additionalConstraints": [
      { "type": "atLeastOneValidCapacity", "capacities": { "nbDeliveries": 0, "nbPickups": 0, "weight": 300 }, "name": "pudo-pickup-once-under-300kg" }
    ]
  }
  ```
</Accordion>

## See also

* [Modeling advanced constraints](/guides/advanced-constraints#sequencing-pickups-after-deliveries) — the `atLeastOneValidCapacity` mechanism behind PUDO gating.
* [Modeling advanced constraints](/guides/advanced-constraints#driver-skills-and-qualifications) — `preferredStopTags`, the soft mechanism behind zone preference.
* [Data model](/reference/data-model#vehicle-profiles) — vehicle profile types and the fields that vary per profile.
* [Data model](/reference/data-model#constraints-catalog) — the full `additionalConstraints` and `globalConstraints` catalog.

Ready to model an operation like this one? [Send your first API call](/getting-started/first-api-call) with your own data, or contact [customer.success@kardinal.ai](mailto:customer.success@kardinal.ai) to walk through your specific constraints.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.