Waves

Waves worden gebruikt om orders te groeperen, alloceren en picktaken aan te maken. Een wave wordt aangemaakt op basis van een wave-definitie die bepaalt welke orders geselecteerd worden.

Endpoints

MethodePadBeschrijving
GET/wave-definitionsAlle wave-definities ophalen
POST/wave-definitionsWave-definitie aanmaken
GET/wave-definitions/:idSpecifieke wave-definitie ophalen
PUT/wave-definitions/:idWave-definitie bijwerken
DELETE/wave-definitions/:idWave-definitie verwijderen
POST/waves/createWave aanmaken op basis van definitie
POST/waves/startWave starten (alloceren + picktaken)
GET/wavesAlle waves ophalen
GET/waves/:idSpecifieke wave ophalen
DELETE/waves/:idWave verwijderen
GET/waves/:id/ordersOrders in een wave ophalen
GET/waves/:id/claimsetsClaimsets van een wave ophalen
GET/waves/:id/claimsClaims van een wave ophalen
GET/waves/:id/tasksTaken van een wave ophalen
GET/waves/:id/shortagesTekorten bij de allocatie van een wave
POST/waves/:id/approve-shortageTekort goedkeuren en de wave hervatten
POST/waves/:id/reallocateWave opnieuw alloceren
POST/waves/:id/resetWave terugzetten naar Te starten
GET/tasks/short-picksTekorten bij het picken (short picks)
POST/tasks/short-picks/:id/resolveShort pick oplossen met voorraad van een andere plek
POST/tasks/short-picks/:id/acceptTekort van een short pick accepteren

Wave-definities

Een wave-definitie bepaalt de criteria waarmee orders automatisch geselecteerd worden bij het aanmaken van een wave.

Alle wave-definities ophalen

GET /wave-definitions

Response 200 OK

[
  {
    "id": 1,
    "description": "Alle orders PostNL",
    "criterium": "Order - Vervoerder",
    "value": "PostNL",
    "picktypedescription": "Per order",
    "autostart": true,
    "criterium_id": 4,
    "pick_type": 1,
    "site_id": "SITE01"
  }
]

Criteria (criterium_id)

IDBeschrijvingWaarde-voorbeeld
1Klant - Naam"Bedrijf BV"
2Order - Order ID"ORD-001"
3Order - Datum"14-03-2026"
4Order - Vervoerder"PostNL"
5Alles(leeg — selecteert alle orders)
6Klant - Plaats"Amsterdam"
7Order - Te verzenden datum"16-03-2026"
8Fulfillment - Per client"CLIENT01"

Pick type

IDBeschrijving
1Per order
2Per wave
3Per klant
4Per vervoerder

Wave-definitie aanmaken

POST /wave-definitions
{
  "description": "Alle orders voor vandaag",
  "criterium_id": 5,
  "value": null,
  "pick_type": 1,
  "autostart": true
}
VeldTypeVerplichtBeschrijving
descriptionstring✅Omschrijving
criterium_idnumber✅Selectiecriterium (zie tabel hierboven)
valuestringNeeFilterwaarde (afhankelijk van criterium)
pick_typenumber✅Manier van picken (zie tabel)
autostartbooleanNeeAutomatisch starten na aanmaken

Response 204 No Content

Wave aanmaken

Maak een nieuwe wave aan op basis van een wave-definitie.

POST /waves/create

Request

{
  "wavedef_id": 1
}

Response 200 OK

{
  "message": "Wave met id 42 is aangemaakt",
  "wave_id": 42
}

Als autostart is ingeschakeld op de definitie:

{
  "message": "Wave met id 42 wordt aangemaakt en automatisch gestart",
  "wave_id": 42
}

Als er geen orders zijn voor de criteria:

{
  "message": "Wave met id 42 is aangemaakt maar bevat geen orders",
  "wave_id": 42
}

Response 400 Bad Request

wavedef_id ontbreekt of is leeg. Er wordt geen wave gemaakt.

{
  "message": "Wave definitie is niet gevuld."
}

Response 404 Not Found

Er is geen wave-definitie met dit wavedef_id. Er wordt geen wave gemaakt.

{
  "message": "Wave definitie met id 999 bestaat niet."
}

Wave starten

Start een bestaande wave (allocatie + picktaken aanmaken).

POST /waves/start

Request

{
  "wave_id": 42
}

Response 200 OK

{
  "message": "Wave met id 42 is gestart"
}

Of wanneer geen orders gevonden:

{
  "message": "Geen orders in deze wave"
}

Wat gebeurt er bij het starten?

  1. Orders worden geselecteerd op basis van de criteria
  2. Geselecteerde orders worden gealloceerd (voorraad gereserveerd)
  3. Picktaken worden aangemaakt
  4. Order status verandert van "Released" naar "Allocated"

Alle waves ophalen

GET /waves

Response 200 OK

[
  {
    "id": 42,
    "status": "Released",
    "criterium": "Alles",
    "value": null,
    "picktypedescription": "Per order",
    "status_id": 14,
    "criterium_id": 5,
    "pick_type": 1,
    "autostart": true,
    "site_id": "SITE01"
  }
]

