Skip to content

Choose a delivery option

To let a buyer choose how their order arrives, put a GET between create and submit:

  1. Create the checkout — Komplett prepares a delivery menu for it.
  2. Get the checkout — read delivery.options.
  3. Submit with deliveryOptionId set to the id of the chosen option.

GET /checkout/v1/019fd6cac2fd7383ac6d759468e7360c

Response — 200 OK

{
"checkoutId": "019fd6cac2fd7383ac6d759468e7360c",
"status": "Created",
"delivery": {
"options": [
{
"id": "do_dff9ba360a7b4cc5b082e8736d32a3ac",
"type": "BusinessDelivery",
"displayName": "Levering bedriftsadresse",
"express": false,
"price": { "gross": 0.0, "net": 0.0, "vat": 0.0 },
"transporter": "PostNord",
"collectionPoint": null
},
{
"id": "do_002ccf7a3d8d4716aca61599b2f322c5",
"type": "HomeDelivery",
"displayName": "Hjemlevering",
"express": false,
"price": { "gross": 578.75, "net": 463.0, "vat": 115.75 },
"transporter": "PostNord",
"collectionPoint": null
},
{
"id": "do_707b98a187d44415a6ccd3c5cb57c048",
"type": "PickupPoint",
"displayName": "Pick-up-Point Sandefjord (Kullerød)",
"express": false,
"price": { "gross": 0.0, "net": 0.0, "vat": 0.0 },
"transporter": "Komplett",
"collectionPoint": {
"id": "9999",
"name": "Pick-up-Point Sandefjord",
"addressLine": "Østre Kullerød 2",
"postCode": "3241",
"city": "Sandefjord",
"country": "NO"
}
}
]
}
}

POST /checkout/v1/submit
{
"checkoutId": "019fd6cac2fd7383ac6d759468e7360c",
"deliveryOptionId": "do_002ccf7a3d8d4716aca61599b2f322c5"
}

Response — 204 No Content — the order is placed with home delivery.


This is the single most important thing on this page. A menu regularly contains several options that share a type, a displayName, and even a price. Here is a real menu returned for one checkout — nine options, of which four are indistinguishable except by collectionPoint:

Response — a nine-option menu
{
"checkoutId": "019fd6ca09d577e3843e72b436c7007f",
"status": "Created",
"delivery": {
"options": [
{
"id": "do_b9e603f1222e47d4a97744a71ea0fa54",
"type": "BusinessDelivery",
"displayName": "Levering bedriftsadresse",
"express": false,
"price": { "gross": 0.0, "net": 0.0, "vat": 0.0 },
"transporter": "PostNord",
"collectionPoint": null
},
{
"id": "do_a6d2d89a833a4e3194cff02b67226dbb",
"type": "BusinessDelivery",
"displayName": "Levering bedriftsadresse",
"express": false,
"price": { "gross": 356.25, "net": 285.0, "vat": 71.25 },
"transporter": "Bring",
"collectionPoint": null
},
{
"id": "do_4adb6618861847b19c96a772f2571247",
"type": "PickupPoint",
"displayName": "Henting i butikk (MyPack)",
"express": false,
"price": { "gross": 198.75, "net": 159.0, "vat": 39.75 },
"transporter": "PostNord",
"collectionPoint": {
"id": "6331664",
"name": "Matkroken Huk",
"addressLine": "Langviksveien 15A",
"postCode": "0286",
"city": "OSLO",
"country": "NO"
}
},
{
"id": "do_6978280dfa55433eab84da230e17092f",
"type": "PickupPoint",
"displayName": "Henting i butikk (MyPack)",
"express": false,
"price": { "gross": 198.75, "net": 159.0, "vat": 39.75 },
"transporter": "PostNord",
"collectionPoint": {
"id": "50101823",
"name": "Vika Frukt Og Grønt As",
"addressLine": "Huitfeldts Gate 28A",
"postCode": "0253",
"city": "OSLO",
"country": "NO"
}
},
{
"id": "do_12942a4174f342038ad628ad5778cf05",
"type": "PickupPoint",
"displayName": "Henting i butikk (MyPack)",
"express": false,
"price": { "gross": 198.75, "net": 159.0, "vat": 39.75 },
"transporter": "PostNord",
"collectionPoint": {
"id": "3956315",
"name": "Prix Sørenga",
"addressLine": "Sørengkaia 8",
"postCode": "0194",
"city": "OSLO",
"country": "NO"
}
},
{
"id": "do_c356294e07ea4d3694737e9da1a303a5",
"type": "PickupPoint",
"displayName": "Henting i butikk (MyPack)",
"express": false,
"price": { "gross": 198.75, "net": 159.0, "vat": 39.75 },
"transporter": "PostNord",
"collectionPoint": {
"id": "50108356",
"name": "Joker Akersgata",
"addressLine": "Akersgata 5",
"postCode": "0158",
"city": "OSLO",
"country": "NO"
}
},
{
"id": "do_53250d906dd04e8e814b4bf7094248a5",
"type": "PickupPoint",
"displayName": "Hente i Butikk",
"express": false,
"price": { "gross": 251.25, "net": 201.0, "vat": 50.25 },
"transporter": "Bring",
"collectionPoint": {
"id": "171102",
"name": "Vika Postkontor",
"addressLine": "KLINGENBERGGATA 7",
"postCode": "0161",
"city": "OSLO",
"country": "NO"
}
},
{
"id": "do_8de321c382a64a16a67587ba42417fdf",
"type": "HomeDelivery",
"displayName": "Hjemlevering",
"express": false,
"price": { "gross": 276.25, "net": 221.0, "vat": 55.25 },
"transporter": "PostNord",
"collectionPoint": null
},
{
"id": "do_d3b593fee68c494e9629b6e7995209cc",
"type": "PickupPoint",
"displayName": "Pick-up-Point Sandefjord (Kullerød)",
"express": false,
"price": { "gross": 0.0, "net": 0.0, "vat": 0.0 },
"transporter": "Komplett",
"collectionPoint": {
"id": "9999",
"name": "Pick-up-Point Sandefjord",
"addressLine": "Østre Kullerød 2",
"postCode": "3241",
"city": "Sandefjord",
"country": "NO"
}
}
]
}
}

