Wolt Drive API endpoints
Note that we release new features constantly and may add optional fields in our API without creating a new API version. In practice, this could mean that some new fields are also introduced in the responses. The client side should allow unknown keys.
Base URLs
- Staging:
https://daas-public-api.development.dev.woltapi.com
- Production:
https://daas-public-api.wolt.com
Authentication
All requests to Drive API endpoints must be authorized with a Bearer Token.
All the requests must contain Authorization: Bearer <token>
header. This token is often referred as Merchant Key. Staging token will be provided by Wolt when you start the integration development and the production token when you successfully complete the testing phase. Only one token per merchant is needed.
Venueful endpoints
Shipment Promises
A venueful endpoint
Promise contains estimated price and delivery time based on destination location. It can be binding in case when the location is detailed enough for time estimate to be accurate. Also it can be non-binding which means that location is not precise enough and time is a rough estimate. In case of non-binding promise it is not possible to create a delivery order using the promise. Promise creation is rather flexible but estimate accuracy depends on inputs.
There are multiple ways to create a shipment promise:
- lat AND lon AND ((street AND city) OR (street AND post_code)) - the preferred way of creating a binding promise with most accurate estimates.
- street + city - yields a binding promise with accurate estimates.
- street + post_code - yields a binding promise with accurate estimates.
- post_code or city only - a non-binding promise with rough estimates and it is not possible to create a delivery order with it.
- lat AND lon - a non-binding promise with an accurate estimate. Add street and city name for a binding promise.
Additionally you can add parcel and cash information into the request for more accurate price estimates.
POST /v1/venues/{venue_id}/shipment-promises
Shipment promise request
This request validates the delivery availability based on recipient location. This price is does not include possible extra fees, based on dimensions and/or cash usage. See the second tab for requesting a final estimate based on all available details.
POST /v1/venues/{venue_id}/shipment-promises
{"street": "string","city": "string","post_code": "string","lat": 0,"lon": 0,"language": "string","min_preparation_time_minutes": 30,"scheduled_dropoff_time": "2019-08-24T14:15:22Z"}
Shipment promise parameters
Name | Location | Type | Required |
---|---|---|---|
venue_id | In: path | string | Required |
Parameter | Type | Required | Description |
---|---|---|---|
street | string | Street name and house number. | |
city | string | The name of the city. | |
post_code | string | Post code | |
lat | number | "lat" and "lon" are always preferred over address details. | |
lon | number | "lat" and "lon" are always preferred over address details. | |
language | string | Response address will be localized with this language if locale is available. | |
min_preparation_time_minutes | integer | Default: 30 | Max 60 mins. Time that the venue needs for preparing the order. Functionality is explained under payload features. |
scheduled_dropoff_time | string(date-time) | Target time for the scheduled pre-order dropoff. Timestamp is in ISO8601 format e.g. 2020-01-30T10:00:13.123Z. Functionality is explained under payload features. |
Shipment promise request with applicable fees
Response to this request will include possible additional fees based on order dimensions and cash usage. It also validates the delivery availability, and can be requested after the recipient has included their full address and selected items for delivery. These additional details do not affect the delivery availability.
POST /v1/venues/{venue_id}/shipment-promises
{"street": "string","city": "string","post_code": "string","lat": 0,"lon": 0,"language": "string","min_preparation_time_minutes": 30,"scheduled_dropoff_time": "2019-08-24T14:15:22Z","parcels": [{"count": 1,"dimensions": {"weight_gram": 0,"width_cm": 0,"height_cm": 0,"depth_cm": 0},"price": {"amount": 0,"currency": "string"}}],"cash": {"amount_to_collect": 0}}
Shipment promise with extra parameters
Name | Location | Type | Required |
---|---|---|---|
venue_id | In: path | string | Required |
Parameter | Type | Required | Description |
---|---|---|---|
street | string | Street name and house number. | |
city | string | The name of the city. | |
post_code | string | Post code | |
lat | number | "lat" and "lon" are always preferred over address details. | |
lon | number | "lat" and "lon" are always preferred over address details. | |
language | string | Response address will be localized with this language if locale is available. | |
min_preparation_time_minutes | integer | Default: 30 | Max 60 mins. Time that the venue needs for preparing the order. Functionality is explained under payload features. |
scheduled_dropoff_time | string(date-time) | Target time for the scheduled pre-order dropoff. Timestamp is in ISO8601 format e.g. 2020-01-30T10:00:13.123Z. Functionality is explained under payload features. | |
parcels | ParcelV1 | A list of parcels for a single delivery. Providing this allows for more accurate price estimates. | |
cash | Cash | Supported in some regions. Check with your Wolt Drive contact if cash is included in your contract. Providing this allows for more accurate price estimates. |
Shipment promise response
201 Created{"id": "string","created_at": "2019-08-24T14:15:22Z","valid_until": "2019-08-24T14:15:22Z","pickup": {"venue_id": "string","location": {"coordinates": {"lat": 0,"lon": 0},"formatted_address": "string"},"options": {"min_preparation_time_minutes": 0},"eta_minutes": 0},"dropoff": {"location": {"coordinates": {"lat": 0,"lon": 0},"formatted_address": "string"},"options": {"scheduled_time": "2019-08-24T14:15:22Z"},"eta_minutes": 0},"price": {"amount": 0,"currency": "string"},"time_estimate_minutes": 0,"is_binding": true,"parcels": [{"dimensions": {"weight_gram": 0,"width_cm": 0,"height_cm": 0,"depth_cm": 0},"price": {"amount": 0,"currency": "string"},"count": 1}]}
Field time_estimate_minutes
is deprecated, use dropoff.eta_minutes or dropoff.options.scheduled_time in order to determine the delivery estimate.
Status | Description | Schema |
---|---|---|
201 | Successful Response | ShipmentPromiseDetailsV1 |
400 | Bad Request | 400 Error handling |
401 | Unauthorized | 401 Error handling |
404 | Not found | 404 Error handling |
422 | Unprocessable Entity | 422 Error handling |
500 | Internal Server Error | 500 Error handling |
Deliveries
A venueful endpoint
POST /v1/venues/{venue_id}/deliveries
Deliveries request
POST /v1/venues/{venue_id}/deliveries
{"pickup": {"options": {"min_preparation_time_minutes": 30},"comment": "string","display_name": "string"},"dropoff": {"location": {"coordinates": {"lat": 0,"lon": 0}},"comment": "string","options": {"is_no_contact": false,"scheduled_time": "2019-08-24T14:15:22Z"}},"price": {"amount": 0,"currency": "string"},"recipient": {"name": "string","phone_number": "string","email": "string"},"parcels": [{"count": 1,"dimensions": {"weight_gram": 0,"width_cm": 0,"height_cm": 0,"depth_cm": 0},"price": {"amount": 0,"currency": "string"},"description": "string","identifier": "string","dropoff_restrictions": {"id_check_required": false},"tags": ["alcohol"]}],"shipment_promise_id": "string","customer_support": {"url": "string","email": "string","phone_number": "string"},"merchant_order_reference_id": "string","sms_notifications": {"received": "string","picked_up": "string"},"tips": [{"type": "pre_delivery_courier_tip","price": {"amount": 0,"currency": "string"}}],"order_number": "string","cash": {"amount_to_collect": 0,"amount_to_expect": 0},"handshake_delivery": {"is_required": false,"should_send_sms_to_dropoff_contact": true}}
Delivery request parameters
Name | Location | Type | Required |
---|---|---|---|
venue_id | In: path | string | Required |
Parameter | Type | Required | Description |
---|---|---|---|
pickup | CreatePickupV1 | ||
dropoff | CreateDropoffV1 | Required | The location with some additional information of the parcels destination. |
price | Price | Required | Confirmation of price for delivery. Use the price received in ShipmentPromiseDetailsV1. |
recipient | RecipientV1 | Required | Person who is going to receive the parcels. |
parcels | ParcelV1 | Required | A list of parcels for a single delivery. |
shipment_promise_id | string | Required | ID of a binding shipment promise received from the previous step. |
customer_support | CustomerSupport | Required | Customer support contact information which will be shown for the customer in the Wolt tracking UI. |
merchant_order_reference_id | string | Any kind of external reference which links back to the delivery order. | |
sms_notifications | SmsNotifications | Content for the SMS message(s) which will be sent to the recipient at certain stage(s) of the delivery. NOTE: This is an optional feature for communicating the tracking link to the recipient. | |
tips | Tip | Any additional monetary pre-delivery tips for courier partner. | |
order_number | string | A short reference which links back to the delivery order. Suggested to be 5 chars or under. If present, is shown to courier partner instead of merchant_order_reference_id . | |
cash | Cash | Supported in some regions. Check with your Wolt Drive contact if cash is included in your contract. Including this payload will enable cash on delivery, and will result in error if cash is not enabled on your account. | |
handshake_delivery | HandshakeDelivery | Supported in some regions. Enables PIN verification on delivery. Check with your Wolt Drive contact if HSD is available. See feature documentation. |
Deliveries response
201 Created{"id": "string","status": "INFO_RECEIVED","tracking": {"id": "string","url": "string"},"pickup": {"location": {"coordinates": {"lat": 0,"lon": 0},"formatted_address": "string"},"comment": "string","options": {"min_preparation_time_minutes": 30},"eta": "2019-08-24T14:15:22Z","display_name": "string"},"dropoff": {"location": {"coordinates": {"lat": 0,"lon": 0},"formatted_address": "string"},"comment": "string","options": {"is_no_contact": false,"scheduled_time": "2019-08-24T14:15:22Z"},"eta": "2019-08-24T14:15:22Z"},"price": {"amount": 0,"currency": "string"},"recipient": {"name": "string","phone_number": "string","email": "string"},"parcels": [{"dimensions": {"weight_gram": 0,"width_cm": 0,"height_cm": 0,"depth_cm": 0},"price": {"amount": 0,"currency": "string"},"description": "string","identifier": "string","dropoff_restrictions": {"id_check_required": false},"tags": ["alcohol"],"count": 1}],"customer_support": {"url": "string","email": "string","phone_number": "string"},"wolt_order_reference_id": "string","merchant_order_reference_id": "string","tips": [{"type": "pre_delivery_courier_tip","price": {"amount": 0,"currency": "string"}}],"order_number": "string"}
Status | Description | Schema |
---|---|---|
201 | Successful Response | DeliveryOrderV1 |
400 | Bad Request | 400 Error handling |
401 | Unauthorized | 401 Error handling |
404 | Not found | 404 Error handling |
422 | Unprocessable Entity | 422 Error handling |
500 | Internal Server Error | 500 Error handling |
Available venues
A venueful endpoint. Additional step.
Requesting available venues is an additional step that can simplify the process of filtering available venues for delivery. When providing the dropoff location as the request, endpoint returns a sorted list of available venue names, their IDs, delivery prices and estimated delivery times.
Available venues request
POST /merchants/{merchant_id}/available-venues
{"dropoff": {"location": {"formatted_address": "string","coordinates": {"lat": 0,"lon": 0}}},"scheduled_dropoff_time": "string"}
Available venues parameters
Name | Location | Type | Required |
---|---|---|---|
merchant_id | In: path | string | Required |
Parameter | Type | Required | Description |
---|---|---|---|
dropoff | DropoffDetails | Required | Dropoff location information. |
scheduled_dropoff_time | string(date-time) | Target time for the scheduled pre-order dropoff. Timestamp is in ISO8601 format e.g. 2020-01-30T10:00:13.123Z. Functionality is explained under payload features. |
Available venues response
201 Created[{"pickup": {"venue_id": "string","name": [{"lang": "string","value": "string"}],"location": {"formatted_address": "string","coordinates": {"lat": 0,"lon": 0}}},"fee": {"amount": 0,"currency": "string"},"pre_estimate": {"pickup_minutes": 0,"delivery_minutes": 0,"total_minutes": {"min": 0,"mean": 0,"max": 0}},"scheduled_dropoff_time": "string"}]
Status | Description | Schema |
---|---|---|
201 | Successful Response | AvailableVenuesListResponse |
400 | Bad Request | 400 Error handling |
401 | Unauthorized | 401 Error handling |
404 | Not found | 404 Error handling |
422 | Unprocessable Entity | 422 Error handling |
500 | Internal Server Error | 500 Error handling |
Venueless endpoints
Delivery Fee
A venueless endpoint
POST /merchants/{merchant_id}/delivery-fee
Delivery fee request
POST /merchants/{merchant_id}/delivery-fee
{"pickup": {"location": {"formatted_address": "string","coordinates": {"lat": 0,"lon": 0}}},"dropoff": {"location": {"formatted_address": "string","coordinates": {"lat": 0,"lon": 0}}},"scheduled_dropoff_time": "2019-08-24T14:15:22Z","contents": [{"count": 1,"dimensions": {"weight_gram": 0,"width_cm": 0,"height_cm": 0,"depth_cm": 0},"price": {"amount": 0,"currency": "string"}}],"cash": {"amount_to_collect": 0,"amount_to_expect": 0}}
Delivery fee request parameters
Name | Location | Type | Required |
---|---|---|---|
merchant_id | In: path | string | Required |
Parameter | Type | Required | Description |
---|---|---|---|
pickup | PickupDetails | Required | Pickup location (venue) information. |
dropoff | DropoffDetails | Required | Dropoff location (end-customer) information. |
scheduled_dropoff_time | string(date-time) | Target time for the scheduled pre-order dropoff. Timestamp is in ISO8601 format e.g. 2020-01-30T10:00:13.123Z. Functionality is explained under payload features. | |
contents | [Contents] | A list of parcels for a single delivery. Providing this allows for more accurate price estimates. | |
cash | Cash | Supported in some regions. Check with your Wolt Drive contact if cash is included in your contract. Providing this allows for more accurate price estimates. |
Delivery fee response
200 OK{"created_at": "string","pickup": {"location": {"formatted_address": "string","coordinates": {"lat": 0,"lon": 0}}},"dropoff": {"location": {"formatted_address": "string","coordinates": {"lat": 0,"lon": 0}}},"fee": {"amount": 0,"currency": "string"},"time_estimate_minutes": 0,"scheduled_dropoff_time": "string"}
Status | Description | Schema |
---|---|---|
201 | Successful Response | DeliveryFeeResponse |
400 | Bad Request | 400 Error handling |
401 | Unauthorized | 401 Error handling |
404 | Not found | 404 Error handling |
422 | Unprocessable Entity | 422 Error handling |
500 | Internal Server Error | 500 Error handling |
Delivery Order
A venueless endpoint
POST /merchants/{merchant_id}/delivery-order
Delivery order request
POST /merchants/{merchant_id}/delivery-order
{"pickup": {"location": {"formatted_address": "string","coordinates": {"lat": 0,"lon": 0}},"comment": "string","contact_details": {"name": "string","phone_number": "string","send_tracking_link_sms": true},"display_name": "string"},"dropoff": {"location": {"formatted_address": "string","coordinates": {"lat": 0,"lon": 0}},"contact_details": {"name": "string","phone_number": "string","send_tracking_link_sms": true},"comment": "string"},"customer_support": {"email": "string","phone_number": "string","url": "string"},"merchant_order_reference_id": "string","is_no_contact": true,"contents": [{"count": 0,"description": "string","identifier": "string","id_check_required": false,"tags": ["alcohol"],"price": {"amount": 0,"currency": "string"},"dimensions": {"weight_gram": 0,"width_cm": 0,"height_cm": 0,"depth_cm": 0}}],"tips": [{"type": "pre_delivery_courier_tip","price": {"amount": 0,"currency": "string"}}],"min_preparation_time_minutes": 0,"scheduled_dropoff_time": "2019-08-24T14:15:22Z","order_number": "string","cash": {"amount_to_collect": 0,"amount_to_expect": 0},"handshake_delivery": {"is_required": false,"should_send_sms_to_dropoff_contact": true}}
Delivery order request parameters
Name | Location | Type | Required |
---|---|---|---|
merchant_id | In: path | string | Required |
Parameter | Type | Required | Description |
---|---|---|---|
pickup | CreatePickupDetails | Required | Pickup location (venue) information. |
dropoff | CreateDropoffDetails | Required | Pickup location (end-customer) information. |
customer_support | CustomerSupport | Required | Customer support contact information which will be shown for the customer in the Wolt tracking UI. |
merchant_order_reference_id | string | Any kind of reference-id which links back to the delivery order. | |
is_no_contact | boolean | Required | Boolean for no-contact delivery. Define if the order should be left at customer's door. |
contents | [Contents] | Required | A list of parcels for a single delivery. |
tips | [Tip] | Required | Any additional monetary pre-delivery tips for courier partner. |
min_preparation_time_minutes | integer | Required | Max 60 mins. Time that the venue needs for preparing the order. Functionality is explained under payload features. |
scheduled_dropoff_time | string(date-time) | Target time for the scheduled pre-order dropoff. Timestamp is in ISO8601 format e.g. 2020-01-30T10:00:13.123Z. Functionality is explained under payload features. | |
order_number | string | A short reference which links back to the delivery order. Suggested to be 5 chars or under. If present, is shown to courier partner instead of merchant_order_reference_id . | |
cash | Cash | Supported in some markets. Check with your Wolt Drive contact if cash is included in your contract. Including this payload will enable cash on delivery, and will result in error if cash is not enabled on your account. | |
handshake_delivery | HandshakeDelivery | Supported in some regions. Enables PIN verification on delivery. Check with your Wolt Drive contact if HSD is available. See feature documentation. |
Delivery order response
201 Created{"pickup": {"eta": "string","location": {"formatted_address": "string","coordinates": {"lat": 0,"lon": 0}},"comment": "string","contact_details": {"name": "string","phone_number": "string","send_tracking_link_sms": true},"display_name": "string"},"dropoff": {"eta": "string","location": {"formatted_address": "string","coordinates": {"lat": 0,"lon": 0}},"comment": "string","contact_details": {"name": "string","phone_number": "string","send_tracking_link_sms": true}},"scheduled_dropoff_time": "string","customer_support": {"email": "string","phone_number": "string","url": "string"},"is_no_contact": true,"merchant_order_reference_id": "string","contents": [{"count": 0,"description": "string","identifier": "string","id_check_required": false,"tags": ["alcohol"],"price": {"amount": 0,"currency": "string"},"dimensions": {"weight_gram": 0,"width_cm": 0,"height_cm": 0,"depth_cm": 0}}],"tips": [{"type": "pre_delivery_courier_tip","price": {"amount": 0,"currency": "string"}}],"price": {"amount": 0,"currency": "string"},"tracking": {"id": "string","url": "string"},"wolt_order_reference_id": "string","min_preparation_time_minutes": 0,"order_number": "string"}
Status | Description | Schema |
---|---|---|
201 | Successful Response | DeliveryOrderResponse |
400 | Bad Request | 400 Error handling |
401 | Unauthorized | 401 Error handling |
404 | Not found | 404 Error handling |
422 | Unprocessable Entity | 422 Error handling |
500 | Internal Server Error | 500 Error handling |
Live order features
These endpoints can be used to alter the status or get details of an active delivery order.
Order cancellation
Any Drive API delivery can be cancelled before a Wolt courier partner has accepted the delivery task. Exact time depends on order preparation time and courier availability. Task start is optimized to happen roughly at pickup time
minus courier travel time
. To support timing and user experience, use webhook event order.pickup_started
. Sending a cancellation after pickup has started will return error 400 and no further automated action is taken. Such orders need to be canceled by contacting support.
Cancellation reason is required. Reason can be any string and it will be visible on Wolt’s system.
PATCH /order/{wolt_order_reference_id}/status/cancel
Order cancellation request
PATCH /order/{wolt_order_reference_id}/status/cancel
{"reason": "string"}
Name | Location | Type | Required | Description |
---|---|---|---|---|
wolt_order_reference_id | In: path | string | Required | Reference ID as returned in delivery creation response |
Parameter | Type | Required | Description |
---|---|---|---|
reason | string | Required | A free-form informative reason for the cancellation. |
Order cancellation responses
Successful response:
200 OK{"status": "REJECTED"}
Failed response, cancellation no longer possible.
400 Invalid payload{"error_code": "INVALID_ORDER_STATE_TRANSITION","reason": "Invalid order state transition","details": "Order is not in a cancellable state. Please contact support to cancel it"}
Generic error responses apply to possible order cancellation responses.
Get delivery handshake details
If a delivery has the handshake PIN verification enabled, the generated PIN and other relevant information can be fetched using a GET endpoint. Customer is required to provide the PIN for Wolt courier partner. See documentation:
GET /order/{wolt_order_reference_id}/status/handshake-delivery
GET /order/{wolt_order_reference_id}/status/handshake-delivery
curl {{host}}/order/{wolt_order_reference_id}/status/handshake-delivery \-H "Authorization: Bearer (token)"
Name | Location | Type | Required | Description |
---|---|---|---|---|
wolt_order_reference_id | In: path | string | Required | Reference ID as returned in delivery creation response |
Expected response when handshake is enabled:
200 OK{"is_required": true,"pin_code": 123}