{"openapi":"3.1.0","components":{"securitySchemes":{"partnerApiKey":{"type":"apiKey","in":"header","name":"x-api-key","description":"Workspace API key from Settings → API keys: mm_live_… for real deliveries, mm_test_… for simulated ones."},"partnerBearer":{"type":"http","scheme":"bearer","description":"The same API key sent as `Authorization: Bearer <key>`."}},"schemas":{"CancelDeliveryRequest":{"title":"CancelDeliveryRequest","type":"object","properties":{"reason":{"default":"found_another_service","description":"Why you cancel. Helps Maxmove improve; defaults to other.","type":"string","enum":["found_another_service","waited_too_long","booked_by_mistake","no_longer_needed","change_details","other"]}}},"Contact":{"title":"Contact","description":"Handoff contact at this stop.","type":"object","required":["name","phone"],"properties":{"name":{"minLength":1,"maxLength":200,"description":"Person or business the courier meets at this stop.","examples":["Erika Muster"],"type":"string"},"phone":{"minLength":5,"maxLength":32,"description":"Phone number in international format. The courier calls it at handoff.","examples":["+49 170 1234567"],"type":"string"},"email":{"format":"email","examples":["erika@example.com"],"type":"string"}}},"Courier":{"title":"Courier","type":"object","required":["name","photo_url","rating","vehicle","location"],"properties":{"name":{"anyOf":[{"description":"Courier first name.","examples":["Jonas"],"type":"string"},{"type":"null"}]},"photo_url":{"anyOf":[{"description":"Courier photo.","type":"string"},{"type":"null"}]},"rating":{"anyOf":[{"minimum":1,"maximum":5,"description":"Average courier rating, 1–5. Null until the courier has ratings.","examples":[4.8],"type":"number"},{"type":"null"}]},"vehicle":{"anyOf":[{"$ref":"#/components/schemas/CourierVehicle"},{"type":"null"}]},"location":{"description":"Null until tracking opens (see tracking_available_at).","anyOf":[{"type":"object","required":["latitude","longitude","recorded_at"],"properties":{"latitude":{"examples":[51.0412],"type":"number"},"longitude":{"examples":[6.8911],"type":"number"},"recorded_at":{"anyOf":[{"format":"date-time","description":"When the position was recorded.","examples":["2026-10-07T09:30:00Z"],"type":"string"},{"type":"null"}]}}},{"type":"null"}]}}},"CourierVehicle":{"title":"CourierVehicle","type":"object","required":["make","model","color","license_plate","photo_url"],"properties":{"make":{"anyOf":[{"examples":["Mercedes-Benz"],"type":"string"},{"type":"null"}]},"model":{"anyOf":[{"examples":["Sprinter"],"type":"string"},{"type":"null"}]},"color":{"anyOf":[{"examples":["White"],"type":"string"},{"type":"null"}]},"license_plate":{"anyOf":[{"description":"Registration plate, so the recipient recognises the vehicle. Masked once the delivery has ended.","examples":["K-MM 2026"],"type":"string"},{"type":"null"}]},"photo_url":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"CreateDeliveryRequest":{"title":"CreateDeliveryRequest","type":"object","required":["pickup","dropoff","vehicle_type_id"],"properties":{"quote_id":{"description":"Locks the price of a quote from POST /v1/quotes. The route (pickup, dropoff, stops, vehicle_type_id, extras, items) must match the quoted route exactly, otherwise 400 quote_mismatch. Omit to price the route at creation.","examples":["qt_8f14e45fceea167a5a36dedd4bea2543"],"type":"string"},"pickup":{"examples":[{"address":"Ehrenstraße 15, 50672 Köln","latitude":50.9385,"longitude":6.9469,"contact":{"name":"Feinkost Ehrenfeld","phone":"+49 221 1234567"},"instructions":"Pick up at the back entrance, Friesenwall side."}],"type":"object","required":["address","latitude","longitude","contact"],"properties":{"address":{"minLength":3,"maxLength":500,"description":"Full street address including postcode and city.","examples":["Ehrenstraße 15, 50672 Köln"],"type":"string"},"latitude":{"minimum":-90,"maximum":90,"description":"WGS 84 latitude.","examples":[50.9385],"type":"number"},"longitude":{"minimum":-180,"maximum":180,"description":"WGS 84 longitude.","examples":[6.9469],"type":"number"},"contact":{"$ref":"#/components/schemas/Contact"},"instructions":{"maxLength":500,"description":"Handoff instructions for the courier at this stop, for example entrance, floor, or gate code.","examples":["Ring at reception, 2nd floor."],"type":"string"}}},"dropoff":{"examples":[{"address":"Königsallee 27, 40212 Düsseldorf","latitude":51.2233,"longitude":6.7768,"contact":{"name":"Erika Muster","phone":"+49 170 1234567"},"instructions":"Ring at reception, 2nd floor."}],"type":"object","required":["address","latitude","longitude","contact"],"properties":{"address":{"minLength":3,"maxLength":500,"description":"Full street address including postcode and city.","examples":["Ehrenstraße 15, 50672 Köln"],"type":"string"},"latitude":{"minimum":-90,"maximum":90,"description":"WGS 84 latitude.","examples":[50.9385],"type":"number"},"longitude":{"minimum":-180,"maximum":180,"description":"WGS 84 longitude.","examples":[6.9469],"type":"number"},"contact":{"$ref":"#/components/schemas/Contact"},"instructions":{"maxLength":500,"description":"Handoff instructions for the courier at this stop, for example entrance, floor, or gate code.","examples":["Ring at reception, 2nd floor."],"type":"string"}}},"stops":{"maxItems":10,"description":"Intermediate stops between pickup and dropoff, in driving order.","type":"array","items":{"examples":[{"address":"Friedrich-Ebert-Platz 2, 51373 Leverkusen","latitude":51.0327,"longitude":6.9877,"contact":{"name":"Max Beispiel","phone":"+49 171 7654321"}}],"type":"object","required":["address","latitude","longitude"],"properties":{"address":{"minLength":3,"maxLength":500,"description":"Full street address including postcode and city.","examples":["Ehrenstraße 15, 50672 Köln"],"type":"string"},"latitude":{"minimum":-90,"maximum":90,"description":"WGS 84 latitude.","examples":[50.9385],"type":"number"},"longitude":{"minimum":-180,"maximum":180,"description":"WGS 84 longitude.","examples":[6.9469],"type":"number"},"contact":{"$ref":"#/components/schemas/Contact"},"instructions":{"maxLength":500,"description":"Handoff instructions for the courier at this stop, for example entrance, floor, or gate code.","examples":["Ring at reception, 2nd floor."],"type":"string"}}}},"vehicle_type_id":{"minLength":1,"description":"An id from GET /v1/vehicle-types.","examples":["courier"],"type":"string"},"extras":{"maxItems":20,"description":"Optional extra services.","type":"array","items":{"$ref":"#/components/schemas/SelectedExtra"}},"items":{"minItems":1,"maxItems":100,"description":"Optional cargo lines. When sent, Maxmove checks the vehicle fit.","type":"array","items":{"$ref":"#/components/schemas/ShipmentItem"}},"external_id":{"minLength":1,"maxLength":128,"description":"Your own reference, for example a shop order number. Unique per API mode; a duplicate returns 409 duplicate_external_id.","examples":["order-4711"],"type":"string"},"notes":{"maxLength":2000,"description":"Notes for the whole delivery. Put stop-specific details in that waypoint’s instructions.","type":"string"},"scheduled_at":{"format":"date-time","description":"Requested pickup time (RFC 3339), in the future. Omit for an immediate delivery. A quote for a scheduled delivery must carry the same time as the delivery.","examples":["2026-10-08T08:00:00Z"],"type":"string"},"proof_of_delivery":{"description":"What the courier must collect as proof. Omit to keep the default: one photo at pickup and one at the dropoff. Fields you leave out keep their default.","type":"object","properties":{"pickup":{"type":"object","properties":{"photos":{"minimum":1,"maximum":10,"description":"Minimum number of photos the courier takes. Default 1.","type":"integer"},"signature":{"description":"The sender signs on the courier’s phone.","type":"boolean"},"sender_name":{"description":"The courier records who handed the goods over.","type":"boolean"},"barcode":{"description":"The courier scans a barcode on the goods.","type":"boolean"}}},"dropoff":{"type":"object","properties":{"photos":{"minimum":1,"maximum":10,"description":"Minimum number of photos the courier takes. Default 1.","type":"integer"},"signature":{"description":"The recipient signs on the courier’s phone.","type":"boolean"},"recipient_name":{"description":"The courier records who received the goods.","type":"boolean"},"barcode":{"description":"The courier scans a barcode on the goods.","type":"boolean"},"age_check":{"description":"The courier checks the recipient’s ID before handing over, for age-restricted goods.","type":"boolean"},"leave_at_door":{"description":"If nobody answers, the courier may leave the goods at the door and photograph where. Signature and recipient name are then skipped. Cannot be combined with age_check.","type":"boolean"}}}}},"test_scenario":{"default":"no_courier_found","description":"Test keys only: the Robocourier ends the delivery as cancelled. no_courier_found: while searching. courier_cancelled: after a courier accepted. pickup_no_show: at pickup, nobody hands over the goods. delivery_failed: at the dropoff.","type":"string","enum":["no_courier_found","courier_cancelled","pickup_no_show","delivery_failed"]}}},"CreateFleetOrderRequest":{"title":"CreateFleetOrderRequest","type":"object","required":["customer","pickup","dropoff","vehicle_type_id"],"properties":{"customer":{"description":"Your customer who placed the order.","type":"object","required":["name","phone"],"properties":{"name":{"minLength":1,"maxLength":200,"examples":["Feinkost Ehrenfeld"],"type":"string"},"phone":{"minLength":5,"maxLength":32,"examples":["+49 221 1234567"],"type":"string"},"email":{"format":"email","examples":["dispo@feinkost.example"],"type":"string"}}},"pickup":{"examples":[{"address":"Ehrenstraße 15, 50672 Köln","latitude":50.9385,"longitude":6.9469,"contact":{"name":"Feinkost Ehrenfeld","phone":"+49 221 1234567"},"instructions":"Pick up at the back entrance, Friesenwall side."}],"type":"object","required":["address","latitude","longitude"],"properties":{"address":{"minLength":3,"maxLength":500,"description":"Full street address including postcode and city.","examples":["Ehrenstraße 15, 50672 Köln"],"type":"string"},"latitude":{"minimum":-90,"maximum":90,"description":"WGS 84 latitude.","examples":[50.9385],"type":"number"},"longitude":{"minimum":-180,"maximum":180,"description":"WGS 84 longitude.","examples":[6.9469],"type":"number"},"contact":{"$ref":"#/components/schemas/Contact"},"instructions":{"maxLength":500,"description":"Handoff instructions for the courier at this stop, for example entrance, floor, or gate code.","examples":["Ring at reception, 2nd floor."],"type":"string"}}},"dropoff":{"examples":[{"address":"Königsallee 27, 40212 Düsseldorf","latitude":51.2233,"longitude":6.7768,"contact":{"name":"Erika Muster","phone":"+49 170 1234567"},"instructions":"Ring at reception, 2nd floor."}],"type":"object","required":["address","latitude","longitude"],"properties":{"address":{"minLength":3,"maxLength":500,"description":"Full street address including postcode and city.","examples":["Ehrenstraße 15, 50672 Köln"],"type":"string"},"latitude":{"minimum":-90,"maximum":90,"description":"WGS 84 latitude.","examples":[50.9385],"type":"number"},"longitude":{"minimum":-180,"maximum":180,"description":"WGS 84 longitude.","examples":[6.9469],"type":"number"},"contact":{"$ref":"#/components/schemas/Contact"},"instructions":{"maxLength":500,"description":"Handoff instructions for the courier at this stop, for example entrance, floor, or gate code.","examples":["Ring at reception, 2nd floor."],"type":"string"}}},"stops":{"maxItems":10,"description":"Intermediate stops between pickup and dropoff, in driving order.","type":"array","items":{"examples":[{"address":"Friedrich-Ebert-Platz 2, 51373 Leverkusen","latitude":51.0327,"longitude":6.9877,"contact":{"name":"Max Beispiel","phone":"+49 171 7654321"}}],"type":"object","required":["address","latitude","longitude"],"properties":{"address":{"minLength":3,"maxLength":500,"description":"Full street address including postcode and city.","examples":["Ehrenstraße 15, 50672 Köln"],"type":"string"},"latitude":{"minimum":-90,"maximum":90,"description":"WGS 84 latitude.","examples":[50.9385],"type":"number"},"longitude":{"minimum":-180,"maximum":180,"description":"WGS 84 longitude.","examples":[6.9469],"type":"number"},"contact":{"$ref":"#/components/schemas/Contact"},"instructions":{"maxLength":500,"description":"Handoff instructions for the courier at this stop, for example entrance, floor, or gate code.","examples":["Ring at reception, 2nd floor."],"type":"string"}}}},"vehicle_type_id":{"minLength":1,"description":"An id from GET /v1/vehicle-types.","examples":["courier"],"type":"string"},"items":{"minItems":1,"maxItems":100,"description":"Optional cargo lines. When sent, Maxmove checks the vehicle fit.","type":"array","items":{"$ref":"#/components/schemas/ShipmentItem"}},"reference":{"minLength":1,"maxLength":120,"description":"Your customer’s order reference.","examples":["PO-2026-1187"],"type":"string"},"requested_pickup_date":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","examples":["2026-10-08"],"type":"string"},"requested_pickup_time":{"pattern":"^\\d{2}:\\d{2}$","examples":["08:30"],"type":"string"},"customer_timezone":{"maxLength":64,"description":"IANA time zone of the requested date and time.","examples":["Europe/Berlin"],"type":"string"},"notes":{"maxLength":2000,"type":"string"}}},"CreateQuoteRequest":{"title":"CreateQuoteRequest","type":"object","required":["pickup","dropoff","vehicle_type_id"],"properties":{"pickup":{"description":"An address with its coordinates. Maxmove does not geocode: send the coordinates your address search returned.","examples":[{"address":"Ehrenstraße 15, 50672 Köln","latitude":50.9385,"longitude":6.9469}],"type":"object","required":["address","latitude","longitude"],"properties":{"address":{"minLength":3,"maxLength":500,"description":"Full street address including postcode and city.","examples":["Ehrenstraße 15, 50672 Köln"],"type":"string"},"latitude":{"minimum":-90,"maximum":90,"description":"WGS 84 latitude.","examples":[50.9385],"type":"number"},"longitude":{"minimum":-180,"maximum":180,"description":"WGS 84 longitude.","examples":[6.9469],"type":"number"}}},"dropoff":{"description":"An address with its coordinates. Maxmove does not geocode: send the coordinates your address search returned.","examples":[{"address":"Königsallee 27, 40212 Düsseldorf","latitude":51.2233,"longitude":6.7768}],"type":"object","required":["address","latitude","longitude"],"properties":{"address":{"minLength":3,"maxLength":500,"description":"Full street address including postcode and city.","examples":["Ehrenstraße 15, 50672 Köln"],"type":"string"},"latitude":{"minimum":-90,"maximum":90,"description":"WGS 84 latitude.","examples":[50.9385],"type":"number"},"longitude":{"minimum":-180,"maximum":180,"description":"WGS 84 longitude.","examples":[6.9469],"type":"number"}}},"stops":{"maxItems":10,"description":"Intermediate stops between pickup and dropoff, in driving order.","type":"array","items":{"description":"An address with its coordinates. Maxmove does not geocode: send the coordinates your address search returned.","examples":[{"address":"Friedrich-Ebert-Platz 2, 51373 Leverkusen","latitude":51.0327,"longitude":6.9877}],"type":"object","required":["address","latitude","longitude"],"properties":{"address":{"minLength":3,"maxLength":500,"description":"Full street address including postcode and city.","examples":["Ehrenstraße 15, 50672 Köln"],"type":"string"},"latitude":{"minimum":-90,"maximum":90,"description":"WGS 84 latitude.","examples":[50.9385],"type":"number"},"longitude":{"minimum":-180,"maximum":180,"description":"WGS 84 longitude.","examples":[6.9469],"type":"number"}}}},"vehicle_type_id":{"minLength":1,"description":"An id from GET /v1/vehicle-types.","examples":["courier"],"type":"string"},"extras":{"maxItems":20,"description":"Optional extra services.","type":"array","items":{"$ref":"#/components/schemas/SelectedExtra"}},"items":{"minItems":1,"maxItems":100,"description":"Optional cargo lines. When sent, Maxmove checks the vehicle fit.","type":"array","items":{"$ref":"#/components/schemas/ShipmentItem"}},"scheduled_at":{"format":"date-time","description":"Requested pickup time (RFC 3339), in the future. Omit for an immediate delivery. A quote for a scheduled delivery must carry the same time as the delivery.","examples":["2026-10-08T08:00:00Z"],"type":"string"}}},"CreateWebhookEndpointRequest":{"title":"CreateWebhookEndpointRequest","type":"object","required":["url"],"properties":{"url":{"minLength":12,"maxLength":2000,"description":"Public HTTPS URL. Private and reserved network targets are rejected.","examples":["https://shop.example.com/maxmove/webhooks"],"type":"string"},"events":{"maxItems":8,"description":"Events to send. Empty or omitted means all events.","type":"array","items":{"default":"delivery.created","examples":["delivery.status_updated"],"type":"string","enum":["delivery.created","delivery.status_updated","delivery.courier_assigned","delivery.courier_arrived","delivery.eta_updated","delivery.pod_submitted","delivery.delivered","delivery.cancelled"]}},"description":{"maxLength":500,"examples":["Shop order sync"],"type":"string"}}},"Delivery":{"title":"Delivery","type":"object","required":["id","status","mode","external_id","quote_id","amount_cents","currency","tax_behavior","breakdown","pickup","dropoff","stops","vehicle_type_id","notes","scheduled_at","proof_of_delivery","tracking_available_at","tracking_url","courier","created_at","updated_at","cancelled_at","cancellation_reason","delivered_at"],"properties":{"id":{"examples":["del_0c9b0f6e2d8a4e1f9b7c5a3d1e2f4a6b"],"type":"string"},"status":{"default":"pending","description":"pending → courier_assigned → at_pickup → picked_up → in_transit → at_dropoff → delivered. Terminal: delivered and cancelled (also when no courier was found).","type":"string","enum":["pending","courier_assigned","at_pickup","picked_up","in_transit","at_dropoff","delivered","cancelled"]},"mode":{"default":"live","description":"test: created with a test key and run by the Robocourier simulator.","type":"string","enum":["live","test"]},"external_id":{"anyOf":[{"examples":["order-4711"],"type":"string"},{"type":"null"}]},"quote_id":{"anyOf":[{"examples":["qt_8f14e45fceea167a5a36dedd4bea2543"],"type":"string"},{"type":"null"}]},"amount_cents":{"anyOf":[{"description":"Total price in cents of `currency`. null until the delivery is priced.","examples":[4890],"type":"integer"},{"type":"null"}]},"currency":{"anyOf":[{"examples":["EUR"],"type":"string"},{"type":"null"}]},"tax_behavior":{"default":"inclusive","description":"inclusive: every amount includes VAT. The invoice of each completed delivery states the VAT.","type":"string","enum":["inclusive"]},"breakdown":{"anyOf":[{"$ref":"#/components/schemas/PriceBreakdown"},{"type":"null"}]},"pickup":{"$ref":"#/components/schemas/Waypoint"},"dropoff":{"$ref":"#/components/schemas/Waypoint"},"stops":{"type":"array","items":{"$ref":"#/components/schemas/Waypoint"}},"vehicle_type_id":{"examples":["courier"],"type":"string"},"notes":{"anyOf":[{"examples":["Two boxes, handle with care."],"type":"string"},{"type":"null"}]},"scheduled_at":{"anyOf":[{"format":"date-time","description":"Requested pickup time.","examples":["2026-10-07T09:30:00Z"],"type":"string"},{"type":"null"}]},"proof_of_delivery":{"description":"null: the default applies, one photo at pickup and one at the dropoff.","anyOf":[{"$ref":"#/components/schemas/ProofOfDeliveryRequirements"},{"type":"null"}]},"tracking_available_at":{"anyOf":[{"format":"date-time","description":"From this time courier.location is filled. Authoritative on GET /v1/deliveries/{deliveryId}/tracking; list and create responses may return null.","examples":["2026-10-07T09:30:00Z"],"type":"string"},{"type":"null"}]},"tracking_url":{"anyOf":[{"description":"Public tracking page you can share with the recipient.","examples":["https://maxmove.com/de/track/3J8kQ2pVx9"],"type":"string"},{"type":"null"}]},"courier":{"anyOf":[{"$ref":"#/components/schemas/Courier"},{"type":"null"}]},"created_at":{"format":"date-time","description":"When the delivery was created.","examples":["2026-10-07T09:30:00Z"],"type":"string"},"updated_at":{"format":"date-time","description":"Last change.","examples":["2026-10-07T09:30:00Z"],"type":"string"},"cancelled_at":{"anyOf":[{"format":"date-time","description":"When the delivery was cancelled.","examples":["2026-10-07T09:30:00Z"],"type":"string"},{"type":"null"}]},"cancellation_reason":{"anyOf":[{"default":"cancelled_by_you","description":"Why the delivery was cancelled; null unless status is cancelled. cancelled_by_you: you cancelled it. no_courier_found: no courier accepted it in time. pickup_no_show: nobody handed over the goods at pickup. cancelled_by_maxmove: Maxmove ended it, for example after a failed handover.","type":"string","enum":["cancelled_by_you","no_courier_found","pickup_no_show","cancelled_by_maxmove"]},{"type":"null"}]},"delivered_at":{"anyOf":[{"format":"date-time","description":"When the delivery was completed.","examples":["2026-10-07T09:30:00Z"],"type":"string"},{"type":"null"}]}}},"DeliveryEventData":{"title":"DeliveryEventData","description":"The delivery as returned by GET /v1/deliveries/{deliveryId}, with the courier reduced to the name.","type":"object","required":["id","status","mode","external_id","quote_id","amount_cents","currency","tax_behavior","breakdown","pickup","dropoff","stops","vehicle_type_id","notes","scheduled_at","proof_of_delivery","tracking_available_at","tracking_url","created_at","updated_at","cancelled_at","cancellation_reason","delivered_at","courier"],"properties":{"id":{"examples":["del_0c9b0f6e2d8a4e1f9b7c5a3d1e2f4a6b"],"type":"string"},"status":{"default":"pending","description":"pending → courier_assigned → at_pickup → picked_up → in_transit → at_dropoff → delivered. Terminal: delivered and cancelled (also when no courier was found).","type":"string","enum":["pending","courier_assigned","at_pickup","picked_up","in_transit","at_dropoff","delivered","cancelled"]},"mode":{"default":"live","description":"test: created with a test key and run by the Robocourier simulator.","type":"string","enum":["live","test"]},"external_id":{"anyOf":[{"examples":["order-4711"],"type":"string"},{"type":"null"}]},"quote_id":{"anyOf":[{"examples":["qt_8f14e45fceea167a5a36dedd4bea2543"],"type":"string"},{"type":"null"}]},"amount_cents":{"anyOf":[{"description":"Total price in cents of `currency`. null until the delivery is priced.","examples":[4890],"type":"integer"},{"type":"null"}]},"currency":{"anyOf":[{"examples":["EUR"],"type":"string"},{"type":"null"}]},"tax_behavior":{"default":"inclusive","description":"inclusive: every amount includes VAT. The invoice of each completed delivery states the VAT.","type":"string","enum":["inclusive"]},"breakdown":{"anyOf":[{"$ref":"#/components/schemas/PriceBreakdown"},{"type":"null"}]},"pickup":{"$ref":"#/components/schemas/Waypoint"},"dropoff":{"$ref":"#/components/schemas/Waypoint"},"stops":{"type":"array","items":{"$ref":"#/components/schemas/Waypoint"}},"vehicle_type_id":{"examples":["courier"],"type":"string"},"notes":{"anyOf":[{"examples":["Two boxes, handle with care."],"type":"string"},{"type":"null"}]},"scheduled_at":{"anyOf":[{"format":"date-time","description":"Requested pickup time.","examples":["2026-10-07T09:30:00Z"],"type":"string"},{"type":"null"}]},"proof_of_delivery":{"description":"null: the default applies, one photo at pickup and one at the dropoff.","anyOf":[{"$ref":"#/components/schemas/ProofOfDeliveryRequirements"},{"type":"null"}]},"tracking_available_at":{"anyOf":[{"format":"date-time","description":"From this time courier.location is filled. Authoritative on GET /v1/deliveries/{deliveryId}/tracking; list and create responses may return null.","examples":["2026-10-07T09:30:00Z"],"type":"string"},{"type":"null"}]},"tracking_url":{"anyOf":[{"description":"Public tracking page you can share with the recipient.","examples":["https://maxmove.com/de/track/3J8kQ2pVx9"],"type":"string"},{"type":"null"}]},"created_at":{"format":"date-time","description":"When the delivery was created.","examples":["2026-10-07T09:30:00Z"],"type":"string"},"updated_at":{"format":"date-time","description":"Last change.","examples":["2026-10-07T09:30:00Z"],"type":"string"},"cancelled_at":{"anyOf":[{"format":"date-time","description":"When the delivery was cancelled.","examples":["2026-10-07T09:30:00Z"],"type":"string"},{"type":"null"}]},"cancellation_reason":{"anyOf":[{"default":"cancelled_by_you","description":"Why the delivery was cancelled; null unless status is cancelled. cancelled_by_you: you cancelled it. no_courier_found: no courier accepted it in time. pickup_no_show: nobody handed over the goods at pickup. cancelled_by_maxmove: Maxmove ended it, for example after a failed handover.","type":"string","enum":["cancelled_by_you","no_courier_found","pickup_no_show","cancelled_by_maxmove"]},{"type":"null"}]},"delivered_at":{"anyOf":[{"format":"date-time","description":"When the delivery was completed.","examples":["2026-10-07T09:30:00Z"],"type":"string"},{"type":"null"}]},"courier":{"anyOf":[{"type":"object","required":["name"],"properties":{"name":{"anyOf":[{"examples":["Jonas"],"type":"string"},{"type":"null"}]}}},{"type":"null"}]},"test":{"description":"true on sample events from /test.","type":"boolean"}}},"DeliveryList":{"title":"DeliveryList","type":"object","required":["deliveries","next_page_token"],"properties":{"deliveries":{"type":"array","items":{"$ref":"#/components/schemas/Delivery"}},"next_page_token":{"anyOf":[{"description":"Pass as page_token for the next page; null on the last page.","type":"string"},{"type":"null"}]}}},"Error":{"title":"Error","type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","doc_url"],"properties":{"code":{"description":"Stable, machine-readable error code. Branch on this, not on the message.","examples":["quote_expired"],"type":"string"},"message":{"description":"Human-readable explanation. Wording may change.","examples":["The quote has expired. Request a new quote and retry."],"type":"string"},"param":{"description":"The request field (dot path) or header the error is about, when there is one.","examples":["pickup.contact.phone"],"type":"string"},"doc_url":{"format":"uri","description":"Documentation of this error code and how to resolve it.","examples":["https://maxmove.com/en/developers/docs/concepts/errors#content-quote-expired"],"type":"string"}}},"request_id":{"description":"Include this id when you contact support.","examples":["7c9e6679-7425-40de-944b-e07fc1f90ae7"],"type":"string"}}},"Event":{"title":"Event","description":"An event exactly as it was sent to webhook endpoints.","type":"object","required":["id","type","version","created_at","data"],"properties":{"id":{"description":"Event id. Deliveries are at least once: deduplicate on this id.","examples":["evt_4c1f9e2b7a3d8c5e6f0a1b2c3d4e5f60"],"type":"string"},"type":{"default":"delivery.created","examples":["delivery.status_updated"],"type":"string","enum":["delivery.created","delivery.status_updated","delivery.courier_assigned","delivery.courier_arrived","delivery.eta_updated","delivery.pod_submitted","delivery.delivered","delivery.cancelled"]},"version":{"description":"Payload version. Changes only on breaking payload changes.","examples":["2026-10"],"type":"string"},"created_at":{"format":"date-time","description":"When the event occurred.","examples":["2026-10-07T09:30:00Z"],"type":"string"},"data":{"$ref":"#/components/schemas/DeliveryEventData"}}},"EventDetails":{"title":"EventDetails","type":"object","required":["id","type","version","created_at","data","webhook_attempts"],"properties":{"id":{"description":"Event id. Deliveries are at least once: deduplicate on this id.","examples":["evt_4c1f9e2b7a3d8c5e6f0a1b2c3d4e5f60"],"type":"string"},"type":{"default":"delivery.created","examples":["delivery.status_updated"],"type":"string","enum":["delivery.created","delivery.status_updated","delivery.courier_assigned","delivery.courier_arrived","delivery.eta_updated","delivery.pod_submitted","delivery.delivered","delivery.cancelled"]},"version":{"description":"Payload version. Changes only on breaking payload changes.","examples":["2026-10"],"type":"string"},"created_at":{"format":"date-time","description":"When the event occurred.","examples":["2026-10-07T09:30:00Z"],"type":"string"},"data":{"$ref":"#/components/schemas/DeliveryEventData"},"webhook_attempts":{"description":"Every send attempt to your webhook endpoints, oldest first.","type":"array","items":{"$ref":"#/components/schemas/WebhookAttempt"}}}},"EventList":{"title":"EventList","type":"object","required":["events","next_page_token"],"properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/Event"}},"next_page_token":{"anyOf":[{"description":"Pass as page_token for the next page; null on the last page.","type":"string"},{"type":"null"}]}}},"FleetOrder":{"title":"FleetOrder","type":"object","required":["id","status","reference","order_id","tracking_url","created_at","updated_at"],"properties":{"id":{"examples":["0b5c2f4e-8a1d-4c3e-9f7a-2d6b1e8c4a90"],"type":"string"},"status":{"default":"pending","description":"pending → courier_assigned → at_pickup → picked_up → in_transit → at_dropoff → delivered. Terminal: delivered and cancelled (also when no courier was found).","type":"string","enum":["pending","courier_assigned","at_pickup","picked_up","in_transit","at_dropoff","delivered","cancelled"]},"reference":{"anyOf":[{"examples":["PO-2026-1187"],"type":"string"},{"type":"null"}]},"order_id":{"description":"Maxmove order id on your dispatch board.","examples":["0b5c2f4e-8a1d-4c3e-9f7a-2d6b1e8c4a90"],"type":"string"},"tracking_url":{"anyOf":[{"examples":["https://maxmove.com/de/track/3J8kQ2pVx9"],"type":"string"},{"type":"null"}]},"created_at":{"anyOf":[{"format":"date-time","description":"When the order was received.","examples":["2026-10-07T09:30:00Z"],"type":"string"},{"type":"null"}]},"updated_at":{"anyOf":[{"format":"date-time","description":"Last change.","examples":["2026-10-07T09:30:00Z"],"type":"string"},{"type":"null"}]}}},"PriceBreakdown":{"title":"PriceBreakdown","description":"How amount_cents is made up: route_cents + extras − discount_cents + service_fee_cents.","type":"object","required":["route_cents","extras","surcharges","discount_cents","service_fee_cents"],"properties":{"route_cents":{"description":"Transport fare for the route, including night and Sunday surcharges.","examples":[4290],"type":"integer"},"extras":{"description":"Selected extra services.","type":"array","items":{"type":"object","required":["extra_id","option_id","name","option_name","quantity","unit_amount_cents","amount_cents"],"properties":{"extra_id":{"examples":["loading_help"],"type":"string"},"option_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"examples":["Loading help"],"type":"string"},"option_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"quantity":{"examples":[1],"type":"integer"},"unit_amount_cents":{"examples":[1500],"type":"integer"},"amount_cents":{"examples":[1500],"type":"integer"}}}},"surcharges":{"description":"Time-based surcharges. Already part of route_cents.","type":"array","items":{"type":"object","required":["code","label","amount_cents"],"properties":{"code":{"description":"For example night_surcharge or sunday_surcharge. New codes can appear.","examples":["night_surcharge"],"type":"string"},"label":{"examples":["Night surcharge"],"type":"string"},"amount_cents":{"examples":[640],"type":"integer"}}}},"discount_cents":{"description":"Discount applied to the fare.","examples":[0],"type":"integer"},"service_fee_cents":{"description":"Maxmove service fee.","examples":[600],"type":"integer"}}},"ProofOfDelivery":{"title":"ProofOfDelivery","type":"object","required":["delivery_id","checkpoints"],"properties":{"delivery_id":{"examples":["del_0c9b0f6e2d8a4e1f9b7c5a3d1e2f4a6b"],"type":"string"},"checkpoints":{"type":"array","items":{"$ref":"#/components/schemas/ProofOfDeliveryCheckpoint"}}}},"ProofOfDeliveryArtifact":{"title":"ProofOfDeliveryArtifact","type":"object","required":["kind","file_name","content_type","download_url"],"properties":{"kind":{"default":"photo","type":"string","enum":["photo","signature","signed_delivery_note","document","unknown"]},"file_name":{"anyOf":[{"examples":["signature.png"],"type":"string"},{"type":"null"}]},"content_type":{"anyOf":[{"examples":["image/png"],"type":"string"},{"type":"null"}]},"download_url":{"anyOf":[{"description":"Short-lived download URL. Fetch the proof again when it expires.","type":"string"},{"type":"null"}]}}},"ProofOfDeliveryCheckpoint":{"title":"ProofOfDeliveryCheckpoint","type":"object","required":["kind","recipient_name","submitted_at","artifacts"],"properties":{"kind":{"default":"pickup","type":"string","enum":["pickup","dropoff","unknown"]},"recipient_name":{"anyOf":[{"examples":["E. Muster"],"type":"string"},{"type":"null"}]},"submitted_at":{"anyOf":[{"format":"date-time","description":"When the courier submitted the proof.","examples":["2026-10-07T09:30:00Z"],"type":"string"},{"type":"null"}]},"artifacts":{"type":"array","items":{"$ref":"#/components/schemas/ProofOfDeliveryArtifact"}}}},"ProofOfDeliveryRequirements":{"title":"ProofOfDeliveryRequirements","description":"What the courier must collect as proof, as set when the delivery was created.","type":"object","required":["pickup","dropoff"],"properties":{"pickup":{"type":"object","required":["photos","signature","sender_name","barcode"],"properties":{"photos":{"description":"Minimum number of photos the courier takes. Default 1.","examples":[1],"type":"integer"},"signature":{"description":"The sender signs on the courier’s phone.","type":"boolean"},"sender_name":{"description":"The courier records who handed the goods over.","type":"boolean"},"barcode":{"description":"The courier scans a barcode on the goods.","type":"boolean"}}},"dropoff":{"type":"object","required":["photos","signature","recipient_name","barcode","age_check","leave_at_door"],"properties":{"photos":{"description":"Minimum number of photos the courier takes. Default 1.","examples":[1],"type":"integer"},"signature":{"description":"The recipient signs on the courier’s phone.","type":"boolean"},"recipient_name":{"description":"The courier records who received the goods.","type":"boolean"},"barcode":{"description":"The courier scans a barcode on the goods.","type":"boolean"},"age_check":{"description":"The courier checks the recipient’s ID before handing over, for age-restricted goods.","type":"boolean"},"leave_at_door":{"description":"If nobody answers, the courier may leave the goods at the door and photograph where. Signature and recipient name are then skipped. Cannot be combined with age_check.","type":"boolean"}}}}},"Quote":{"title":"Quote","type":"object","required":["id","amount_cents","currency","tax_behavior","breakdown","distance_km","duration_min","valid_until","created_at"],"properties":{"id":{"description":"Pass as quote_id when creating the delivery.","examples":["qt_8f14e45fceea167a5a36dedd4bea2543"],"type":"string"},"amount_cents":{"description":"Total price in cents of `currency`.","examples":[4890],"type":"integer"},"currency":{"description":"ISO 4217 currency code.","examples":["EUR"],"type":"string"},"tax_behavior":{"default":"inclusive","description":"inclusive: every amount includes VAT. The invoice of each completed delivery states the VAT.","type":"string","enum":["inclusive"]},"breakdown":{"$ref":"#/components/schemas/PriceBreakdown"},"distance_km":{"anyOf":[{"description":"Route distance.","examples":[41.7],"type":"number"},{"type":"null"}]},"duration_min":{"anyOf":[{"description":"Estimated driving time.","examples":[38],"type":"number"},{"type":"null"}]},"valid_until":{"format":"date-time","description":"The quote can be used until this time (about 5 minutes).","examples":["2026-10-07T09:30:00Z"],"type":"string"},"created_at":{"format":"date-time","description":"When the quote was created.","examples":["2026-10-07T09:30:00Z"],"type":"string"}}},"SelectedExtra":{"title":"SelectedExtra","type":"object","required":["extra_id"],"properties":{"extra_id":{"minLength":1,"description":"Extra service id.","type":"string"},"option_id":{"description":"Option id when the extra has options.","type":"string"},"quantity":{"minimum":1,"maximum":99,"description":"Defaults to 1.","type":"integer"}}},"ShipmentItem":{"title":"ShipmentItem","description":"One line of identical units. Maxmove checks that the selected vehicle_type_id can carry every line (400 vehicle_does_not_fit otherwise) and keeps the lines on the delivery for the courier, package labels, and proof of delivery.","examples":[{"source_line_id":"SO-4711-1","description":"Espresso machine, boxed","quantity":2,"weight_kg":12.5,"length_cm":50,"width_cm":40,"height_cm":45,"fragile":true,"keep_upright":true}],"type":"object","required":["quantity","weight_kg","length_cm","width_cm","height_cm"],"properties":{"source_line_id":{"minLength":1,"maxLength":200,"description":"Your own line identifier (for example an ERP or shop order line id).","type":"string"},"description":{"minLength":1,"maxLength":500,"description":"Short cargo description shown to the courier.","type":"string"},"quantity":{"minimum":1,"maximum":10000,"description":"Number of identical units on this line.","type":"integer"},"weight_kg":{"exclusiveMinimum":0,"maximum":100000,"description":"Weight of one unit in kilograms.","type":"number"},"length_cm":{"exclusiveMinimum":0,"maximum":5000,"description":"Outer length of one unit in centimetres.","type":"number"},"width_cm":{"exclusiveMinimum":0,"maximum":5000,"description":"Outer width of one unit in centimetres.","type":"number"},"height_cm":{"exclusiveMinimum":0,"maximum":5000,"description":"Outer height of one unit in centimetres.","type":"number"},"sku":{"minLength":1,"maxLength":200,"description":"Your SKU.","type":"string"},"customer_reference":{"minLength":1,"maxLength":200,"description":"Reference printed on package labels and shown at handover.","type":"string"},"barcode":{"minLength":1,"maxLength":200,"description":"Existing package barcode; the courier scans it at pickup and dropoff.","type":"string"},"gtin":{"minLength":1,"maxLength":200,"description":"GTIN / EAN.","type":"string"},"sscc":{"minLength":1,"maxLength":200,"description":"Serial Shipping Container Code, if you already issue one.","type":"string"},"stackable":{"description":"true: identical units may be stacked when checking vehicle fit; false: never stacked. Omit when unknown (treated conservatively).","type":"boolean"},"fragile":{"description":"Fragile units are never stacked and are flagged to the courier.","type":"boolean"},"keep_upright":{"description":"The unit must keep its height axis vertical; only the footprint may be rotated.","type":"boolean"}}},"Tracking":{"title":"Tracking","type":"object","required":["delivery_id","tracking_available_at","status","tracking_url","eta_seconds","distance_meters","route_polyline","courier"],"properties":{"delivery_id":{"examples":["del_0c9b0f6e2d8a4e1f9b7c5a3d1e2f4a6b"],"type":"string"},"tracking_available_at":{"anyOf":[{"format":"date-time","description":"From this time courier.location is filled. Null when not yet known.","examples":["2026-10-07T09:30:00Z"],"type":"string"},{"type":"null"}]},"status":{"default":"pending","description":"pending → courier_assigned → at_pickup → picked_up → in_transit → at_dropoff → delivered. Terminal: delivered and cancelled (also when no courier was found).","type":"string","enum":["pending","courier_assigned","at_pickup","picked_up","in_transit","at_dropoff","delivered","cancelled"]},"tracking_url":{"anyOf":[{"examples":["https://maxmove.com/de/track/3J8kQ2pVx9"],"type":"string"},{"type":"null"}]},"eta_seconds":{"anyOf":[{"description":"Estimated seconds until the next stop.","examples":[840],"type":"integer"},{"type":"null"}]},"distance_meters":{"anyOf":[{"description":"Remaining driving distance to the next stop.","examples":[6200],"type":"integer"},{"type":"null"}]},"route_polyline":{"anyOf":[{"description":"Encoded polyline (Google format) of the remaining route.","examples":["_p~iF~ps|U_ulLnnqC_mqNvxq`@"],"type":"string"},{"type":"null"}]},"courier":{"anyOf":[{"$ref":"#/components/schemas/Courier"},{"type":"null"}]}}},"UpdateWebhookEndpointRequest":{"title":"UpdateWebhookEndpointRequest","type":"object","properties":{"url":{"minLength":12,"maxLength":2000,"description":"Public HTTPS URL. Private and reserved network targets are rejected.","examples":["https://shop.example.com/maxmove/webhooks"],"type":"string"},"events":{"maxItems":8,"description":"Events to send. Empty or omitted means all events.","type":"array","items":{"default":"delivery.created","examples":["delivery.status_updated"],"type":"string","enum":["delivery.created","delivery.status_updated","delivery.courier_assigned","delivery.courier_arrived","delivery.eta_updated","delivery.pod_submitted","delivery.delivered","delivery.cancelled"]}},"description":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}]},"status":{"default":"active","type":"string","enum":["active","disabled"]},"rotate_secret":{"description":"true: issue a new signing secret, returned once in this response. The previous secret keeps signing for 24 hours, so you can deploy the new one without missing events.","type":"boolean"}}},"VehicleType":{"title":"VehicleType","type":"object","required":["id","name","description"],"properties":{"id":{"examples":["courier"],"type":"string"},"name":{"examples":["Courier"],"type":"string"},"description":{"examples":["Car for documents and small parcels"],"type":"string"}}},"VehicleTypeList":{"title":"VehicleTypeList","type":"object","required":["vehicle_types"],"properties":{"vehicle_types":{"type":"array","items":{"$ref":"#/components/schemas/VehicleType"}}}},"Waypoint":{"title":"Waypoint","description":"A place on the route with its handoff details.","type":"object","required":["address","latitude","longitude","contact","instructions"],"properties":{"address":{"minLength":3,"maxLength":500,"description":"Full street address including postcode and city.","examples":["Ehrenstraße 15, 50672 Köln"],"type":"string"},"latitude":{"minimum":-90,"maximum":90,"description":"WGS 84 latitude.","examples":[50.9385],"type":"number"},"longitude":{"minimum":-180,"maximum":180,"description":"WGS 84 longitude.","examples":[6.9469],"type":"number"},"contact":{"anyOf":[{"$ref":"#/components/schemas/Contact"},{"type":"null"}]},"instructions":{"anyOf":[{"maxLength":500,"description":"Handoff instructions for the courier at this stop, for example entrance, floor, or gate code.","examples":["Ring at reception, 2nd floor."],"type":"string"},{"type":"null"}]}}},"WebhookAttempt":{"title":"WebhookAttempt","type":"object","required":["webhook_id","attempt","status","response_code","latency_ms","created_at"],"properties":{"webhook_id":{"examples":["we_3f2a9c1d8b7e4a5f9c0d1e2f3a4b5c6d"],"type":"string"},"attempt":{"minimum":1,"examples":[1],"type":"integer"},"status":{"default":"succeeded","description":"failed: no further retries; replay the endpoint to send it again.","type":"string","enum":["succeeded","retrying","failed"]},"response_code":{"anyOf":[{"description":"HTTP status your endpoint answered.","examples":[200],"type":"integer"},{"type":"null"}]},"latency_ms":{"anyOf":[{"examples":[184],"type":"integer"},{"type":"null"}]},"created_at":{"format":"date-time","description":"When the attempt was made.","examples":["2026-10-07T09:30:00Z"],"type":"string"}}},"WebhookEndpoint":{"title":"WebhookEndpoint","type":"object","required":["id","url","events","mode","status","description","previous_secret_expires_at","created_at","updated_at"],"properties":{"id":{"examples":["we_3f2a9c1d8b7e4a5f9c0d1e2f3a4b5c6d"],"type":"string"},"url":{"examples":["https://shop.example.com/maxmove/webhooks"],"type":"string"},"events":{"type":"array","items":{"default":"delivery.created","examples":["delivery.status_updated"],"type":"string","enum":["delivery.created","delivery.status_updated","delivery.courier_assigned","delivery.courier_arrived","delivery.eta_updated","delivery.pod_submitted","delivery.delivered","delivery.cancelled"]}},"mode":{"default":"live","description":"Test endpoints only receive events of test deliveries, and vice versa.","type":"string","enum":["live","test"]},"status":{"default":"active","type":"string","enum":["active","disabled"]},"description":{"anyOf":[{"examples":["Shop order sync"],"type":"string"},{"type":"null"}]},"previous_secret_expires_at":{"anyOf":[{"format":"date-time","description":"After a rotation: until this time every event is also signed with the previous secret. null otherwise.","examples":["2026-10-07T09:30:00Z"],"type":"string"},{"type":"null"}]},"created_at":{"format":"date-time","description":"When the endpoint was registered.","examples":["2026-10-07T09:30:00Z"],"type":"string"},"updated_at":{"format":"date-time","description":"Last change.","examples":["2026-10-07T09:30:00Z"],"type":"string"}}},"WebhookEndpointList":{"title":"WebhookEndpointList","type":"object","required":["webhooks"],"properties":{"webhooks":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpoint"}}}},"WebhookEndpointWithSecret":{"title":"WebhookEndpointWithSecret","type":"object","required":["id","url","events","mode","status","description","previous_secret_expires_at","created_at","updated_at"],"properties":{"id":{"examples":["we_3f2a9c1d8b7e4a5f9c0d1e2f3a4b5c6d"],"type":"string"},"url":{"examples":["https://shop.example.com/maxmove/webhooks"],"type":"string"},"events":{"type":"array","items":{"default":"delivery.created","examples":["delivery.status_updated"],"type":"string","enum":["delivery.created","delivery.status_updated","delivery.courier_assigned","delivery.courier_arrived","delivery.eta_updated","delivery.pod_submitted","delivery.delivered","delivery.cancelled"]}},"mode":{"default":"live","description":"Test endpoints only receive events of test deliveries, and vice versa.","type":"string","enum":["live","test"]},"status":{"default":"active","type":"string","enum":["active","disabled"]},"description":{"anyOf":[{"examples":["Shop order sync"],"type":"string"},{"type":"null"}]},"previous_secret_expires_at":{"anyOf":[{"format":"date-time","description":"After a rotation: until this time every event is also signed with the previous secret. null otherwise.","examples":["2026-10-07T09:30:00Z"],"type":"string"},{"type":"null"}]},"created_at":{"format":"date-time","description":"When the endpoint was registered.","examples":["2026-10-07T09:30:00Z"],"type":"string"},"updated_at":{"format":"date-time","description":"Last change.","examples":["2026-10-07T09:30:00Z"],"type":"string"},"secret":{"description":"Signing secret. Returned only on creation and on rotate_secret; store it securely.","examples":["whsec_9b1d4c7e2a8f4e6b9d0c3a5f7e1b2d4c"],"type":"string"}}},"WebhookReplay":{"title":"WebhookReplay","type":"object","required":["queued"],"properties":{"queued":{"description":"Number of failed deliveries queued again.","examples":[3],"type":"integer"}}},"WebhookTestEvent":{"title":"WebhookTestEvent","type":"object","required":["event_id"],"properties":{"event_id":{"examples":["evt_4c1f9e2b7a3d8c5e6f0a1b2c3d4e5f60"],"type":"string"}}}}},"info":{"title":"Maxmove API","version":"1.0.0","description":"Book and track same-day courier deliveries from your own software: price a route, create the delivery, follow the courier, and receive signed webhooks for every change. Fleets can also push their customers’ orders onto their own dispatch board.\n\nAuthenticate with a workspace API key from **Settings → API keys** in the `x-api-key` header. `mm_live_…` keys create real deliveries; `mm_test_…` keys create simulated ones run by the Robocourier. Both use https://api.maxmove.com/v1.\n\nErrors share one shape: `{ \"error\": { \"code\", \"message\" }, \"request_id\" }`. Branch on `error.code`.\n\nGuides and quickstart: https://maxmove.com/developers/docs","contact":{"name":"Maxmove support","email":"support@maxmove.com","url":"https://maxmove.com/developers/docs"}},"paths":{"/v1/vehicle-types":{"get":{"tags":["Vehicle types"],"operationId":"listVehicleTypes","security":[{"partnerApiKey":[]},{"partnerBearer":[]}],"summary":"List vehicle types","description":"Vehicle types you can book. Pass an id as vehicle_type_id on quotes, deliveries, and fleet orders.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VehicleTypeList"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks a permission, or the workspace plan does not include this feature. Codes: `permission_denied`, `api_access_disabled`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the Retry-After header. Codes: `rate_limited`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"description":"Unexpected error. Retry with the same Idempotency-Key. Codes: `internal_error`, `verification_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"An internal service failed. Retry shortly. Codes: `upstream_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable. Retry shortly. Codes: `service_unavailable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/quotes":{"post":{"tags":["Quotes"],"operationId":"createQuote","security":[{"partnerApiKey":[]},{"partnerBearer":[]}],"summary":"Create a quote","description":"Prices a route for one vehicle type. The quote is valid for about 5 minutes (valid_until). To lock the price, create the delivery with this quote_id and the same route.\n\nOptionally send items with per-unit dimensions and weight: Maxmove then checks that the vehicle can carry them and answers 400 vehicle_does_not_fit when it cannot.","parameters":[{"name":"idempotency-key","in":"header","required":false,"schema":{"minLength":1,"maxLength":255,"description":"Optional. A retry with the same key and body within 24 hours returns the original response with `Idempotent-Replayed: true` instead of running the request again.","examples":["5b1f0c4e-7d1a-4f0e-9c2b-8a6d3e1f2a4b"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateQuoteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CreateQuoteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CreateQuoteRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Idempotent-Replayed":{"description":"true when this response replays an earlier request with the same Idempotency-Key and body.","schema":{"type":"string","enum":["true"]}}}},"400":{"description":"Invalid request. See error.code. Codes: `invalid_request`, `invalid_idempotency_key`, `service_area_unavailable`, `vehicle_does_not_fit`, `invalid_items`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks a permission, or the workspace plan does not include this feature. Codes: `permission_denied`, `api_access_disabled`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflicts with the current state or an earlier request. See error.code. Codes: `idempotency_key_reused`, `request_in_progress`, `conflict`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the Retry-After header. Codes: `rate_limited`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"description":"Unexpected error. Retry with the same Idempotency-Key. Codes: `internal_error`, `verification_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"An internal service failed. Retry shortly. Codes: `upstream_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable. Retry shortly. Codes: `service_unavailable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/deliveries":{"post":{"tags":["Deliveries"],"operationId":"createDelivery","security":[{"partnerApiKey":[]},{"partnerBearer":[]}],"summary":"Create a delivery","description":"Books a courier for the route. pickup.contact and dropoff.contact are required: the courier calls them at handoff. Stops take an optional contact, and every waypoint takes optional instructions.\n\nSend quote_id to lock a quoted price; the route must then match the quote exactly (400 quote_mismatch otherwise). Without quote_id, Maxmove prices the route at creation.\n\nThe Idempotency-Key header is required. A retry with the same key and body returns the original delivery, again with 201, and `Idempotent-Replayed: true`. Test keys create simulated deliveries run by the Robocourier.","parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"minLength":1,"maxLength":255,"description":"Unique key per logical request, for example your order id. Retrying with the same key and body returns the original result.","examples":["order-4711"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDeliveryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CreateDeliveryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CreateDeliveryRequest"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Delivery"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Idempotent-Replayed":{"description":"true when this response replays an earlier request with the same Idempotency-Key and body.","schema":{"type":"string","enum":["true"]}}}},"400":{"description":"Invalid request. See error.code. Codes: `invalid_request`, `missing_idempotency_key`, `invalid_idempotency_key`, `quote_mismatch`, `quote_not_found`, `quote_expired`, `service_area_unavailable`, `vehicle_does_not_fit`, `invalid_items`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Your workspace billing blocks new deliveries. See error.code. Codes: `invoice_credit_limit_exceeded`, `invoice_statement_overdue`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks a permission, or the workspace plan does not include this feature. Codes: `invoice_billing_not_enabled`, `permission_denied`, `api_access_disabled`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflicts with the current state or an earlier request. See error.code. Codes: `idempotency_key_reused`, `request_in_progress`, `duplicate_external_id`, `conflict`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the Retry-After header. Codes: `rate_limited`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"description":"Unexpected error. Retry with the same Idempotency-Key. Codes: `internal_error`, `verification_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"An internal service failed. Retry shortly. Codes: `upstream_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable. Retry shortly. Codes: `service_unavailable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"tags":["Deliveries"],"operationId":"listDeliveries","security":[{"partnerApiKey":[]},{"partnerBearer":[]}],"summary":"List deliveries","description":"Deliveries of your API mode (live or test), newest first. Pass next_page_token as page_token to read the next page.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"minimum":1,"maximum":20,"description":"Page size, 1–20. Defaults to 20.","type":"integer"}},{"name":"page_token","in":"query","required":false,"schema":{"description":"next_page_token from the previous page.","type":"string"}},{"name":"external_id","in":"query","required":false,"schema":{"minLength":1,"maxLength":128,"description":"Only the delivery with this external_id.","examples":["order-4711"],"type":"string"}},{"name":"status","in":"query","required":false,"schema":{"default":"pending","description":"pending → courier_assigned → at_pickup → picked_up → in_transit → at_dropoff → delivered. Terminal: delivered and cancelled (also when no courier was found).","type":"string","enum":["pending","courier_assigned","at_pickup","picked_up","in_transit","at_dropoff","delivered","cancelled"]}},{"name":"created_after","in":"query","required":false,"schema":{"format":"date-time","description":"Only deliveries created at or after this time.","examples":["2026-10-01T00:00:00Z"],"type":"string"}},{"name":"created_before","in":"query","required":false,"schema":{"format":"date-time","description":"Only deliveries created before this time.","examples":["2026-11-01T00:00:00Z"],"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryList"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}}}},"400":{"description":"Invalid request. See error.code. Codes: `invalid_request`, `invalid_page_token`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks a permission, or the workspace plan does not include this feature. Codes: `permission_denied`, `api_access_disabled`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the Retry-After header. Codes: `rate_limited`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"description":"Unexpected error. Retry with the same Idempotency-Key. Codes: `internal_error`, `verification_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable. Retry shortly. Codes: `service_unavailable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/deliveries/{deliveryId}":{"get":{"tags":["Deliveries"],"operationId":"getDelivery","security":[{"partnerApiKey":[]},{"partnerBearer":[]}],"summary":"Get a delivery","description":"Returns 409 request_in_progress while the create request that made this delivery has not completed; retry that create request.","parameters":[{"name":"deliveryId","in":"path","required":true,"schema":{"description":"Delivery id from POST /v1/deliveries.","examples":["del_0c9b0f6e2d8a4e1f9b7c5a3d1e2f4a6b"],"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Delivery"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks a permission, or the workspace plan does not include this feature. Codes: `permission_denied`, `api_access_disabled`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found for this API key and mode. Codes: `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflicts with the current state or an earlier request. See error.code. Codes: `request_in_progress`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the Retry-After header. Codes: `rate_limited`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"description":"Unexpected error. Retry with the same Idempotency-Key. Codes: `internal_error`, `verification_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable. Retry shortly. Codes: `service_unavailable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/deliveries/{deliveryId}/cancel":{"post":{"tags":["Deliveries"],"operationId":"cancelDelivery","security":[{"partnerApiKey":[]},{"partnerBearer":[]}],"summary":"Cancel a delivery","description":"Possible until the courier has picked up the goods; afterwards the request fails with 409 not_cancellable. Cancelling an already cancelled delivery returns it unchanged, so retries are safe. The delivery then carries cancellation_reason cancelled_by_you.","parameters":[{"name":"deliveryId","in":"path","required":true,"schema":{"description":"Delivery id from POST /v1/deliveries.","examples":["del_0c9b0f6e2d8a4e1f9b7c5a3d1e2f4a6b"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelDeliveryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CancelDeliveryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CancelDeliveryRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Delivery"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks a permission, or the workspace plan does not include this feature. Codes: `permission_denied`, `api_access_disabled`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found for this API key and mode. Codes: `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflicts with the current state or an earlier request. See error.code. Codes: `not_cancellable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the Retry-After header. Codes: `rate_limited`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"description":"Unexpected error. Retry with the same Idempotency-Key. Codes: `internal_error`, `verification_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"An internal service failed. Retry shortly. Codes: `upstream_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable. Retry shortly. Codes: `service_unavailable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/deliveries/{deliveryId}/tracking":{"get":{"tags":["Deliveries"],"operationId":"getDeliveryTracking","security":[{"partnerApiKey":[]},{"partnerBearer":[]}],"summary":"Get live tracking","description":"Status, ETA, remaining distance, route polyline, and the courier position. courier.location stays null until tracking_available_at; scheduled deliveries open tracking shortly before pickup.","parameters":[{"name":"deliveryId","in":"path","required":true,"schema":{"description":"Delivery id from POST /v1/deliveries.","examples":["del_0c9b0f6e2d8a4e1f9b7c5a3d1e2f4a6b"],"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tracking"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks a permission, or the workspace plan does not include this feature. Codes: `permission_denied`, `api_access_disabled`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found for this API key and mode. Codes: `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflicts with the current state or an earlier request. See error.code. Codes: `request_in_progress`, `conflict`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the Retry-After header. Codes: `rate_limited`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"description":"Unexpected error. Retry with the same Idempotency-Key. Codes: `internal_error`, `verification_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"An internal service failed. Retry shortly. Codes: `upstream_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable. Retry shortly. Codes: `service_unavailable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/deliveries/{deliveryId}/proof-of-delivery":{"get":{"tags":["Deliveries"],"operationId":"getDeliveryProofOfDelivery","security":[{"partnerApiKey":[]},{"partnerBearer":[]}],"summary":"Get proof of delivery","description":"Signatures, photos, and signed delivery notes per pickup and dropoff, as short-lived download URLs. 404 no_proof_of_delivery until the courier submits proof; 403 pod_not_available when your plan does not include proof of delivery.","parameters":[{"name":"deliveryId","in":"path","required":true,"schema":{"description":"Delivery id from POST /v1/deliveries.","examples":["del_0c9b0f6e2d8a4e1f9b7c5a3d1e2f4a6b"],"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProofOfDelivery"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks a permission, or the workspace plan does not include this feature. Codes: `pod_not_available`, `permission_denied`, `api_access_disabled`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found for this API key and mode. Codes: `not_found`, `no_proof_of_delivery`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the Retry-After header. Codes: `rate_limited`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"description":"Unexpected error. Retry with the same Idempotency-Key. Codes: `internal_error`, `verification_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"An internal service failed. Retry shortly. Codes: `upstream_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable. Retry shortly. Codes: `service_unavailable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/events":{"get":{"tags":["Events"],"operationId":"listEvents","security":[{"partnerApiKey":[]},{"partnerBearer":[]}],"summary":"List events","description":"Every event of your API mode, newest first, whether or not a webhook endpoint received it. Use it to reconcile after an outage. Events are kept for 30 days.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"minimum":1,"maximum":100,"description":"Page size, 1–100. Defaults to 100.","type":"integer"}},{"name":"page_token","in":"query","required":false,"schema":{"description":"next_page_token from the previous page.","type":"string"}},{"name":"delivery_id","in":"query","required":false,"schema":{"description":"Only events of this delivery.","examples":["del_0c9b0f6e2d8a4e1f9b7c5a3d1e2f4a6b"],"type":"string"}},{"name":"type","in":"query","required":false,"schema":{"default":"delivery.created","examples":["delivery.status_updated"],"type":"string","enum":["delivery.created","delivery.status_updated","delivery.courier_assigned","delivery.courier_arrived","delivery.eta_updated","delivery.pod_submitted","delivery.delivered","delivery.cancelled"]}},{"name":"created_after","in":"query","required":false,"schema":{"format":"date-time","description":"Only events at or after this time.","type":"string"}},{"name":"created_before","in":"query","required":false,"schema":{"format":"date-time","description":"Only events before this time.","type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventList"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}}}},"400":{"description":"Invalid request. See error.code. Codes: `invalid_request`, `invalid_page_token`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks a permission, or the workspace plan does not include this feature. Codes: `permission_denied`, `api_access_disabled`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the Retry-After header. Codes: `rate_limited`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"description":"Unexpected error. Retry with the same Idempotency-Key. Codes: `internal_error`, `verification_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable. Retry shortly. Codes: `service_unavailable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/events/{eventId}":{"get":{"tags":["Events"],"operationId":"getEvent","security":[{"partnerApiKey":[]},{"partnerBearer":[]}],"summary":"Get an event","description":"The event as it was sent, plus every attempt to deliver it to your webhook endpoints.","parameters":[{"name":"eventId","in":"path","required":true,"schema":{"description":"Event id, as in webhook-id and the event body.","examples":["evt_4c1f9e2b7a3d8c5e6f0a1b2c3d4e5f60"],"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventDetails"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks a permission, or the workspace plan does not include this feature. Codes: `permission_denied`, `api_access_disabled`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found for this API key and mode. Codes: `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the Retry-After header. Codes: `rate_limited`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"description":"Unexpected error. Retry with the same Idempotency-Key. Codes: `internal_error`, `verification_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable. Retry shortly. Codes: `service_unavailable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks":{"post":{"tags":["Webhooks"],"operationId":"createWebhookEndpoint","security":[{"partnerApiKey":[]},{"partnerBearer":[]}],"summary":"Create a webhook endpoint","description":"The response contains the signing secret; it is not shown again. Endpoints registered with a test key only receive test deliveries, and vice versa.","parameters":[{"name":"idempotency-key","in":"header","required":false,"schema":{"minLength":1,"maxLength":255,"description":"Optional. A retry with the same key and body within 24 hours returns the original response with `Idempotent-Replayed: true` instead of running the request again.","examples":["5b1f0c4e-7d1a-4f0e-9c2b-8a6d3e1f2a4b"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookEndpointRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CreateWebhookEndpointRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CreateWebhookEndpointRequest"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointWithSecret"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Idempotent-Replayed":{"description":"true when this response replays an earlier request with the same Idempotency-Key and body.","schema":{"type":"string","enum":["true"]}}}},"400":{"description":"Invalid request. See error.code. Codes: `invalid_request`, `invalid_idempotency_key`, `invalid_webhook_url`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks a permission, or the workspace plan does not include this feature. Codes: `permission_denied`, `api_access_disabled`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflicts with the current state or an earlier request. See error.code. Codes: `idempotency_key_reused`, `request_in_progress`, `endpoint_limit_reached`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the Retry-After header. Codes: `rate_limited`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"description":"Unexpected error. Retry with the same Idempotency-Key. Codes: `internal_error`, `verification_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable. Retry shortly. Codes: `service_unavailable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"tags":["Webhooks"],"operationId":"listWebhookEndpoints","security":[{"partnerApiKey":[]},{"partnerBearer":[]}],"summary":"List webhook endpoints","description":"Endpoints registered with keys of the same mode (live or test). Signing secrets are never listed.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointList"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks a permission, or the workspace plan does not include this feature. Codes: `permission_denied`, `api_access_disabled`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the Retry-After header. Codes: `rate_limited`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"description":"Unexpected error. Retry with the same Idempotency-Key. Codes: `internal_error`, `verification_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable. Retry shortly. Codes: `service_unavailable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/{webhookId}":{"patch":{"tags":["Webhooks"],"operationId":"updateWebhookEndpoint","security":[{"partnerApiKey":[]},{"partnerBearer":[]}],"summary":"Update a webhook endpoint","description":"Change the URL, events, description, or status. rotate_secret: true issues a new signing secret, returned once in this response.","parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"description":"Webhook endpoint id from POST /v1/webhooks.","examples":["we_3f2a9c1d8b7e4a5f9c0d1e2f3a4b5c6d"],"type":"string"}},{"name":"idempotency-key","in":"header","required":false,"schema":{"minLength":1,"maxLength":255,"description":"Optional. A retry with the same key and body within 24 hours returns the original response with `Idempotent-Replayed: true` instead of running the request again.","examples":["5b1f0c4e-7d1a-4f0e-9c2b-8a6d3e1f2a4b"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookEndpointRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/UpdateWebhookEndpointRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/UpdateWebhookEndpointRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointWithSecret"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Idempotent-Replayed":{"description":"true when this response replays an earlier request with the same Idempotency-Key and body.","schema":{"type":"string","enum":["true"]}}}},"400":{"description":"Invalid request. See error.code. Codes: `invalid_request`, `invalid_idempotency_key`, `invalid_webhook_url`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks a permission, or the workspace plan does not include this feature. Codes: `permission_denied`, `api_access_disabled`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found for this API key and mode. Codes: `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflicts with the current state or an earlier request. See error.code. Codes: `idempotency_key_reused`, `request_in_progress`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the Retry-After header. Codes: `rate_limited`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"description":"Unexpected error. Retry with the same Idempotency-Key. Codes: `internal_error`, `verification_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable. Retry shortly. Codes: `service_unavailable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Webhooks"],"operationId":"deleteWebhookEndpoint","security":[{"partnerApiKey":[]},{"partnerBearer":[]}],"summary":"Delete a webhook endpoint","description":"Stops all deliveries to this endpoint, including queued retries. To pause it instead, set status to disabled.","parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"description":"Webhook endpoint id from POST /v1/webhooks.","examples":["we_3f2a9c1d8b7e4a5f9c0d1e2f3a4b5c6d"],"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["deleted"],"properties":{"deleted":{"const":true,"type":"boolean"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks a permission, or the workspace plan does not include this feature. Codes: `permission_denied`, `api_access_disabled`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found for this API key and mode. Codes: `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the Retry-After header. Codes: `rate_limited`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"description":"Unexpected error. Retry with the same Idempotency-Key. Codes: `internal_error`, `verification_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable. Retry shortly. Codes: `service_unavailable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/{webhookId}/test":{"post":{"tags":["Webhooks"],"operationId":"sendWebhookTestEvent","security":[{"partnerApiKey":[]},{"partnerBearer":[]}],"summary":"Send a test event","description":"Queues a signed sample delivery.status_updated event with data.test = true, so you can check your signature verification. 409 endpoint_disabled for disabled endpoints.","parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"description":"Webhook endpoint id from POST /v1/webhooks.","examples":["we_3f2a9c1d8b7e4a5f9c0d1e2f3a4b5c6d"],"type":"string"}},{"name":"idempotency-key","in":"header","required":false,"schema":{"minLength":1,"maxLength":255,"description":"Optional. A retry with the same key and body within 24 hours returns the original response with `Idempotent-Replayed: true` instead of running the request again.","examples":["5b1f0c4e-7d1a-4f0e-9c2b-8a6d3e1f2a4b"],"type":"string"}}],"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTestEvent"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Idempotent-Replayed":{"description":"true when this response replays an earlier request with the same Idempotency-Key and body.","schema":{"type":"string","enum":["true"]}}}},"400":{"description":"Invalid request. See error.code. Codes: `invalid_idempotency_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks a permission, or the workspace plan does not include this feature. Codes: `permission_denied`, `api_access_disabled`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found for this API key and mode. Codes: `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflicts with the current state or an earlier request. See error.code. Codes: `idempotency_key_reused`, `request_in_progress`, `endpoint_disabled`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the Retry-After header. Codes: `rate_limited`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"description":"Unexpected error. Retry with the same Idempotency-Key. Codes: `internal_error`, `verification_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable. Retry shortly. Codes: `service_unavailable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/{webhookId}/replay":{"post":{"tags":["Webhooks"],"operationId":"replayWebhookFailures","security":[{"partnerApiKey":[]},{"partnerBearer":[]}],"summary":"Retry failed events","description":"Queues every event that exhausted its retries for this endpoint again, for example after you fixed an outage on your side.","parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"description":"Webhook endpoint id from POST /v1/webhooks.","examples":["we_3f2a9c1d8b7e4a5f9c0d1e2f3a4b5c6d"],"type":"string"}},{"name":"idempotency-key","in":"header","required":false,"schema":{"minLength":1,"maxLength":255,"description":"Optional. A retry with the same key and body within 24 hours returns the original response with `Idempotent-Replayed: true` instead of running the request again.","examples":["5b1f0c4e-7d1a-4f0e-9c2b-8a6d3e1f2a4b"],"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookReplay"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Idempotent-Replayed":{"description":"true when this response replays an earlier request with the same Idempotency-Key and body.","schema":{"type":"string","enum":["true"]}}}},"400":{"description":"Invalid request. See error.code. Codes: `invalid_idempotency_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks a permission, or the workspace plan does not include this feature. Codes: `permission_denied`, `api_access_disabled`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found for this API key and mode. Codes: `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflicts with the current state or an earlier request. See error.code. Codes: `idempotency_key_reused`, `request_in_progress`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the Retry-After header. Codes: `rate_limited`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"description":"Unexpected error. Retry with the same Idempotency-Key. Codes: `internal_error`, `verification_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable. Retry shortly. Codes: `service_unavailable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/fleet/orders":{"post":{"tags":["Fleet orders"],"operationId":"createFleetOrder","security":[{"partnerApiKey":[]},{"partnerBearer":[]}],"summary":"Create a fleet order","description":"For fleets: pushes an order from your customer’s system (ERP, shop) straight onto your own dispatch board. Requires a live key of a fleet workspace (403 fleet_key_required or live_key_required otherwise) and the internal orders module (403 fleet_orders_not_available). The Idempotency-Key header is required; a retry with the same key answers 201 with the existing order.","parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"minLength":1,"maxLength":255,"description":"Unique key per logical request, for example your order id. Retrying with the same key and body returns the original result.","examples":["order-4711"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFleetOrderRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CreateFleetOrderRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CreateFleetOrderRequest"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FleetOrder"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}}}},"400":{"description":"Invalid request. See error.code. Codes: `invalid_request`, `missing_idempotency_key`, `invalid_idempotency_key`, `vehicle_does_not_fit`, `invalid_items`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks a permission, or the workspace plan does not include this feature. Codes: `fleet_key_required`, `live_key_required`, `fleet_orders_not_available`, `permission_denied`, `api_access_disabled`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflicts with the current state or an earlier request. See error.code. Codes: `conflict`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the Retry-After header. Codes: `rate_limited`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"description":"Unexpected error. Retry with the same Idempotency-Key. Codes: `internal_error`, `verification_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"An internal service failed. Retry shortly. Codes: `upstream_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable. Retry shortly. Codes: `service_unavailable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/fleet/orders/{fleetOrderId}":{"get":{"tags":["Fleet orders"],"operationId":"getFleetOrder","security":[{"partnerApiKey":[]},{"partnerBearer":[]}],"summary":"Get a fleet order","description":"The order as it stands on your dispatch board, with its delivery status and tracking link.","parameters":[{"name":"fleetOrderId","in":"path","required":true,"schema":{"description":"Fleet order id from POST /v1/fleet/orders.","examples":["0b5c2f4e-8a1d-4c3e-9f7a-2d6b1e8c4a90"],"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FleetOrder"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks a permission, or the workspace plan does not include this feature. Codes: `fleet_key_required`, `live_key_required`, `permission_denied`, `api_access_disabled`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found for this API key and mode. Codes: `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the Retry-After header. Codes: `rate_limited`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) when the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"description":"Unexpected error. Retry with the same Idempotency-Key. Codes: `internal_error`, `verification_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"An internal service failed. Retry shortly. Codes: `upstream_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable. Retry shortly. Codes: `service_unavailable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"servers":[{"url":"https://api.maxmove.com","description":"Production. Live and test keys use the same host."}],"tags":[{"name":"Vehicle types","description":"Vehicle types you can book."},{"name":"Quotes","description":"Price a route before booking. A quote is valid for about 5 minutes."},{"name":"Deliveries","description":"Create, follow, and cancel deliveries, and fetch proof of delivery."},{"name":"Events","description":"The log of everything that happened to your deliveries, the same events webhooks send. Kept for 30 days."},{"name":"Webhooks","description":"Endpoints that receive signed events for every delivery change."},{"name":"Fleet orders","description":"For fleets: push your customers’ orders straight onto your own dispatch board. Requires a live key of a fleet workspace."},{"name":"Webhook events","description":"Requests Maxmove sends to your webhook endpoints. Verify the signature, answer 2xx within 5 seconds, and deduplicate on id."}],"webhooks":{"delivery.created":{"post":{"tags":["Webhook events"],"operationId":"webhook_delivery_created","summary":"Delivery created","description":"Event type `delivery.created`. The delivery was created. data.status is pending. Sent to every active endpoint subscribed to it.","parameters":[{"name":"webhook-id","in":"header","required":true,"description":"Event id, same as `id` in the body. Deduplicate on it.","schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"description":"Send time as Unix seconds. Reject values more than 5 minutes off.","schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"description":"Space-separated `v1,<base64>` signatures: HMAC-SHA256 over `{webhook-id}.{webhook-timestamp}.{raw body}`, keyed with the base64-decoded part of your `whsec_…` secret. Accept the request if any signature matches. Any Standard Webhooks library verifies it.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","version","created_at","data"],"properties":{"id":{"description":"Event id. Deliveries are at least once: deduplicate on this id.","examples":["evt_4c1f9e2b7a3d8c5e6f0a1b2c3d4e5f60"],"type":"string"},"type":{"type":"string","enum":["delivery.created"]},"version":{"type":"string","enum":["2026-10"]},"created_at":{"format":"date-time","description":"When the event occurred.","examples":["2026-10-07T09:30:00Z"],"type":"string"},"data":{"$ref":"#/components/schemas/DeliveryEventData"}}}}}},"responses":{"2XX":{"description":"Acknowledge within 5 seconds. Any other answer or a timeout is retried."}}}},"delivery.status_updated":{"post":{"tags":["Webhook events"],"operationId":"webhook_delivery_status_updated","summary":"Delivery status updated","description":"Event type `delivery.status_updated`. The status changed, for example to picked_up or in_transit. Statuses with their own event (courier_assigned, at_pickup, at_dropoff, delivered, cancelled) can also arrive as this event, so always read data.status. Sent to every active endpoint subscribed to it.","parameters":[{"name":"webhook-id","in":"header","required":true,"description":"Event id, same as `id` in the body. Deduplicate on it.","schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"description":"Send time as Unix seconds. Reject values more than 5 minutes off.","schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"description":"Space-separated `v1,<base64>` signatures: HMAC-SHA256 over `{webhook-id}.{webhook-timestamp}.{raw body}`, keyed with the base64-decoded part of your `whsec_…` secret. Accept the request if any signature matches. Any Standard Webhooks library verifies it.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","version","created_at","data"],"properties":{"id":{"description":"Event id. Deliveries are at least once: deduplicate on this id.","examples":["evt_4c1f9e2b7a3d8c5e6f0a1b2c3d4e5f60"],"type":"string"},"type":{"type":"string","enum":["delivery.status_updated"]},"version":{"type":"string","enum":["2026-10"]},"created_at":{"format":"date-time","description":"When the event occurred.","examples":["2026-10-07T09:30:00Z"],"type":"string"},"data":{"$ref":"#/components/schemas/DeliveryEventData"}}}}}},"responses":{"2XX":{"description":"Acknowledge within 5 seconds. Any other answer or a timeout is retried."}}}},"delivery.courier_assigned":{"post":{"tags":["Webhook events"],"operationId":"webhook_delivery_courier_assigned","summary":"Courier assigned","description":"Event type `delivery.courier_assigned`. A courier accepted the delivery. data.status is courier_assigned. Sent to every active endpoint subscribed to it.","parameters":[{"name":"webhook-id","in":"header","required":true,"description":"Event id, same as `id` in the body. Deduplicate on it.","schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"description":"Send time as Unix seconds. Reject values more than 5 minutes off.","schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"description":"Space-separated `v1,<base64>` signatures: HMAC-SHA256 over `{webhook-id}.{webhook-timestamp}.{raw body}`, keyed with the base64-decoded part of your `whsec_…` secret. Accept the request if any signature matches. Any Standard Webhooks library verifies it.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","version","created_at","data"],"properties":{"id":{"description":"Event id. Deliveries are at least once: deduplicate on this id.","examples":["evt_4c1f9e2b7a3d8c5e6f0a1b2c3d4e5f60"],"type":"string"},"type":{"type":"string","enum":["delivery.courier_assigned"]},"version":{"type":"string","enum":["2026-10"]},"created_at":{"format":"date-time","description":"When the event occurred.","examples":["2026-10-07T09:30:00Z"],"type":"string"},"data":{"$ref":"#/components/schemas/DeliveryEventData"}}}}}},"responses":{"2XX":{"description":"Acknowledge within 5 seconds. Any other answer or a timeout is retried."}}}},"delivery.courier_arrived":{"post":{"tags":["Webhook events"],"operationId":"webhook_delivery_courier_arrived","summary":"Courier arrived","description":"Event type `delivery.courier_arrived`. The courier arrived at a waypoint: data.status is at_pickup or at_dropoff. At an intermediate stop the status does not change. Sent to every active endpoint subscribed to it.","parameters":[{"name":"webhook-id","in":"header","required":true,"description":"Event id, same as `id` in the body. Deduplicate on it.","schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"description":"Send time as Unix seconds. Reject values more than 5 minutes off.","schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"description":"Space-separated `v1,<base64>` signatures: HMAC-SHA256 over `{webhook-id}.{webhook-timestamp}.{raw body}`, keyed with the base64-decoded part of your `whsec_…` secret. Accept the request if any signature matches. Any Standard Webhooks library verifies it.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","version","created_at","data"],"properties":{"id":{"description":"Event id. Deliveries are at least once: deduplicate on this id.","examples":["evt_4c1f9e2b7a3d8c5e6f0a1b2c3d4e5f60"],"type":"string"},"type":{"type":"string","enum":["delivery.courier_arrived"]},"version":{"type":"string","enum":["2026-10"]},"created_at":{"format":"date-time","description":"When the event occurred.","examples":["2026-10-07T09:30:00Z"],"type":"string"},"data":{"$ref":"#/components/schemas/DeliveryEventData"}}}}}},"responses":{"2XX":{"description":"Acknowledge within 5 seconds. Any other answer or a timeout is retried."}}}},"delivery.eta_updated":{"post":{"tags":["Webhook events"],"operationId":"webhook_delivery_eta_updated","summary":"ETA updated","description":"Event type `delivery.eta_updated`. The schedule or the route changed, so the expected arrival moved. The payload carries no ETA; read it from GET /v1/deliveries/{deliveryId}/tracking. Sent to every active endpoint subscribed to it.","parameters":[{"name":"webhook-id","in":"header","required":true,"description":"Event id, same as `id` in the body. Deduplicate on it.","schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"description":"Send time as Unix seconds. Reject values more than 5 minutes off.","schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"description":"Space-separated `v1,<base64>` signatures: HMAC-SHA256 over `{webhook-id}.{webhook-timestamp}.{raw body}`, keyed with the base64-decoded part of your `whsec_…` secret. Accept the request if any signature matches. Any Standard Webhooks library verifies it.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","version","created_at","data"],"properties":{"id":{"description":"Event id. Deliveries are at least once: deduplicate on this id.","examples":["evt_4c1f9e2b7a3d8c5e6f0a1b2c3d4e5f60"],"type":"string"},"type":{"type":"string","enum":["delivery.eta_updated"]},"version":{"type":"string","enum":["2026-10"]},"created_at":{"format":"date-time","description":"When the event occurred.","examples":["2026-10-07T09:30:00Z"],"type":"string"},"data":{"$ref":"#/components/schemas/DeliveryEventData"}}}}}},"responses":{"2XX":{"description":"Acknowledge within 5 seconds. Any other answer or a timeout is retried."}}}},"delivery.pod_submitted":{"post":{"tags":["Webhook events"],"operationId":"webhook_delivery_pod_submitted","summary":"Proof of delivery submitted","description":"Event type `delivery.pod_submitted`. The courier submitted proof at pickup or dropoff, so it can arrive twice per delivery. Fetch the files from GET /v1/deliveries/{deliveryId}/proof-of-delivery. Sent to every active endpoint subscribed to it.","parameters":[{"name":"webhook-id","in":"header","required":true,"description":"Event id, same as `id` in the body. Deduplicate on it.","schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"description":"Send time as Unix seconds. Reject values more than 5 minutes off.","schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"description":"Space-separated `v1,<base64>` signatures: HMAC-SHA256 over `{webhook-id}.{webhook-timestamp}.{raw body}`, keyed with the base64-decoded part of your `whsec_…` secret. Accept the request if any signature matches. Any Standard Webhooks library verifies it.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","version","created_at","data"],"properties":{"id":{"description":"Event id. Deliveries are at least once: deduplicate on this id.","examples":["evt_4c1f9e2b7a3d8c5e6f0a1b2c3d4e5f60"],"type":"string"},"type":{"type":"string","enum":["delivery.pod_submitted"]},"version":{"type":"string","enum":["2026-10"]},"created_at":{"format":"date-time","description":"When the event occurred.","examples":["2026-10-07T09:30:00Z"],"type":"string"},"data":{"$ref":"#/components/schemas/DeliveryEventData"}}}}}},"responses":{"2XX":{"description":"Acknowledge within 5 seconds. Any other answer or a timeout is retried."}}}},"delivery.delivered":{"post":{"tags":["Webhook events"],"operationId":"webhook_delivery_delivered","summary":"Delivery completed","description":"Event type `delivery.delivered`. The delivery was completed. data.status is delivered and delivered_at is set. Sent to every active endpoint subscribed to it.","parameters":[{"name":"webhook-id","in":"header","required":true,"description":"Event id, same as `id` in the body. Deduplicate on it.","schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"description":"Send time as Unix seconds. Reject values more than 5 minutes off.","schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"description":"Space-separated `v1,<base64>` signatures: HMAC-SHA256 over `{webhook-id}.{webhook-timestamp}.{raw body}`, keyed with the base64-decoded part of your `whsec_…` secret. Accept the request if any signature matches. Any Standard Webhooks library verifies it.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","version","created_at","data"],"properties":{"id":{"description":"Event id. Deliveries are at least once: deduplicate on this id.","examples":["evt_4c1f9e2b7a3d8c5e6f0a1b2c3d4e5f60"],"type":"string"},"type":{"type":"string","enum":["delivery.delivered"]},"version":{"type":"string","enum":["2026-10"]},"created_at":{"format":"date-time","description":"When the event occurred.","examples":["2026-10-07T09:30:00Z"],"type":"string"},"data":{"$ref":"#/components/schemas/DeliveryEventData"}}}}}},"responses":{"2XX":{"description":"Acknowledge within 5 seconds. Any other answer or a timeout is retried."}}}},"delivery.cancelled":{"post":{"tags":["Webhook events"],"operationId":"webhook_delivery_cancelled","summary":"Delivery cancelled","description":"Event type `delivery.cancelled`. The delivery was cancelled by you or by Maxmove. data.status is cancelled and cancelled_at is set. Sent to every active endpoint subscribed to it.","parameters":[{"name":"webhook-id","in":"header","required":true,"description":"Event id, same as `id` in the body. Deduplicate on it.","schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"description":"Send time as Unix seconds. Reject values more than 5 minutes off.","schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"description":"Space-separated `v1,<base64>` signatures: HMAC-SHA256 over `{webhook-id}.{webhook-timestamp}.{raw body}`, keyed with the base64-decoded part of your `whsec_…` secret. Accept the request if any signature matches. Any Standard Webhooks library verifies it.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","version","created_at","data"],"properties":{"id":{"description":"Event id. Deliveries are at least once: deduplicate on this id.","examples":["evt_4c1f9e2b7a3d8c5e6f0a1b2c3d4e5f60"],"type":"string"},"type":{"type":"string","enum":["delivery.cancelled"]},"version":{"type":"string","enum":["2026-10"]},"created_at":{"format":"date-time","description":"When the event occurred.","examples":["2026-10-07T09:30:00Z"],"type":"string"},"data":{"$ref":"#/components/schemas/DeliveryEventData"}}}}}},"responses":{"2XX":{"description":"Acknowledge within 5 seconds. Any other answer or a timeout is retried."}}}}}}