# Scheduled deliveries

> Book a pickup for a later time, know when live tracking opens, and handle the delivery until then.

Omit `scheduled_at` and the delivery is immediate: Maxmove starts looking for a courier right away. Set `scheduled_at` to request a later pickup time.

## Book a pickup time

`scheduled_at` is the requested pickup time in RFC 3339, for example `2026-10-08T08:00:00Z` or `2026-10-08T10:00:00+02:00`. Send it on [`POST /v1/deliveries`](https://api.maxmove.com/v1/docs#tag/deliveries/POST/v1/deliveries) together with the route:

```json
{
  "pickup": {
    "address": "Ehrenstraße 15, 50672 Köln",
    "latitude": 50.9385,
    "longitude": 6.9469,
    "contact": { "name": "Feinkost Ehrenfeld", "phone": "+49 221 1234567" }
  },
  "dropoff": {
    "address": "Königsallee 27, 40212 Düsseldorf",
    "latitude": 51.2233,
    "longitude": 6.7768,
    "contact": { "name": "Erika Muster", "phone": "+49 170 1234567" }
  },
  "vehicle_type_id": "courier",
  "scheduled_at": "2026-10-08T08:00:00Z"
}
```

The price can depend on the pickup time, so quote with the same `scheduled_at` you book. [`POST /v1/quotes`](https://api.maxmove.com/v1/docs#tag/quotes/POST/v1/quotes) accepts it, and a delivery whose `scheduled_at` differs from its quote fails with `400 quote_mismatch`. Book within the quote's validity of about 5 minutes.

`scheduled_at` must lie in the future. A past time fails with `400 invalid_request`, and so does a time too far ahead.

## Before pickup

A scheduled delivery is readable at any time, and you can cancel it until the courier has picked up the goods. It stays `pending` until a courier accepts it.

Live tracking opens one hour before the pickup time, or earlier when the courier is already on the way to pickup. Until then `courier.location` is `null`.

- Read `tracking_available_at` from [`GET /v1/deliveries/{deliveryId}/tracking`](https://api.maxmove.com/v1/docs#tag/deliveries/GET/v1/deliveries/{deliveryId}/tracking). It is the authoritative time; list and create responses may return `null` there.
- Start polling the courier position from that time, or react to `delivery.courier_assigned` and `delivery.courier_arrived` [webhooks](https://maxmove.com/en/developers/docs/webhooks/events).

> **Note:**
> For live deliveries, the link in `tracking_url` works from creation. Share it with the recipient right away: the page shows the live status, and the courier's position once it is available.

## In test mode

The Robocourier does not wait for `scheduled_at`: a scheduled test delivery moves through its statuses right away, about 20 seconds per step. Use it to test your status handling, not your timing.

---

Source: https://maxmove.com/en/developers/docs/guides/scheduled-deliveries
