// conventions
The response envelope, error shape, authentication, and the rules every capability follows.
This product follows widely-adopted open standards so any client — monitoring tools, event platforms, or your own code — can integrate without bespoke work. These conventions are adopted independently; where this document references an external standard, that standard (not this document) is the source of truth.
/v1/.... Breaking changes ship under a new major version.dataschema attribute (a URL to a JSON Schema) and a data.schema_version date string (e.g. 2026-06-26). Adding fields is not breaking; consumers MUST ignore unknown fields.Deprecation: true and Sunset: <HTTP-date> headers (RFC 8594) for at least 6 months before removal. Deprecations are announced in the changelog.Authorization: Bearer <token>. Tokens are issued in the dashboard, are scoped, and can be rotated or revoked.Every webhook this product sends, and every webhook it accepts, is signed using the Standard Webhooks scheme.
whsec_...).webhook-id (unique message id, equal to the event id), webhook-timestamp (Unix seconds), and webhook-signature (a space-separated list of v1,<base64 HMAC-SHA256>).base64(HMAC_SHA256(secret, "{webhook-id}.{webhook-timestamp}.{body}")) and constant-time comparing it against each signature in webhook-signature.webhook-timestamp is more than 5 minutes from now (replay protection).Events are encoded as CloudEvents 1.0 in structured JSON (Content-Type: application/cloudevents+json).
| Attribute | Meaning |
|---|---|
specversion |
Always 1.0. |
id |
Globally-unique event id. Also the idempotency key (sent as the webhook-id header). |
source |
URI identifying the producer, e.g. https://api.example.app/tenants/{id}. |
type |
Reverse-DNS event type, e.g. app.beaam.incident.opened. |
subject |
The affected resource, e.g. incident/{id}. |
time |
RFC 3339 UTC timestamp. |
datacontenttype |
application/json. |
dataschema |
URL of the versioned JSON Schema for data. |
data |
The event payload (documented per event type). |
id (equivalently the webhook-id header).time and the resource-state fields in each payload to reconcile. Every event carries enough state to be processed on its own.2xx. Respond within 10 seconds; do slow work asynchronously.410 Gone to permanently stop delivery to an endpoint. 429 with Retry-After is honored.Errors use standard HTTP status codes and a JSON body:
{ "error": { "type": "invalid_request", "code": "missing_field", "message": "field 'x' is required", "request_id": "req_..." } }
type is a stable machine-readable category; request_id is for support.
Responses include RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset (seconds until reset). Exceeding the limit returns 429 with a Retry-After header.
This page is generated from docs/api/conventions.md in the Beaam repository, so it stays in step with the implementation. Something unclear or wrong?Tell us — and see theAPI reference for the full list of operations.