GuideEvent Catalog

Event Catalog

Reference documentation for SmartphoneKey EventBridge events available to partners.

This catalog lists every event a partner can subscribe to. For each event you will find the source, when it fires, and the fields of its payload.

For how to subscribe and receive them, see Partner Webhooks.

All spk.api events share the same envelope structure. The domain payload is wrapped in a detail object that carries projection metadata plus the original event under data:

{
  "source": "spk.api",
  "detail-type": "<EventName>",
  "detail": {
    "partnerId": "<your-orgId>",
    "aggregateType": "<LockAggregate|UserAggregate|HubAggregate|...>",
    "aggregateId": "<aggregate id>",
    "version": 7,
    "timestamp": 1745922600123,
    "data": { /* event-specific payload — see below */ }
  }
}

detail.timestamp is the projection time as epoch milliseconds (a number). The ISO-8601 timestamp inside detail.data.timestamp is the domain-event time. The fields documented below describe detail.data — the actual domain event.


Lock events

LockCreated

Sourcespk.api
detail-typeLockCreated
aggregateTypeLockAggregate

A new lock has been created in the system.

Payload fields (detail.data):

FieldTypeRequiredDescription
lockIdnumberyesNumeric lock ID
uuidstringyesLock UUID
serialNumberstringnoHardware serial number
keysobject[]noInitial key list
keys[].uuidstringyesKey UUID
keys[].indexNumbernumbernoKey slot index
keys[].userIdstringnoUser the key is assigned to
ownerIdstringnoOwning user ID
timestampstringyesISO-8601 time of the domain event
thingNamestringnoAWS IoT thing name
thingArnstringnoAWS IoT thing ARN

OwnerSet

Sourcespk.api
detail-typeOwnerSet
aggregateTypeLockAggregate

A lock's owner has been assigned or changed.

Payload fields (detail.data):

FieldTypeRequiredDescription
lockIdnumberyesNumeric lock ID
uuidstringyesLock UUID
timestampstringyesISO-8601 time of the domain event
userIdstringyesNew owner user ID

OrganizationSet

Sourcespk.api
detail-typeOrganizationSet
aggregateTypeLockAggregate

A lock has been moved to a different organization.

Payload fields (detail.data):

FieldTypeRequiredDescription
lockIdnumberyesNumeric lock ID
uuidstringyesLock UUID
timestampstringyesISO-8601 time of the domain event
orgIdstringyesOrganization ID

KeyAdded

Sourcespk.api
detail-typeKeyAdded
aggregateTypeLockAggregate

A physical key has been added to a lock.

Payload fields (detail.data):

FieldTypeRequiredDescription
lockIdnumberyesNumeric lock ID
uuidstringyesLock UUID
timestampstringyesISO-8601 time of the domain event
keyUuidstringyesUUID of the key
keyIndexNumbernumbernoKey slot index
userIdstringnoUser the key is assigned to
messageIdstringno
requestedAtnumberno

KeyRemoved

Sourcespk.api
detail-typeKeyRemoved
aggregateTypeLockAggregate

A physical key has been removed from a lock.

Payload fields (detail.data):

FieldTypeRequiredDescription
lockIdnumberyesNumeric lock ID
uuidstringyesLock UUID
timestampstringyesISO-8601 time of the domain event
keyUuidstringyesUUID of the removed key
keyIndexNumbernumbernoKey slot index
messageIdstringno
requestedAtnumberno

ResidentAdded

Sourcespk.api
detail-typeResidentAdded
aggregateTypeLockAggregate

A resident has been granted access to a lock.

Payload fields (detail.data):

FieldTypeRequiredDescription
lockIdnumberyesNumeric lock ID
uuidstringyesLock UUID
timestampstringyesISO-8601 time of the domain event
userIdstringyesResident user ID (resolved from the email)
namestringyesResident display name
emailstringnoResident email

ResidentRemoved

Sourcespk.api
detail-typeResidentRemoved
aggregateTypeLockAggregate

A resident's access to a lock has been revoked.

Payload fields (detail.data):

FieldTypeRequiredDescription
lockIdnumberyesNumeric lock ID
uuidstringyesLock UUID
timestampstringyesISO-8601 time of the domain event
userIdstringyesResident user ID
emailstringnoResident email

LockUuidChanged

Sourcespk.api
detail-typeLockUuidChanged
aggregateTypeLockAggregate

A lock's UUID has been replaced.

Payload fields (detail.data):

FieldTypeRequiredDescription
lockIdnumberyesNumeric lock ID
uuidstringyesLock UUID
timestampstringyesISO-8601 time of the domain event
newUuidstringyes
previousUuidstringyes

LockOpenRequested

Sourcespk.api
detail-typeLockOpenRequested
aggregateTypeLockAggregate

An unlock command was delivered to the lock.

Payload fields (detail.data):

FieldTypeRequiredDescription
lockIdnumberyesNumeric lock ID
uuidstringyesLock UUID
timestampstringyesISO-8601 time of the domain event
reasonstringno
requestIdstringno
messageIdstringno
requestedAtnumberno

LockOpenConfirmed

Sourcespk.api
detail-typeLockOpenConfirmed
aggregateTypeLockAggregate

The lock reported that an unlock was carried out.

Payload fields (detail.data):

FieldTypeRequiredDescription
lockIdnumberyesNumeric lock ID
uuidstringyesLock UUID
timestampstringyesISO-8601 time of the domain event
messageIdstringyes
requestIdstringno
attemptsnumberyes
latencyMsnumberyes

LockOpenUnconfirmed

Sourcespk.api
detail-typeLockOpenUnconfirmed
aggregateTypeLockAggregate

An unlock was sent but the lock did not confirm the bolt moved, or did not answer in time.

Payload fields (detail.data):

FieldTypeRequiredDescription
lockIdnumberyesNumeric lock ID
uuidstringyesLock UUID
timestampstringyesISO-8601 time of the domain event
messageIdsstring[]yes
requestIdstringno
attemptsnumberyes
reason"refused" | "no-state-change" | "no-ack"yes
errorCodenumber | stringno
detailstringno

KeyWriteRequested

Sourcespk.api
detail-typeKeyWriteRequested
aggregateTypeLockAggregate

A key write to physical NFC hardware was requested.

Payload fields (detail.data):

FieldTypeRequiredDescription
lockIdnumberyesNumeric lock ID
uuidstringyesLock UUID
timestampstringyesISO-8601 time of the domain event
keyUuidstringyes
keyIndexNumbernumberno

LockIvrCallCompleted

