Errors & rate limits
Every error response, regardless of status code, uses the same envelope:
{
"error": {
"type": "UnauthorizedException",
"message": "Invalid or revoked API key",
"details": { }
}
}details is only present for validation errors (e.g. a malformed request body) and mirrors the underlying field-level errors.
Common status codes
400— malformed request, or the target device doesn't support the requesteddeliveryMethod(see Devices & capabilities).401— missing, malformed, unknown, or revoked API key; onunlock_attempts, also an incorrect code (counts against that code's attempt lockout — see Remote unlock).403— onunlock_attempts, the code'svalidFromis in the future.404— the resource doesn't exist, or exists in the other mode (test vs. live) than your key.409— anIdempotency-Keywas reused with a different request body; onunlock_attempts, also a code that's already been used or revoked.410— onunlock_attempts, the code'svalidUntilhas passed.429— rate limit exceeded (see below).503— onunlock_attempts, the device wasn't reachable (e.g. bridge/gateway offline). Not the guest's fault — retry, the code stays valid.
Rate limits
Requests are limited to 10 requests/second (burst) and 200 requests/minute, tracked per client IP address (not yet per API key/tenant — if you call the API from a shared egress IP, factor that in).