/api/partner/v1/wolt/events
Requires authentication
Rate limited by the `api-global` limiter
Send a bearer token in the Authorization header.
The spine of the integration. Poll this endpoint with the last next_cursor
you received to get the venue's order lifecycle events in order. The feed is
append-only, so nothing is missed across your downtime; delivery is
at-least-once, so treat (order_id, type) as idempotent. Each event carries a
compact snapshot of the order at that moment in order.
Full URL: https://fature.al/api/partner/v1/wolt/events
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| since | integer | no | The cursor to resume from; pass the previous next_cursor. Defaults to 0, the start of retention. Defaults to `0`. |
| limit | integer | no | Max events to return, 1-200. Defaults to `50`. |
| types | string | no | Comma-separated event types to include, e.g. order.received,order.ready. |
Responses
200 OK
| Field | Type | Description |
|---|---|---|
| status | boolean | |
| data | object | |
| data.events | array | |
| data.events[].id | integer | Monotonic cursor id; pass the highest one you have seen as ?since= |
| data.events[].type | string | Event type, e.g. order.received, order.accepted, order.ready, order.delivered, order.fiscalized, order.fiscalization_failed |
| data.events[].order_id | integer | Fatureal order id the event is about |
| data.events[].wolt_order_id | string | Wolt's order id |
| data.events[].status | string, nullable | Order status at the moment of the event |
| data.events[].occurred_at | string, nullable | When the event occurred (ISO-8601) |
| data.events[].order | object | Compact snapshot of the order at that moment |
| data.events[].order.id | integer | Fatureal order id; use this as {id} in the order and action routes |
| data.events[].order.wolt_order_id | string | Wolt's own order id |
| data.events[].order.display_number | string, nullable | Human order number shown to the customer |
| data.events[].order.status | string | Raw Wolt lifecycle status: received, acknowledged, production, ready, picked_up, courier_at_customer, delivered, rejected, refunded, ... |
| data.events[].order.fiscal_state | string | Fiscal state derived from the invoice: pending, deferred, fiscalised or failed |
| data.events[].order.total_amount | number | Charged total in major currency units |
| data.events[].order.currency | string | ISO 4217 currency code |
| data.events[].order.received_at | string, nullable | When Wolt handed the order to us (ISO-8601) |
| data.events[].order.pickup_at | string, nullable | Committed handover time (ISO-8601), set when a pickup time was chosen on accept |
| data.events[].order.delivery_type | string, nullable | Wolt delivery type: takeaway, eatin, homedelivery, ... |
| data.events[].order.self_delivery | boolean | Whether the venue fulfils delivery with its own courier |
| data.events[].order.branch | string, nullable | Branch name |
| data.events[].order.invoice | object, nullable | Linked fiscal invoice reference, or null before fiscalisation |
| data.next_cursor | string | |
| data.has_more | boolean |
403 The company has no Wolt add-on, the token has no Wolt right, or it resolves to no single active venue.
| Field | Type | Description |
|---|---|---|
| status | boolean | Always false |
| message | string | Localised explanation, safe to log but not to branch on |
| code | string | Stable machine readable reason: `unauthenticated`, `wolt_not_enabled`, `forbidden`, `no_venue`, `order_not_found`, `invalid_transition`, `invalid_data`, `action_failed`, `wolt_upstream_error`, `idempotency_key_required`, `idempotency_in_progress` |
429 Rate limit reached: 180 reads a minute per token. Retry after the number of seconds in the Retry-After header.
| Field | Type | Description |
|---|---|---|
| message | string |
Example request
curl -X GET 'https://fature.al/api/partner/v1/wolt/events' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'X-Client-Id: YOUR_CLIENT_ID' \
-H 'X-Client-Secret: YOUR_CLIENT_SECRET' \
-H 'Accept: application/json'
use Illuminate\Support\Facades\Http;
$response = Http::withHeaders([
'Authorization' => 'Bearer YOUR_TOKEN',
'X-Client-Id' => 'YOUR_CLIENT_ID',
'X-Client-Secret' => 'YOUR_CLIENT_SECRET',
'Accept' => 'application/json',
])->get('https://fature.al/api/partner/v1/wolt/events');
$data = $response->json();
use GuzzleHttp\Client;
$client = new Client();
$response = $client->request('GET', 'https://fature.al/api/partner/v1/wolt/events', [
'headers' => [
'Authorization' => 'Bearer YOUR_TOKEN',
'X-Client-Id' => 'YOUR_CLIENT_ID',
'X-Client-Secret' => 'YOUR_CLIENT_SECRET',
'Accept' => 'application/json',
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://fature.al/api/partner/v1/wolt/events', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_TOKEN',
'X-Client-Id': 'YOUR_CLIENT_ID',
'X-Client-Secret': 'YOUR_CLIENT_SECRET',
'Accept': 'application/json'
}
});
const data = await response.json();
Example response
{
"status": true,
"data": {
"events": [
{
"id": 1,
"type": "type",
"order_id": 1,
"wolt_order_id": "wolt order id",
"status": "status",
"occurred_at": "occurred at",
"order": {
"id": 1,
"wolt_order_id": "wolt order id",
"display_number": "display number",
"status": "status",
"fiscal_state": "fiscal state",
"total_amount": 4200,
"currency": "USD",
"received_at": "received at",
"pickup_at": "pickup at",
"delivery_type": "delivery type",
"self_delivery": true,
"branch": "branch",
"invoice": []
}
}
],
"next_cursor": "next cursor",
"has_more": true
}
}
{
"status": true,
"message": "Hello there",
"code": "code"
}
{
"message": "Hello there"
}