Sourcespk.api
detail-typeLockIvrCallCompleted
aggregateTypeLockAggregate

An IVR call to a resident about this lock ended (telephony-api). Delivered at least once — deduplicate on callId.

Payload fields (detail.data):

FieldTypeRequiredDescription
lockIdnumberyesNumeric lock ID
uuidstringyesLock UUID
timestampstringyesISO-8601 time of the domain event
callIdstringyesThe calling client's call id; the same call may be delivered twice
userIdstringyesResident called (user ID); the phone number is never carried, not even masked
status"opened" | "denied" | "timeout" | "no_answer" | "busy" | "failed" | "ended"yesFinal call status: opened, denied, timeout, no_answer, busy, failed or ended
result"open_failed" | "dial_failed" | "guest_not_connected" | "talk_limit" | "hangup_client" | "hangup_resident" | "provider_error" | nullyesFor failed / ended: open_failed, dial_failed, guest_not_connected, talk_limit, hangup_client, hangup_resident or provider_error; otherwise null
choice"0" | "1" | "9" | nullyesKey the resident pressed: 9 open, 0 refuse, 1 talk; null when none
providerstringyesTelephony provider that carried the call
countrystring | nullyesISO-3166 alpha-2 of the resident's number; null when unknown
languagestringyesLanguage the menu was played in
createdAtstringyesISO-8601 time the call was ordered
answeredAtstringnoISO-8601 time the resident answered; absent when nobody answered
endedAtstringyesISO-8601 time the call reached its final status
durationSecsnumberyesSeconds from answer to end; 0 when nobody answered

Temporary key events

TempKeyCreated

Sourcespk.api
detail-typeTempKeyCreated
aggregateTypeLockAggregate

Deprecated: a temporary key has been issued through a per-lock route.

Payload fields (detail.data):

FieldTypeRequiredDescription
tempKeyUuidstringyes
lockIdnumberyesNumeric lock ID
lockUuidstringyes
accessMode"public" | "user-whitelist"yes
allowedUserIdsstring[]no
validFromstringyes
validUntilstringyes
maxUsesnumber | nullno
createdBystringyes
timestampstringyesISO-8601 time of the domain event

TempKeyUsed

Sourcespk.api
detail-typeTempKeyUsed
aggregateTypeLockAggregate

Deprecated: a temporary key has been used to unlock (see TempKeyDoorOpened).

Payload fields (detail.data):

FieldTypeRequiredDescription
tempKeyUuidstringyes
lockIdnumberyesNumeric lock ID
lockUuidstringyes
userIdstringnoUser ID
usedCountnumberyes
timestampstringyesISO-8601 time of the domain event

TempKeyDeleted

Sourcespk.api
detail-typeTempKeyDeleted
aggregateTypeLockAggregate

Deprecated: a temporary key has been deleted through a per-lock route.

Payload fields (detail.data):

FieldTypeRequiredDescription
tempKeyUuidstringyes
lockIdnumberyesNumeric lock ID
lockUuidstringyes
deletedBystringyes
timestampstringyesISO-8601 time of the domain event

TempKeyUpdated

Sourcespk.api
detail-typeTempKeyUpdated
aggregateTypeLockAggregate

Deprecated: a temporary key's rules changed through a per-lock route.

Payload fields (detail.data):

FieldTypeRequiredDescription
tempKeyUuidstringyes
lockIdnumberyesNumeric lock ID
lockUuidstringyes
changesobjectyes
changes.validFromstringno
changes.validUntilstringno
changes.maxUsesnumber | nullno
changes.allowedUserIdsstring[]no
changes.accessMode"public" | "user-whitelist"no
updatedBystringyes
timestampstringyesISO-8601 time of the domain event

TempKeyIssued

Sourcespk.api
detail-typeTempKeyIssued
aggregateTypeTempKeyAggregate

A temporary key has been issued for one or more doors.

Payload fields (detail.data):

FieldTypeRequiredDescription
tempKeyUuidstringyesTemporary key UUID (also the aggregateId)
issuedBystringyesOrganization or user ID that issued the key
origin"temp-keys" | "per-lock" | "import"yes'temp-keys' (the key routes), 'per-lock' (a deprecated per-lock route) or 'import' (moved from b2c-api)
keyobjectyes
key.doorsobject[]yes
key.doors[].doorIdnumberyesStable door id within the key (guest pages address doors by it)
key.doors[].lockIdnumberyesNumeric ID of the lock the door opens
key.doors[].lockUuidstringyesUUID of the lock the door opens
key.doors[].accessMethod"key" | "code" | "both"yesHow a guest opens the door: 'key' (guest page), 'code' (entrance-panel PIN) or 'both'
key.doors[].sortOrdernumberyes
key.validFromstringyes
key.validUntilstringyes
key.accessMode"public" | "user-whitelist"yes'public' (anyone with the link or PIN) or 'user-whitelist' (only allowedUserIds)
key.allowedUserIdsstring[]yes
key.maxUsesnumber | nullyesTotal opens the key allows across all its doors; null = unlimited
key.usedCountnumberyesOpens so far
key.pinIssuedbooleanyesTrue when the key has an entrance-panel PIN; the PIN itself is never sent
key.createdBystringyes
key.createdAtstringyes
key.revokedAtstring | nullyesWhen the key was revoked; null while it is not
timestampstringyesISO-8601 time of the domain event

TempKeyChanged

Sourcespk.api
detail-typeTempKeyChanged
aggregateTypeTempKeyAggregate

A temporary key's validity, limit, access or guest instructions changed.

Payload fields (detail.data):

FieldTypeRequiredDescription
tempKeyUuidstringyesTemporary key UUID (also the aggregateId)
changed"validFrom" | "validUntil" | "maxUses" | "accessMode" | "allowedUserIds" | "description"[]yesThe fields that changed; 'description' names the guest instructions, whose text is never sent
changedBystringyesOrganization or user ID that made the change
keyobjectyes
key.doorsobject[]yes
key.doors[].doorIdnumberyesStable door id within the key (guest pages address doors by it)
key.doors[].lockIdnumberyesNumeric ID of the lock the door opens
key.doors[].lockUuidstringyesUUID of the lock the door opens
key.doors[].accessMethod"key" | "code" | "both"yesHow a guest opens the door: 'key' (guest page), 'code' (entrance-panel PIN) or 'both'
key.doors[].sortOrdernumberyes
key.validFromstringyes
key.validUntilstringyes
key.accessMode"public" | "user-whitelist"yes'public' (anyone with the link or PIN) or 'user-whitelist' (only allowedUserIds)
key.allowedUserIdsstring[]yes
key.maxUsesnumber | nullyesTotal opens the key allows across all its doors; null = unlimited
key.usedCountnumberyesOpens so far
key.pinIssuedbooleanyesTrue when the key has an entrance-panel PIN; the PIN itself is never sent
key.createdBystringyes
key.createdAtstringyes
key.revokedAtstring | nullyesWhen the key was revoked; null while it is not
timestampstringyesISO-8601 time of the domain event

