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
| Methode | Pad | Beschrijving |
|---|---|---|
GET | /wave-definitions | Alle wave-definities ophalen |
POST | /wave-definitions | Wave-definitie aanmaken |
GET | /wave-definitions/:id | Specifieke wave-definitie ophalen |
PUT | /wave-definitions/:id | Wave-definitie bijwerken |
DELETE | /wave-definitions/:id | Wave-definitie verwijderen |
POST | /waves/create | Wave aanmaken op basis van definitie |
POST | /waves/start | Wave starten (alloceren + picktaken) |
GET | /waves | Alle waves ophalen |
GET | /waves/:id | Specifieke wave ophalen |
DELETE | /waves/:id | Wave verwijderen |
GET | /waves/:id/orders | Orders in een wave ophalen |
GET | /waves/:id/claimsets | Claimsets van een wave ophalen |
GET | /waves/:id/claims | Claims van een wave ophalen |
GET | /waves/:id/tasks | Taken van een wave ophalen |
GET | /waves/:id/shortages | Tekorten bij de allocatie van een wave |
POST | /waves/:id/approve-shortage | Tekort goedkeuren en de wave hervatten |
POST | /waves/:id/reallocate | Wave opnieuw alloceren |
POST | /waves/:id/reset | Wave terugzetten naar Te starten |
GET | /tasks/short-picks | Tekorten bij het picken (short picks) |
POST | /tasks/short-picks/:id/resolve | Short pick oplossen met voorraad van een andere plek |
POST | /tasks/short-picks/:id/accept | Tekort 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)
| ID | Beschrijving | Waarde-voorbeeld |
|---|---|---|
| 1 | Klant - Naam | "Bedrijf BV" |
| 2 | Order - Order ID | "ORD-001" |
| 3 | Order - Datum | "14-03-2026" |
| 4 | Order - Vervoerder | "PostNL" |
| 5 | Alles | (leeg — selecteert alle orders) |
| 6 | Klant - Plaats | "Amsterdam" |
| 7 | Order - Te verzenden datum | "16-03-2026" |
| 8 | Fulfillment - Per client | "CLIENT01" |
Pick type
| ID | Beschrijving |
|---|---|
| 1 | Per order |
| 2 | Per wave |
| 3 | Per klant |
| 4 | Per vervoerder |
Wave-definitie aanmaken
POST /wave-definitions
{
"description": "Alle orders voor vandaag",
"criterium_id": 5,
"value": null,
"pick_type": 1,
"autostart": true
}
| Veld | Type | Verplicht | Beschrijving |
|---|---|---|---|
description | string | ✅ | Omschrijving |
criterium_id | number | ✅ | Selectiecriterium (zie tabel hierboven) |
value | string | Nee | Filterwaarde (afhankelijk van criterium) |
pick_type | number | ✅ | Manier van picken (zie tabel) |
autostart | boolean | Nee | Automatisch 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?
- Orders worden geselecteerd op basis van de criteria
- Geselecteerde orders worden gealloceerd (voorraad gereserveerd)
- Picktaken worden aangemaakt
- 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_id | Status |
|---|---|
| 1 | Te starten |
| 3 | Gestart |
| 4 | Volledig gealloceerd |
| 5 | Volledig gepicked |
| 6 | Gestart met alloceren |
| 7 | Gestart met picking |
| 8 | Gestart met assembleren |
| 9 | Volledig geassembleerd |
| 10 | Gestart met verladen |
| 11 | Volledig verladen |
| 12 | Geannuleerd |
| 13 | Aanmaken picktaken |
| 14 | Picktaken zijn aangemaakt |
| 15 | Gepauzeerd |
| 16 | Volledig gesorteerd |
| 17 | Gedeeltelijk gealloceerd |
| 18 | Wacht 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"
}
| Status | Wanneer |
|---|---|
200 OK | Goedgekeurd |
404 Not Found | De wave bestaat niet |
409 Conflict | De 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"
}
| Status | Wanneer |
|---|---|
200 OK | Opnieuw gealloceerd; de nieuwe status volgt uit GET /waves/:id |
404 Not Found | De wave bestaat niet |
409 Conflict | Er 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"
}
| Status | Wanneer |
|---|---|
200 OK | Teruggezet |
404 Not Found | De wave bestaat niet |
409 Conflict | Er 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.
result | Betekenis |
|---|---|
OK | Het hele tekort is opnieuw gereserveerd. De short pick krijgt status reallocated. Is de rest gepickt, dan wordt de order Picked. |
PARTIAL | Er 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_STOCK | Geen 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
}
| Status | Wanneer |
|---|---|
200 OK | Zie result |
400 Bad Request | De short pick is niet meer open |
404 Not Found | De 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_shortagemet 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 directShippeden krijgt de klant ook de webhookorder_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"
}
| Status | Wanneer |
|---|---|
200 OK | Geaccepteerd |
400 Bad Request | De short pick is niet meer open (al opgelost of geaccepteerd) |
404 Not Found | De short pick bestaat niet |