Device Types
Every piece of Bikeep IoT parking hardware that you can control via the API is a device. Devices are grouped into locations and identified by a UUID. This page describes each device type, what it does physically, and what commands it supports.
Overview
| Device Type | Location Type(s) | Primary Use | Key Commands |
|---|---|---|---|
LOCKER |
BIKE_LOCKERS, BIKE_HOUSE |
Secure long-term bike parking | lock, unlock, book, cancel-booking |
GUARD |
BIKE_LOCKERS, BIKE_DOCKS, BIKE_HOUSE, BIKE_HOUSE_DOCKLESS, BIKE_HANGAR |
IoT gateway / allowlist storage | take-photo (if has camera) |
BIKE_DOCK |
BIKE_DOCKS, BIKE_HOUSE |
Secure short-term bike parking | lock, unlock, book, cancel-booking |
SCOOTER_DOCK |
SCOOTER_DOCKS, SCOOTER_DOCKS_V2 |
Scooter parking | lock, unlock, book |
BIKE_HOUSE_DOOR |
BIKE_HOUSE, BIKE_HOUSE_DOCKLESS, BIKE_HANGAR |
Entrance door with API unlock | unlock |
Note: The commands listed above are typical for each device type. In practice, available commands depend on the configuration of each specific device. Check the
commandsfield in the device response for the authoritative list of commands a given device supports.
Administrative commands: Additional commands for operator/maintenance scenarios —
force-lock,force-unlock,force-cancel-booking, andsync-device— are available via the API. These are not listed in the per-device tables above (which focus on user-facing flows). See the Device API Reference for details.
LOCKER
A locker is an individual enclosed storage compartment. Lockers can be either provided by Bikeep or just have the Bikeep IoT integrated into them. Physically, it is an enclosed compartment with an electronically controlled lock and an RFID reader.
Physical behavior
- The door has a sensor that detects open/closed state
- The lock is electronically controlled — it cannot be opened without an API command or an authorized RFID card
- The RFID reader accepts cards that are on the device’s whitelist
Available commands
| Command | Effect | Starting State | Resulting State |
|---|---|---|---|
book |
Reserves the locker for a user. Accepts optional timeout_at. |
UNLOCKED |
BOOKED |
cancel-booking |
Cancels an active reservation | BOOKED |
UNLOCKED |
lock |
Locks the device (activates a session) | UNLOCKED or BOOKED |
LOCKING → LOCKED |
unlock |
Unlocks the device (ends a session) | LOCKED |
UNLOCKING → UNLOCKED |
See Sessions for the full session lifecycle.
RFID interaction
- Whitelist tap on unlocked device: locks the device, activating a session tied to that RFID card
- Whitelist tap on locked device (same card): unlocks the device, ending the session
- Master key tap on locked device: unlocks regardless of which card locked it
Monitoring
GET /device/v1/devices/{device_id}
Key response fields:
state.value— current device state (UNLOCKED,LOCKED,BOOKED, etc.)state.changed_at— when the state last changedstate.timeout_at— when the current state expires. Meaning depends on the state:BOOKED→ booking ends,ALLOCATED→ command has timed out,LOCKING→ device will disengage,UNLOCKING→ device has moved to unlocked.nullwhen no timeout applieshardware_state— physical hardware health. In practice, onlyNORMALandNOT_RESPONDINGare used (withNOT_RESPONDINGbeing used for legacy G1 bike docks)heartbeat_health— deprecated, useheartbeat_v2.healthinstead. Values:HEALTHY,UNHEALTHY,DEAD(does not distinguishLONG_DEADfromDEAD)heartbeat_v2.health—HEALTHY,UNHEALTHY,DEAD, orLONG_DEADheartbeat_v2.dead_since— when the device went offline (nullif healthy)
For availability monitoring across all devices at a location, use the Location API rather than polling individual devices:
GET /location/v1/locations/{location_id}
The devices.available field returns the count of devices that are both available AND online — use this for availability display rather than computing it yourself.
See State Machines for the full state transition diagram.
GUARD (IoT Gateway)
A guard is an IoT gateway and parent controller. Every bike house (bike room, hangar, or dockless space) and standalone locker/dock location has one or more GUARD devices that bridge all child devices — BIKE_HOUSE_DOORs, LOCKERs, BIKE_DOCKs — to the Bikeep cloud via MQTT. The GUARD also stores and distributes allowlists (RFID access keys) to all its children.
Role in device hierarchy
A location can have multiple GUARD devices. The GUARD is the parent of every other device at its location. When you query devices at a BIKE_HOUSE location, the GUARD is the gateway and all other devices (BIKE_HOUSE_DOOR, LOCKER, BIKE_DOCK, etc.) are its children. At standalone locations (BIKE_LOCKERS, BIKE_DOCKS), the GUARD similarly serves as the gateway for all LOCKERs or BIKE_DOCKs. The GUARD itself is not user-facing — users interact with the BIKE_HOUSE_DOOR (to enter the bike room) and interior devices (LOCKERs or BIKE_DOCKs) to store items.
Allowlist distribution
Whitelists and their targets (which GUARDs or locations receive the keys) are configured by Bikeep during station provisioning. As an integrator, you manage the entities — adding and removing RFID cards on existing whitelists via the API. The GUARD then distributes these keys to all its child devices, including BIKE_HOUSE_DOORs and any interior devices (LOCKERs or BIKE_DOCKs). This model applies to both bike house locations and standalone locker/dock locations. You do not need to manage allowlists per-child-device — the GUARD handles distribution automatically.
See Locker & Dock Integration — Step 4 for the entity management workflow.
Available commands
The GUARD has no device-control commands (no lock, unlock, book, etc.). If the GUARD has a camera connected, the take-photo command is available to capture a snapshot. Door access is handled by the BIKE_HOUSE_DOOR device, not the GUARD.
Monitoring
The GUARD reports connectivity and heartbeat data, but its state values are not operationally meaningful in the way locker or dock states are. Monitor the GUARD’s heartbeat_v2.health to assess whether the gateway (and by extension, its children) is online. The legacy heartbeat_health field is deprecated — it does not distinguish LONG_DEAD from DEAD.
See Bike House (Dockless) Integration for access-control-only bike houses, or Bike House (with Docks/Lockers) Integration for bike houses with interior storage devices.
BIKE_DOCK
An outdoor bicycle parking dock. Each dock holds one bicycle using a mechanical locking arm. Docks are the most common Bikeep device type.
Note: Devices may briefly report
type: "DOCK"before hardware sync — treat these the same asBIKE_DOCK. Your integration should handle both values.
Available commands
| Command | Effect |
|---|---|
lock |
Engages the locking arm (bike secured) |
unlock |
Releases the locking arm (bike freed) |
book |
Reserves the dock for a user |
cancel-booking |
Cancels an active reservation |
RFID interaction
Same as lockers: tap to lock, tap again to unlock.
SCOOTER_DOCK
A parking dock designed for scooters. Functionally similar to BIKE_DOCK but physically adapted for scooter form factors. Found at SCOOTER_DOCKS locations; the newer-generation SCOOTER_DOCKS_V2 locations use the same device type with the same commands and behavior.
Available commands
lock, unlock, book
BIKE_HOUSE_DOOR (Entrance Door)
A BIKE_HOUSE_DOOR is a physical entrance device at a bike house (bike room, hangar, or dockless space). It is a child of the GUARD and controls the electronic lock on one of the bike house’s entry points. A bike house may have one or more BIKE_HOUSE_DOOR devices — one per physical entrance. Users access the bike room by tapping a whitelisted RFID card on the door’s reader, or via the API unlock command.
Physical behavior
- The door has an electronic lock and an RFID reader
- When a whitelisted RFID card is tapped, the lock releases and the user enters
- The lock re-engages automatically after a timeout
- The API
unlockcommand triggers the same lock release as an RFID tap
Available commands
| Command | Effect |
|---|---|
unlock |
Releases the door lock (one-off action, no session) |
Key characteristics
- API-controllable:
BIKE_HOUSE_DOORsupports theunlockcommand for remote door access (e.g., from a mobile app) - RFID access: The BIKE_HOUSE_DOOR’s RFID reader accepts cards allowed by the location’s whitelist
- No sessions: Each unlock is a stateless action — no usage session is created
- No booking:
BIKE_HOUSE_DOORdoes not supportbookorcancel-booking - Inverted availability: A
BIKE_HOUSE_DOORinLOCKEDstate is “available” (door is secured and ready to be opened)
A note on DOOR vs BIKE_HOUSE_DOOR
The API returns BIKE_HOUSE_DOOR as the device type for bike house entrance doors after hardware sync. You may encounter type: "DOOR" for devices not yet synced with hardware — treat these the same as BIKE_HOUSE_DOOR. Your integration should handle both values.
Common Properties
All devices share these response fields:
| Field | Type | Description |
|---|---|---|
id |
UUID | Unique device identifier |
type |
string | One of the device types above |
code |
string | Human-readable device code |
alias |
string | Human-readable device identifier. Guards use C1, C2, etc. Doors use D1, D2, etc. Lockers and docks use 1, 2, 3, etc. |
nr |
string | Deprecated — use alias instead. Device number within its location |
state.value |
string | Current state |
state.changed_at |
RFC 3339 | When the state last changed |
hardware_state |
string | NORMAL, DISABLED, DISABLED_LOCKING, DISABLED_UNLOCKING, ERROR, NOT_RESPONDING. In practice, only NORMAL and NOT_RESPONDING are used |
heartbeat_health |
string | Deprecated — does not distinguish LONG_DEAD from DEAD. Use heartbeat_v2.health instead. Values: HEALTHY, UNHEALTHY, DEAD |
heartbeat |
RFC 3339 | Deprecated — simulated value, not real heartbeat data. Use heartbeat_v2 instead |
heartbeat_latency |
number | Deprecated — always returns null |
wifi_rssi |
number | Deprecated — always returns null |
lock_state |
string | Physical lock state: LOCKED or UNLOCKED. This is the raw hardware signal — it may lag behind state.value during transitions (e.g., while LOCKING, lock_state remains UNLOCKED until hardware confirms). Use state.value for integration logic; use lock_state only for hardware diagnostics |
sleep_state |
string | Power state: empty string (awake), LIGHT_SLEEP, or DEEP_SLEEP. See Power Save and Sleep |
power_save_strategy |
string | NONE (always on), REMOTE_WAKEUP (backend wakes transparently), or LOCAL_WAKEUP (physical interaction only). See Power Save and Sleep |
heartbeat_v2 |
object | Extended heartbeat info (see below) |
has_camera |
boolean | Whether the device has a camera (enables take-photo command) |
has_otp_support |
boolean | Whether the device supports TOTP-based access |
has_allowlist |
boolean | Whether the device has allowlists configured |
has_access_lists |
boolean | Whether the device has access lists configured |
has_subscription |
boolean | Whether the device has an active subscription |
user.id |
UUID | Currently associated user (if locked) |
user.access_key |
string | RFID key that locked the device |
Power Save and Sleep
Bikeep devices support power-saving modes to extend battery life and reduce energy consumption. Two fields on every device tell you whether it is asleep and how it can be woken: sleep_state and power_save_strategy.
Strategy comparison:
power_save_strategy |
Sleep Depth | Behavior | Can You Send API Commands? | Latency Impact |
|---|---|---|---|---|
NONE |
N/A — always awake | Always on, no sleep mode | Yes, normal operation | None — typical 1–5 second round-trip |
REMOTE_WAKEUP |
LIGHT_SLEEP only |
Backend wakes the device transparently when you send a command. Command it like any always-on device | Yes — no code changes needed | Higher latency while waking from LIGHT_SLEEP; once awake, latency drops to normal levels |
LOCAL_WAKEUP |
Up to DEEP_SLEEP |
Device can only be woken by physical interaction (e.g., button press). Cannot be woken via the API | No — commands will not reach the device while sleeping | N/A — must be woken locally first |
Sleep states:
sleep_state |
Meaning | Which strategies use it |
|---|---|---|
"" (empty) |
Device is awake | All |
LIGHT_SLEEP |
Light power-saving mode — device is reachable but may respond with higher latency | REMOTE_WAKEUP |
DEEP_SLEEP |
Deep power-saving mode — device is unreachable via API, can only be woken by physical interaction | LOCAL_WAKEUP |
Integrator guidance:
NONEorREMOTE_WAKEUP— safe to send commands at any time. ForREMOTE_WAKEUPdevices inLIGHT_SLEEP, expect longer initial response times but no code changes needed. Once awake, latency drops to the same levels as non-sleeping devices.LOCAL_WAKEUPinDEEP_SLEEP— do not send commands. The device cannot be reached. Wait forsleep_stateto change to""(awake), or inform the end user that physical interaction is required.
heartbeat_v2
The heartbeat_v2 object provides richer connectivity information than the top-level heartbeat_health field. Prefer heartbeat_v2 for new integrations.
| Field | Type | Description |
|---|---|---|
heartbeat_v2.sent_at |
RFC 3339 | Deprecated — simulated value. Will be removed |
heartbeat_v2.latency_millis |
number | Deprecated — always returns 0. Will be removed |
heartbeat_v2.health |
string | HEALTHY, UNHEALTHY, DEAD, or LONG_DEAD |
heartbeat_v2.dead_since |
RFC 3339 | When the device went dead (null if healthy) |
Note:
heartbeat_v2.healthincludesLONG_DEAD(device offline for 2+ hours), while the top-levelheartbeat_healthmapsLONG_DEAD→DEADfor backwards compatibility.