Set the events you subscribe to
package main
import ( "fmt" "strings" "net/http" "io")
func main() {
url := "https://driver-staging-api.delivr.no/v1/merchant/webhook/events"
payload := strings.NewReader("{ \"events\": [ \"order.placed\" ] }")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Idempotency-Key", "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0") req.Header.Add("Authorization", "Bearer <token>") req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close() body, _ := io.ReadAll(res.Body)
fmt.Println(res) fmt.Println(string(body))
}const url = 'https://driver-staging-api.delivr.no/v1/merchant/webhook/events';const options = { method: 'PUT', headers: { 'Idempotency-Key': '2489E9AD-2EE2-8E00-8EC9-32D5F69181C0', Authorization: 'Bearer <token>', 'Content-Type': 'application/json' }, body: '{"events":["order.placed"]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PUT \ --url https://driver-staging-api.delivr.no/v1/merchant/webhook/events \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --header 'Idempotency-Key: 2489E9AD-2EE2-8E00-8EC9-32D5F69181C0' \ --data '{ "events": [ "order.placed" ] }'An empty or omitted list subscribes to every event. webhook.test is always delivered.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Header Parameters
Section titled “Header Parameters”A UUID, one header. A retry of the same request (method, path,
canonical JSON body) within 24 h gets the first successful reply
again (Idempotent-Replayed: true). Another request under the key
is 422 idempotency_key_reused; a retry while the first runs is
409 idempotency_key_in_flight. Refused or failed requests free
the key.
Request Bodyrequired
Section titled “Request Bodyrequired”object
Responses
Section titled “Responses”The endpoint.
object
First characters of the signing secret (whsec_...).
A rotated-out secret also signs until then.
Absent - every event.
Example
{ "events": [ "order.placed" ]}Headers
Section titled “Headers”The request’s id (yours if you sent a valid one, up to 64 of A-Za-z0-9._-). Quote it to support.
malformed_json, idempotency_key_required.
object
object
Status per code: 400 malformed_json, idempotency_key_required; 401 unauthenticated; 403 merchant_suspended, insufficient_scope; 404 not_found, quote_not_found; 405 method_not_allowed; 409 conflict, cancellation_not_allowed, idempotency_key_in_flight, price_changed, option_unavailable, fee_changed, quote_already_used, external_ref_taken, window_full, order_ended; 422 invalid_request, idempotency_key_reused, no_delivery_options, manual_quote_required, invalid_address; 429 rate_limited; 500 internal; 503 unavailable.
Human-readable; may change. Branch on code.
The request field at fault, e.g. delivery.address (an unknown field: its name).
object
object
Stable key to book (on_demand or window:<start>/<end> in the market’s zone). The same delivery quoted again lists the same keys.
On demand. Arrival band.
object
Window option.
object
Window option. Book and cancel free before it.
object
VAT included.
On demand only. HINT for the seller, never a promise: drivers near the store when quoted and when the first-ranked could reach it. Do not show a driver count to shoppers.
object
object
object
Options offered instead (may be empty). Book one by key.
object
Stable key to book (on_demand or window:<start>/<end> in the market’s zone). The same delivery quoted again lists the same keys.
On demand. Arrival band.
object
Window option.
object
Window option. Book and cancel free before it.
object
VAT included.
On demand only. HINT for the seller, never a promise: drivers near the store when quoted and when the first-ranked could reach it. Do not show a driver count to shoppers.
object
object
object
object
VAT split only when charged.
object
VAT included.
Example
{ "error": { "code": "invalid_request", "details": { "option": { "type": "on_demand", "key": "on_demand", "price": { "currency": "NOK" } } } }}unauthenticated: missing, unknown or revoked key.
object
object
Status per code: 400 malformed_json, idempotency_key_required; 401 unauthenticated; 403 merchant_suspended, insufficient_scope; 404 not_found, quote_not_found; 405 method_not_allowed; 409 conflict, cancellation_not_allowed, idempotency_key_in_flight, price_changed, option_unavailable, fee_changed, quote_already_used, external_ref_taken, window_full, order_ended; 422 invalid_request, idempotency_key_reused, no_delivery_options, manual_quote_required, invalid_address; 429 rate_limited; 500 internal; 503 unavailable.
Human-readable; may change. Branch on code.
The request field at fault, e.g. delivery.address (an unknown field: its name).
object
object
Stable key to book (on_demand or window:<start>/<end> in the market’s zone). The same delivery quoted again lists the same keys.
On demand. Arrival band.
object
Window option.
object
Window option. Book and cancel free before it.
object
VAT included.
On demand only. HINT for the seller, never a promise: drivers near the store when quoted and when the first-ranked could reach it. Do not show a driver count to shoppers.
object
object
object
Options offered instead (may be empty). Book one by key.
object
Stable key to book (on_demand or window:<start>/<end> in the market’s zone). The same delivery quoted again lists the same keys.
On demand. Arrival band.
object
Window option.
object
Window option. Book and cancel free before it.
object
VAT included.
On demand only. HINT for the seller, never a promise: drivers near the store when quoted and when the first-ranked could reach it. Do not show a driver count to shoppers.
object
object
object
object
VAT split only when charged.
object
VAT included.
Example
{ "error": { "code": "invalid_request", "details": { "option": { "type": "on_demand", "key": "on_demand", "price": { "currency": "NOK" } } } }}merchant_suspended, insufficient_scope.
object
object
Status per code: 400 malformed_json, idempotency_key_required; 401 unauthenticated; 403 merchant_suspended, insufficient_scope; 404 not_found, quote_not_found; 405 method_not_allowed; 409 conflict, cancellation_not_allowed, idempotency_key_in_flight, price_changed, option_unavailable, fee_changed, quote_already_used, external_ref_taken, window_full, order_ended; 422 invalid_request, idempotency_key_reused, no_delivery_options, manual_quote_required, invalid_address; 429 rate_limited; 500 internal; 503 unavailable.
Human-readable; may change. Branch on code.
The request field at fault, e.g. delivery.address (an unknown field: its name).
object
object
Stable key to book (on_demand or window:<start>/<end> in the market’s zone). The same delivery quoted again lists the same keys.
On demand. Arrival band.
object
Window option.
object
Window option. Book and cancel free before it.
object
VAT included.
On demand only. HINT for the seller, never a promise: drivers near the store when quoted and when the first-ranked could reach it. Do not show a driver count to shoppers.
object
object
object
Options offered instead (may be empty). Book one by key.
object
Stable key to book (on_demand or window:<start>/<end> in the market’s zone). The same delivery quoted again lists the same keys.
On demand. Arrival band.
object
Window option.
object
Window option. Book and cancel free before it.
object
VAT included.
On demand only. HINT for the seller, never a promise: drivers near the store when quoted and when the first-ranked could reach it. Do not show a driver count to shoppers.
object
object
object
object
VAT split only when charged.
object
VAT included.
Example
{ "error": { "code": "invalid_request", "details": { "option": { "type": "on_demand", "key": "on_demand", "price": { "currency": "NOK" } } } }}conflict, cancellation_not_allowed, idempotency_key_in_flight,
price_changed, option_unavailable, window_full, fee_changed,
quote_already_used, external_ref_taken, order_ended. See
details for what to do.
object
object
Status per code: 400 malformed_json, idempotency_key_required; 401 unauthenticated; 403 merchant_suspended, insufficient_scope; 404 not_found, quote_not_found; 405 method_not_allowed; 409 conflict, cancellation_not_allowed, idempotency_key_in_flight, price_changed, option_unavailable, fee_changed, quote_already_used, external_ref_taken, window_full, order_ended; 422 invalid_request, idempotency_key_reused, no_delivery_options, manual_quote_required, invalid_address; 429 rate_limited; 500 internal; 503 unavailable.
Human-readable; may change. Branch on code.
The request field at fault, e.g. delivery.address (an unknown field: its name).
object
object
Stable key to book (on_demand or window:<start>/<end> in the market’s zone). The same delivery quoted again lists the same keys.
On demand. Arrival band.
object
Window option.
object
Window option. Book and cancel free before it.
object
VAT included.
On demand only. HINT for the seller, never a promise: drivers near the store when quoted and when the first-ranked could reach it. Do not show a driver count to shoppers.
object
object
object
Options offered instead (may be empty). Book one by key.
object
Stable key to book (on_demand or window:<start>/<end> in the market’s zone). The same delivery quoted again lists the same keys.
On demand. Arrival band.
object
Window option.
object
Window option. Book and cancel free before it.
object
VAT included.
On demand only. HINT for the seller, never a promise: drivers near the store when quoted and when the first-ranked could reach it. Do not show a driver count to shoppers.
object
object
object
object
VAT split only when charged.
object
VAT included.
Example
{ "error": { "code": "invalid_request", "details": { "option": { "type": "on_demand", "key": "on_demand", "price": { "currency": "NOK" } } } }}invalid_request (with param), idempotency_key_reused,
no_delivery_options, manual_quote_required, invalid_address.
object
object
Status per code: 400 malformed_json, idempotency_key_required; 401 unauthenticated; 403 merchant_suspended, insufficient_scope; 404 not_found, quote_not_found; 405 method_not_allowed; 409 conflict, cancellation_not_allowed, idempotency_key_in_flight, price_changed, option_unavailable, fee_changed, quote_already_used, external_ref_taken, window_full, order_ended; 422 invalid_request, idempotency_key_reused, no_delivery_options, manual_quote_required, invalid_address; 429 rate_limited; 500 internal; 503 unavailable.
Human-readable; may change. Branch on code.
The request field at fault, e.g. delivery.address (an unknown field: its name).
object
object
Stable key to book (on_demand or window:<start>/<end> in the market’s zone). The same delivery quoted again lists the same keys.
On demand. Arrival band.
object
Window option.
object
Window option. Book and cancel free before it.
object
VAT included.
On demand only. HINT for the seller, never a promise: drivers near the store when quoted and when the first-ranked could reach it. Do not show a driver count to shoppers.
object
object
object
Options offered instead (may be empty). Book one by key.
object
Stable key to book (on_demand or window:<start>/<end> in the market’s zone). The same delivery quoted again lists the same keys.
On demand. Arrival band.
object
Window option.
object
Window option. Book and cancel free before it.
object
VAT included.
On demand only. HINT for the seller, never a promise: drivers near the store when quoted and when the first-ranked could reach it. Do not show a driver count to shoppers.
object
object
object
object
VAT split only when charged.
object
VAT included.
Example
{ "error": { "code": "invalid_request", "details": { "option": { "type": "on_demand", "key": "on_demand", "price": { "currency": "NOK" } } } }}rate_limited. Also after repeated failed sign-ins from one address.
object
object
Status per code: 400 malformed_json, idempotency_key_required; 401 unauthenticated; 403 merchant_suspended, insufficient_scope; 404 not_found, quote_not_found; 405 method_not_allowed; 409 conflict, cancellation_not_allowed, idempotency_key_in_flight, price_changed, option_unavailable, fee_changed, quote_already_used, external_ref_taken, window_full, order_ended; 422 invalid_request, idempotency_key_reused, no_delivery_options, manual_quote_required, invalid_address; 429 rate_limited; 500 internal; 503 unavailable.
Human-readable; may change. Branch on code.
The request field at fault, e.g. delivery.address (an unknown field: its name).
object
object
Stable key to book (on_demand or window:<start>/<end> in the market’s zone). The same delivery quoted again lists the same keys.
On demand. Arrival band.
object
Window option.
object
Window option. Book and cancel free before it.
object
VAT included.
On demand only. HINT for the seller, never a promise: drivers near the store when quoted and when the first-ranked could reach it. Do not show a driver count to shoppers.
object
object
object
Options offered instead (may be empty). Book one by key.
object
Stable key to book (on_demand or window:<start>/<end> in the market’s zone). The same delivery quoted again lists the same keys.
On demand. Arrival band.
object
Window option.
object
Window option. Book and cancel free before it.
object
VAT included.
On demand only. HINT for the seller, never a promise: drivers near the store when quoted and when the first-ranked could reach it. Do not show a driver count to shoppers.
object
object
object
object
VAT split only when charged.
object
VAT included.
Example
{ "error": { "code": "invalid_request", "details": { "option": { "type": "on_demand", "key": "on_demand", "price": { "currency": "NOK" } } } }}Headers
Section titled “Headers”Seconds to wait.
Requests per minute for your merchant (600).
Seconds until the window resets.