Quick reference for DoorFlow's main resources. Scan to find what you need.
People
Individuals who need building access.
Key Fields
id - Unique identifier
first_name, last_name - Name
email - Contact/identifier
enabled - Can they access doors? (true/false)
group_ids - Which groups they belong to
Important
Required Scope: account.person (or .readonly for read)
Credentials
Physical or digital tokens that grant access.
Types
Key Fields
id - Unique identifier
credential_type_id - What type (5=Card, 6=PIN, etc.)
value - Card number / PIN / mobile ID
enabled - Currently active? (true/false)
person_id - Who owns it
Important
"******" for value to auto-generate random PIN
Required Scope: account.person (or .readonly for read)
Channels
Physical access control hardware (the hardware that controls locks).
Key Fields
id - Unique identifier
name - Human name ("Front Door")
mode - Current mode (normal/unlock/lockdown)
status - Connection (online/offline)
site_id - Which building/location
Modes
Required Scopes
account.channel.readonly
account.channel.admit or .admit.person
Groups
Collections of people with similar access needs.
Key Fields
id - Unique identifier
name - Group name ("Employees", "Visitors")
people_count - How many members
Important
Required Scope: account.group.readonly (read-only)
Note: Can't create/modify groups via API - use web interface
Roles
Define which groups can access which channels (and when).
Key Fields
id - Unique identifier
name - Role name
group_ids - Which groups have this role
channel_ids - Which doors it grants access to
shift_ids - Optional time restrictions
Important
Required Scope: account.role.readonly (read-only)
Note: Can't create/modify roles via API - use web interface
Group Reservations
Temporarily assign groups to a person for a specific timeframe. This grants them access to all doors/areas the group has permissions for during that period.
Key Fields
id - Unique identifier
person_id - Who receives the temporary group membership
group_id - Which group to assign them to temporarily
start_time - When membership begins (ISO 8601)
end_time - When membership expires (ISO 8601)
Important
Common Use Cases
Why use this instead of regular reservations?
- One group reservation grants access to many doors (via group's role permissions)
- Longer timeframes (weeks/months vs hours/days)
- Easier to manage than creating individual reservations per door
Required Scope: account.reservation (or .readonly for read)
Events
Audit log of all activity. Read-only.
Key Fields
id - Unique identifier
event_code - Type of event (10-18=admit, 20-29=reject, etc.)
person_id - Who was involved
channel_id - Which door
occurred_at - Timestamp (UTC)
description - Human-readable
Important
Required Scope: account.event.access.readonly
Sites
Physical locations/buildings. Read-only.
Key Fields
id - Unique identifier
name - Location name
address - Physical address
Required Scope: account.site.readonly
Quick Decision Guide
Need to grant someone permanent access?
- Create Person → Assign to Group → Issue Credential
Need temporary access to many doors (contractor, temp employee)?
- Create Person → Issue Credential → Create Group Reservation (assigns them to group temporarily)
Need short-term access to specific doors (visitor)?
- Create Person → Issue Credential → Create Regular Reservation (not group reservation)
Need to revoke access?
- Option 1: Disable person (
enabled: false) - Option 2: Disable their credentials
- Option 3: Remove from groups (or delete group reservation for temporary access)
Need to monitor access?
- Query Events filtered by person/channel/time
Need to lockdown building?
- POST
/channels/{id}/lockdownfor each channel