PHPackages                             foodticket/wolt - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. foodticket/wolt

ActiveLibrary[API Development](/categories/api)

foodticket/wolt
===============

A Laravel client to integrate with the Wolt API

v0.0.15(2mo ago)0811MITPHPPHP ^8.2

Since Apr 2Pushed 2w agoCompare

[ Source](https://github.com/food-ticket/wolt-client)[ Packagist](https://packagist.org/packages/foodticket/wolt)[ RSS](/packages/foodticket-wolt/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (10)Dependencies (4)Versions (16)Used By (0)

Wolt Client
===========

[](#wolt-client)

A PHP client to integrate with the [Wolt](https://wolt.com) POS Integration API for Laravel.

Requirements
------------

[](#requirements)

- PHP &gt;= 8.3
- Laravel &gt;= 12.0

Installation
------------

[](#installation)

```
composer require foodticket/wolt
```

The service provider is auto-discovered and registers itself automatically.

Publish the config file:

```
php artisan vendor:publish --tag=wolt-config
```

Configuration
-------------

[](#configuration)

Add the following variables to your `.env` file:

```
WOLT_CLIENT_ID=
WOLT_CLIENT_SECRET=
WOLT_WEBHOOK_SECRET=
WOLT_REDIRECT_URI=https://your-app.com/wolt/oauth/callback
```

Routes
------

[](#routes)

Register the Wolt routes in your `RouteServiceProvider`:

```
use Illuminate\Support\Facades\Route;

Route::woltWebhooks();       // POST /wolt/orders
Route::woltOAuthCallback();  // GET  /wolt/oauth/callback
```

Both macros accept an optional URI argument to override the default path:

```
Route::woltWebhooks('custom/wolt/orders');
Route::woltOAuthCallback('custom/wolt/oauth/callback');
```

Webhooks
--------

[](#webhooks)

The webhook endpoint accepts incoming order notifications from Wolt and dispatches a `wolt-webhooks.order_notification` Laravel event with a `WoltWebhook` instance. Register a listener to handle it:

```
use Foodticket\Wolt\WoltWebhook;

Event::listen('wolt-webhooks.order_notification', function (WoltWebhook $webhook) {
    // $webhook->orderId()
    // $webhook->venueId()
    // $webhook->payload()
});
```

OAuth
-----

[](#oauth)

The OAuth callback endpoint handles the authorization code redirect from Wolt and dispatches an `OAuthCallbackReceived` event. Register a listener to exchange the code for tokens:

```
use Foodticket\Wolt\Events\OAuthCallbackReceived;

Event::listen(OAuthCallbackReceived::class, function (OAuthCallbackReceived $event) {
    // $event->code  — authorization code from Wolt
    // $event->state — state parameter set when initiating the OAuth flow
});
```

To exchange the authorization code for tokens, inject `WoltOauthClient`:

```
use Foodticket\Wolt\WoltOauthClient;

$tokens = app(WoltOauthClient::class)->exchangeCode($event->code);
// $tokens['access_token']
// $tokens['refresh_token']
// $tokens['expires_in']
```

When initiating the OAuth flow, encode identifying information in the `state` parameter so the callback listener can resolve the correct resource:

```
use Illuminate\Support\Facades\Crypt;

$state = Crypt::encryptString($client->uuid);
$redirectUrl = 'https://pos.wolt.com/oauth/authorize?client_id='.config('wolt.client_id').'&state='.$state.'&redirect_uri='.urlencode(config('wolt.redirect_uri'));
```

API
---

[](#api)

Inject `WoltApi` to interact with the Wolt POS Integration API directly:

```
use Foodticket\Wolt\WoltApi;

$api = app(WoltApi::class);
```

### Orders

[](#orders)

#### `getOrder(string $orderId): array`

[](#getorderstring-orderid-array)

`GET /orders/{orderId}`

Fetch full order details (v1).

```
$order = $api->getOrder($orderId);
```

#### `getOrderV2(string $orderId): array`

[](#getorderv2string-orderid-array)

`GET /v2/orders/{orderId}`

Fetch full order details (v2). Throws `RequestException` on non-2xx responses.

```
$order = $api->getOrderV2($orderId);
```

#### `acceptOrder(string $orderId, mixed $data = null): Response`

[](#acceptorderstring-orderid-mixed-data--null-response)

`PUT /orders/{orderId}/accept`

Accept an incoming order. Pass optional body data (e.g. estimated preparation time).

```
$api->acceptOrder($orderId);
$api->acceptOrder($orderId, ['adjusted_preparation_time' => 15]);
```

#### `acceptSelfDeliveryOrder(string $orderId, mixed $data = null): Response`

[](#acceptselfdeliveryorderstring-orderid-mixed-data--null-response)

`PUT /orders/{orderId}/self-delivery/accept`

Accept an order that uses your own delivery fleet.

```
$api->acceptSelfDeliveryOrder($orderId);
```

#### `rejectOrder(string $orderId, mixed $data = null): Response`

[](#rejectorderstring-orderid-mixed-data--null-response)

`PUT /orders/{orderId}/reject`

Reject an incoming order. Pass optional body data (e.g. rejection reason).

```
$api->rejectOrder($orderId, ['reason' => 'RESTAURANT_CLOSED']);
```

#### `markOrderReady(string $orderId, mixed $data = null): Response`

[](#markorderreadystring-orderid-mixed-data--null-response)

`PUT /orders/{orderId}/ready`

Signal that the order is ready for pickup by the courier.

```
$api->markOrderReady($orderId);
```

#### `markPickupCompleted(string $orderId, mixed $data = null): Response`

[](#markpickupcompletedstring-orderid-mixed-data--null-response)

`PUT /orders/{orderId}/pickup-completed`

Signal that the courier has picked up the order (self-delivery flow).

```
$api->markPickupCompleted($orderId);
```

#### `markCourierAtCustomer(string $orderId, mixed $data = null): Response`

[](#markcourieratcustomerstring-orderid-mixed-data--null-response)

`PUT /orders/{orderId}/courier-at-customer`

Signal that the courier has arrived at the customer's location (self-delivery flow).

```
$api->markCourierAtCustomer($orderId);
```

#### `markOrderDelivered(string $orderId, mixed $data = null): Response`

[](#markorderdeliveredstring-orderid-mixed-data--null-response)

`PUT /orders/{orderId}/delivered`

Mark the order as successfully delivered (self-delivery flow).

```
$api->markOrderDelivered($orderId);
```

#### `confirmPreorder(string $orderId, mixed $data = null): Response`

[](#confirmpreorderstring-orderid-mixed-data--null-response)

`PUT /orders/{orderId}/confirm-preorder`

Confirm a scheduled/pre-order so Wolt knows the venue will fulfil it.

```
$api->confirmPreorder($orderId);
```

#### `replaceItems(string $orderId, array $itemChanges = [], array $itemAdditions = []): Response`

[](#replaceitemsstring-orderid-array-itemchanges---array-itemadditions---response)

`PUT /orders/{orderId}/replace-items`

Modify an accepted order — change quantities on existing items or add new ones. Empty arrays are omitted from the request body.

```
$api->replaceItems(
    $orderId,
    itemChanges: [
        ['item_id' => 'abc', 'count' => 2],
    ],
    itemAdditions: [
        ['item_id' => 'xyz', 'count' => 1],
    ],
);
```

#### `markSentToPos(string $orderId, mixed $data = null): Response`

[](#marksenttoposstring-orderid-mixed-data--null-response)

`PUT /orders/{orderId}/sent-to-pos`

Acknowledge that the order has been forwarded to the POS system.

```
$api->markSentToPos($orderId);
```

#### `markDepositsReturned(string $orderId, mixed $data = null): Response`

[](#markdepositsreturnedstring-orderid-mixed-data--null-response)

`PUT /orders/{orderId}/deposits-returned`

Confirm that deposit items (e.g. bottles) have been returned.

```
$api->markDepositsReturned($orderId);
```

#### `refundItems(string $orderId, mixed $data): Response`

[](#refunditemsstring-orderid-mixed-data-response)

`POST /orders/{orderId}/refund-items`

Issue a partial refund for specific items in an order.

```
$api->refundItems($orderId, [
    'items' => [
        ['item_id' => 'abc', 'count' => 1],
    ],
]);
```

#### `refundBasket(string $orderId, mixed $data): Response`

[](#refundbasketstring-orderid-mixed-data-response)

`POST /orders/{orderId}/refund-basket`

Issue a full basket refund for an order.

```
$api->refundBasket($orderId, ['reason' => 'QUALITY_ISSUE']);
```

#### `updateDeliveryLocation(string $orderId, mixed $location): Response`

[](#updatedeliverylocationstring-orderid-mixed-location-response)

`PUT /orders/{orderId}/delivery/tracking/location`

Push a live GPS coordinate update for the courier during self-delivery.

```
$api->updateDeliveryLocation($orderId, [
    'latitude'  => 52.3731,
    'longitude' => 4.8922,
]);
```

#### `updateDeliveryEta(string $orderId, mixed $data): Response`

[](#updatedeliveryetastring-orderid-mixed-data-response)

`PUT /orders/{orderId}/delivery/eta`

Update the estimated delivery time for a self-delivery order.

```
$api->updateDeliveryEta($orderId, ['eta' => '2026-04-11T12:30:00Z']);
```

#### `getDocumentUploadLink(string $orderId, string $documentType): array`

[](#getdocumentuploadlinkstring-orderid-string-documenttype-array)

`POST /orders/{orderId}/documents/{documentType}/upload-links`

Request a pre-signed upload URL for attaching a document (e.g. invoice) to an order. `$documentType` is typically `'INVOICE'`.

```
$link = $api->getDocumentUploadLink($orderId, 'INVOICE');
// $link['upload_url']
```

---

### Venues

[](#venues)

#### `getVenueStatus(string $venueId): array`

[](#getvenuestatusstring-venueid-array)

`GET /venues/{venueId}/status`

Retrieve the current online/offline status and related details for a venue.

```
$status = $api->getVenueStatus($venueId);
```

#### `getDeliveryProvider(string $venueId): array`

[](#getdeliveryproviderstring-venueid-array)

`GET /venues/{venueId}/delivery-provider`

Get the active delivery provider for a venue (`WOLT` or `SELF_DELIVERY`).

```
$provider = $api->getDeliveryProvider($venueId);
```

#### `updateDeliveryProvider(string $venueId, string $deliveryProvider): Response`

[](#updatedeliveryproviderstring-venueid-string-deliveryprovider-response)

`PATCH /venues/{venueId}/delivery-provider`

Switch the delivery provider. Accepted values: `'WOLT'`, `'SELF_DELIVERY'`.

```
$api->updateDeliveryProvider($venueId, 'SELF_DELIVERY');
```

#### `updateOnlineStatus(string $venueId, string $status, ?string $until = null): Response`

[](#updateonlinestatusstring-venueid-string-status-string-until--null-response)

`PATCH /venues/{venueId}/online`

Set the venue online or offline. Pass an ISO 8601 timestamp to `$until` to schedule an automatic return to online. Accepted `$status` values: `'ONLINE'`, `'OFFLINE'`.

```
$api->updateOnlineStatus($venueId, 'ONLINE');
$api->updateOnlineStatus($venueId, 'OFFLINE', until: '2026-04-11T08:00:00Z');
```

#### `updateOpeningTimes(string $venueId, array $availability): Response`

[](#updateopeningtimesstring-venueid-array-availability-response)

`PATCH /venues/{venueId}/opening-times`

Update regular weekly opening hours. The `$availability` array is sent as `{"availability": [...]}`.

```
$api->updateOpeningTimes($venueId, [
    ['day_of_week' => 'monday', 'open' => '08:00', 'close' => '22:00'],
    // ...
]);
```

#### `setSpecialOpeningTimes(string $venueId, mixed $data): Response`

[](#setspecialopeningtimesstring-venueid-mixed-data-response)

`PUT /venues/{venueId}/special-opening-times`

Set one-off opening time overrides (e.g. public holidays or special events).

```
$api->setSpecialOpeningTimes($venueId, [
    ['date' => '2026-12-25', 'closed' => true],
]);
```

---

### Menu

[](#menu)

#### `createMenu(string $venueId, array $menu): array`

[](#createmenustring-venueid-array-menu-array)

`POST /v1/restaurants/{venueId}/menu`

Create or fully replace the menu for a venue. Returns the created menu object. Throws `RequestException` on non-2xx responses.

```
$result = $api->createMenu($venueId, $menuArray);
```

#### `getMenu(string $venueId): array`

[](#getmenustring-venueid-array)

`GET /v2/venues/{venueId}/menu`

Retrieve the current published menu for a venue. Throws `RequestException` on non-2xx responses.

```
$menu = $api->getMenu($venueId);
```

#### `updateItemInventory(string $venueId, mixed $data): Response`

[](#updateiteminventorystring-venueid-mixed-data-response)

`PATCH /venues/{venueId}/items/inventory`

Update stock/availability for one or more menu items (e.g. mark items as sold out).

```
$api->updateItemInventory($venueId, [
    'updates' => [
        ['item_id' => 'abc', 'enabled' => false],
    ],
]);
```

#### `updateItems(string $venueId, mixed $data): Response`

[](#updateitemsstring-venueid-mixed-data-response)

`PATCH /venues/{venueId}/items`

Update item properties such as name, description, price, or enabled status.

```
$api->updateItems($venueId, [
    'updates' => [
        ['item_id' => 'abc', 'price' => 1099],
    ],
]);
```

#### `updateOptions(string $venueId, mixed $data): Response`

[](#updateoptionsstring-venueid-mixed-data-response)

`PATCH /venues/{venueId}/options/values`

Update option/modifier values and their configurations (e.g. price, availability).

```
$api->updateOptions($venueId, [
    'updates' => [
        ['option_id' => 'xyz', 'enabled' => true],
    ],
]);
```

Security Vulnerabilities
------------------------

[](#security-vulnerabilities)

If you discover a security vulnerability within this project, please report this by email to .

###  Health Score

43

—

FairBetter than 90% of packages

Maintenance92

Actively maintained with recent releases

Popularity19

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity44

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 90% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~2 days

Total

15

Last Release

63d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/9a331f154c735cc3b44cc802b7b183a58e503dfcf5dc3add0dea69eae3bc61ff?d=identicon)[foodticket](/maintainers/foodticket)

![](https://www.gravatar.com/avatar/d4f3f59549aeb7310f56a6f0885a3eb273163cedf4368c64b2455fb1fd637264?d=identicon)[rikmorskate](/maintainers/rikmorskate)

---

Top Contributors

[![rikmorskate](https://avatars.githubusercontent.com/u/3383883?v=4)](https://github.com/rikmorskate "rikmorskate (18 commits)")[![h-sols](https://avatars.githubusercontent.com/u/210041382?v=4)](https://github.com/h-sols "h-sols (2 commits)")

---

Tags

phpapi clientdeliveryfoodticketwolt

### Embed Badge

![Health badge](/badges/foodticket-wolt/health.svg)

```
[![Health](https://phpackages.com/badges/foodticket-wolt/health.svg)](https://phpackages.com/packages/foodticket-wolt)
```

###  Alternatives

[openai-php/laravel

OpenAI PHP for Laravel is a supercharged PHP API client that allows you to interact with the Open AI API

3.7k9.5M86](/packages/openai-php-laravel)[statamic/cms

The Statamic CMS Core Package

4.8k3.6M966](/packages/statamic-cms)[mozex/anthropic-laravel

Laravel integration for the Anthropic API: facade, config publishing, install command, testing fakes, messages, streaming, tool use, thinking, and batches.

74331.3k1](/packages/mozex-anthropic-laravel)[scriptdevelop/whatsapp-manager

Paquete para manejo de WhatsApp Business API en Laravel

783.8k](/packages/scriptdevelop-whatsapp-manager)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
