Open de console

Gebeurtenissen & pogingen

Meld voortgang en bezorgpogingen met de juiste status en reden.

↓ Download MarkdownBijgewerkt op 16 oktober 2026

Gebruik een gebeurtenis voor voortgang zoals opgehaald of onderweg. Gebruik een bezorgpoging voor een daadwerkelijke uitkomst zoals afgeleverd, niet thuis of geweigerd. Beide aanvragen vereisen deliveries:write.

Wat stuur je bij beide aanvragen mee?

Plaats Veld Invullen
URL-pad {id} entry_id van de bestaande levering; een UUID.
Header Authorization Bearer <jouw-api-key>.
Header Content-Type application/json.
Header Idempotency-Key Een nieuwe unieke waarde van 8–128 bytes per gebeurtenis of poging. Bewaar die voor retries.

Je hoeft hier geen If-Match mee te sturen. De waarnemingstijd bepaalt of de nieuwe informatie ook de actuele toestand verandert. Zie volgorde en tijdstippen.

Velden voor een gebeurtenis

Aanvraag: POST /deliveries/v1/parcels/{id}/events.

Bodyveld Invullen? Type en toegestane waarden Voorbeeld
status Expliciet meesturen Geheel getal: 0 aangemeld, 1 opgehaald, 2 onderweg, 3 in bezorging. 3
occurred_at Verplicht Unix-seconden UTC van de werkelijke gebeurtenis. Vanaf 1 januari 2000 tot maximaal vijf minuten in de toekomst. 1792141200

Laat status niet weg: bij weglaten gebruikt de API 0. Dat is een echte status en kan dus iets anders betekenen dan je bedoeling. Status 4 en 5 zijn op dit endpoint ongeldig; gebruik daarvoor een bezorgpoging.

{"status": 3, "occurred_at": 1792141200}

De voorbeeldtijd is 16 oktober 2026, 09:00 UTC. Vul voor je eigen aanvraag het werkelijke tijdstip in. Een complete aanroep met een voorbereid bestand gebeurtenis.json:

curl --fail-with-body --silent --show-error \
  -X POST "https://api.vlows.io/deliveries/v1/parcels/$ENTRY_ID/events" \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: gebeurtenis-voorbeeld-0001' \
  --data-binary @gebeurtenis.json

Bewaar het bestand en dezelfde sleutel als je na een timeout opnieuw probeert.

Velden voor een bezorgpoging

Aanvraag: POST /deliveries/v1/parcels/{id}/attempts.

Bodyveld Invullen? Type en regels Voorbeeld
time_attempt Verplicht Unix-seconden UTC van de poging; dezelfde tijdgrenzen als een gebeurtenis. 1792141500
outcome Expliciet meesturen Geheel getal 0–4 uit de uitkomsttabel. Bij weglaten gebruikt de API 0 (afgeleverd). 1
reason Optioneel Geheel getal 0–10 uit de redentabel. Weglaten betekent 0. 1
delivered Optioneel, alleen bij uitkomst 0 of 2 Object met de daadwerkelijk gebruikte afleveradresvelden; zie hieronder. Zie volledig voorbeeld.
attempt_no Niet invullen Vlows wijst het pogingnummer toe. Een eigen niet-nul pogingnummer wordt geweigerd. Weglaten.

Voorbeeld: niet thuis. Uitkomst 1 is mislukt; reden 1 betekent niet thuis.

{"time_attempt": 1792141500, "outcome": 1, "reason": 1}

Het delivered-object hoort niet bij een mislukte, geweigerde of opnieuw ingeplande poging. Een poging heeft geen losse status of occurred_at: gebruik de veldnamen van dit endpoint.

Uitkomsten

outcome Naam Betekenis Actuele bezorgstatus als deze poging wordt toegepast
0 delivered Afgeleverd. 4
1 failed Mislukt. 5
2 delivered_alternative Afgeleverd op een andere plek. 4
3 refused Geweigerd. 5
4 rescheduled Opnieuw ingepland. 3

De API zet bij een toegepaste aflevering ook time_delivered op het tijdstip van de poging. Je stuurt dat veld niet apart mee bij deze aanvraag.

Redenen

reason Naam Gebruik
0 none Geen aanvullende reden; standaard bij weglaten.
1 not_home Ontvanger niet thuis.
2 address_not_found Adres niet gevonden.
3 no_access Geen toegang.
4 refused Ontvanger weigert.
5 damaged Beschadigd.
6 out_of_time Geen tijd meer.
7 vehicle_traffic Voertuig- of verkeersprobleem.
8 weather Weersomstandigheden.
9 business_closed Bedrijf gesloten.
10 other Andere reden.

Kies een reden die bij de waarneming past. Er is geen vrij tekstveld voor opmerkingen bij een poging; stuur geen extra notes of description mee.

Velden binnen delivered

Dit object is optioneel bij uitkomst 0 en 2. Zodra je het meestuurt, zijn land, postcode en nummer verplicht. Zonder het object wordt geen nieuw afleveradres opgegeven.

