Welcome to the API documentation.
To authenticate with the API, you must provide your VanMoof credentials to obtain an access token. All Bearer Tokens use JWT (JSON Web Token)
Most API requests require the following header:
Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819This is "api_key": 3
Only the new *.vanmoof.cloud Endpoints do not require it.
First, retrieve an initial authentication token using your email and password.
Response
The response will include a token and a refresh_token.
Exchange the initial token for an Application Token (JWT), which is required for most other endpoints.
Response
The response will include a token.
For all subsequent requests (e.g., getting bike data), include the Application Token in the Authorization header:
Authorization: Bearer <application_token>
Endpoints for user authentication
Authenticate with email and password to get an initial token. This token is then exchanged for an Application JWT which expires within two hours. This token however is valid for one year to continusly optain new Application JWTs without re-authenticating.
JWT Payload:
{
"iss": "http://api.vanmoof-api.com",
"iat": {issued_at_timestamp},
"nbf": {not_before_timestamp},
"exp": {expiration_timestamp},
"user": {userID},
"api_key": 3,
"device": null,
"refresh_token": "{UUIDv4}"
}
curl --request POST \
"https://api.vanmoof-api.com/v8/authenticate" \
--header "Authorization: Basic dXNlckBleGFtcGxlLmNvbTpwYXNzd29yZA==" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" {
"token": "{TOKEN}",
"refreshToken": "UUIDv4"
}
Exchange the initial token for an Application JWT used for subsequent requests.
JWT payload:
{
"iss": "http://api.vanmoof-api.com",
"iat": {issued_at_timestamp},
"nbf": {not_before_timestamp},
"exp": {expiration_timestamp},
"user": "{email}",
"uuid": "{UUIDv3}",
"bikes": [
{bikeID},
],
"owner": [
"{FrameNumber}"
]
}
curl --request GET \
--get "https://api.vanmoof-api.com/v8/getApplicationToken" \
--header "Authorization: Bearer {INITIAL_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" {
"token": "{JWT_TOKEN}"
}
Refresh the authentication token using a refresh token.
curl --request POST \
"https://api.vanmoof-api.com/v8/token" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json" \
--data "{
\"refreshToken\": null
}"
{
"token": "eyXXX.eyXXX"
}
Endpoints for bike operations
Change the name of a specific bike. Limited to 255 Characters.
The bike ID
curl --request POST \
"https://api.vanmoof-api.com/v8/changeBikeName/" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json" \
--data "{
\"name\": null
}"
{
"result": true
}
Notify Backend that the bikes backup code was changed. Requires macAddress in body. Since the SA5 do not have the macAddress in the API.. This is kinda pointless. Even with the SA3 the API responds with macAddress field is required.
curl --request POST \
"https://api.vanmoof-api.com/v8/changedBackupCode" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json; charset=utf-8" \
--data "{
\"macAddress\": null
}"
{
"error": "AuthenticationException",
"message": "Invalid Credentials"
}
Retrieve bike sharing invitations for the authenticated user. Hash is likely MD5.
curl --request GET \
--get "https://api.vanmoof-api.com/v8/getBikeSharingInvitations" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" {
"invitations": [],
"hash": "{MD5_HASH}"
}
Retrieve bike sharing invitations for a specific bike.
The bike ID
curl --request GET \
--get "https://api.vanmoof-api.com/v8/getBikeSharingInvitationsForBike/" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" {
"invitations": []
}
Retrieve detailed data for a specific bike. Returns same structure as bikeDetails in getCustomerData. Hash is likely MD5.
The bike ID
curl --request GET \
--get "https://api.vanmoof-api.com/v8/getBikeData/" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" {
"data": {
"id": "{BikeID}",
"name": "{Bike Name}",
"frameNumber": "{Frame Number}",
"bikeId": "{Bike ID}",
"frameSerial": "{Frame Serial}",
"ownerName": "{Owner Name}",
"tripDistance": 0,
"pendingSmartmoduleMacAddress": null,
"macAddress": null,
"mainEcuSerial": "{ECU Serial}",
"smartmoduleCurrentVersion": null,
"smartmoduleDesiredVersion": null,
"smartmoduleLatestStable": false,
"changeBackupCode": true,
"isTracking": false,
"highestAvailableSpeedLimit": null,
"messageAvailable": false,
"modelName": "{Model Name}",
"modelDetails": null,
"modelColor": {
"name": "{Color Name}",
"primary": "{Hex Color}",
"secondary": "{Hex Color}"
},
"frameShape": "{Shape}",
"manufacturer": "{Manufacturer}",
"controller": "{Controller}",
"updateMethod": "OAD (encrypted)",
"eLock": true,
"gsmModule": "{GSM Module}",
"speaker": true,
"bleProfile": "{BLE Profile}",
"bleVersion": null,
"messagesViaBLE": "BLEv2",
"customerRoleFamily": "Responsible",
"customerRole": "owner",
"startsAt": "{ISO8601 Date}",
"endsAt": null,
"permissions": [
"ADD_USER",
"FIRMWARE_UPDATES",
"REMOVE_USER",
"REPORT_FOUND",
"REPORT_STOLEN",
"SEND_STATISTICS",
"BACKUP_CODE",
"BIKE_NAME",
"VIEW_THEFT_CASES",
"ALARM_SETTINGS",
"COUNTRY_SETTINGS",
"LIGHTS",
"MOTOR_SUPPORT_LEVEL",
"UNLOCK",
"READ_VALUES",
"STOLEN_MODE",
"SWAP_SMARTMODULE"
],
"key": null,
"isFactoryKey": true,
"customerCount": 1,
"invitationCount": 0,
"stolen": {
"isStolen": false,
"dateStolen": null,
"status": "not_stolen",
"latestLocation": null
},
"hasPeaceOfMind": false,
"peaceOfMind": null,
"links": {
"hash": "http://api.vanmoof-api.com/v8/getBikeDataHash/{BikeID}",
"thumbnail": "https://my.vanmoof.com/image/model/{ModelID}"
},
"serviceModeEnabled": false,
"workshopInfo": []
},
"hash": "{MD5_HASH}"
}
Retrieve messages for a specific bike.
The bike ID
curl --request GET \
--get "https://api.vanmoof-api.com/v8/getBikeMessages/" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" []
Retrieve theft case information for a specific bike by frame number.
The bike frame number
curl --request GET \
--get "https://api.vanmoof-api.com/v8/getTheftCase/" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" {}
Retrieve the hash for a specific bike using its bike ID.
The bike ID
curl --request GET \
--get "https://api.vanmoof-api.com/v8/getBikeDataHash/" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" {
"hash": "{MD5_HASH}"
}
Create an invitation to share a bike with another user via email.
curl --request POST \
"https://api.vanmoof-api.com/v8/createBikeSharingInvitation" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json; charset=utf-8" \
--data "{
\"email\": null,
\"duration\": null,
\"bikeId\": null
}"
{
"result": {
"guid": "{UUIDv3}",
"expiresAt": "{ISO8601 Date}",
"startsAt": null,
"endsAt": null,
"duration": "{time in seconds}",
"role": "user",
"email": "{email}"
}
}
Revoke workshop sharing invitations for a specific bike. It updates the invitation and sets endsAt to now.
curl --request POST \
"https://api.vanmoof-api.com/v8/revokeWorkshopSharingInvitation" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json; charset=utf-8" \
--data "{
\"bikeId\": null
}"
{
"result": [
{
"email": "{Workshop Email}",
"name": "{Workshop Name}",
"startsAt": "{ISO8601 Date}",
"endsAt": "{ISO8601 Date}"
}
]
}
Revoke a previously created bike sharing invitation by GUID.
Invitation GUID
curl --request POST \
"https://api.vanmoof-api.com/v8/revokeBikeSharingInvitation/" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" {
"result": true
}
Create an invitation for a workshop to access a bike. Valid for 6 months. QR Code content "https://www.vanmoof.com/invite-shop?email={Workshop Email}&name={workshop Name}"
curl --request POST \
"https://api.vanmoof-api.com/v8/createWorkshopSharingInvitation" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json" \
--data "{
\"email\": null,
\"bikeId\": null
}"
{
"result": {
"email": "{Workshop Email}",
"name": "{Workshop Name}",
"startsAt": "{ISO8601 Date}",
"endsAt": "{ISO8601 Date}"
}
}
Decline a bike sharing invitation using the invitation GUID.
The GUID of the bike sharing invitation to decline.
curl --request POST \
"https://api.vanmoof-api.com/v8/declineBikeSharingInvitation/" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" {
"result": true
}
Accept a bike sharing invitation using the invitation GUID. It responds with the same schema as getBikeData. "user" is missing ADD_USER, FIRMWARE_UPDATES, REMOVE_USER, BACKUP_CODE, BIKE_NAME, STOLEN_MODE, SWAP_SMARTMODULE permissions.
The GUID of the bike sharing invitation to accept.
curl --request POST \
"https://api.vanmoof-api.com/v8/acceptBikeSharingInvitation/" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" {
"data": {
"id": {BikeID},
"name": "{Bike Name}",
"frameNumber": "{Frame Number}",
"bikeId": "{Bike ID}",
"frameSerial": "{Frame Serial}",
"ownerName": "{Owner Name}",
"tripDistance": 0,
"pendingSmartmoduleMacAddress": null,
"macAddress": null,
"mainEcuSerial": "{ECU Serial}",
"smartmoduleCurrentVersion": null,
"smartmoduleDesiredVersion": null,
"smartmoduleLatestStable": false,
"changeBackupCode": true,
"isTracking": false,
"highestAvailableSpeedLimit": null,
"messageAvailable": false,
"modelName": "{Model Name}",
"modelDetails": null,
"modelColor": {
"name": "{Color Name}",
"primary": "{Primary Color}",
"secondary": "{Secondary Color}"
},
"frameShape": "S",
"manufacturer": "pegatron",
"controller": "2022",
"updateMethod": "OAD (encrypted)",
"eLock": true,
"gsmModule": "4G",
"speaker": true,
"bleProfile": "ELECTRIFIED_2022",
"bleVersion": null,
"messagesViaBLE": "BLEv2",
"customerRoleFamily": "User",
"customerRole": "user",
"startsAt": "{ISO8601 Date}",
"endsAt": "{ISO8601 Date}",
"permissions": [
"REPORT_FOUND",
"SEND_STATISTICS",
"REPORT_STOLEN",
"VIEW_THEFT_CASES",
"ALARM_SETTINGS",
"COUNTRY_SETTINGS",
"LIGHTS",
"MOTOR_SUPPORT_LEVEL",
"UNLOCK",
"READ_VALUES"
],
"key": null,
"isFactoryKey": true,
"customerCount": 2,
"invitationCount": 2,
"stolen": {
"isStolen": false,
"dateStolen": null,
"status": "not_stolen",
"latestLocation": null
},
"hasPeaceOfMind": false,
"peaceOfMind": null,
"links": {
"hash": "http://api.vanmoof-api.com/v8/getBikeDataHash/176393",
"thumbnail": "https://my.vanmoof.com/image/model/99"
},
"serviceModeEnabled": false,
"workshopInfo": []
}
}
Remove all bike sharing invitations for a specific bike.
curl --request POST \
"https://api.vanmoof-api.com/v8/removeCustomerBikeSharingForBike" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json; charset=utf-8" \
--data "{
\"bikeId\": null
}"
{
"result": true
}
Register a bike to the currently authenticated user using the frame number and verification code. QR Code Content: https://my.vanmoof.com/proof-of-ownership?bike_id={framenumber}&validation={validationCode}
curl --request POST \
"https://api.vanmoof-api.com/v8/registerBikeToCurrentUser" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json; charset=utf-8" \
--data "{
\"framenumber\": null,
\"verification\": null
}"
{
"error": "BikeRegisterToCurrentCustomerException",
"message": "This frame number can’t be registered."
}
Retrieve the desired update version information for a specific bike. This only works for at least the SA3/SA4 bikes. SA5 and later uses another API.
The ID of the bike to retrieve update information for.
curl --request GET \
--get "https://api.vanmoof-api.com/v8/getDesiredUpdateVersionInfo/" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" {
"updateVersion": "{Version}",
"releaseDate": "{ISO8601 Date}",
"latestStable": false,
"releaseNotes": "",
"fileSize": 0,
"firmwareCrc": "{CRC}",
"transportCrc": "{CRC}",
"encrypted": true,
"pendingUpdatesCount": 0,
"pendingUpdates": [
{
"updateVersion": "{Version}",
"releaseDate": "{ISO8601 Date}",
"latestStable": true,
"releaseNotes": "",
"fileSize": 0",
"firmwareCrc": "{CRC}",
"transportCrc": "{CRC}",
"encrypted": true
}
]
}
Retrieve the desired update version file for a specific bike. This only works for at least the SA3/SA4 bikes. SA5 and later uses another API.
The ID of the bike to retrieve the update file for.
curl --request GET \
--get "https://api.vanmoof-api.com/v8/getDesiredUpdateVersionFile/" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" application/zip
Report a bike as stolen.
curl --request POST \
"https://api.vanmoof-api.com/v8/reportStolen" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json; charset=utf-8" \
--data "{
\"bikeId\": null
}"
{
"isStolen": true,
"dateStolen": "{ISO8601 Date}",
"status": "confirmed",
"latestLocation": null,
"publicTrackingUrl": "https://my.vanmoof.com/findmybike/show/{UUIDv4}"
}
Report a bike as found and optionally disable tracking.
curl --request POST \
"https://api.vanmoof-api.com/v8/reportFound" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json; charset=utf-8" \
--data "{
\"bikeId\": null
}"
{
"result": true
}
Remove ownership of a bike by providing the bike ID.
curl --request POST \
"https://api.vanmoof-api.com/v8/removeBikeOwnership" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json; charset=utf-8" \
--data "{
\"bikeId\": null
}"
{
"result": true
}
Update the customer associated with a bike, specifying their role.
curl --request POST \
"https://api.vanmoof-api.com/v8/updateCustomerOnBike" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json; charset=utf-8" \
--data "{
\"bikeId\": null,
\"email\": null,
\"role\": null
}"
{
"result": true
}
Remove a customer from a bike using the bike ID and customer email.
curl --request POST \
"https://api.vanmoof-api.com/v8/removeCustomerFromBike" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json; charset=utf-8" \
--data "{
\"bikeId\": null,
\"email\": null
}"
{
"result": true
}
Submit ride statistics for a specific bike.
curl --request POST \
"https://api.vanmoof-api.com/v8/postStatistics" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json; charset=utf-8" \
--data "{
\"bikeId\": null,
\"timestamp\": null,
\"distance\": null,
\"rideTime\": null,
\"batteryLevel\": null,
\"averageSpeed\": null,
\"maxSpeed\": null
}"
{
"result": true
}
Submit a response from the bike using its bike ID.
The ID of the bike to submit the response for.
curl --request POST \
"https://api.vanmoof-api.com/v8/postBikeResponse/" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json; charset=utf-8" \
--data "{
\"data\": null
}"
{
"result": true
}
Create a certificate for a bike using its Bike ID. This endpoint uses the Bike API (bikeapi.production.vanmoof.cloud) instead of the main API. Ratelimited at 100 requests per 15 seconds.
The frame number of the bike.
curl --request POST \
"https://api.vanmoof-api.com/bikes//create_certificate" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Content-Type: application/json; charset=utf-8" \
--data "{
\"public_key\": null
}"
{
"created_at": "{ISO8601 Date}",
"expiry": "{ISO8601 Date}",
"certificate": "{Base64 Encoded Certificate}"
}
Endpoints for the Cloud.
Retrieve a list of subscriptions. USE https://subscription.production.vanmoof.cloud
Filter by subscription status (e.g. ACTIVE, EXPIRED).
curl --request GET \
--get "https://api.vanmoof-api.com/subscriptions" \
--header "Authorization: Bearer {APPLICATION_JWT_TOKEN}" \
--header "Host: subscription.production.vanmoof.cloud" []
Retrieve notification preferences for the user. USE https://notification.production.vanmoof.cloud
curl --request GET \
--get "https://api.vanmoof-api.com/preferences" \
--header "Authorization: Bearer {APPLICATION_JWT_TOKEN}" \
--header "Host: notification.production.vanmoof.cloud" {
"languages": [
"en-US"
],
"channels": {
"push": {
"vehicles": {
"FrameNumber": {
"notifications": {
"alarm_state/1": {
"enabled": false
},
"alarm_state/2": {
"enabled": true
},
"alarm_state/3": {
"enabled": false
},
"battery_charge/custom": {
"enabled": false,
"preferences": {
"soc": 25
}
},
"battery_charge/empty": {
"enabled": true
},
"battery_charge/full": {
"enabled": true
},
"battery_charge/low": {
"enabled": true
},
"location_update": {
"enabled": true
},
"not_locked": {
"enabled": true
}
}
}
}
}
}
}
Retrieve access list for a specific vehicle, showing owners and guests. USE https://vehicleregistry.production.vanmoof.cloud
The frame number of the vehicle.
curl --request GET \
--get "https://api.vanmoof-api.com/external/vehicles//accesses" \
--header "Authorization: Bearer {APPLICATION_JWT_TOKEN}" \
--header "Host: vehicleregistry.production.vanmoof.cloud" {
"vehicle_id": "{vehicle_id}",
"vehicle_access": [
{
"rider_id": "{uuid}",
"rider_name": "Rider Name",
"rider_email": "rider@vanmoof.com",
"owner_id": "{owner_uuid}",
"owner_name": "Owner Name",
"owner_email": "owner@vanmoof.com",
"role": "GUEST",
"expires_at": "2027-01-01T01:00:00.000000Z",
"starts_at": "2026-01-01T01:00:00.000000Z"
}
]
}
Retrieve invitations for a specific rider. USE https://vehicleregistry.production.vanmoof.cloud
curl --request GET \
--get "https://api.vanmoof-api.com/external/riders/{uuid}/invitations" \
--header "Authorization: Bearer {APPLICATION_JWT_TOKEN}" \
--header "Host: vehicleregistry.production.vanmoof.cloud" []
Retrieve all external invitations. USE https://vehicleregistry.production.vanmoof.cloud
curl --request GET \
--get "https://api.vanmoof-api.com/external/invitations" \
--header "Authorization: Bearer {APPLICATION_JWT_TOKEN}" \
--header "Host: vehicleregistry.production.vanmoof.cloud" []
Retrieve vehicles associated with a specific rider. USE https://vehicleregistry.production.vanmoof.cloud
curl --request GET \
--get "https://api.vanmoof-api.com/external/riders/{uuid}/vehicles" \
--header "Authorization: Bearer {APPLICATION_JWT_TOKEN}" \
--header "Host: vehicleregistry.production.vanmoof.cloud" {
"rider_id": "{uuid}",
"vehicle_access": []
}
Bike Tracking. USE https://biketracking.production.vanmoof.cloud
curl --request GET \
--get "https://api.vanmoof-api.com/v1/rider/bikes" \
--header "Authorization: Bearer {APPLICATION_JWT_TOKEN}" \
--header "Host: biketracking.production.vanmoof.cloud" {
"items": []
}
Retrieve the tracking state of a specific vehicle. USE https://biketracking.production.vanmoof.cloud
The frame number of the vehicle.
curl --request GET \
--get "https://api.vanmoof-api.com/v2/states/" \
--header "Authorization: Bearer {APPLICATION_JWT_TOKEN}" \
--header "Host: biketracking.production.vanmoof.cloud" {
"id": "{uuid}",
"missing": "NOT_MISSING",
"tracking": "ENABLED",
"created_at": "2026-01-01T10:00:00.000000Z"
}
Update the notification preferences for the user. USE https://notification.production.vanmoof.cloud
curl --request PATCH \
"https://api.vanmoof-api.com/preferences" \
--header "Authorization: Bearer {APPLICATION_JWT_TOKEN}" \
--header "Content-Type: application/json; charset=utf-8" \
--header "Host: notification.production.vanmoof.cloud" {
"languages": [
"en-US"
],
"channels": {
"push": {
"vehicles": {
"FrameNumber": {
"notifications": {
"alarm_state/1": {
"enabled": false
},
"alarm_state/2": {
"enabled": true
},
"alarm_state/3": {
"enabled": false
},
"battery_charge/custom": {
"enabled": false,
"preferences": {
"soc": 25
}
},
"battery_charge/empty": {
"enabled": true
},
"battery_charge/full": {
"enabled": true
},
"battery_charge/low": {
"enabled": true
},
"location_update": {
"enabled": true
},
"not_locked": {
"enabled": true
}
}
}
}
}
}
}
Remove a notification channel for the user. USE https://notification.production.vanmoof.cloud
curl --request DELETE \
"https://api.vanmoof-api.com/channels" \
--header "Authorization: Bearer {APPLICATION_JWT_TOKEN}" \
--header "Content-Type: application/json; charset=utf-8" \
--header "Host: notification.production.vanmoof.cloud" [Empty response]
Create a new notification channel for the user. USE https://notification.production.vanmoof.cloud
curl --request POST \
"https://api.vanmoof-api.com/channels" \
--header "Authorization: Bearer {APPLICATION_JWT_TOKEN}" \
--header "Content-Type: application/json; charset=utf-8" \
--header "Host: notification.production.vanmoof.cloud" {
"id": "{CHANNEL_ID}"
}
Endpoints for customer data
Retrieve all customers associated with a specific bike.
The bike ID
curl --request GET \
--get "https://api.vanmoof-api.com/v8/getCustomersOnBike/" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" {
"customers": [
{
"name": "{Customer Name}",
"email": "{Customer Email}",
"role": "owner",
"start": "{ISO8601 Date}",
"end": null,
"status": "current"
}
]
}
Update current customer's profile (partial updates allowed). Updating the email or the password requires a fresh initial token from v8/authenticate.
curl --request POST \
"https://api.vanmoof-api.com/v8/updateCustomer" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json" \
{
"result": {
"uuid": "{Customer UUIDv3}",
"name": "{Customer Name}",
"email": "{Customer Email}",
"emailConfirmed": "boolean",
"phone": "{Customer Phone}",
"country": "{ISO 3166-1}",
"links": {
"show": "http://api.vanmoof-api.com/v8/getCustomerData"
}
}
}
Create a new customer account. All fields are required. Password policy: The password must contain between 6 and 50 characters, a digit, an upper case and a lower case character
curl --request POST \
"https://api.vanmoof-api.com/v8/createCustomer" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json" \
--data "{
\"name\": null,
\"email\": null,
\"country\": null,
\"password\": null,
\"confirmationUrl\": null
}"
{
"result": {
"uuid": "{Customer UUIDv3}",
"name": "{Customer Name}",
"email": "{Customer Email}",
"emailConfirmed": false,
"privacyPolicyAccepted": false
}
}
Retrieve MD5 hash of customer data.
curl --request GET \
--get "https://api.vanmoof-api.com/v8/getCustomerDataHash" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" {
"hash": "{MD5_HASH}"
}
Retrieve the authenticated customer's data and associated bikes. Data Hash is likely MD5. If a workshop is invited. The Field contains email, name, start and end. Also serviceModeEnabled is true for the time being in service mode.
Include details about the customer's bikes.
curl --request GET \
--get "https://api.vanmoof-api.com/v8/getCustomerData" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" {
"data": {
"uuid": "{UUIDv4}",
"name": "{Customer Name}",
"email": "{Customer Email}",
"confirmed": "boolean",
"privacyPolicyAccepted": "boolean",
"phone": "",
"country": "{Country Code}",
"bikes": [
{
"id": "{BikeID}",
"name": "VanMoof",
"frameNumber": "ASY31ddddd",
"bikeId": "ASY31ddddd",
"frameSerial": null,
"ownerName": "{Owner}",
"pendingSmartmoduleMacAddress": null,
"macAddress": "{MAC Address}",
"mainEcuSerial": null,
"bleProfile": "ELECTRIFIED_2021",
"controller": "2020 S",
"eLock": true,
"speaker": true,
"smartmoduleCurrentVersion": "1.8.2",
"smartmoduleDesiredVersion": "1.9.1",
"smartmoduleLatestStable": false,
"highestAvailableSpeedLimit": null,
"tripDistance": "{TripDistance}",
"modelName": "VM01-203-EU",
"modelColor": {
"name": "Light",
"primary": "#7a99ac",
"secondary": "#7a99ac"
},
"frameShape": "S",
"customerRole": "owner",
"startsAt": "{Date}",
"endsAt": null,
"permissions": [
"ADD_USER",
"FIRMWARE_UPDATES",
"REMOVE_USER",
"REPORT_FOUND",
"REPORT_STOLEN",
"SEND_STATISTICS",
"BACKUP_CODE",
"BIKE_NAME",
"VIEW_THEFT_CASES",
"ALARM_SETTINGS",
"COUNTRY_SETTINGS",
"LIGHTS",
"MOTOR_SUPPORT_LEVEL",
"UNLOCK",
"READ_VALUES",
"STOLEN_MODE",
"SWAP_SMARTMODULE"
],
"isTracking": false,
"stolen": {
"isStolen": false,
"dateStolen": null,
"status": "not_stolen",
"latestLocation": null
},
"links": {
"thumbnail": "https://my.vanmoof.com/image/model/84",
"show": "http://api.vanmoof-api.com/v8/getBikeData/{BikeID}"
}
},
{
"id": "{BikeID}",
"name": "VanMoof",
"frameNumber": "SVTBKLdddddLL",
"bikeId": "SVTBKLdddddLL",
"frameSerial": "AST52IdddddL",
"ownerName": "{Owner}",
"pendingSmartmoduleMacAddress": null,
"macAddress": null,
"mainEcuSerial": "",
"bleProfile": "ELECTRIFIED_2022",
"controller": "2022",
"eLock": true,
"speaker": true,
"smartmoduleCurrentVersion": null,
"smartmoduleDesiredVersion": null,
"smartmoduleLatestStable": false,
"highestAvailableSpeedLimit": null,
"tripDistance": "{TripDistance}",
"modelName": "B-05S-E01EU-XX",
"modelColor": {
"name": "Gray",
"primary": "#929393",
"secondary": "#929393"
},
"frameShape": "S",
"customerRole": "owner",
"startsAt": "{Date}",
"endsAt": null,
"permissions": [
"ADD_USER",
"FIRMWARE_UPDATES",
"REMOVE_USER",
"REPORT_FOUND",
"REPORT_STOLEN",
"SEND_STATISTICS",
"BACKUP_CODE",
"BIKE_NAME",
"VIEW_THEFT_CASES",
"ALARM_SETTINGS",
"COUNTRY_SETTINGS",
"LIGHTS",
"MOTOR_SUPPORT_LEVEL",
"UNLOCK",
"READ_VALUES",
"STOLEN_MODE",
"SWAP_SMARTMODULE"
],
"isTracking": false,
"stolen": {
"isStolen": false,
"dateStolen": null,
"status": "not_stolen",
"latestLocation": null
},
"links": {
"thumbnail": "https://my.vanmoof.com/image/model/99",
"show": "http://api.vanmoof-api.com/v8/getBikeData/{BikeID}"
}
}
],
"hasPendingBikeSharingInvitations": false,
"links": {
"hash": "http://api.vanmoof-api.com/v8/getCustomerDataHash",
"devices": "http://api.vanmoof-api.com/v8/getDevices",
"resendConfirmation": null,
"update": "http://api.vanmoof-api.com/v8/updateCustomer",
"addBike": "http://api.vanmoof-api.com/v8/registerBikeToCurrentUser",
"addFcmToken": "http://api.vanmoof-api.com/v8/registrationToken",
"theftCases": "http://api.vanmoof-api.com/v8/getCurrentTheftCasesForCurrentUser"
},
"bikeDetails": [
{
"id": "{BikeID}",
"name": "VanMoof",
"frameNumber": "ASY31ddddd",
"bikeId": "ASY31ddddd",
"frameSerial": null,
"ownerName": "{Owner}",
"tripDistance": 1234,
"pendingSmartmoduleMacAddress": null,
"macAddress": "{MAC Address}",
"mainEcuSerial": null,
"smartmoduleCurrentVersion": "1.8.2",
"smartmoduleDesiredVersion": "1.9.1",
"smartmoduleLatestStable": false,
"changeBackupCode": false,
"isTracking": false,
"highestAvailableSpeedLimit": null,
"messageAvailable": false,
"modelName": "VM01-203-EU",
"modelDetails": {
"Gears": "Automatic 4 speed shifting gears",
"Motor": "250 - 500 W front-wheel hub motor",
"Top Speed": "25 km/h (EU speed)",
"Range": "60 km (full power) ~ 150 km (economy mode)",
"Edition": "ES-3 2G"
},
"modelColor": {
"name": "Light",
"primary": "#7a99ac",
"secondary": "#7a99ac"
},
"frameShape": "S",
"manufacturer": "muco",
"controller": "2020 S",
"updateMethod": "OAD (encrypted)",
"eLock": true,
"gsmModule": "2G",
"speaker": true,
"bleProfile": "ELECTRIFIED_2021",
"bleVersion": null,
"messagesViaBLE": "BLEv2",
"customerRoleFamily": "Responsible",
"customerRole": "owner",
"startsAt": "{Date}",
"endsAt": null,
"permissions": [
"ADD_USER",
"FIRMWARE_UPDATES",
"REMOVE_USER",
"REPORT_FOUND",
"REPORT_STOLEN",
"SEND_STATISTICS",
"BACKUP_CODE",
"BIKE_NAME",
"VIEW_THEFT_CASES",
"ALARM_SETTINGS",
"COUNTRY_SETTINGS",
"LIGHTS",
"MOTOR_SUPPORT_LEVEL",
"UNLOCK",
"READ_VALUES",
"STOLEN_MODE",
"SWAP_SMARTMODULE"
],
"key": {
"encryptionKey": "{BLE Encryption Key}",
"passcode": "{BLE Passcode}",
"userKeyId": 1
},
"isFactoryKey": false,
"customerCount": 1,
"invitationCount": 0,
"stolen": {
"isStolen": false,
"dateStolen": null,
"status": "not_stolen",
"latestLocation": null
},
"hasPeaceOfMind": false,
"peaceOfMind": null,
"links": {
"hash": "http://api.vanmoof-api.com/v8/getBikeDataHash/{BikeID}",
"thumbnail": "https://my.vanmoof.com/image/model/84"
},
"serviceModeEnabled": false,
"workshopInfo": []
},
{
"id": "{BikeID}",
"name": "VanMoof",
"frameNumber": "SVTBKLdddddLL",
"bikeId": "SVTBKLdddddLL",
"frameSerial": "AST52IdddddL",
"ownerName": "{Owner}",
"tripDistance": "{TripDistance}",
"pendingSmartmoduleMacAddress": null,
"macAddress": null,
"mainEcuSerial": "",
"smartmoduleCurrentVersion": null,
"smartmoduleDesiredVersion": null,
"smartmoduleLatestStable": false,
"changeBackupCode": true,
"isTracking": false,
"highestAvailableSpeedLimit": null,
"messageAvailable": false,
"modelName": "B-05S-E01EU-XX",
"modelDetails": null,
"modelColor": {
"name": "Gray",
"primary": "#929393",
"secondary": "#929393"
},
"frameShape": "S",
"manufacturer": "pegatron",
"controller": "2022",
"updateMethod": "OAD (encrypted)",
"eLock": true,
"gsmModule": "4G",
"speaker": true,
"bleProfile": "ELECTRIFIED_2022",
"bleVersion": null,
"messagesViaBLE": "BLEv2",
"customerRoleFamily": "Responsible",
"customerRole": "owner",
"startsAt": "{Date}",
"endsAt": null,
"permissions": [
"ADD_USER",
"FIRMWARE_UPDATES",
"REMOVE_USER",
"REPORT_FOUND",
"REPORT_STOLEN",
"SEND_STATISTICS",
"BACKUP_CODE",
"BIKE_NAME",
"VIEW_THEFT_CASES",
"ALARM_SETTINGS",
"COUNTRY_SETTINGS",
"LIGHTS",
"MOTOR_SUPPORT_LEVEL",
"UNLOCK",
"READ_VALUES",
"STOLEN_MODE",
"SWAP_SMARTMODULE"
],
"key": null,
"isFactoryKey": true,
"customerCount": 1,
"invitationCount": 0,
"stolen": {
"isStolen": false,
"dateStolen": null,
"status": "not_stolen",
"latestLocation": null
},
"hasPeaceOfMind": false,
"peaceOfMind": null,
"links": {
"hash": "http://api.vanmoof-api.com/v8/getBikeDataHash/{BikeID}",
"thumbnail": "https://my.vanmoof.com/image/model/99"
},
"serviceModeEnabled": false,
"workshopInfo": []
}
]
},
"hash": "{DATA_HASH}"
}
Retrieve theft cases for the authenticated user.
curl --request GET \
--get "https://api.vanmoof-api.com/v8/getCurrentTheftCasesForCurrentUser" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" {
"theftCases": []
}
Retrieve registered devices for the authenticated user.
curl --request GET \
--get "https://api.vanmoof-api.com/v8/getDevices" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" [
{
"device": null,
"key": "{Device Key}"
}
]
Resend confirmation email to the authenticated user.
curl --request POST \
"https://api.vanmoof-api.com/v8/resendConfirmationEmail" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" {}
Validate a customer's email address using a token.
curl --request POST \
"https://api.vanmoof-api.com/v8/validateCustomerEmail" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json" \
--data "{
\"token\": null
}"
{
"result": true
}
Mark the privacy policy as accepted for the authenticated customer.
curl --request POST \
"https://api.vanmoof-api.com/v8/privacyPolicyAccepted" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json" {
"result": true
}
Request a password reset email for the given email address.
curl --request POST \
"https://api.vanmoof-api.com/v8/forgotPassword" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json; charset=utf-8" \
--data "{
\"email\": null,
\"redirectUrl\": null
}"
{
"result": true
}
Submit a APN registration token. (Used for push notifications on Android. No longer used)
curl --request POST \
"https://api.vanmoof-api.com/v8/registrationToken" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Content-Type: application/json; charset=utf-8" \
--data "{
\"token\": null
}"
{
"result": true
}
Endpoints for SA5+ firmwares
Retrieve the latest firmware version and release notes for SA5 and later Bikes. USE https://fima.production.vanmoof.cloud
curl --request GET \
--get "https://api.vanmoof-api.com/v1/firmwares/last" \
--header "Authorization: Bearer {APPLICATION_JWT_TOKEN}" {
"version": "{version}",
"stage": "{stage}",
"releaseNotes": {
"EN": "",
"DE": "",
"NL": ""
}
}
Endpoints for tracking and retrieving rider rides
Retrieve rider preferences by rider UUID. The city field uses a format like "{COUNTRY CITY}" where COUNTRY is the international country code (e.g., DE for Germany) and CITY is the city code (e.g., FRA for Frankfurt am Main). Example: "DE FRA". USE https://tenjin.vanmoof.com/
curl --request GET \
--get "https://api.vanmoof-api.com/api/v1/riders/{riderID}/preferences" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" {
"recordRides": true,
"recordCountry": false,
"city": "{COUNTRY CITY}",
"optedOutOfCity": false
}
Retrieve a list of cities. USE https://tenjin.vanmoof.com
curl --request GET \
--get "https://api.vanmoof-api.com/api/v1/cities" \
--header "Api-Key: fcb38d47-f14b-30cf-843b-26283f6a5819" \
--header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
--header "Host: tenjin.vanmoof.com" \
--header "Rider-Etag: {ETAG}" [
{
"country": "DE",
"code": "DE FRA",
"name": "Frankfurt (Frankfurt am Main)",
"location": {
"lat": 50.1136,
"long": 8.6797
}
}
]
Endpoints you interact with via the VanMoof website
Retrieve the latest known coordinates of a bike by its UUIDv4. This endpoint does not require authentication nor is it disabled after the bike is found. USE https://my.vanmoof.com
curl --request GET \
--get "https://api.vanmoof-api.com/findmybike/coords/{bike UUIDv4}" {
"coordinates": [
{
"lat": -10.47,
"lon": 105.61,
"acc": 0,
"datetime": {
"user": {
"date": "{DD-MM-YYYY}",
"time": "13:37"
},
"bike": {
"date": "{DD-MM-YYYY}",
"time": "13:37"
}
},
"timezone": {
"user": "Europe/Amsterdam",
"bike": "Europe/Berlin"
},
"firstTime": {
"user": "13:37",
"bike": "13:37"
},
"measurements": 1,
"type": "ublox",
"measured_by": []
}
],
"timezone": 2
}