Access API Reference
Enterprise API endpoints for managing access.
Create a duration passage algoPIN code.
/devices/{deviceId}/algopin/passageAllows unlock with AlgoPIN and keeps the lock unlocked for the duration provided in the request body. Only supports newer devices with latest firmware.
Path Parameters
| Parameter | Type | Required |
|---|---|---|
| deviceId | string | Yes |
Query Parameters
| Parameter | In | Required |
|---|---|---|
| Authorization | header | Yes |
Body Parameters
| Parameter | Type | Required |
|---|---|---|
| accessName | string | Optional |
| durationHours | integer | Optional |
| startDate | string | Optional |
| variance | integer | Optional |
Request Example
Responses
OK. If a matching PIN already exists for this lock, type, and window with the same 'variance', this returns the same success response without creating a new PIN. This is expected, idempotent behavior, not an error.
Bad Request
Unauthorized, invalid or expired authorization token
Missing the broad algopin scope, OR missing the specific scope for this exact PIN type (double-gated — see the endpoint description).
Response
Missing 'Content-Type: application/json'.
No example response recorded for this status code.
Example response — 402-account-suspended:
Example response — 402-trial-ended:
No example response recorded for this status code.
List access records for a device
/devices/{id}/accessA malformed query parameter returns a 400, even if authentication is missing or invalid.
Path Parameters
| Parameter | Type | Required |
|---|---|---|
| id | string | Yes |
Query Parameters
| Parameter | In | Required |
|---|---|---|
| accessType | query | No |
| limit | query | No |
| cursor | query | No |
| sort | query | No |
Request Example
Responses
OK.
Query/body validation failure.
Unauthorized, invalid or expired authorization token
Forbidden. One of: (1) the token is valid but lacks the required scope for this endpoint (no body); (2) the OAuth client's access has been revoked ('{error: "The user has revoked access for this application..."}'). Never returned on the API-key auth path, which does not check scope at all.
Device not found, or (Lock/Keypad only) Property not found.
Property timezone is missing.
No example response recorded for this status code.
Example response — 402-account-suspended:
Example response — 402-trial-ended:
No example response recorded for this status code.
Grant ekey access (persists Access + Activity + Audit trail)
/devices/{id}/access/grantAll error responses on this endpoint use a {message, code} body shape. See the 404 response below for the specific not-found causes.
Path Parameters
| Parameter | Type | Required |
|---|---|---|
| id | string | Yes |
Body Parameters
| Parameter | Type | Required |
|---|---|---|
| departmentRef | string | Optional |
| endDateTime | string | Optional |
| lang | string | Optional |
| permissions | string | Optional |
| recipientId | string | Optional |
| startDateTime | string | Optional |
Request Example
Responses
Created. If activity logging fails after the access record is saved, this still returns 201, but with a different response body (no 'code' field) containing an error message instead.
Bad Request
Unauthorized, invalid or expired authorization token
Forbidden. One of: (1) the token is valid but lacks the required scope for this endpoint (no body); (2) the OAuth client's access has been revoked ('{error: "The user has revoked access for this application..."}'). Never returned on the API-key auth path, which does not check scope at all.
RECIPIENT_NOT_FOUND / LOCK_NOT_FOUND / DEPARTMENT_NOT_FOUND.
CONFIGURATION_LOCK_ISSUE / FAILED_GENERATE_EKEY.
Missing 'Content-Type: application/json'.
NON_LOCK_DEVICE_NOT_ALLOWED — returned when the target device is not a Lock.
FLAT_ORG_DEPT_NOT_FOUND / INTERNAL_SERVER_ERROR.
No example response recorded for this status code.
Example response — 402-account-suspended:
Example response — 402-trial-ended:
No example response recorded for this status code.
Revoke ekey access(es) for a recipient on this device
/devices/{id}/access/revokeRevokes ALL matching access records for this recipient and permanently deletes their associated key material. This action is permanent and cannot be undone.
Path Parameters
| Parameter | Type | Required |
|---|---|---|
| id | string | Yes |
Body Parameters
| Parameter | Type | Required |
|---|---|---|
| recipientId | string | Optional |
Request Example
Responses
OK.
Query/body validation failure.
Unauthorized, invalid or expired authorization token
Forbidden. One of: (1) the token is valid but lacks the required scope for this endpoint (no body); (2) the OAuth client's access has been revoked ('{error: "The user has revoked access for this application..."}'). Never returned on the API-key auth path, which does not check scope at all.
RECIPIENT_NOT_FOUND / LOCK_NOT_FOUND / NO_ACTIVE_ACCESS ("Ekey already revoked or not found").
Missing 'Content-Type: application/json'.
INTERNAL_SERVER_ERROR — unlike grant, there is no tolerant fallback if activity/audit-trail logging fails; any failure here is a hard 500.
No example response recorded for this status code.
Example response — 402-account-suspended:
Example response — 402-trial-ended:
No example response recorded for this status code.
Delete/revoke a PIN access (creates an async delete job)
/devices/{id}/access/{accessId}Path Parameters
| Parameter | Type | Required |
|---|---|---|
| id | string | Yes |
| accessId | string | Yes |
Request Example
Responses
Delete job created.
Unauthorized, invalid or expired authorization token
Forbidden. One of: (1) the token is valid but lacks the required scope for this endpoint (no body); (2) the OAuth client's access has been revoked ('{error: "The user has revoked access for this application..."}'). Never returned on the API-key auth path, which does not check scope at all.
Access not found ('{error: "access not found"}').
Response
Missing 'Content-Type: application/json' — enforced even though this DELETE has no meaningful body fields.
No example response recorded for this status code.
Example response — 402-account-suspended:
Example response — 402-trial-ended:
No example response recorded for this status code.
Create a Daily Algo PIN
/devices/{id}/algopin/dailySee POST /devices/{id}/algopin/permanent — identical shape, different scope. endDate is required for this PIN type (forbidden for permanent/onetime), and variance range is 1–3 (not 1–5).
Path Parameters
| Parameter | Type | Required |
|---|---|---|
| id | string | Yes |
Body Parameters
| Parameter | Type | Required |
|---|---|---|
| accessName | string | Optional |
| departmentId | string | Optional |
| endDate | string | Optional |
| startDate | string | Optional |
| variance | integer | Optional |
Request Example
Responses
OK. If a matching PIN already exists for this lock, type, and window with the same 'variance', this returns the same success response without creating a new PIN. This is expected, idempotent behavior, not an error.
Bad Request
Unauthorized, invalid or expired authorization token
Missing the broad algopin scope, OR missing the specific scope for this exact PIN type (double-gated — see the endpoint description).
Response
Missing 'Content-Type: application/json'.
No example response recorded for this status code.
Example response — 402-account-suspended:
Example response — 402-trial-ended:
No example response recorded for this status code.
Create an Hourly Algo PIN
/devices/{id}/algopin/hourlySee POST /devices/{id}/algopin/permanent — identical shape, different scope. endDate is required for this PIN type (forbidden for permanent/onetime), and variance range is 1–3 (not 1–5).
Path Parameters
| Parameter | Type | Required |
|---|---|---|
| id | string | Yes |
Body Parameters
| Parameter | Type | Required |
|---|---|---|
| accessName | string | Optional |
| departmentId | string | Optional |
| endDate | string | Optional |
| startDate | string | Optional |
| variance | integer | Optional |
Request Example
Responses
OK. If a matching PIN already exists for this lock, type, and window with the same 'variance', this returns the same success response without creating a new PIN. This is expected, idempotent behavior, not an error.
Bad Request
Unauthorized, invalid or expired authorization token
Missing the broad algopin scope, OR missing the specific scope for this exact PIN type (double-gated — see the endpoint description).
Response
Missing 'Content-Type: application/json'.
No example response recorded for this status code.
Example response — 402-account-suspended:
Example response — 402-trial-ended:
No example response recorded for this status code.
Create a One-Time Algo PIN
/devices/{id}/algopin/onetimeSee POST /devices/{id}/algopin/permanent — identical shape, different scope.
Path Parameters
| Parameter | Type | Required |
|---|---|---|
| id | string | Yes |
Body Parameters
| Parameter | Type | Required |
|---|---|---|
| accessName | string | Optional |
| departmentId | string | Optional |
| endDate | string | Optional |
| startDate | string | Optional |
| variance | integer | Optional |
Request Example
Responses
OK. If a matching PIN already exists for this lock, type, and window with the same 'variance', this returns the same success response without creating a new PIN. This is expected, idempotent behavior, not an error.
Bad Request
Unauthorized, invalid or expired authorization token
Missing the broad algopin scope, OR missing the specific scope for this exact PIN type (double-gated — see the endpoint description).
Response
Missing 'Content-Type: application/json'.
No example response recorded for this status code.
Example response — 402-account-suspended:
Example response — 402-trial-ended:
No example response recorded for this status code.
Create a Permanent Algo PIN
/devices/{id}/algopin/permanentRequest and response shape matches the other Algo PIN endpoints (onetime/daily/hourly) — see AlgoPinRequest. Requires the algopin-permanent scope specifically; holding a different Algo PIN scope (e.g. algopin-daily) is not sufficient and returns a 403.
Path Parameters
| Parameter | Type | Required |
|---|---|---|
| id | string | Yes |
Body Parameters
| Parameter | Type | Required |
|---|---|---|
| accessName | string | Optional |
| departmentId | string | Optional |
| endDate | string | Optional |
| startDate | string | Optional |
| variance | integer | Optional |
Request Example
Responses
OK. If a matching PIN already exists for this lock, type, and window with the same 'variance', this returns the same success response without creating a new PIN. This is expected, idempotent behavior, not an error.
Bad Request
Unauthorized, invalid or expired authorization token
Missing the broad algopin scope, OR missing the specific scope for this exact PIN type (double-gated — see the endpoint description).
Response
Missing 'Content-Type: application/json'.
No example response recorded for this status code.
Example response — 402-account-suspended:
Example response — 402-trial-ended:
No example response recorded for this status code.
Generate a Bluetooth guest ekey (no DB persistence)
/devices/{id}/ekeyError responses are returned as plain text rather than JSON. Only a successful response returns a JSON body.
Path Parameters
| Parameter | Type | Required |
|---|---|---|
| id | string | Yes |
Body Parameters
| Parameter | Type | Required |
|---|---|---|
| endDate | string | Optional |
| permissions | string | Optional |
| startDate | string | Optional |
Request Example
Responses
OK.
Bad Request
Unauthorized, invalid or expired authorization token
Forbidden. One of: (1) the token is valid but lacks the required scope for this endpoint (no body); (2) the OAuth client's access has been revoked ('{error: "The user has revoked access for this application..."}'). Never returned on the API-key auth path, which does not check scope at all.
Plain-text body: '"failed.generate.ekey"' (key derivation failed).
Missing 'Content-Type: application/json'.
Plain-text body — uncaught exception.
No example response recorded for this status code.
Example response — 402-account-suspended:
Example response — 402-trial-ended:
No example response recorded for this status code.