TempKeyRevoked

Sourcespk.api
detail-typeTempKeyRevoked
aggregateTypeTempKeyAggregate

A temporary key has been revoked; none of its doors open with it any more.

Payload fields (detail.data):

FieldTypeRequiredDescription
tempKeyUuidstringyesTemporary key UUID (also the aggregateId)
revokedBystringyesOrganization or user ID that revoked the key
keyobjectyes
key.doorsobject[]yes
key.doors[].doorIdnumberyesStable door id within the key (guest pages address doors by it)
key.doors[].lockIdnumberyesNumeric ID of the lock the door opens
key.doors[].lockUuidstringyesUUID of the lock the door opens
key.doors[].accessMethod"key" | "code" | "both"yesHow a guest opens the door: 'key' (guest page), 'code' (entrance-panel PIN) or 'both'
key.doors[].sortOrdernumberyes
key.validFromstringyes
key.validUntilstringyes
key.accessMode"public" | "user-whitelist"yes'public' (anyone with the link or PIN) or 'user-whitelist' (only allowedUserIds)
key.allowedUserIdsstring[]yes
key.maxUsesnumber | nullyesTotal opens the key allows across all its doors; null = unlimited
key.usedCountnumberyesOpens so far
key.pinIssuedbooleanyesTrue when the key has an entrance-panel PIN; the PIN itself is never sent
key.createdBystringyes
key.createdAtstringyes
key.revokedAtstring | nullyesWhen the key was revoked; null while it is not
timestampstringyesISO-8601 time of the domain event

TempKeyDoorOpened

Sourcespk.api
detail-typeTempKeyDoorOpened
aggregateTypeTempKeyAggregate

A door has been opened with a temporary key.

Payload fields (detail.data):

FieldTypeRequiredDescription
tempKeyUuidstringyesTemporary key UUID (also the aggregateId)
doorIdnumberyesThe door of the key that opened
lockIdnumberyesNumeric ID of the lock the door opens
lockUuidstringyesUUID of the lock the door opens
method"slide" | "pin"yes'slide' (guest page) or 'pin' (entrance panel)
openedBystring | nullyesUser ID of a signed-in guest; null for an anonymous guest page or a PIN
keyobjectyes
key.doorsobject[]yes
key.doors[].doorIdnumberyesStable door id within the key (guest pages address doors by it)
key.doors[].lockIdnumberyesNumeric ID of the lock the door opens
key.doors[].lockUuidstringyesUUID of the lock the door opens
key.doors[].accessMethod"key" | "code" | "both"yesHow a guest opens the door: 'key' (guest page), 'code' (entrance-panel PIN) or 'both'
key.doors[].sortOrdernumberyes
key.validFromstringyes
key.validUntilstringyes
key.accessMode"public" | "user-whitelist"yes'public' (anyone with the link or PIN) or 'user-whitelist' (only allowedUserIds)
key.allowedUserIdsstring[]yes
key.maxUsesnumber | nullyesTotal opens the key allows across all its doors; null = unlimited
key.usedCountnumberyesOpens so far
key.pinIssuedbooleanyesTrue when the key has an entrance-panel PIN; the PIN itself is never sent
key.createdBystringyes
key.createdAtstringyes
key.revokedAtstring | nullyesWhen the key was revoked; null while it is not
timestampstringyesISO-8601 time of the domain event

User events

UserCreated

Sourcespk.api
detail-typeUserCreated
aggregateTypeUserAggregate

A new user has been registered.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
status"ACTIVE" | "INACTIVE" | "SUSPENDED"yes

ProfileUpdated

Sourcespk.api
detail-typeProfileUpdated
aggregateTypeUserAggregate

A user's profile fields have changed.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
changesobjectyes
changes.firstNameobjectno
changes.firstName.oldstringyes
changes.firstName.newstringyes
changes.lastNameobjectno
changes.lastName.oldstringyes
changes.lastName.newstringyes
changes.phoneNumberobjectno
changes.phoneNumber.oldstringno
changes.phoneNumber.newstringno

UserPhoneNumberUpdated

Sourcespk.api
detail-typeUserPhoneNumberUpdated
aggregateTypeUserAggregate

A user's phone number has changed (only the masked number is carried).

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
action"set" | "removed"yes
maskedPhoneNumberstringnoObfuscated number (last 4 digits, e.g. "***4567") — present only when action is "set"
timestampstringyesISO-8601 time of the domain event

UserEmailUpdated

Sourcespk.api
detail-typeUserEmailUpdated
aggregateTypeUserAggregate

A user's email address has changed.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
action"set" | "removed"yes
maskedEmailstringnoObfuscated email (first initial + domain, e.g. "a***@example.com") — present only when action is "set"
timestampstringyesISO-8601 time of the domain event

PhysicalKeyAdded

Sourcespk.api
detail-typePhysicalKeyAdded
aggregateTypeUserAggregate

A physical key has been issued to a user.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
numbernumberyesKey number
orgIdstringyesIssuing organization
orgNamestringnoOrganization display name
notestringnoFree-form note
addedAtnumberyesUnix epoch ms

PhysicalKeyRemoved

Sourcespk.api
detail-typePhysicalKeyRemoved
aggregateTypeUserAggregate

A physical key has been removed from a user.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
numbernumberyesKey number
removedAtnumberyesUnix epoch ms

WalletKeyPrepared

Sourcespk.api
detail-typeWalletKeyPrepared
aggregateTypeUserAggregate

A wallet key (Apple/Google) is being provisioned.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
keyIdstringyes
walletType"APPLE" | "GOOGLE"yes
keyIndexnumberno
deviceIdstringnoDevice UUID
orgIdstring | nullnoOrganization ID

WalletKeyCommitted

Sourcespk.api
detail-typeWalletKeyCommitted
aggregateTypeUserAggregate

A wallet key has been issued and the pass is available.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
keyIdstringyes
keyIndexnumberno
walletType"APPLE" | "GOOGLE"no
deviceIdstringnoDevice UUID
passIdstringyes
passUrlstringyes
committedAtstringyes

