HTTP, authentication, and limits
Use HTTPS; a plain-HTTP request returns 426 HTTPS_REQUIRED with an Upgrade: TLS/1.2 header, and a key sent that way should be treated as exposed. Send Authorization: Bearer YOUR_API_KEY and Content-Type: application/json for bodies. Never send a key as a query parameter. Use a server-side client; the backend is not configured for arbitrary browser origins. The website uses its own server-side session bridge. JSON bodies are limited to 100 KB; a larger body returns 413 PAYLOAD_TOO_LARGE, which is not retryable. Do not send files or card details.
Responses use X-Request-ID and normally Cache-Control: no-store; public plans explicitly allow caching. Selected-building endpoints return X-Buzzer-Building-Id. Treat identifiers as opaque, timestamps as ISO 8601 unless explicitly Unix seconds, and money as minor currency units.
| Account's plan | Authenticated API requests per 15-minute window, per API key |
| BuzzerAPI | 2,000 |
| No active subscription | 100 |
Public, sign-in, and verification endpoints have their own limits. Sign-in and verification codes are single-use, expire, and are rate- and attempt-limited. On 429, wait the Retry-After seconds.
Every rate-limited response, successful or not, carries RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset (seconds until the window resets). A 429 sends Retry-After: the number of seconds to wait. PHONE_CODE_ATTEMPTS has no Retry-After: request a new code instead. /v1/health and /v1/openapi.json are not rate limited. Back off with jitter after a 429, and inspect mutation state before repeating anything with side effects.
Access rules can be created, edited, activated, deactivated, and revoked before subscribing or connecting a building; no subscription or virtual number is needed. They start opening the door once a virtual number is connected, because nothing can open a door until that number receives a call. Account, setup, access, and log reads and access revocation stay available after subscription expiry. If the account's current plan doesn't include a rule type, that type returns PLAN_UPGRADE_REQUIRED, except for the exact body {"enabled":false}. Release-tone changes on the primary building need only an owned number. Linked-building writes, including access PATCH, require an active BuzzerAPI subscription, so use DELETE for downgrade cleanup.
REST examples
These examples use https://api.buzzerapi.com and assume authentication and physical building setup are complete. Read onboarding for email authentication and hosted payment.
# Create a one-use, four-digit visitor code. Save the returned grant ID.
curl -sS "https://api.buzzerapi.com/v1/unlock" \
-H "Authorization: Bearer $BUZZER_API_KEY" \
-H "X-Buzzer-Building-Id: $BUILDING_ID" \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: delivery-example-001' \
--data '{"type":"passcode","label":"Delivery","enabled":true,"remaining_uses":1,"expires_in_minutes":60}'
# Read the current grant and ETag before an update.
curl -i "https://api.buzzerapi.com/v1/unlock/$UNLOCK_ID" \
-H "Authorization: Bearer $BUZZER_API_KEY" \
-H "X-Buzzer-Building-Id: $BUILDING_ID"
# Replace "3" with the exact quoted ETag from that GET.
curl -sS -X PATCH "https://api.buzzerapi.com/v1/unlock/$UNLOCK_ID" \
-H "Authorization: Bearer $BUZZER_API_KEY" \
-H "X-Buzzer-Building-Id: $BUILDING_ID" \
-H 'Content-Type: application/json' -H 'If-Match: "3"' \
--data '{"enabled":false}'
# Fetch an activity page; repeat with the returned pagination.cursor.
# Optional filters: type=unlock|call, unlock_id=ID, succeeded=true|false, q=TEXT (searches entry names).
curl -sS -G "https://api.buzzerapi.com/v1/logs" \
-H "Authorization: Bearer $BUZZER_API_KEY" \
-H "X-Buzzer-Building-Id: $BUILDING_ID" \
--data-urlencode 'since=2026-09-19T00:00:00Z' --data-urlencode 'limit=100'
# Add --data-urlencode "cursor=$CURSOR" for subsequent pages.
Creation returns a grant like this (illustrative values, optional fields omitted):
{
"building_id": "507f1f77bcf86cd799439011",
"id": "507f1f77bcf86cd799439012",
"type": "passcode", "label": "Delivery", "enabled": true,
"version": 0, "status": "active", "request_id": "delivery-example-001",
"created_at": "2026-09-19T12:00:00Z", "ends_at": "2026-09-19T13:00:00Z",
"access_code": "0427", "remaining_uses": 1, "enter_code_with_voice": false
}
To page safely, retain the same building and filters while pagination.has_more is true. Unlock lists use an ID cursor; logs use an opaque encoded cursor. For ongoing activity recovery, persist a timestamp checkpoint, overlap the next polling window, and deduplicate by log ID. There is no streaming endpoint; poll GET /v1/logs, or register a webhook to be told when access is used.
Webhooks
Register an HTTPS endpoint to be told when access is used instead of polling logs. Endpoints belong to the account, not a building (do not send X-Buzzer-Building-Id); every event carries building_id and building_label (the same id and label as GET /v1/buildings). An account can have at most 5 endpoints. Endpoints can also be added, tested, and deleted on the account page, which shows the secret once. See the webhooks guide for signature verification in Node and Python.
| Request | Scope | Result |
POST /v1/webhooks {"url","events"} | access:write | 201 endpoint with secret. A replay with the same Idempotency-Key and body returns 200 with the same endpoint and secret plus Idempotency-Replayed: true; a different body returns 409 IDEMPOTENCY_CONFLICT. The secret is never listed. |
GET /v1/webhooks | access:read | 200 {data:[endpoint]} without secrets |
DELETE /v1/webhooks/{id} | access:write | 200 {id, deleted: true}; cancels pending deliveries; safe to repeat |
POST /v1/webhooks/{id}/test | access:write | 202 {delivery_id}; sends a webhook.test event |
The URL must be a publicly reachable https:// URL (max 2048 characters); otherwise 400 INVALID_WEBHOOK_URL. events is optional and defaults to every event type; an unknown type returns 400 INVALID_WEBHOOK_EVENTS. A sixth endpoint returns 409 WEBHOOK_LIMIT.
| Event type | When it fires | data fields |
access.granted | A rule granted access | building_id, building_label, unlock_id, unlock_type, label, remaining_uses (number or null), occurred_at |
access.call_forwarded | A buzz matched no rule and was forwarded to the resident's phone | building_id, building_label, occurred_at |
access.denied | A wrong passcode was entered | building_id, building_label, occurred_at |
unlock.no_uses_remaining | A passcode or timer used its last use | building_id, building_label, unlock_id, unlock_type, label, occurred_at |
webhook.test | Sent by POST /v1/webhooks/{id}/test | empty object |
POST /your/webhook HTTP/1.1
Content-Type: application/json
User-Agent: BuzzerAPI-Webhooks/1
BuzzerAPI-Signature: t=1790000000,v1=5f2b...e9
{"id":"evt_8Jk2...","type":"access.granted","created_at":"2026-09-28T17:04:05.000Z","api_version":"v1",
"data":{"building_id":"507f1f77bcf86cd799439011","building_label":"Mission St","unlock_id":"507f1f77bcf86cd799439012","unlock_type":"timer",
"label":"Package delivery","remaining_uses":0,"occurred_at":"2026-09-28T17:04:05.000Z"}}
v1 is the hex HMAC-SHA256 of t, a period, and the raw request body, keyed with the whole endpoint secret, including the whsec_ prefix. Verify it with a constant-time compare and reject timestamps older than 5 minutes. Respond with any 2xx within 5 seconds; redirects are not followed. Anything else is retried at +1 minute, +5 minutes, +30 minutes, and +2 hours (5 attempts in total), then marked failed. A retry repeats the same event id, so deduplicate on it. Delivery order is not guaranteed; order events by data.occurred_at. Delivery never delays the call at the door.
Every REST operation
GET /v1/health
Check service health
Health is public and not rate limited; success does not establish account readiness. openapi_url and docs_url point at this contract and the AI agent guide.
Authorization: Public; no key required.
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. Health |
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
GET /v1/openapi.json
Fetch the OpenAPI contract
Public, not rate limited, and sent with Access-Control-Allow-Origin: *. Redirects to the website copy of this contract (https://www.buzzerapi.com/openapi.json in production). Follow the redirect.
Authorization: Public; no key required.
No request body.
Responses
| HTTP status | Contract |
|---|
| 302 | Found. Follow Location to the OpenAPI 3.1 JSON document. Location: Absolute URL of openapi.json on the website. string
format: uri |
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
GET /v1/plans
Read live public prices
Only BuzzerAPI weekly and yearly are listed. Each building uses one subscription unit at the selected price. Public cache max-age=60, shared cache max-age=300.
Authorization: Public; no key required.
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. Plans |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
POST /v1/auth/otp
Request email sign-in code
Sign-in codes are single-use, expire, and are rate- and attempt-limited. On 429, wait the Retry-After seconds. Delivery is not proof that the account already exists.
Authorization: Public; no key required.
JSON request body
Responses
| HTTP status | Contract |
|---|
| 200 | Success. OtpChallenge |
| 400 | Invalid request; correct the input. Codes: INVALID_JSON, INVALID_EMAIL, LINKED_ACCOUNT. Error |
| 429 | Rate limited; wait for Retry-After. Codes: OTP_RATE_LIMIT, AUTH_RATE_LIMIT. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
POST /v1/auth/verify
Verify email and start a website session
Website sign-in only: purpose must be web, otherwise 400 WEBSITE_SIGN_IN_REQUIRED is returned before the code is consumed. Creates the account if needed. Returns a 12-hour website session key that the website keeps server-side; it is not a browser-storage recommendation. AI agents use keys created on the account page instead. Never disclose apiKey.
Authorization: Public; no key required.
JSON request body
Responses
| HTTP status | Contract |
|---|
| 200 | Success. WebSessionCredential |
| 400 | Invalid request; correct the input. Codes: INVALID_JSON, INVALID_EMAIL, LINKED_ACCOUNT, WEBSITE_SIGN_IN_REQUIRED. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: INVALID_OTP. Error |
| 429 | Rate limited; wait for Retry-After. Codes: AUTH_RATE_LIMIT. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
DELETE /v1/auth/key
Revoke the current credential
No extra scope required. Any key can revoke itself; subsequent use fails authentication. AI agent keys survive website sign-out.
Authorization: Bearer key; no additional scope.
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. Revoked |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 429 | Rate limited; wait for Retry-After. Codes: AUTH_RATE_LIMIT. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
POST /v1/auth/keys
Create an AI agent key
Website session only; AI agent keys get 403 WEB_SESSION_REQUIRED. Keys can be issued before payment with access, setup, billing, and optional building scopes. keys:write or any other unlisted scope returns 400 INVALID_KEY_OPTIONS. At most 20 active AI agent keys (409 KEY_LIMIT). Live access and building mutations still require the corresponding subscription. AI agent keys are independent of website session expiry.
Authorization: Bearer key; keys:write.
JSON request body
Responses
| HTTP status | Contract |
|---|
| 201 | Created. AgentCredential |
| 400 | Invalid request; correct the input. Codes: INVALID_JSON, INVALID_KEY_OPTIONS. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE, WEB_SESSION_REQUIRED. Error |
| 409 | Conflicts with current state; inspect it before retrying. Codes: KEY_LIMIT. Error |
| 429 | Rate limited; wait for Retry-After. Codes: AUTH_RATE_LIMIT. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
GET /v1/auth/keys
List every key on the account
Website session only; AI agent keys get 403 WEB_SESSION_REQUIRED. Returns every active key: website sign-ins (type web_session, current true for the calling session) and AI agent keys (type agent). Newest first. Excludes revoked keys, but can include expired ones. No secrets or pagination.
Authorization: Bearer key; keys:write.
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. KeyList |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE, WEB_SESSION_REQUIRED. Error |
| 429 | Rate limited; wait for Retry-After. Codes: AUTH_RATE_LIMIT. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
DELETE /v1/auth/keys/{id}
Revoke any key on the account
Website session only; AI agent keys get 403 WEB_SESSION_REQUIRED. Revokes any active key on the account, including other website sign-ins and the calling session itself, which is then signed out. A malformed ID returns 400 INVALID_ID; an unknown ID or another account's key returns 404 NOT_FOUND.
Authorization: Bearer key; keys:write.
Parameters
| Parameter | Contract |
|---|
id path · required | stringOpaque resource ID, normally 24 hexadecimal characters. pattern: ^[a-fA-F0-9]{24}$ |
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. KeyRevoked |
| 400 | Invalid request; correct the input. Codes: INVALID_ID. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE, WEB_SESSION_REQUIRED. Error |
| 404 | Not found for this key or building. Codes: NOT_FOUND. Error |
| 429 | Rate limited; wait for Retry-After. Codes: AUTH_RATE_LIMIT. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
POST /v1/auth/keys/revoke-others
Revoke every other key
Website session only; AI agent keys get 403 WEB_SESSION_REQUIRED. Revokes every active key on the account except the calling website session, including AI agent keys and other website sign-ins. No request body. Returns the number of keys revoked.
Authorization: Bearer key; keys:write.
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. KeysRevoked |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE, WEB_SESSION_REQUIRED. Error |
| 429 | Rate limited; wait for Retry-After. Codes: AUTH_RATE_LIMIT. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
GET /v1/account
Inspect account readiness
Account-level response; building header does not select another account. Subscription active and a recorded buzz do not prove physical entry.
Authorization: Bearer key; account:read.
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. Account |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE. Error |
| 404 | Not found for this key or building. Codes: ACCOUNT_NOT_FOUND. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: FETCH_FAILED, INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
GET /v1/account/phone
Read forwarding phone status
Website session only; AI agent keys and linked-building keys get 403 WEB_SESSION_REQUIRED. A phone verified earlier appears here without another SMS.
Authorization: Bearer key; account:read + keys:write.
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. PhoneStatus |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE, WEB_SESSION_REQUIRED. Error |
| 404 | Not found for this key or building. Codes: ACCOUNT_NOT_FOUND. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
POST /v1/account/phone/verification
Send forwarding phone code
Website session only (403 WEB_SESSION_REQUIRED otherwise). Requires an active subscription and an owned provisioned virtual number. Explicit request only. Verification codes are single-use, expire, and are rate- and attempt-limited, and changing an existing phone is also limited. On 429, wait the Retry-After seconds.
Authorization: Bearer key; account:read + keys:write.
JSON request body
Responses
| HTTP status | Contract |
|---|
| 200 | Success. PhoneCodeSent |
| 400 | Invalid request; correct the input. Codes: INVALID_JSON, INVALID_PHONE_NUMBER. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE, WEB_SESSION_REQUIRED, SUBSCRIPTION_REQUIRED, NUMBER_NOT_PROVISIONED. Error |
| 404 | Not found for this key or building. Codes: ACCOUNT_NOT_FOUND. Error |
| 409 | Conflicts with current state; inspect it before retrying. Codes: ALREADY_VERIFIED, PHONE_IN_USE. Error |
| 429 | Rate limited; wait for Retry-After. Codes: PHONE_CODE_RATE_LIMIT, PHONE_CHANGE_LIMIT, RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: PHONE_CODE_SEND_FAILED, INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
POST /v1/account/phone/confirmation
Confirm forwarding phone code
Website session only (403 WEB_SESSION_REQUIRED otherwise). Requires an active subscription and owned provisioned virtual number. Codes expire and are attempt-limited; after PHONE_CODE_EXPIRED or PHONE_CODE_ATTEMPTS, request a new code.
Authorization: Bearer key; account:read + keys:write.
JSON request body
Responses
| HTTP status | Contract |
|---|
| 200 | Success. PhoneStatus |
| 400 | Invalid request; correct the input. Codes: INVALID_JSON, INVALID_PHONE_CODE, PHONE_CODE_EXPIRED. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE, WEB_SESSION_REQUIRED, SUBSCRIPTION_REQUIRED, NUMBER_NOT_PROVISIONED. Error |
| 404 | Not found for this key or building. Codes: ACCOUNT_NOT_FOUND. Error |
| 409 | Conflicts with current state; inspect it before retrying. Codes: PHONE_IN_USE. Error |
| 429 | Rate limited; wait for Retry-After. Codes: PHONE_CODE_ATTEMPTS, PHONE_CHANGE_LIMIT, RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
GET /v1/billing/plans
Read authenticated price catalog
Same catalog as public plans; no active subscription required.
Authorization: Bearer key; billing:write.
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. Plans |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
GET /v1/billing/checkout
Recover latest checkout
Read after a timeout. complete means hosted checkout completed; recheck account.subscription.status and setup. preparing means retry original plan and request ID. Once the subscription a completed checkout created is canceled, this reports none and a new checkout can start.
Authorization: Bearer key; billing:write.
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. Checkout |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: CHECKOUT_UNAVAILABLE, INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
POST /v1/billing/checkout
Start or recover hosted checkout
Parent account only. Any existing subscription on the account, including a past_due one, returns SUBSCRIPTION_EXISTS; manage it in the portal. A request ID whose checkout ended failed replays that result; use a new Idempotency-Key to try again. A new request ID for the same plan returns the existing open checkout with its original request_id. One pending checkout: same plan reuses it. Requesting another plan while the existing session is still open (unpaid) expires that session and starts the new plan; a checkout that is being prepared or was already paid returns CHECKOUT_EXISTS. A completed checkout keeps blocking new ones until its subscription is canceled; then start again with a new Idempotency-Key. Same request ID with another plan conflicts. Hosted checkout returns to the account page with checkout=success after payment or checkout=cancel when the customer backs out. CHECKOUT_RECONCILIATION_REQUIRED means an earlier checkout needs support to resolve; contact support instead of purchasing again. No card details accepted by this API.
Authorization: Bearer key; billing:write.
Parameters
| Parameter | Contract |
|---|
Idempotency-Key header · required | Stable identifier for this action: 16 to 100 letters, digits, hyphens, or underscores. Reuse the identical body and key after a timeout. Keys never expire.stringpattern: ^[a-zA-Z0-9_-]{16,100}$ |
JSON request body
Responses
| HTTP status | Contract |
|---|
| 200 | Success. Checkout |
| 201 | Created. Checkout |
| 400 | Invalid request; correct the input. Codes: INVALID_JSON, IDEMPOTENCY_KEY_REQUIRED, INVALID_PLAN. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE, PARENT_BILLING_REQUIRED. Error |
| 404 | Not found for this key or building. Codes: ACCOUNT_NOT_FOUND. Error |
| 409 | Conflicts with current state; inspect it before retrying. Codes: IDEMPOTENCY_CONFLICT, SUBSCRIPTION_EXISTS, CHECKOUT_EXISTS, CHECKOUT_PENDING, CHECKOUT_RECONCILIATION_REQUIRED, PLAN_UNAVAILABLE. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: CHECKOUT_UNAVAILABLE, INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
POST /v1/billing/checkout/{id}/expire
Expire unpaid checkout
Open sessions can be expired; already-expired sessions succeed. Completed checkout returns 409 SUBSCRIPTION_EXISTS. This does not cancel a subscription.
Authorization: Bearer key; billing:write.
Parameters
| Parameter | Contract |
|---|
id path · required | stringStripe checkout session ID. |
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. CheckoutExpired |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE. Error |
| 404 | Not found for this key or building. Codes: NOT_FOUND. Error |
| 409 | Conflicts with current state; inspect it before retrying. Codes: SUBSCRIPTION_EXISTS. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: CHECKOUT_UNAVAILABLE, INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
POST /v1/billing/portal
Open hosted billing management
Parent account with an existing billing customer. No request body.
Authorization: Bearer key; billing:write.
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. Portal |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE, PARENT_BILLING_REQUIRED. Error |
| 404 | Not found for this key or building. Codes: CUSTOMER_NOT_FOUND. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
GET /v1/buildings/{buildingId}/settings
Read one building’s tone and greeting
Read without an active subscription. Invited members can inspect their number but cannot change its settings; editable is false for them. Unprovisioned buildings return virtual_number/unlock_tone/version null and default greeting values. The path explicitly selects the building; no header is needed.
Authorization: Bearer key; account:read.
Parameters
| Parameter | Contract |
|---|
buildingId path · required | Explicit building ID from GET /v1/buildings. Child keys can only use their own building. An optional X-Buzzer-Building-Id header must agree with the path.stringOpaque resource ID, normally 24 hexadecimal characters. pattern: ^[a-fA-F0-9]{24}$ |
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. BuildingSettings ETag: Present for provisioned numbers. Supply as If-Match on PATCH. Also exposed without quotes in response.version. string
Quoted opaque 64-hex snapshot token. |
| 400 | Invalid request; correct the input. Codes: INVALID_BUILDING, INVALID_BUILDING_CONTEXT. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE. Error |
| 404 | Not found for this key or building. Codes: BUILDING_NOT_FOUND. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
PATCH /v1/buildings/{buildingId}/settings
Update one building’s tone and greeting
Requires ownership and a provisioned number. Invited members get 403 NUMBER_OWNER_REQUIRED; check editable from GET first. Primary-building writes need no active subscription; linked-building writes require an active BuzzerAPI subscription. Supply the ETag from GET in If-Match. Strong and weak quoted tokens are accepted. Tone and greeting are saved together in one transaction. Omitted fields stay unchanged; unknown fields, nulls and empty patch objects are rejected. Greeting strings preserve whitespace and must be shorter than 120 JavaScript UTF-16 code units (astral characters count twice). A shared legacy greeting is copied so siblings remain unchanged. One competing save wins; others return 409 SETTINGS_VERSION_CONFLICT. After a timeout or conflict, read back and review before deciding to retry; no automatic mutation retry.
Authorization: Bearer key; setup:write.
Parameters
| Parameter | Contract |
|---|
buildingId path · required | Explicit building ID from GET /v1/buildings. Child keys can only use their own building. An optional X-Buzzer-Building-Id header must agree with the path.stringOpaque resource ID, normally 24 hexadecimal characters. pattern: ^[a-fA-F0-9]{24}$ |
If-Match header · required | stringQuoted ETag from this building’s GET. pattern: ^(?:W/)?"[a-f0-9]{64}"$ |
JSON request body
Responses
| HTTP status | Contract |
|---|
| 200 | Success. BuildingSettingsUpdated ETag: Present for provisioned numbers. Supply as If-Match on PATCH. Also exposed without quotes in response.version. string
Quoted opaque 64-hex snapshot token. |
| 400 | Invalid request; correct the input. Codes: INVALID_JSON, INVALID_BUILDING, INVALID_BUILDING_CONTEXT, INVALID_TONE, INVALID_SETTINGS, INVALID_GREETING. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE, MULTI_BUILDING_REQUIRED, NUMBER_OWNER_REQUIRED. Error |
| 404 | Not found for this key or building. Codes: BUILDING_NOT_FOUND, NUMBER_NOT_FOUND. Error |
| 409 | Conflicts with current state; inspect it before retrying. Codes: SETTINGS_VERSION_CONFLICT. Error |
| 428 | Precondition required. Codes: SETTINGS_VERSION_REQUIRED. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
GET /v1/buildings/{buildingId}/setup
Inspect one building’s setup
No subscription required for inspection. previous_buzz_recorded requires a successful access-rule unlock; forwarded calls and owner self-calls do not count. It is not proof of physical door release. The path explicitly selects the building; no header is needed.
Authorization: Bearer key; account:read.
Parameters
| Parameter | Contract |
|---|
buildingId path · required | Explicit building ID from GET /v1/buildings. Child keys can only use their own building. An optional X-Buzzer-Building-Id header must agree with the path.stringOpaque resource ID, normally 24 hexadecimal characters. pattern: ^[a-fA-F0-9]{24}$ |
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. BuildingSetup |
| 400 | Invalid request; correct the input. Codes: INVALID_BUILDING, INVALID_BUILDING_CONTEXT. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE. Error |
| 404 | Not found for this key or building. Codes: BUILDING_NOT_FOUND. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
GET /v1/buildings
List accessible buildings
No pagination. Ordered by creation time then ID. Parent sees primary and children; child sees only itself.
Authorization: Bearer key; account:read.
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. Buildings |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY, AUTHENTICATION_REQUIRED. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
POST /v1/buildings
Execute quoted building addition
Parent account only; do not send building header. Supply the matching unexpired quote and stable request ID. Stale inventory/billing requires a fresh preview before execution. Replay returns stored operation. HTTP 202 is not completion. running: poll the operation; reconciliation_required: contact support with its ID and do not create another request. Only one building change runs at a time per account (409 BUILDING_BUSY). An addition that fully rolled back (no number purchased, building removed, billing restored) returns 409 BUILDING_ADD_FAILED, is recorded as failed, and lets another building change start; replaying it returns the same error.
Authorization: Bearer key; account:read + buildings:write.
Parameters
| Parameter | Contract |
|---|
Idempotency-Key header · required | Stable identifier for this action: 16 to 100 letters, digits, hyphens, or underscores. Reuse the identical body and key after a timeout. Keys never expire.stringpattern: ^[a-zA-Z0-9_-]{16,100}$ |
JSON request body
Responses
| HTTP status | Contract |
|---|
| 200 | Success. BuildingOperation |
| 201 | Created. BuildingOperation |
| 202 | Pending or uncertain: inspect status and next_action. BuildingOperation |
| 400 | Invalid request; correct the input. Codes: INVALID_JSON, IDEMPOTENCY_KEY_REQUIRED, INVALID_QUOTE, INVALID_BUILDING_CONTEXT. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 402 | Payment failed. Codes: PAYMENT_FAILED. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE, PARENT_BUILDING_KEY_REQUIRED, MULTI_BUILDING_REQUIRED. Error |
| 404 | Not found for this key or building. Codes: NOT_FOUND. Error |
| 409 | Conflicts with current state; inspect it before retrying. Codes: INVALID_QUOTE, IDEMPOTENCY_CONFLICT, QUOTE_EXPIRED, QUOTE_STALE, BUILDING_BUSY, BUILDING_BILLING_MISMATCH, BUILDING_ADD_FAILED. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
POST /v1/buildings/preview
Preview addition or removal
Parent account only; do not send building header. Requires an active BuzzerAPI subscription with a matching billed quantity, maximum 20 buildings including primary. Each additional building adds one unit at the same subscription price. Preview purchases nothing, creates a 15-minute quote and invoice snapshot. US and Canadian addresses are supported; a Canadian building receives a Canadian number. Previews are still issued while another operation awaits reconciliation, but cannot be executed until it is resolved. Removal cannot target primary; review release/deletion effects.
Authorization: Bearer key; account:read + buildings:write.
JSON request body
Responses
| HTTP status | Contract |
|---|
| 201 | Created. BuildingOperation |
| 400 | Invalid request; correct the input. Codes: INVALID_JSON, INVALID_BUILDING_INPUT, INVALID_BUILDING_CONTEXT, INVALID_PHONE_NUMBER, PHONE_VERIFICATION_REQUIRED, FORWARDING_PHONE_NOT_VERIFIED. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE, PARENT_BUILDING_KEY_REQUIRED, MULTI_BUILDING_REQUIRED. Error |
| 404 | Not found for this key or building. Codes: BUILDING_NOT_FOUND. Error |
| 409 | Conflicts with current state; inspect it before retrying. Codes: BUILDING_LIMIT, BUILDING_BILLING_MISMATCH. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
DELETE /v1/buildings/{id}
Execute quoted building removal
Parent account only; do not send building header. Supply the matching unexpired quote and stable request ID. Stale inventory/billing requires a fresh preview before execution. Replay returns stored operation. HTTP 202 is not completion. running: poll the operation; reconciliation_required: contact support with its ID and do not create another request. Only one building change runs at a time per account (409 BUILDING_BUSY). An addition that fully rolled back (no number purchased, building removed, billing restored) returns 409 BUILDING_ADD_FAILED, is recorded as failed, and lets another building change start; replaying it returns the same error. The JSON DELETE body is required. Permanently releases the number, deletes child rules/activity, revokes child keys, and reduces subscription quantity.
Authorization: Bearer key; account:read + buildings:write.
Parameters
| Parameter | Contract |
|---|
id path · required | stringOpaque resource ID, normally 24 hexadecimal characters. pattern: ^[a-fA-F0-9]{24}$ |
Idempotency-Key header · required | Stable identifier for this action: 16 to 100 letters, digits, hyphens, or underscores. Reuse the identical body and key after a timeout. Keys never expire.stringpattern: ^[a-zA-Z0-9_-]{16,100}$ |
JSON request body
Responses
| HTTP status | Contract |
|---|
| 200 | Success. BuildingOperation |
| 202 | Pending or uncertain: inspect status and next_action. BuildingOperation |
| 400 | Invalid request; correct the input. Codes: INVALID_JSON, IDEMPOTENCY_KEY_REQUIRED, INVALID_ID, INVALID_QUOTE, INVALID_BUILDING_CONTEXT. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE, PARENT_BUILDING_KEY_REQUIRED, MULTI_BUILDING_REQUIRED. Error |
| 404 | Not found for this key or building. Codes: NOT_FOUND, BUILDING_NOT_FOUND. Error |
| 409 | Conflicts with current state; inspect it before retrying. Codes: INVALID_QUOTE, IDEMPOTENCY_CONFLICT, QUOTE_EXPIRED, QUOTE_STALE, BUILDING_BUSY, BUILDING_BILLING_MISMATCH. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
GET /v1/buildings/operations/{id}
Read building operation receipt
Parent-owned operation. Recovery remains available without an active subscription. A running operation that stops making progress is reported as reconciliation_required. Quotes/receipts are not erased when the quote expires.
Authorization: Bearer key; account:read + buildings:write.
Parameters
| Parameter | Contract |
|---|
id path · required | stringOpaque resource ID, normally 24 hexadecimal characters. pattern: ^[a-fA-F0-9]{24}$ |
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. BuildingOperation |
| 400 | Invalid request; correct the input. Codes: INVALID_ID. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE, PARENT_BUILDING_KEY_REQUIRED. Error |
| 404 | Not found for this key or building. Codes: NOT_FOUND. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
POST /v1/unlock
Create an access grant
No subscription or virtual number is needed: rules can be created before subscribing or connecting a building, and they start opening the door once a virtual number is connected. BuzzerAPI includes timer, passcode, and routine for every building; if the account's current plan doesn't include a rule type, creating it returns 403 PLAN_UPGRADE_REQUIRED. A timer with a future starts_at has status scheduled until then. A timer or passcode with remaining_uses lets in that many buzzes, then becomes exhausted; omit it (or send null on a passcode) for unlimited buzzes; a passcode no longer defaults to one use. A timer's window is set by exactly one of expires_in_minutes or ends_at; a passcode can take either one for an expiry, or neither to never expire. type is required and never inferred. A repeated Idempotency-Key with the same body returns 200 with the current grant and Idempotency-Replayed: true (including revoked state and current remaining_uses), never reopens it; the same key with a different body returns 409 IDEMPOTENCY_CONFLICT. Keys never expire and are scoped to the selected building.
Authorization: Bearer key; access:write.
Parameters
| Parameter | Contract |
|---|
X-Buzzer-Building-Id header | Required when a parent account has linked buildings, even for its primary building. Omit only for a single-building account. Child keys cannot select siblings.stringOpaque resource ID, normally 24 hexadecimal characters. pattern: ^[a-fA-F0-9]{24}$ |
Idempotency-Key header · required | Stable identifier for this action: 16 to 100 letters, digits, hyphens, or underscores. Reuse the identical body and key after a timeout. Keys never expire.stringpattern: ^[a-zA-Z0-9_-]{16,100}$ |
JSON request body
Responses
| HTTP status | Contract |
|---|
| 200 | Success. Unlock Location: On new 201: relative /v1/unlock/{id}. string
Idempotency-Replayed: Present on replay. string
constant: "true" |
| 201 | Created. Unlock Location: On new 201: relative /v1/unlock/{id}. string
Idempotency-Replayed: Present on replay. string
constant: "true" |
| 400 | Invalid request; correct the input. Codes: INVALID_JSON, IDEMPOTENCY_KEY_REQUIRED, INVALID_BUILDING, INVALID_TYPE, INVALID_UNLOCK. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE, PLAN_UPGRADE_REQUIRED, MULTI_BUILDING_REQUIRED. Error |
| 404 | Not found for this key or building. Codes: BUILDING_NOT_FOUND. Error |
| 409 | Conflicts with current state; inspect it before retrying. Codes: BUILDING_REQUIRED, IDEMPOTENCY_CONFLICT. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
GET /v1/unlock
List access grants
No active subscription required. Excludes API-revoked grants. Ordered by descending ID. enabled filters by the on/off switch; status filters by what the rule does right now (status=active matches a timer within its window, a nonexpired/nonexhausted enabled passcode, or an enabled routine, not necessarily inside its schedule).
Authorization: Bearer key; access:read.
Parameters
| Parameter | Contract |
|---|
X-Buzzer-Building-Id header | Required when a parent account has linked buildings, even for its primary building. Omit only for a single-building account. Child keys cannot select siblings.stringOpaque resource ID, normally 24 hexadecimal characters. pattern: ^[a-fA-F0-9]{24}$ |
enabled query | stringone of: true, false |
status query | stringone of: active, scheduled, inactive, expired, exhausted |
type query | stringone of: timer, passcode, routine |
limit query | integerminimum: 1 maximum: 100 default: 50 |
cursor query | Use pagination.cursor; this endpoint uses a grant ID cursor.stringOpaque resource ID, normally 24 hexadecimal characters. pattern: ^[a-fA-F0-9]{24}$ |
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. UnlockPage |
| 400 | Invalid request; correct the input. Codes: INVALID_BUILDING, INVALID_FILTER, INVALID_TYPE, INVALID_LIMIT, INVALID_CURSOR. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE. Error |
| 404 | Not found for this key or building. Codes: BUILDING_NOT_FOUND. Error |
| 409 | Conflicts with current state; inspect it before retrying. Codes: BUILDING_REQUIRED. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
GET /v1/unlock/{id}
Read one access grant
Includes revoked grants; ownership is scoped to selected building.
Authorization: Bearer key; access:read.
Parameters
| Parameter | Contract |
|---|
id path · required | stringOpaque resource ID, normally 24 hexadecimal characters. pattern: ^[a-fA-F0-9]{24}$ |
X-Buzzer-Building-Id header | Required when a parent account has linked buildings, even for its primary building. Omit only for a single-building account. Child keys cannot select siblings.stringOpaque resource ID, normally 24 hexadecimal characters. pattern: ^[a-fA-F0-9]{24}$ |
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. Unlock ETag: Supply this exact quoted value as If-Match when updating. string
Quoted decimal version, e.g. "3", or its proxy-generated weak form W/"3". |
| 400 | Invalid request; correct the input. Codes: INVALID_BUILDING, INVALID_ID. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE. Error |
| 404 | Not found for this key or building. Codes: BUILDING_NOT_FOUND, NOT_FOUND. Error |
| 409 | Conflicts with current state; inspect it before retrying. Codes: BUILDING_REQUIRED. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
PATCH /v1/unlock/{id}
Update an access grant
Requires If-Match from GET. Strong quoted versions and proxy-generated weak ETags are accepted. Parallel updates using the same version permit one write; the others return 409 VERSION_CONFLICT. Missing/malformed version: 428 VERSION_REQUIRED. Reread, review changes, and decide whether to retry. Revoked grants cannot be reopened. remaining_uses (1 to 100) sets a new count; null removes the use limit on timers and passcodes. Turning a timer on (enabled: true) needs expires_in_minutes or ends_at, plus an optional starts_at. On a passcode, expires_in_minutes or ends_at sets a new expiry and ends_at: null removes it. No subscription or virtual number is needed on the primary building; if the account's current plan doesn't include the rule type, PLAN_UPGRADE_REQUIRED is returned except for the exact body {"enabled":false}. Linked-building PATCH still requires an active BuzzerAPI subscription even for deactivation. DELETE remains the downgrade cleanup path.
Authorization: Bearer key; access:write.
Parameters
| Parameter | Contract |
|---|
id path · required | stringOpaque resource ID, normally 24 hexadecimal characters. pattern: ^[a-fA-F0-9]{24}$ |
X-Buzzer-Building-Id header | Required when a parent account has linked buildings, even for its primary building. Omit only for a single-building account. Child keys cannot select siblings.stringOpaque resource ID, normally 24 hexadecimal characters. pattern: ^[a-fA-F0-9]{24}$ |
If-Match header · required | stringQuoted version from the ETag. A weak W/"3" form, which proxies may add when compressing, is accepted too. pattern: ^(?:W/)?"[0-9]+"$ |
JSON request body
Responses
| HTTP status | Contract |
|---|
| 200 | Success. Unlock ETag: Supply this exact quoted value as If-Match when updating. string
Quoted decimal version, e.g. "3", or its proxy-generated weak form W/"3". |
| 400 | Invalid request; correct the input. Codes: INVALID_JSON, INVALID_BUILDING, INVALID_ID, INVALID_UNLOCK. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE, PLAN_UPGRADE_REQUIRED, MULTI_BUILDING_REQUIRED. Error |
| 404 | Not found for this key or building. Codes: BUILDING_NOT_FOUND, NOT_FOUND. Error |
| 409 | Conflicts with current state; inspect it before retrying. Codes: BUILDING_REQUIRED, VERSION_CONFLICT, GRANT_REVOKED. Error |
| 428 | Precondition required. Codes: VERSION_REQUIRED. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
DELETE /v1/unlock/{id}
Revoke access grant
No active subscription required. Soft revocation is repeatable; never erases create idempotency receipt. Missing grant is 404. Other grants may still allow access.
Authorization: Bearer key; access:write.
Parameters
| Parameter | Contract |
|---|
id path · required | stringOpaque resource ID, normally 24 hexadecimal characters. pattern: ^[a-fA-F0-9]{24}$ |
X-Buzzer-Building-Id header | Required when a parent account has linked buildings, even for its primary building. Omit only for a single-building account. Child keys cannot select siblings.stringOpaque resource ID, normally 24 hexadecimal characters. pattern: ^[a-fA-F0-9]{24}$ |
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. UnlockRevoked |
| 400 | Invalid request; correct the input. Codes: INVALID_BUILDING, INVALID_ID. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE. Error |
| 404 | Not found for this key or building. Codes: BUILDING_NOT_FOUND, NOT_FOUND. Error |
| 409 | Conflicts with current state; inspect it before retrying. Codes: BUILDING_REQUIRED. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
GET /v1/logs
Read persisted access activity
No active subscription required. Descending created_at then ID. since/until inclusive. Follow every cursor with unchanged filters; overlap timestamp checkpoints and deduplicate by ID to recover use events. Passcodes are withheld from logs; use an access:read key to retrieve a grant when needed. Calls forwarded to the resident appear with type call. No server streaming endpoint.
Authorization: Bearer key; logs:read.
Parameters
| Parameter | Contract |
|---|
X-Buzzer-Building-Id header | Required when a parent account has linked buildings, even for its primary building. Omit only for a single-building account. Child keys cannot select siblings.stringOpaque resource ID, normally 24 hexadecimal characters. pattern: ^[a-fA-F0-9]{24}$ |
limit query | integerminimum: 1 maximum: 100 default: 50 |
since query | stringISO 8601 timestamp. format: date-time |
until query | stringISO 8601 timestamp. format: date-time |
type query | unlock: access-rule attempts only. call: forwarded calls only. Omit for both.stringone of: unlock, call |
unlock_id query | Only entries for this access rule.stringOpaque resource ID, normally 24 hexadecimal characters. pattern: ^[a-fA-F0-9]{24}$ |
q query | Case-insensitive search of each entry's name, such as an access rule label. Matched literally; 1 to 100 characters after trimming.stringminLength: 1 maxLength: 100 |
succeeded query | stringone of: true, false |
cursor query | Opaque base64url cursor; do not construct or decode as part of client logic.string |
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. LogPage |
| 400 | Invalid request; correct the input. Codes: INVALID_BUILDING, INVALID_ID, INVALID_LIMIT, INVALID_DATE, INVALID_TYPE, INVALID_QUERY, INVALID_SUCCEEDED, INVALID_CURSOR. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE. Error |
| 404 | Not found for this key or building. Codes: BUILDING_NOT_FOUND. Error |
| 409 | Conflicts with current state; inspect it before retrying. Codes: BUILDING_REQUIRED. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: FETCH_FAILED, INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
POST /v1/webhooks
Create a webhook endpoint
Account-level: do not send X-Buzzer-Building-Id; events carry building_id. At most 5 endpoints per account (409 WEBHOOK_LIMIT). secret is returned only by this call; store it to verify BuzzerAPI-Signature. events defaults to every event type. Endpoints can also be managed on the account page. Repeating the call with the same Idempotency-Key and body returns 200 with the original endpoint, including secret, and Idempotency-Replayed: true; a different body with that key returns 409 IDEMPOTENCY_CONFLICT.
Authorization: Bearer key; access:write.
Parameters
| Parameter | Contract |
|---|
Idempotency-Key header | Optional. When supplied it works like access creation: the same key and body replay the original endpoint with Idempotency-Replayed: true, and a different body returns 409 IDEMPOTENCY_CONFLICT.stringpattern: ^[a-zA-Z0-9_-]{16,100}$ |
JSON request body
Responses
| HTTP status | Contract |
|---|
| 200 | Success. WebhookEndpoint Idempotency-Replayed: Present on replay. string
constant: "true" |
| 201 | Created. WebhookEndpoint Idempotency-Replayed: Present on replay. string
constant: "true" |
| 400 | Invalid request; correct the input. Codes: INVALID_JSON, INVALID_WEBHOOK_URL, INVALID_WEBHOOK_EVENTS. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE. Error |
| 409 | Conflicts with current state; inspect it before retrying. Codes: WEBHOOK_LIMIT, IDEMPOTENCY_CONFLICT. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
GET /v1/webhooks
List webhook endpoints
Every endpoint on the account. secret is never returned here.
Authorization: Bearer key; access:read.
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. WebhookEndpointList |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
DELETE /v1/webhooks/{id}
Delete a webhook endpoint
Stops deliveries and cancels pending retries for this endpoint. Repeating the call is harmless.
Authorization: Bearer key; access:write.
Parameters
| Parameter | Contract |
|---|
id path · required | stringOpaque resource ID, normally 24 hexadecimal characters. pattern: ^[a-fA-F0-9]{24}$ |
No request body.
Responses
| HTTP status | Contract |
|---|
| 200 | Success. Deleted |
| 400 | Invalid request; correct the input. Codes: INVALID_ID. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |
POST /v1/webhooks/{id}/test
Send a test event
Queues a webhook.test event for this endpoint with the normal signature, timeout, and retry rules. 202 means queued, not delivered.
Authorization: Bearer key; access:write.
Parameters
| Parameter | Contract |
|---|
id path · required | stringOpaque resource ID, normally 24 hexadecimal characters. pattern: ^[a-fA-F0-9]{24}$ |
No request body.
Responses
| HTTP status | Contract |
|---|
| 202 | Accepted: the test delivery is queued. WebhookTestQueued |
| 400 | Invalid request; correct the input. Codes: INVALID_ID. Error |
| 401 | Missing, invalid, expired, or revoked key. Codes: AUTH_REQUIRED, INVALID_KEY. Error |
| 403 | Not permitted for this key, account, or plan. Codes: INSUFFICIENT_SCOPE. Error |
| 404 | Not found for this key or building. Codes: NOT_FOUND. Error |
| 429 | Rate limited; wait for Retry-After. Codes: RATE_LIMIT_EXCEEDED. Error Retry-After: Number of seconds to wait before retrying. Absent on PHONE_CODE_ATTEMPTS; request a new code instead. integer
minimum: 1 RateLimit-Limit: Requests allowed in the current window. integer
RateLimit-Remaining: Requests left in the current window. integer
RateLimit-Reset: Seconds until the window resets. integer
|
| 5XX | Server error; retryable is true, but check a mutation's state before repeating it. Codes: INTERNAL_ERROR. Error |
| default | Structured API error; see error handling and the error code catalog. Hosting/proxy failures and unknown paths can return non-JSON bodies. Error |