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

POST/mobility-api/v2/micromobility

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 run on supported providers

Trips are available on trip-capable providers. Vehicles from search-only providers carry deepLinks to the provider's app instead of a usable vehicleToken.

Vehicle tokens expire quickly

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

GET/mobility-api/v2/micromobility/vehicles/by-qr/{qrCode}

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)

POST/mobility-api/v2/micromobility/trips

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

POST/mobility-api/v2/micromobility/trips

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.

Scan-to-start

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

POST/mobility-api/v2/micromobility/trips/{tripId}/vehicle-action

During an active trip, the rider can act on the vehicle directly:

ActionWhat happensTrip state
LOCKLocks the vehicle for a mid-ride stop. The timer keeps running.PAUSED
UNLOCKUnlocks a paused vehicle to continue the ride.ACTIVE
HONKThe 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"
}
Typical HONK use case

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

POST/mobility-api/v2/micromobility/trips/{tripId}/end

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.

Parking rules apply

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:

StatusMeaningNext action
RESERVEDVehicle held, ride not startedStart the trip or cancel
ACTIVERide in progress, timer runningVehicle actions, end trip
PAUSEDVehicle locked mid-ride, timer keeps runningUnlock to continue, or end trip
COMPLETEDTrip endedShow the receipt from the end-trip call
CANCELLEDReservation cancelled, no charge for the rideBack to search
Keep the end-trip response

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

SituationWhat you getWhat to do
Vehicle token expired or invalid404 NOT_FOUND ("Vehicle token expired or invalid")Run a fresh search, get a new token
Scanned vehicle ≠ the one started409 VEHICLE_MISMATCHAsk the rider to scan the correct vehicle
Trip not found or already endedPROVIDER_ERROR with a clear messageRefresh trip status, return to search
Vehicle rejected the commandPROVIDER_ERRORRetry 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.