# Test mode

> Build and test your integration with mm_test_ keys: simulated deliveries, the Robocourier, signed webhooks, and forced failure scenarios.

Requests with a test key (`mm_test_…`) go to the same base URL and accept the same requests as live keys. Test deliveries are never dispatched to a courier and never billed.

## The Robocourier

A simulated courier, the Robocourier, moves every test delivery through the full status sequence, about 20 seconds per step:

| Status | Webhook event sent |
| --- | --- |
| `pending` | `delivery.created` when the delivery is created |
| `courier_assigned` | `delivery.courier_assigned` |
| `at_pickup` | `delivery.courier_arrived` |
| `picked_up` | `delivery.status_updated` |
| `in_transit` | `delivery.status_updated` |
| `at_dropoff` | `delivery.courier_arrived` |
| `delivered` | `delivery.delivered` |

The events are signed exactly like live events, so you can test your [signature verification](https://maxmove.com/en/developers/docs/webhooks/verify-signatures) end to end. Test events only go to webhook endpoints that were registered with a test key. Test deliveries don't send `delivery.eta_updated` or `delivery.pod_submitted`.

On the tracking endpoint, the Robocourier's position moves on a straight line from pickup to dropoff.

## Test failure handling

Create the delivery with `test_scenario` to make it fail at a fixed point:

| `test_scenario` | What happens |
| --- | --- |
| `courier_cancelled` | The delivery is `cancelled` right after `courier_assigned`. |
| `delivery_failed` | The delivery is `cancelled` after `at_dropoff`. |

```json
{
  "pickup": { … },
  "dropoff": { … },
  "vehicle_type_id": "courier",
  "test_scenario": "courier_cancelled"
}
```

Live keys reject `test_scenario` with `400 invalid_request`.

You can also cancel a test delivery yourself with `POST /v1/deliveries/{deliveryId}/cancel` while it is `pending`, `courier_assigned`, or `at_pickup`.

## What is separate in test mode

- **Data.** Deliveries, quotes, webhook endpoints, idempotency keys, and `external_id` values of test and live mode are invisible to each other.
- **Rate limit.** Test keys can send 120 requests per minute, live keys 600. See [Rate limits](https://maxmove.com/en/developers/docs/concepts/rate-limits).

## Fleet orders have no test mode

Fleet orders always land on your real dispatch board, so there is nothing to simulate. `POST /v1/fleet/orders` and `GET /v1/fleet/orders/{fleetOrderId}` answer `403 live_key_required` for test keys. See [Fleet order ingestion](https://maxmove.com/en/developers/docs/fleet/order-ingestion).

## Go live

Create a live key in **Settings → API keys** and replace the test key. Register your webhook endpoints again with the live key, because endpoints belong to one mode. Live deliveries are billed on your workspace's monthly invoice; see [Billing](https://maxmove.com/en/developers/docs/billing).

---

Source: https://maxmove.com/en/developers/docs/test-mode