Veld binnen delivered Verplicht in dit object? Formaat Voorbeeld
delivered_country Ja Tekst, exact NL. "NL"
delivered_postal_code Ja Nederlandse postcode als tekst. "9901KB"
delivered_number Ja Huisnummer als tekst. "16"
delivered_city Nee Tekst, maximaal 32 UTF-8-bytes. "Delfzijl"
delivered_street Nee Tekst, maximaal 32 UTF-8-bytes. "Voorbeeldstraat"
delivered_addition Nee Tekst, maximaal 32 UTF-8-bytes. "A"
delivered_location_type Nee Code 0–6; zie locaties. 0

Ook land, postcode en nummer vallen onder de tekstlimiet van 32 UTF-8-bytes. Gebruik de exacte namen met delivered_, geen country, postal_code of number binnen dit object.

Volledig voorbeeld van een aflevering aan de deur:

{
  "time_attempt": 1792141800,
  "outcome": 0,
  "reason": 0,
  "delivered": {
    "delivered_country": "NL",
    "delivered_postal_code": "9901KB",
    "delivered_number": "16",
    "delivered_location_type": 0
  }
}

Sla het JSON-object van de gewenste poging op als poging.json en verstuur het zo:

curl --fail-with-body --silent --show-error \
  -X POST "https://api.vlows.io/deliveries/v1/parcels/$ENTRY_ID/attempts" \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: poging-voorbeeld-0001' \
  --data-binary @poging.json

ENTRY_ID is de eerder ontvangen leverings-UUID; API_KEY komt uit je geheime configuratie. Gebruik per nieuwe poging een nieuwe idempotentiesleutel. Een herhaling na een timeout gebruikt juist dezelfde sleutel en hetzelfde bestand.

Gebruik je eigen adres en de echte aflevertijd. De API controleert het adres via de BAG. De betekenis van de uitkomst staat bij Adrescontrole.

Wat krijg je terug?

Beide POST-aanvragen geven bij succes 201 en dezelfde antwoordstructuur:

{
  "data": {
    "event_id": "<gegenereerde-gebeurtenis-uuid>",
    "entry_id": "<jouw-levering-uuid>",
    "applied_to_current_state": true,
    "version": 4
  },
  "error": null
}

event_id identificeert de opgeslagen gebeurtenis, ook als die voortkomt uit een bezorgpoging. version is de nieuwe leveringsversie. applied_to_current_state vertelt of de gebeurtenis ook de actuele toestand heeft aangepast. Voor de actuele ETag en complete levering doe je daarna een GET op de levering.

Volgorde en tijdstippen

Vlows bewaart de echte waarnemingstijd én het moment van ontvangst. Een oudere gebeurtenis kan worden opgeslagen met applied_to_current_state: false, zodat de historie compleet blijft zonder de nieuwste toestand te overschrijven.

Twee verschillende statussen op exact dezelfde seconde geven 409 ambiguous_event_order. Een gewone registratie krijgt als begintijd het registratiemoment. Meld daarna de feitelijke nieuwe waarnemingen; stuur geen verzonnen tussenstappen of aangepaste tijden alleen om een conflict te omzeilen.

Voor gebeurtenissen die de actuele toestand veranderen gelden deze overgangen. Een gelijke status blijft toegestaan.

Huidige status Volgende toegestane andere statussen
0 aangemeld 1, 2, 3, 4, 5
1 opgehaald 2, 3, 4, 5
2 onderweg 3, 4, 5
3 in bezorging 2, 4, 5
4 afgeleverd Geen andere status; afgeleverd is een eindstatus.
5 mislukt 2, 3, 4

Status 4 en 5 meld je altijd via een poging. Een ongeldige overgang geeft 409 invalid_transition. Een late poging krijgt een pogingnummer in ontvangstvolgorde, ook als het waarnemingstijdstip ouder is.

Geschiedenis uitlezen

Gebruik deliveries:read en de leverings-UUID in het pad. Beide GET-aanvragen hebben geen body of queryvelden.

Aanvraag Velden per resultaat in data
GET /deliveries/v1/parcels/{id}/events event_id, occurred_at, received_at, status, source.
GET /deliveries/v1/parcels/{id}/attempts attempt_no, time_attempt, outcome, reason, address.

occurred_at en time_attempt zijn Unix-seconden; received_at is een serverdatumstring. source geeft de herkomst van de gebeurtenis weer. Gebeurtenissen staan op waarnemingstijd en zijn begrensd op 1000 resultaten, zonder cursor. Pogingen staan op pogingnummer; maximaal 127 per levering. address bevat de opgeslagen adrescontrole bij de poging.

Fouten voorkomen

Gebruik status en occurred_at bij gebeurtenissen; gebruik outcome en time_attempt bij pogingen. Stuur tijd als seconden, geen milliseconden. Geef alleen bij aflevering een delivered-object mee en laat attempt_no weg.

Bij een timeout herhaal je dezelfde bodybytes en idempotentiesleutel. Zie Fouten & opnieuw proberen.

Typ om in alle handleidingen te zoeken.