Wave sub-data

Orders in wave

GET /waves/:id/orders
[
  {
    "order_id": "ORD-001",
    "order_date": "2026-03-14",
    "status": "Allocated",
    "customer": "Bedrijf BV - Amsterdam",
    "ship_by_date": "2026-03-16",
    "carrier": "PostNL",
    "ship_dock": "DOCK-01"
  }
]

Claimsets in wave

GET /waves/:id/claimsets
[
  {
    "id": 1,
    "claimset_break": "ORD-001",
    "status": "released",
    "pick_type": "Per order",
    "claim_count": 3,
    "total_qty": 25
  }
]

Claims in wave

GET /waves/:id/claims
[
  {
    "id": 1,
    "content_id": 1001,
    "sku_id": "SKU-001",
    "qty": 10,
    "order_id": "ORD-001",
    "line_id": 1,
    "claimset": 1,
    "status": "allocated",
    "loc_id": "LOC-A01"
  }
]

Taken in wave

GET /waves/:id/tasks
[
  {
    "id": 1,
    "quantity": 10,
    "tag_id": "TAG-0001",
    "from_loc_id": "LOC-A01",
    "to_loc_id": "STAGE-01",
    "final_loc_id": "DOCK-01",
    "sku_id": "SKU-001",
    "creation_date": "2026-03-14",
    "wave_id": 42,
    "claimset": 1
  }
]

Tekorten bij de allocatie

Bij het starten van een wave reserveert de allocatie voorraad voor de orderregels. Daarvoor telt alleen voorraad die nog vrij is:

  • Wat al voor een andere wave gereserveerd is, telt niet mee, ook als die wave al aan het picken is. De reservering blijft staan tot de zending geladen is.
  • Voorraad met een open inruim- of verplaatstaak telt niet mee: die is onderweg.
  • Locaties die van allocatie zijn uitgesloten, tellen niet mee.
  • Geblokkeerde locaties (blokkade OutLocked of Locked) tellen niet mee. Na een short pick wordt de pickplek geblokkeerd tot hij geteld is; ook het oplossen van de short pick zoekt dan voorraad op een andere plek.
  • Voorraad in Lost & Found telt niet mee.

Vindt de allocatie niet genoeg voorraad voor een orderregel, dan wordt dat als tekort vastgelegd. Wat er daarna gebeurt, hangt af van de instelling shortage_auto_continue van de site:

  • 1 (standaard): de wave gaat door met wat wel gereserveerd is. Status 17 Gedeeltelijk gealloceerd, daarna 14 Picktaken zijn aangemaakt.
  • 0: de wave stopt in status 18 Wacht op goedkeuring tekort. Er worden nog geen picktaken gemaakt. Keur het tekort goed, alloceer opnieuw of zet de wave terug.

Statussen van een wave

status_idStatus
1Te starten
3Gestart
4Volledig gealloceerd
5Volledig gepicked
6Gestart met alloceren
7Gestart met picking
8Gestart met assembleren
9Volledig geassembleerd
10Gestart met verladen
11Volledig verladen
12Geannuleerd
13Aanmaken picktaken
14Picktaken zijn aangemaakt
15Gepauzeerd
16Volledig gesorteerd
17Gedeeltelijk gealloceerd
18Wacht op goedkeuring tekort

Een wave is pas Volledig verladen (11) als er van geen enkele pickset in de wave nog iets openstaat: niets meer te picken en niets gepickt dat nog niet geladen is. Wordt een order in delen geladen, dan blijft de wave Gestart met verladen (10) tot de laatste doos geladen is.

Tekorten van een wave

GET /waves/:id/shortages
[
  {
    "id": 17,
    "order_id": "ORD-001",
    "line_id": 1,
    "sku_id": "SKU-001",
    "sku_description": "Widget A",
    "qty_requested": 10,
    "qty_allocated": 6,
    "qty_short": 4,
    "created_datetime": "2026-10-15T08:30:00.000Z"
  }
]

Per orderregel het gevraagde, het gereserveerde en het ontbrekende aantal. Geen tekorten, of een onbekende wave, geeft een lege lijst. Per order: GET /orders/:id/shortages.

Tekort goedkeuren

POST /waves/:id/approve-shortage

Alleen voor een wave in status 18. De wave gaat door met wat wel gereserveerd is: de picktaken worden aangemaakt en de status wordt 14. De tekorten blijven zichtbaar via /shortages. Er is geen body nodig.

{
  "message": "Tekort goedgekeurd, wave wordt hervat"
}
StatusWanneer
200 OKGoedgekeurd
404 Not FoundDe wave bestaat niet
409 ConflictDe wave wacht niet op goedkeuring

Wave opnieuw alloceren

POST /waves/:id/reallocate

Bijvoorbeeld nadat er voorraad is bijgekomen. Verwijdert de open picktaken, de reserveringen en de tekorten van de wave, zet de orders terug op Released en start de wave opnieuw. Daarbij worden de orders opnieuw geselecteerd op de criteria van de wave, dus een order die inmiddels aan de criteria voldoet, komt erbij. Er is geen body nodig.

