Micromobility Trips
Micromobility works differently from car booking. There is no offer, prebook, or booking object. You work with trips: find a vehicle nearby, reserve or unlock it, ride, and end the trip. Pricing runs per minute, so the final price is known when the trip ends.
All requests need an API key, see Authentication. Vehicle search works with publishable keys (micromobility:offer:read); the trip endpoints require a secret key with micromobility:trip:write.
Trip Lifecycle
Minimum flow: Search → Start → End (3 API calls)
With reservation: Search → Reserve → Start → End (4 API calls)
Find a Vehicle
Search for available vehicles around a location. Free-floating vehicles are returned individually with live position and battery level.
{
"location": { "latitude": 48.7466, "longitude": 9.3272 },
"radiusMeters": 1500
}
The search radius defaults to 500 meters and is capped at 5,000. Optional filters include vehicleTypes, providers, minBatteryPercent, and limit.
Each result carries everything you need to display the vehicle:
{
"vehicleId": "veh-8842",
"vehicle": { "type": "SCOOTER", "propulsionType": "ELECTRIC", "name": "OKAI ES400" },
"location": { "latitude": 48.744858, "longitude": 9.322442, "lastUpdated": "2026-07-02T08:07:50Z" },
"isAvailable": true,
"batteryPercent": 90,
"provider": { "id": "pommes-sharing", "name": "POMMES Sharing" },
"pricingPlan": {
"planId": "plan-standard",
"name": "Standard",
"currency": "EUR",
"unlockFee": { "amount": 0, "currency": "EUR" },
"perMinuteRate": { "amount": 25, "currency": "EUR" }
},
"vehicleToken": "Ty9qOUtoTkxmOUpKSFpFS1ZsS1RNUT09...",
"tokenValidUntil": "2026-07-02T08:12:50Z",
"distanceFromSearch": 399
}
Response examples on this page show the data object. Every response is wrapped in the standard envelope { "success": true, "data": ..., "meta": ... }. All amount values are in the smallest currency unit: "amount": 25 means 0.25 EUR per minute.
Trips are available on trip-capable providers. Vehicles from search-only providers carry deepLinks to the provider's
app instead of a usable vehicleToken.
The vehicleToken reflects live availability and is short-lived. Check tokenValidUntil and run a fresh search if it
has passed. Reserve or start promptly after the user picks a vehicle.
Scan-to-Ride
When the user stands in front of a vehicle, skip the map: resolve the QR code sticker directly to the vehicle, including a fresh vehicleToken. Pass the scanned QR content as the {qrCode} path segment, URL-encoded if the sticker encodes a URL.
Reserve the Vehicle (Optional)
A reservation holds the vehicle while the user walks to it. The vehicle stays locked and the ride timer does not run yet.
{
"action": "RESERVE",
"vehicleToken": "Ty9qOUtoTkxmOUpKSFpFS1ZsS1RNUT09...",
"userEmail": "rider@example.com",
"userName": "Alex Rider"
}
{
"tripId": "ADAPT2MOVE-FLEET-ZKG62KKARP",
"status": "RESERVED",
"provider": { "id": "pommes-sharing", "name": "POMMES Sharing" },
"reservedUntil": "2026-07-02T08:18:34Z",
"duration": { "activeMinutes": 0, "pausedMinutes": 0 }
}
The reservation window is set by the operator (configured per tenant) and auto-releases when it expires. Show a countdown based on reservedUntil and let the user cancel via POST /mobility-api/v2/micromobility/trips/{tripId}/cancel. The vehicle can honk during the reservation to help the rider find it (see Control the Vehicle).
userEmail identifies the rider to the mobility provider. Provide it whenever you have it, together with userName.
Start the Trip
Starting unlocks the vehicle and starts the ride timer. Two variants:
Start a reserved trip (pass the tripId from the reservation):
{
"action": "START",
"tripId": "ADAPT2MOVE-FLEET-ZKG62KKARP",
"userLocation": { "latitude": 48.7448, "longitude": 9.3224 },
"scannedQrCode": "QR-9"
}
Start directly without a reservation (pass the vehicleToken from search):
{
"action": "START",
"vehicleToken": "Ty9qOUtoTkxmOUpKSFpFS1ZsS1RNUT09...",
"userLocation": { "latitude": 48.7448, "longitude": 9.3224 },
"userEmail": "rider@example.com"
}
userLocation is required for START. The response returns the trip with status: "ACTIVE" and startedAt.
Pass the QR code the rider just scanned as scannedQrCode. The ride only starts if the scan matches the vehicle being
started; a different vehicle is rejected with 409 VEHICLE_MISMATCH. Checking that the rider is actually at the
vehicle (proximity) stays your responsibility.
Control the Vehicle While Riding
During an active trip, the rider can act on the vehicle directly:
| Action | What happens | Trip state |
|---|---|---|
LOCK | Locks the vehicle for a mid-ride stop. The timer keeps running. | → PAUSED |
UNLOCK | Unlocks a paused vehicle to continue the ride. | → ACTIVE |
HONK | The vehicle sounds its horn briefly, so the rider can find it. | unchanged |
{
"action": "HONK"
}
Vehicle actions execute asynchronously on the vehicle. The API answers with 202 Accepted once the command is handed to the provider:
{
"tripId": "ADAPT2MOVE-FLEET-ZKG62KKARP",
"action": "HONK",
"acceptedAt": "2026-07-02T08:08:35Z"
}
A rider reserved a scooter but cannot spot it in a crowded parking area or garage. One HONK call makes the vehicle
beep. HONK also works during a reservation, before the trip starts.
End the Trip
Ending the trip locks the vehicle, stops the timer, and settles the price.
{
"endLocation": { "latitude": 48.7402, "longitude": 9.3155 }
}
The response returns the completed trip with status: "COMPLETED", the ride duration, and the price breakdown (unlock fee plus per-minute charges). Show this as the trip receipt.
Providers enforce service areas and parking zones. Ending a trip outside an allowed area can be rejected or incur a
fee. Use GET /mobility-api/v2/micromobility/zones (see the OpenAPI Reference) to display
allowed parking areas on your map.
Trip States
Poll GET /mobility-api/v2/micromobility/trips/{tripId} to track a trip. Handle every state:
| Status | Meaning | Next action |
|---|---|---|
RESERVED | Vehicle held, ride not started | Start the trip or cancel |
ACTIVE | Ride in progress, timer running | Vehicle actions, end trip |
PAUSED | Vehicle locked mid-ride, timer keeps running | Unlock to continue, or end trip |
COMPLETED | Trip ended | Show the receipt from the end-trip call |
CANCELLED | Reservation cancelled, no charge for the ride | Back to search |
The price breakdown is returned in the response of the end-trip call. Polling the trip status does not include the
price, so store the end-trip response for the receipt.
Pricing
Micromobility pricing is trip-based: an optional one-time unlock fee plus a per-minute rate from the vehicle's pricingPlan (where the provider publishes one). Paused minutes are billed like active minutes, because the vehicle stays assigned to the rider. The exact total arrives in the end-trip response.
Error Handling
| Situation | What you get | What to do |
|---|---|---|
| Vehicle token expired or invalid | 404 NOT_FOUND ("Vehicle token expired or invalid") | Run a fresh search, get a new token |
| Scanned vehicle ≠ the one started | 409 VEHICLE_MISMATCH | Ask the rider to scan the correct vehicle |
| Trip not found or already ended | PROVIDER_ERROR with a clear message | Refresh trip status, return to search |
| Vehicle rejected the command | PROVIDER_ERROR | Retry once, then surface the provider message |
See Error Handling for the complete error code reference, and the OpenAPI Reference for full request and response schemas.