Notice:

  • Two BusinessDelivery options, same displayName, different transporter and price — one free from PostNord, one at 356.25 from Bring.
  • Four PickupPoint options all displaying “Henting i butikk (MyPack)” at the same price, differing only by which shop the parcel goes to.

So:

  • Address options by id, and only by id. Code that looks up an option by type or displayName will match an arbitrary one of several.
  • Render collectionPoint to disambiguate. For pickup options it is the only thing that tells the buyer where they are collecting from.
  • Do not deduplicate by label. Those four pickup points are four genuinely different places.

Field What to do with it
id The only selectable value. Opaque, and valid only for this checkout
type Group or icon the option. One of HomeDelivery, BusinessDelivery, Locker, PickupPoint, Mailbox, Electronic, Other. Treat any unrecognised value as Other — new values may appear without notice
displayName Show it. Do not match on it
price Show it. gross = net + vat; a free option is 0.0, never null
transporter Show it when present — it is often what distinguishes two same-named options
collectionPoint Populated for pickup-style options only. Its address parts are nullable
express Flag faster options

Order is meaningful. The list arrives in Komplett’s preferred order: the first entry is the default used when you submit without a deliveryOptionId, and pickup points sort last. Present the list in the order you receive it.

Option ids are ephemeral and per-checkout. Fetch them fresh for every checkout and pass them straight back to submit. Never cache them, store them, or reuse an id from another checkout — that is rejected.

deliveryOptionId at submit is the only way to choose. To send an order to a particular pickup point, find the option whose collectionPoint is the one you want and pin that option’s id. There is no way to request a delivery option or collection point on the create request.


An id that is not on this checkout’s menu is rejected with 400, not 422, and the draft stays submittable — so you can re-read the menu and try again.

{
"errors": [
{
"fieldName": "DeliveryOptionId",
"message": "The selected delivery option is not valid for this checkout."
}
],
"code": "ERR_VALIDATION_0001",
"traceId": "0HNNJLGM0FAKD:00000003",
"type": "https://<store-url>/swagger#Validation",
"title": "Validation Failed",
"status": 400,
"detail": "Some fields have validation errors",
"instance": "/checkout/v1/submit",
"extensions": {}
}

The usual cause is a stale id — one from a previous checkout, or from a menu fetched before the checkout was re-created. See Handling failures.