WalletKeyRolledBack

Sourcespk.api
detail-typeWalletKeyRolledBack
aggregateTypeUserAggregate

A wallet key provisioning attempt was rolled back.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
preparedKeyIdstringyes
reasonstringyes
rolledBackAtstringyes

WalletKeyRemoved

Sourcespk.api
detail-typeWalletKeyRemoved
aggregateTypeUserAggregate

A wallet key has been removed from a user.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
keyIdstringyes
reasonstringyes
removedAtstringyesUnix epoch ms

WalletKeyOrgAssigned

Sourcespk.api
detail-typeWalletKeyOrgAssigned
aggregateTypeUserAggregate

An admin assigned a wallet key to its issuing organization.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
keyIdstringyes
orgIdstringyesOrganization the key now belongs to
previousOrgIdstring | nullnoOrganization it belonged to before, if any
auditIdstringyes

AccessibleLockAdded

Sourcespk.api
detail-typeAccessibleLockAdded
aggregateTypeUserAggregate

A user has been granted access to a lock.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
lockIdstringyesLock UUID
lockNamestringyesLock display name
accessLevel"OWNER" | "ADMIN" | "USER" | "GUEST"yes
grantedBystringyesUser ID who granted access

AccessibleLockRemoved

Sourcespk.api
detail-typeAccessibleLockRemoved
aggregateTypeUserAggregate

A user has lost access to a lock.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
lockIdstringyesNumeric lock ID
removedBystringyes
reasonstringyes
removedAtstringyesUnix epoch ms

UserSuspended

Sourcespk.api
detail-typeUserSuspended
aggregateTypeUserAggregate

A user has been suspended.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
reasonstringyes
suspendedBystringyes
suspendedAtstringyes

UserReactivated

Sourcespk.api
detail-typeUserReactivated
aggregateTypeUserAggregate

A previously suspended user has been reactivated.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
reactivatedBystringyes
reactivatedAtstringyes

WalletKeyAdded

Sourcespk.api
detail-typeWalletKeyAdded
aggregateTypeUserAggregate

A wallet key was added (legacy single-step path).

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
walletKeyobjectyes
walletKey.keyIdstringyes
walletKey.keyIndexnumberyes
walletKey.walletType"APPLE" | "GOOGLE"yes
walletKey.deviceIdstringyes
walletKey.passUrlstringno
walletKey.serialNumberstringno
walletKey.addedAtstringyes

LicensePlateAdded

Sourcespk.api
detail-typeLicensePlateAdded
aggregateTypeUserAggregate

A license plate has been registered to a user.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
platestringyesLicense plate string
labelstringyesFriendly label
addedAtnumberyesUnix epoch ms

LicensePlateRemoved

Sourcespk.api
detail-typeLicensePlateRemoved
aggregateTypeUserAggregate

A license plate has been removed from a user.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
platestringyes

DeviceAdded

Sourcespk.api
detail-typeDeviceAdded
aggregateTypeUserAggregate

A device has been linked to a user.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
deviceIdstringyesDevice UUID
deviceType"matter" | "camera" | "rtsp-camera"yes
orgIdstringyesOrganization ID
namestringno
addedBystringno
addedAtstringyesUnix epoch ms

DeviceRemoved

Sourcespk.api
detail-typeDeviceRemoved
aggregateTypeUserAggregate

A device has been unlinked from a user.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
deviceIdstringyesDevice UUID
deviceType"matter" | "camera" | "rtsp-camera"yes
removedBystringyes
reasonstringyes
removedAtstringyesUnix epoch ms

DevicePushMutedUpdated

Sourcespk.api
detail-typeDevicePushMutedUpdated
aggregateTypeUserAggregate

A user muted or unmuted alarm push notifications for one of their devices.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
deviceIdstringyesDevice UUID
mutedbooleanyes
timestampstringyesISO-8601 time of the domain event

CallToOpenLockChosen

Sourcespk.api
detail-typeCallToOpenLockChosen
aggregateTypeUserAggregate

Locks or Matter devices were chosen to open when the user calls the call-to-open number, each on its own digit; replaces the previous choice whole; a preference, not an access grant.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
targetobjectyesThe chosen target on the lowest digit ({kind, id})
target.kind"lock" | "matter"yesWhich of the user's lists the id is in: lock (accessible locks) or matter (Matter devices)
target.idstringyesA lock aggregate id or a Matter device id, never a phone number
targetsobject[]noEvery chosen target with the digit that picks it ({kind, id, digit}), ordered by digit; absent on an event written before a choice held several, whose one target is on 1
targets[].kind"lock" | "matter"yesWhich of the user's lists the id is in: lock (accessible locks) or matter (Matter devices)
targets[].idstringyesA lock aggregate id or a Matter device id, never a phone number
targets[].digitstringyesThe key that picks this target in a call: one digit, 0-9, unique within the choice
chosenByobjectyes
chosenBy.kind"user" | "organization"yesuser for the user themselves, organization for an API key
chosenBy.orgIdstring | nullyesThe API key's organization; null when the user acted themselves
timestampstringyesISO-8601 time of the domain event

CallToOpenLockCleared

Sourcespk.api
detail-typeCallToOpenLockCleared
aggregateTypeUserAggregate

The user's call-to-open choice was cleared whole by a ClearCallToOpenLock command; removing a chosen lock or device from the user's lists drops that target from the choice, without this event.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
previousTargetobjectyesThe cleared target on the lowest digit ({kind, id})
previousTarget.kind"lock" | "matter"yesWhich of the user's lists the id is in: lock (accessible locks) or matter (Matter devices)
previousTarget.idstringyesA lock aggregate id or a Matter device id, never a phone number
previousTargetsobject[]noEvery cleared target with its digit ({kind, id, digit}), ordered by digit; absent on an event written before a choice held several
previousTargets[].kind"lock" | "matter"yesWhich of the user's lists the id is in: lock (accessible locks) or matter (Matter devices)
previousTargets[].idstringyesA lock aggregate id or a Matter device id, never a phone number
previousTargets[].digitstringyesThe key that picks this target in a call: one digit, 0-9, unique within the choice
clearedByobjectyes
clearedBy.kind"user" | "organization"yesuser for the user themselves, organization for an API key
clearedBy.orgIdstring | nullyesThe API key's organization; null when the user acted themselves
timestampstringyesISO-8601 time of the domain event

CallToOpenCallRecorded

Sourcespk.api
detail-typeCallToOpenCallRecorded
aggregateTypeUserAggregate

