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
POST /v1/venues/{venue_id}/shipment-promises
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.
Requirement for min_preparation_time_minutes
and scheduled_dropoff_time
depend on the use case. When the delivery is to be done within next hour, scheduled_dropoff_time
must not be included in the payload. Read the use case documentation for more information.
There are multiple ways to create a shipment promise:
Binding promises with accurate estimates
lat + lon + street + post_code + city
street + post_code + city
Binding promises with accurate estimates, but with a risk of address mixups (e.g., when local geolocation data is suboptimal or similar street addresses exist nearby).
street + city
street + post_code
Non-binding promises, usable when filtering venues but not for a delivery
post_code OR city only - a rough non-binding promise based on the general area.
lat + lon - a non-binding promise with an accurate estimate. Add street and city/post_code before delivery.
Formatting notes:
The `street` field must include the house number.
In addition to house number, entrance number/letter and apartment number also can be included. Depending on the complexity of local address formats, these can also be added as dropoff comments.
Other details (e.g., floor number, delivery instructions) should not be included in `street` but be added separately as a dropoff comment when making a delivery request.
Additionally you can add parcel and cash information into the request for more accurate price estimates, which include applicable fees. See tab "request with applicable fees" for more details.
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.
{"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 to create a delivery order.
POST /v1/venues/{venue_id}/deliveries
The payload of the delivery request should contain for example the following information:
The ID of the shipment promise which was created in previous step
Information about the delivery recipient (e.g. name and phone number)
Information about the parcels to be delivered
Full location of the recipient (drop-off location), which must match the information returned in the response payload of the shipment promise
Any special delivery requirements, and any information beneficial for the specific use case.
Response will include the detailed information for the delivery, including a tracking ID and URL.
Deliveries request
POST /v1/venues/{venue_id}/deliveries
{"pickup": {"options": {"min_preparation_time_minutes": 30},"comment": "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 | Additional pickup information. | |
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 Shipment promise response. |
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 | Unique identifier of a binding shipment promise received in create a shipment promise response. |
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. 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
Please consult with your Wolt contact person before choosing venueless approach.
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 (sender) information. |
dropoff | DropoffDetails | Required | Dropoff location (receiver) 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
curl -X POST {{host}}/merchants/{merchant_id}/delivery-order \-H "Authorization: Bearer (token)" \-H "Content-Type: application/json" \-d '{"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 at minimum to prepare 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, "rejected" refers to the new state of the order:
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: Delivery handshake verification
GET /order/{wolt_order_reference_id}/handshake-delivery
GET /order/{wolt_order_reference_id}/handshake-delivery
curl {{host}}/order/{wolt_order_reference_id}/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}