Choose a delivery option
To let a buyer choose how their order arrives, put a GET between create and submit:
- Create the checkout — Komplett prepares a delivery menu for it.
- Get the checkout — read
delivery.options. - Submit with
deliveryOptionIdset to theidof the chosen option.
Step 1 — Read the menu
Section titled “Step 1 — Read the menu”GET /checkout/v1/019fd6cac2fd7383ac6d759468e7360cResponse — 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" } } ] }}Step 2 — Submit with the chosen option
Section titled “Step 2 — Submit with the chosen option”POST /checkout/v1/submit{ "checkoutId": "019fd6cac2fd7383ac6d759468e7360c", "deliveryOptionId": "do_002ccf7a3d8d4716aca61599b2f322c5"}Response — 204 No Content — the order is placed with home delivery.
Options are not unique by type or name
Section titled “Options are not unique by type or name”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
BusinessDeliveryoptions, samedisplayName, different transporter and price — one free from PostNord, one at 356.25 from Bring. - Four
PickupPointoptions 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 byid. Code that looks up an option bytypeordisplayNamewill match an arbitrary one of several. - Render
collectionPointto 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.
Reading the menu correctly
Section titled “Reading the menu correctly”| 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.
If the option id is wrong
Section titled “If the option id is wrong”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.