Kan alleen zolang er in de wave nog niet gepickt is: de wave staat niet in een pickstatus (5, 7, 8, 9, 10, 11 of 16), er is geen gepickte reservering en geen afgeronde picktaak. Anders volgt 409 en wordt er niets gewijzigd. Dat geldt ook voor Wave terugzetten.

{
  "message": "Wave is opnieuw gealloceerd"
}
StatusWanneer
200 OKOpnieuw gealloceerd; de nieuwe status volgt uit GET /waves/:id
404 Not FoundDe wave bestaat niet
409 ConflictEr is in deze wave al gepickt; er is niets gewijzigd

Wave terugzetten

POST /waves/:id/reset

Maakt het starten ongedaan: verwijdert de open picktaken, de reserveringen en de tekorten, zet de orders terug op Released, haalt ze uit de wave en zet de wave op status 1 Te starten. De voorraad is daarna weer vrij. Er is geen body nodig.

{
  "message": "Wave is gereset, voorraad is vrijgegeven"
}
StatusWanneer
200 OKTeruggezet
404 Not FoundDe wave bestaat niet
409 ConflictEr is in deze wave al gepickt; er is niets gewijzigd

Tekorten bij het picken (short picks)

Vindt de picker minder dan verwacht, dan meldt hij een short pick. Wat gevonden is, is gepickt; het verschil staat als open short pick per picktaak. De pickplek wordt geblokkeerd en krijgt een teltaak, en de andere open picktaken op die plek worden geannuleerd en ook als short pick vastgelegd. Staan er daarna in de pickset of de wave geen open picktaken meer, dan wordt de pickset afgesloten en krijgt de wave status 5 Volledig gepicked, ook als de laatste taak geannuleerd is in plaats van gepickt.

Zolang er een short pick open staat, is de order Partially Allocated (zie Orderstatus) en wordt hij niet Shipped, ook niet als de doos met de rest al geladen is.

Deze endpoints zijn voor gebruikers met het recht Short Picks.

Short picks ophalen

GET /tasks/short-picks?status=open&wave_id=42

Beide queryparameters zijn optioneel. status is open, reallocated (opgelost met andere voorraad) of accepted (tekort geaccepteerd).

[
  {
    "id": 40,
    "wave_id": 42,
    "claimset_id": 7,
    "order_id": "ORD-001",
    "line_id": 1,
    "sku_id": "SKU-001",
    "sku_description": "Widget A",
    "from_loc_id": "A-01-01",
    "qty_expected": 3,
    "qty_picked": 1,
    "qty_short": 2,
    "reason": "Plek bijna leeg",
    "status": "open",
    "resolved_by": null,
    "resolved_at": null
  }
]

Short pick oplossen

POST /tasks/short-picks/:id/resolve

Zoekt vrije voorraad van het artikel op een andere plek (geblokkeerde plekken en Lost & Found tellen niet mee), reserveert die en maakt er picktaken voor in dezelfde pickset. Was de pickset al afgesloten, dan staat hij weer open; een wave in status 5 gaat terug naar 7 Gestart met picking. Er is geen body nodig.

resultBetekenis
OKHet hele tekort is opnieuw gereserveerd. De short pick krijgt status reallocated. Is de rest gepickt, dan wordt de order Picked.
PARTIALEr was minder voorraad dan het tekort. Wat er was, is gereserveerd; de short pick krijgt status reallocated en voor de rest staat een nieuwe open short pick (short_pick_id, remaining_short). De order blijft Partially Allocated.
NO_STOCKGeen voorraad gevonden. Er verandert niets; de short pick blijft open.
{
  "result": "PARTIAL",
  "message": "Gedeeltelijk geheralloceerd, tekort van 1 blijft open",
  "new_task_ids": [812],
  "remaining_short": 1,
  "short_pick_id": 41
}
StatusWanneer
200 OKZie result
400 Bad RequestDe short pick is niet meer open
404 Not FoundDe short pick bestaat niet

Tekort accepteren

POST /tasks/short-picks/:id/accept

Voor een tekort dat niet op te lossen is. De short pick krijgt status accepted en het tekort telt daarna als afgehandeld, net als een goedgekeurd tekort bij de allocatie. Er is geen body nodig.

  • De klant krijgt de webhook order_shortage met de orderregel, het bestelde aantal en het tekort.
  • Staat er voor de order verder niets open, dan wordt hij Picked. Is de rest al geladen, dan wordt hij direct Shipped en krijgt de klant ook de webhook order_shipped, met de doos die als laatste geladen is.
  • Is er van de hele order niets gepickt, dan blijft de order Partially Allocated: er is niets te verzenden.
{
  "result": "ACCEPTED",
  "message": "Tekort van 2 geaccepteerd",
  "short_pick_id": 40,
  "order_id": "ORD-001"
}
StatusWanneer
200 OKGeaccepteerd
400 Bad RequestDe short pick is niet meer open (al opgelost of geaccepteerd)
404 Not FoundDe short pick bestaat niet