Quote a delivery
package main
import ( "fmt" "strings" "net/http" "io")
func main() {
url := "https://driver-staging-api.delivr.no/v1/merchant/quotes"
payload := strings.NewReader("{ \"pickupLocationId\": \"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0\", \"pickupExternalStoreId\": \"example\", \"delivery\": { \"address\": { \"street\": \"example\", \"line2\": \"example\", \"postalCode\": \"example\", \"city\": \"example\", \"country\": \"NO\", \"latitude\": 1, \"longitude\": 1 }, \"contact\": { \"name\": \"example\", \"phone\": \"example\" } }, \"parcels\": [ { \"count\": 1, \"lengthCm\": 1, \"widthCm\": 1, \"heightCm\": 1, \"weightKg\": 1 } ], \"items\": [ { \"title\": \"example\", \"imageUrl\": \"https://example.com\", \"quantity\": 1 } ], \"readyBy\": \"2026-04-15T12:00:00Z\" }")
req, _ := http.NewRequest("POST", url, payload)
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/quotes';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"pickupLocationId":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","pickupExternalStoreId":"example","delivery":{"address":{"street":"example","line2":"example","postalCode":"example","city":"example","country":"NO","latitude":1,"longitude":1},"contact":{"name":"example","phone":"example"}},"parcels":[{"count":1,"lengthCm":1,"widthCm":1,"heightCm":1,"weightKg":1}],"items":[{"title":"example","imageUrl":"https://example.com","quantity":1}],"readyBy":"2026-04-15T12:00:00Z"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://driver-staging-api.delivr.no/v1/merchant/quotes \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "pickupLocationId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "pickupExternalStoreId": "example", "delivery": { "address": { "street": "example", "line2": "example", "postalCode": "example", "city": "example", "country": "NO", "latitude": 1, "longitude": 1 }, "contact": { "name": "example", "phone": "example" } }, "parcels": [ { "count": 1, "lengthCm": 1, "widthCm": 1, "heightCm": 1, "weightKg": 1 } ], "items": [ { "title": "example", "imageUrl": "https://example.com", "quantity": 1 } ], "readyBy": "2026-04-15T12:00:00Z" }'Prices the on-demand option (when there is capacity) and the
service windows from a store to an address. A quote is offered for
5 minutes (expiresAt), plus a per-market grace when booking.
Idempotency-Key is optional here: without one, a retry quotes
again.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Header Parameters
Section titled “Header Parameters”Request Bodyrequired
Section titled “Request Bodyrequired”Exactly one of pickupLocationId and pickupExternalStoreId.
object
No dropoff on a quote (send it with the order): it is refused as an unknown field.
object
object
Apartment or unit (bolignummer, e.g. H0101). Not priced.
With longitude, or neither (Delivr geocodes).
object
The recipient’s phone; the tracking SMS goes here.
A group of identical parcels. Give all three dimensions or none (none uses the store’s default package size).
object
A product bought. Display only (recipient SMS, tracking page, driver); never priced.
object
Https on a public host; never fetched by Delivr.
When the goods are ready at the latest (within 24 h). Default the store’s ready deadline.
Responses
Section titled “Responses”The quote.
object
On demand first (when there is capacity), then windows in time order. May be empty.
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
Example
{ "timeZone": "Europe/Oslo", "options": [ { "type": "on_demand", "key": "on_demand", "price": { "currency": "NOK" } } ]}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.
true when the reply is a replay under the Idempotency-Key.
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" } } } }}not_found (also another merchant’s order), quote_not_found.
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.
unavailable: retry later (same Idempotency-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" } } } }}