A call from the user's own phone number was admitted to open the user's call-to-open choice (the lock open is requested next and may still fail; LockOpenRequested on the lock is the open itself); written only for an admitted call, never for a refused one, and without the phone number; an admitted call counts towards the user's call-to-open rate limit and repeated-call check even when its open then fails.

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
callIdstringyesOpaque id of the call; also the requestId of the LockOpenRequested it caused
targetobjectyesThe chosen lock or Matter device the call was admitted to open ({kind, id})
target.kind"lock" | "matter"yesWhich of the user's lists the id is in: lock (accessible locks) or matter (Matter devices)
target.idstringyesA lock aggregate id or a Matter device id, never a phone number
digitstringnoThe digit the caller pressed in the call's menu to pick the target; absent when the call named none (a choice of one target)
timestampstringyesISO-8601 time of the domain event

UserSubscriptionStatusUpdated

Sourcespk.api
detail-typeUserSubscriptionStatusUpdated
aggregateTypeUserAggregate

An organization's subscription status entry for a user changed (mobile app access); carries only the changed fields (delivered only to the organization whose entry changed).

Payload fields (detail.data):

FieldTypeRequiredDescription
userIdstringyesUser ID
orgIdstringyesThe organization whose entry changed; the delivery's detail.partnerId is the same id
changesobjectyesOnly the entitlements that changed, e.g. mobileAppAccess
changes.mobileAppAccessbooleannoWhether the user may use the mobile app for this organization; an app entitlement, not door access
changedByobjectyesWho made the change: kind organization (that organization's own API key) or super (an administrator acting for it)
changedBy.kind"organization" | "super"yesorganization for that organization's own API key, super for an administrator acting for it
timestampstringyesISO-8601 time of the domain event

Hub events

HubProvisioned

Sourcespk.api
detail-typeHubProvisioned
aggregateTypeHubAggregate

A hub has been provisioned (manufactured / known to the system).

Payload fields (detail.data):

FieldTypeRequiredDescription
hubIdstringyesHub UUID
serialstringyesHardware serial
modelstringyesHardware model
thingNamestringyesAWS IoT thing name
vendorNamestringno
provisionedAtnumberyesUnix epoch ms

HubClaimed

Sourcespk.api
detail-typeHubClaimed
aggregateTypeHubAggregate

A hub has been claimed by an organization and site.

Payload fields (detail.data):

FieldTypeRequiredDescription
hubIdstringyesHub UUID
orgIdstringyesClaiming organization
siteIdstringyesSite the hub is installed at
claimedBystringyesUser ID who claimed it
claimedAtnumberyesUnix epoch ms

HubReClaimed

Sourcespk.api
detail-typeHubReClaimed
aggregateTypeHubAggregate

A hub has been moved from one organization/site to another.

Payload fields (detail.data):

FieldTypeRequiredDescription
hubIdstringyesHub UUID
previousOrgIdstringyes
previousSiteIdstringyes
newOrgIdstringyes
newSiteIdstringyes
reclaimedBystringyes
reasonstringyes
reclaimedAtnumberyes

HubRoleSet

Sourcespk.api
detail-typeHubRoleSet
aggregateTypeHubAggregate

A hub's primary/secondary role has been set.

Payload fields (detail.data):

FieldTypeRequiredDescription
hubIdstringyesHub UUID
isPrimarybooleanyes
setBystringyes
setAtnumberyes

HubSuspended

Sourcespk.api
detail-typeHubSuspended
aggregateTypeHubAggregate

A hub has been suspended.

Payload fields (detail.data):

FieldTypeRequiredDescription
hubIdstringyesHub UUID
reasonstringyes
suspendedBystringyes
suspendedAtnumberyes

HubDecommissioned

Sourcespk.api
detail-typeHubDecommissioned
aggregateTypeHubAggregate

A hub has been decommissioned.

Payload fields (detail.data):

FieldTypeRequiredDescription
hubIdstringyesHub UUID
reasonstringyes
decommissionedBystringyes
decommissionedAtnumberyes

MigrationStarted

Sourcespk.api
detail-typeMigrationStarted
aggregateTypeHubAggregate

A hub-to-hub device migration has started.

Payload fields (detail.data):

FieldTypeRequiredDescription
migrationIdstringyes
sourceHubIdstringyes
targetHubIdstringyes
targetThingNamestringyes
deviceIdsstring[]yes
startedBystringyes
startedAtnumberyes

DeviceMigrationStatusUpdated

Sourcespk.api
detail-typeDeviceMigrationStatusUpdated
aggregateTypeHubAggregate

A device's migration status has changed.

Payload fields (detail.data):

FieldTypeRequiredDescription
migrationIdstringyes
deviceIdstringyesDevice UUID
status"Queued" | "Migrating" | "Migrated" | "Blocked" | "Failed"yes
errorstringno
updatedAtnumberyes

MigrationCompleted

Sourcespk.api
detail-typeMigrationCompleted
aggregateTypeHubAggregate

A hub-to-hub device migration has finished.

Payload fields (detail.data):

FieldTypeRequiredDescription
migrationIdstringyes
status"Completed" | "Completed with errors" | "Failed"yes
completedAtnumberyes

Camera events

CameraRegistered

Sourcespk.api
detail-typeCameraRegistered
aggregateTypeCameraAggregate

A camera has been registered.

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
threeDeyeCameraIdstringyes3dEye-side camera ID
cameraType"generic" | "onvif" | "pnp"yes
namestringyes
orgIdstringyesOrganization ID
ownerIdstringyesOwning user ID
httpUrlstringyes
rtspUrlstringyes
registrationCodestringnoRegistration code used
registeredAtnumberyesUnix epoch ms

CameraUpdated

Sourcespk.api
detail-typeCameraUpdated
aggregateTypeCameraAggregate

A camera's metadata or stream URLs have changed.

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
namestringno
httpUrlstringno
rtspUrlstringno
updatedAtnumberyes

CameraDisabled

Sourcespk.api
detail-typeCameraDisabled
aggregateTypeCameraAggregate

A camera has been disabled.

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
reasonstringyes
disabledBystringyes
disabledAtnumberyes

CameraDeleted

Sourcespk.api
detail-typeCameraDeleted
aggregateTypeCameraAggregate

A camera has been deleted.

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
deletedBystringyes
deletedAtnumberyes

CameraLinkedToLock

Sourcespk.api
detail-typeCameraLinkedToLock
aggregateTypeCameraAggregate

A camera has been associated with a lock.

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
lockIdstringyesNumeric lock ID

CameraUnlinkedFromLock

Sourcespk.api
detail-typeCameraUnlinkedFromLock
aggregateTypeCameraAggregate

A camera has been disassociated from a lock.

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID

CameraRoleCreated

Sourcespk.api
detail-typeCameraRoleCreated
aggregateTypeCameraRoleAggregate

A 3dEye access role has been created.

Payload fields (detail.data):

FieldTypeRequiredDescription
roleIdstringyes
threeDeyeRoleIdstringyes
namestringyes
descriptionstringyes
orgIdstringyesOrganization ID
createdAtnumberyes

CameraRoleDeleted

Sourcespk.api
detail-typeCameraRoleDeleted
aggregateTypeCameraRoleAggregate

A 3dEye access role has been deleted.

Payload fields (detail.data):

FieldTypeRequiredDescription
roleIdstringyes
deletedAtnumberyes

CameraRoleUserAssigned

Sourcespk.api
detail-typeCameraRoleUserAssigned
aggregateTypeCameraRoleAggregate

A user has been added to a camera role.

Payload fields (detail.data):

FieldTypeRequiredDescription
roleIdstringyes
userIdstringyesUser ID
threeDeyeUserIdstringyes
assignedAtnumberyes

CameraRoleUserRemoved

Sourcespk.api
detail-typeCameraRoleUserRemoved
aggregateTypeCameraRoleAggregate

A user has been removed from a camera role.

Payload fields (detail.data):

FieldTypeRequiredDescription
roleIdstringyes
userIdstringyesUser ID
threeDeyeUserIdstringyes
removedAtnumberyesUnix epoch ms

CameraRoleCameraAssigned

Sourcespk.api
detail-typeCameraRoleCameraAssigned
aggregateTypeCameraRoleAggregate

A camera has been added to a role.

Payload fields (detail.data):

FieldTypeRequiredDescription
roleIdstringyes
cameraIdstringyesCamera ID
permissionsstring[]yes
assignedAtnumberyes

CameraRoleCameraRemoved

Sourcespk.api
detail-typeCameraRoleCameraRemoved
aggregateTypeCameraRoleAggregate

A camera has been removed from a role.

Payload fields (detail.data):

FieldTypeRequiredDescription
roleIdstringyes
cameraIdstringyesCamera ID
removedAtnumberyesUnix epoch ms

RTSP camera events

RtspCameraRegistered

Sourcespk.api
detail-typeRtspCameraRegistered
aggregateTypeRtspCameraAggregate

An RTSP camera has been registered; placement on a video worker follows.

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
namestringyes
rtspUrlstringno
rtspHashstringyes
streamIdstringyes
usernamestringno
passwordstringno
httpSnapshotUrlstringno
ownerIdstringno
orgIdstringnoOrganization ID
placementMode"async"no
createdAtstringyes

RtspCameraUpdated

Sourcespk.api
detail-typeRtspCameraUpdated
aggregateTypeRtspCameraAggregate

An RTSP camera's name or source has changed.

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
namestringno
rtspUrlstringno
rtspHashstringno
streamIdstringno
usernamestringno
passwordstringno
httpSnapshotUrlstringno
sourceChangedtrueno
updatedAtstringyes

RtspCameraDeleted

Sourcespk.api
detail-typeRtspCameraDeleted
aggregateTypeRtspCameraAggregate

An RTSP camera has been deleted.

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
deletedAtstringyes
deletedBystringno

RtspCameraAccessGranted

Sourcespk.api
detail-typeRtspCameraAccessGranted
aggregateTypeRtspCameraAggregate

A user has been granted access to an RTSP camera.

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
userIdstringyesUser ID
role"viewer" | "manager"yes
grantedAtstringyes
grantedBystringno

RtspCameraAccessRevoked

Sourcespk.api
detail-typeRtspCameraAccessRevoked
aggregateTypeRtspCameraAggregate

A user's access to an RTSP camera has been revoked.

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
userIdstringyesUser ID
revokedAtstringyes
revokedBystringno

RtspCameraStreamStarted

Sourcespk.api
detail-typeRtspCameraStreamStarted
aggregateTypeRtspCameraAggregate

An RTSP camera's stream has been started.

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
startedAtstringyes
startedBystringno
workerIdstringnoVideo worker ID
placementGenerationnumberno

RtspCameraStreamStopped

Sourcespk.api
detail-typeRtspCameraStreamStopped
aggregateTypeRtspCameraAggregate

An RTSP camera's stream has been stopped.

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
stoppedAtstringyes
stoppedBystringno

RtspCameraPlaced

Sourcespk.api
detail-typeRtspCameraPlaced
aggregateTypeRtspCameraAggregate

An RTSP camera has been placed on a video worker and its stream confirmed.

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
workerIdstringyesVideo worker ID
placementGenerationnumberyes
sourceEventVersionnumberyes
placedAtstringyes

RtspCameraPlacementFailed

Sourcespk.api
detail-typeRtspCameraPlacementFailed
aggregateTypeRtspCameraAggregate

An RTSP camera could not be placed on any video worker.

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
placementGenerationnumberyes
sourceEventVersionnumberyes
errorstringyes
failedAtstringyes

RtspCameraRecordingConfigured

Sourcespk.api
detail-typeRtspCameraRecordingConfigured
aggregateTypeRtspCameraAggregate

An RTSP camera's recording retention was set (0 = recording off).

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
retentionDaysnumberyes
storageProfile"platform"no
changedByobjectyes
changedBy.kind"owner" | "admin" | "manager"yes
changedBy.userIdstringyes
updatedAtstringyes

RtspCameraRecordingsPurgeRequested

Sourcespk.api
detail-typeRtspCameraRecordingsPurgeRequested
aggregateTypeRtspCameraAggregate

A purge of an RTSP camera's older recordings was requested.

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
requestIdstringyes
cutoffstringyes
olderThanDaysnumberyes
requestedByobjectyes
requestedBy.kind"owner" | "admin" | "manager"yes
requestedBy.userIdstringyes
requestedAtstringyes

RtspCameraRecordingsPurged

Sourcespk.api
detail-typeRtspCameraRecordingsPurged
aggregateTypeRtspCameraAggregate

A requested recordings purge has finished.

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
requestIdstringno
cutoffstringyes
olderThanDaysnumberyes
deletednumberyes
completebooleanyes
purgedByobjectyes
purgedBy.kind"owner" | "admin" | "manager"yes
purgedBy.userIdstringyes
purgedAtstringyes

RtspCameraRuntimeStatusChanged

Sourcespk.api
detail-typeRtspCameraRuntimeStatusChanged
aggregateTypeRtspCamera

An RTSP camera's runtime status changed, as reported by its video worker (delivered only for organization-owned cameras).

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
fromstring | nullyesPrevious runtime status
tostringyesNew runtime status
errorstringnoWhy the stream is not running, when known (never contains the RTSP URL)
workerIdstringnoVideo worker ID
changedAtstringyesWhen the change was observed (ISO-8601)
observedAtstringyes

RtspCameraMonitoringConfigured

Sourcespk.api
detail-typeRtspCameraMonitoringConfigured
aggregateTypeRtspCameraAggregate

An RTSP camera's availability monitoring was switched on or off.

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
enabledbooleanyes
changedBystringyes
updatedAtstringyes

RtspCameraUnavailabilityConfirmed

Sourcespk.api
detail-typeRtspCameraUnavailabilityConfirmed
aggregateTypeRtspCamera

A monitored RTSP camera is still unavailable; repeated at most every five minutes while it stays so (delivered only for organization-owned cameras).

Payload fields (detail.data):

FieldTypeRequiredDescription
cameraIdstringyesCamera ID
runtimeStatusstringyesThe runtime status the camera is in (e.g. unreachable, gray, stalled)
reasonstringnoWhy, when known: the probe verdict or the runtime error (never contains the RTSP URL)
workerIdstringnoVideo worker ID
unavailableSincestringyesWhen the camera entered that status (ISO-8601)
checkedAtstringyesWhen the probe or heartbeat that confirmed it ran (ISO-8601)

Video worker events

VideoWorkerStarted

Sourcespk.api
detail-typeVideoWorkerStarted
aggregateTypeVideoWorker

A video worker (VMS box) started up; one event per organization with cameras on it, listing only that organization's cameras.

Payload fields (detail.data):

FieldTypeRequiredDescription
workerIdstringyesVideo worker ID
vmsStartedAtstringyesWhen the VMS process started (ISO-8601)
vmsVersionstringnoVMS build version, when reported
cameraIdsstring[]yesThis organization's cameras assigned to the worker
detectedAtstringyesWhen the control plane saw the first heartbeat after the start (ISO-8601)

Matter device events

MatterDeviceCreated

Sourcespk.api
detail-typeMatterDeviceCreated
aggregateTypeMatterDeviceAggregate

A Matter device has been registered.

Payload fields (detail.data):

FieldTypeRequiredDescription
deviceIdstringyesDevice UUID
thingNamestringyesAWS IoT thing name
hubIdstringyesHub UUID
deviceTypestringyes
createdAtnumberyes

ReportedShadowUpdated

Sourcespk.api
detail-typeReportedShadowUpdated
aggregateTypeMatterDeviceAggregate

A device reported new shadow state.

Not delivered to webhooks. It can be named in a subscription, but it is never published to EventBridge — subscribe to Shadow Update to track device shadow state.

Payload fields (detail.data):

FieldTypeRequiredDescription
deviceIdstringyesDevice UUID
thingNamestringyesAWS IoT thing name
reportedobjectyes
updatedAtnumberyes

DesiredShadowUpdated

Sourcespk.api
detail-typeDesiredShadowUpdated
aggregateTypeMatterDeviceAggregate

A new desired shadow state was pushed.

Not delivered to webhooks. It can be named in a subscription, but it is never published to EventBridge — subscribe to Shadow Update to track device shadow state.

Payload fields (detail.data):

FieldTypeRequiredDescription
deviceIdstringyesDevice UUID
thingNamestringyesAWS IoT thing name
desiredobjectyes
updatedAtnumberyes
requestedByUserIdstringno

MatterPinSet

Sourcespk.api
detail-typeMatterPinSet
aggregateTypeMatterDeviceAggregate

A PIN credential slot was provisioned on a Matter door lock (the PIN itself is never carried).

Payload fields (detail.data):

FieldTypeRequiredDescription
deviceIdstringyesDevice UUID
thingNamestringyesAWS IoT thing name
userIndexnumberyes
credentialIndexnumberyes
timestampnumberyesISO-8601 time of the domain event

MatterPinCleared

Sourcespk.api
detail-typeMatterPinCleared
aggregateTypeMatterDeviceAggregate

A PIN credential slot was cleared on a Matter door lock.

Payload fields (detail.data):

FieldTypeRequiredDescription
deviceIdstringyesDevice UUID
thingNamestringyesAWS IoT thing name
userIndexnumberno
credentialIndexnumberyes
timestampnumberyesISO-8601 time of the domain event

AppPinSendRequested

Sourcespk.api
detail-typeAppPinSendRequested
aggregateTypeMatterDeviceAggregate

An app-PIN delivery attempt was sent to the lock.

Payload fields (detail.data):

FieldTypeRequiredDescription
deviceIdstringyesDevice UUID
thingNamestringyesAWS IoT thing name
timestampnumberyesISO-8601 time of the domain event
messageIdstringyes
attemptnumberyes
userIndexnumberyes
credentialIndexnumberyes
pinMinLengthnumber | nullyes
pinMaxLengthnumber | nullyes

AppPinShadowWriteFailed

Sourcespk.api
detail-typeAppPinShadowWriteFailed
aggregateTypeMatterDeviceAggregate

An app-PIN write could not be made to the device shadow; the attempt will be retried.

Payload fields (detail.data):

FieldTypeRequiredDescription
deviceIdstringyesDevice UUID
thingNamestringyesAWS IoT thing name
timestampnumberyesISO-8601 time of the domain event
command"SetCredential" | "ClearCredential"yes
messageIdstring | nullyes
errorstringyes

AppPinAcked

Sourcespk.api
detail-typeAppPinAcked
aggregateTypeMatterDeviceAggregate

The lock acknowledged an app-PIN write.

Payload fields (detail.data):

FieldTypeRequiredDescription
deviceIdstringyesDevice UUID
thingNamestringyesAWS IoT thing name
timestampnumberyesISO-8601 time of the domain event
outcome"success" | "failure" | "duplicate" | "occupied" | "invalid-field" | "not-found"yes
matchedMessageIdstringyes
errorCodenumber | stringno
userIndexnumberno
provisionState"pending" | "sent" | "verified" | "unverified" | "failed"yes

AppPinClearRequested

Sourcespk.api
detail-typeAppPinClearRequested
aggregateTypeMatterDeviceAggregate

An app-PIN slot clear was sent to the lock.

Payload fields (detail.data):

FieldTypeRequiredDescription
deviceIdstringyesDevice UUID
thingNamestringyesAWS IoT thing name
timestampnumberyesISO-8601 time of the domain event
credentialIndexnumberyes
messageIdstring | nullno

AppPinGaveUp

Sourcespk.api
detail-typeAppPinGaveUp
aggregateTypeMatterDeviceAggregate

The lock refused every app-PIN attempt; delivery stopped.

Payload fields (detail.data):

FieldTypeRequiredDescription
deviceIdstringyesDevice UUID
thingNamestringyesAWS IoT thing name
timestampnumberyesISO-8601 time of the domain event
reasonstringyes
attemptCountnumberyes
lastOutcomestring | nullyes

AppPinRedriven

Sourcespk.api
detail-typeAppPinRedriven
aggregateTypeMatterDeviceAggregate

App-PIN delivery was restarted from the beginning.

Payload fields (detail.data):

FieldTypeRequiredDescription
deviceIdstringyesDevice UUID
thingNamestringyesAWS IoT thing name
timestampnumberyesISO-8601 time of the domain event
reasonstringyes
priorState"pending" | "sent" | "verified" | "unverified" | "failed" | nullyes
priorAttemptsnumberyes
priorInfraFailuresnumberyes
evidenceMessageIdstringno

AppPinRetired

Sourcespk.api
detail-typeAppPinRetired
aggregateTypeMatterDeviceAggregate

App-PIN delivery was dropped because the lock does not require a remote PIN.

Payload fields (detail.data):

FieldTypeRequiredDescription
deviceIdstringyesDevice UUID
thingNamestringyesAWS IoT thing name
timestampnumberyesISO-8601 time of the domain event
reasonstringyes
credentialIndexnumberyes

AppPinDeliveryFailed

Sourcespk.api
detail-typeAppPinDeliveryFailed
aggregateTypeMatterDeviceAggregate

The bridge answered an app-PIN write without the lock carrying it out; the attempt will be retried.

Payload fields (detail.data):

FieldTypeRequiredDescription
deviceIdstringyesDevice UUID
thingNamestringyesAWS IoT thing name
timestampnumberyesISO-8601 time of the domain event
command"SetCredential" | "ClearCredential"yes
messageIdstring | nullyes
reason"unreachable" | "no-ack" | "refused"yes
errorstringyes

MatterDeviceNameSet

Sourcespk.api
detail-typeMatterDeviceNameSet
aggregateTypeMatterDeviceAggregate

The display name of a Matter device has been set.

Payload fields (detail.data):

FieldTypeRequiredDescription
deviceIdstringyesDevice UUID
thingNamestringyesAWS IoT thing name
namestringyes
timestampnumberyesISO-8601 time of the domain event

Alarm events

AlarmTriggered

Sourcespk.api
detail-typeAlarmTriggered
aggregateTypeMatterDeviceAggregate

A Matter sensor (smoke, CO, occupancy, …) reported an alarm condition.

Payload fields (detail.data):

FieldTypeRequiredDescription
deviceIdstringyesDevice UUID
channel"boolean_state" | "smoke" | "smoke_interconnect" | "co" | "occupancy" | "device_fault"yes
alarmType"contact" | "water_leak" | "smoke" | "co" | "motion" | "water_freeze" | "rain" | "device_fault"yes
severity"warning" | "critical"yes
matterPathstringyesMatter endpoint/cluster/attribute path that tripped (e.g. 1/69/0)
deviceTypeIdnumberno
endpointnumberno
deviceTypeSource"shadow" | "sticky" | "command" | "shadow_borrowed" | "shadow_disputed"no
rawValuenumbernoRaw reported value that produced the alarm
alarmsEnabledbooleannoDevice alarm mode at the moment of this transition; false = no push was due. Absent on events recorded before AA-311, which means on.
timestampstringyesISO-8601 time of the domain event

AlarmCleared

Sourcespk.api
detail-typeAlarmCleared
aggregateTypeMatterDeviceAggregate

A previously triggered alarm condition has cleared.

Payload fields (detail.data):

FieldTypeRequiredDescription
deviceIdstringyesDevice UUID
channel"boolean_state" | "smoke" | "smoke_interconnect" | "co" | "occupancy" | "device_fault"yes
alarmType"contact" | "water_leak" | "smoke" | "co" | "motion" | "water_freeze" | "rain" | "device_fault"yes
matterPathstringyes
deviceTypeIdnumberno
endpointnumberno
deviceTypeSource"shadow" | "sticky" | "command" | "shadow_borrowed" | "shadow_disputed"no
rawValuenumberno
alarmsEnabledbooleannoDevice alarm mode at the moment of this transition; false = no push was due. Absent on events recorded before AA-311, which means on.
timestampstringyesISO-8601 time of the domain event

AlarmModeSet

Sourcespk.api
detail-typeAlarmModeSet
aggregateTypeMatterDeviceAggregate

Alarm pushes of a Matter device were switched on or off.

Payload fields (detail.data):

FieldTypeRequiredDescription
deviceIdstringyesDevice UUID — same value as the MatterDevice thingName / aggregate id
enabledbooleanyesThe new alarm mode; false = the device sends no alarm push
changedByUserIdstringnoThe user (token caller) who changed the mode; absent when an organization API key changed it
changedByOrgIdstringnoThe API key's organization that changed the mode; absent when a user's token changed it

IoT events

Shadow Update

Sourcespk.iot.shadow
detail-typeShadow Update

An IoT hub device updated its AWS IoT Device Shadow.

This event has a different envelope from spk.api events — there is no detail.data wrapper. The shadow fields live directly on detail.

Payload fields (top-level detail):

FieldTypeRequiredDescription
partnerIdstring | nullyesPartner associated with this device
thingNamestringyesAWS IoT thing name
reportedStatestring | nullyesState the device reported back (JSON string)
desiredStatestring | nullyesTarget state set by the application (JSON string)
deltaStatestringyesDifference between desired and reported state (JSON string)
metadatastring | nullyesAWS IoT shadow metadata with timestamps per field (JSON string)
versionstring | number | nullyesShadow document version
shadowNamestring | nullnoNamed shadow the update came from (e.g. state, device_info)
bridgeUuidstring | nullno
deviceTypestring | nullno
nodeIdstring | nullno
thingTypeNamestring | nullno

reportedState, desiredState, deltaState and metadata are stringified JSON embedded inside the outer JSON object. Call JSON.parse() on each before reading its contents.