← All guides

Secure V2 · SDK 0.3.0

Bring your own backend

Updated October 11, 2026 · verified against repository implementation

Route securely ingested readings to cloud services, PostgreSQL or HTTPS applications.

Availability and setup

Integrations require an activated Phase 7 deployment. Open Dashboard → Integrations, choose a destination, enter connection settings and scoped credentials, choose routing and field mapping, review, and save. New connections are disabled. Verify the connection, then explicitly enable forwarding. Existing Webhooks retain their original JSON and HMAC contract.

Connection checks report configuration valid, credentials verified or connection established. These are separate from successful publication. A send-only credential may not support read-only lookup; use the clearly confirmed test-send action to publish one synthetic event. No customer telemetry is sent by a basic check. The generic synthetic test contains test=true and a message; a required field mapping may reject it. Use the no-send sample preview to validate mappings, then confirm real delivery through the Delivery history after enabling.

Routing rules

All telemetry is the default. Conditional rules retain the existing Scale entitlement. Use payload.temperature, device_id, schema_slot, schema_version or event_type with eq, ne, gt, gte, lt, lte, contains or exists. AND/OR groups support up to five levels and 64 conditions. Missing or invalid fields fail closed. Quote text and exact large integers in JSON. Numeric thresholds compare decimal values in PostgreSQL without JavaScript integer coercion.

Each destination has one expression, which can contain several nested groups. Every matched event creates at most one delivery per destination. Rule priority and independent named rule objects are not implemented. Schema identity currently means device plus immutable Secure V2 slot (and linked legacy schema version when available), not a shared cross-device schema catalog.

Routing and configuration are snapshotted in the ingestion transaction. Editing a rule affects new events, not existing queued work. Pausing retains work and stops new claims; packets can still add matching jobs. Disabling stops new routing and can make queued attempts terminal. In-flight requests may finish. Downgrading a workspace with a conditional integration stops its new routing; it does not broadcast formerly filtered data.

Field mapping and precision

Choose an envelope with a data object or a flat object. Select source fields and destination names to include only those fields. With no mappings, all fields are retained. Optional metadata includes device ID, timestamp and schema slot/version; event_id, event_type and format_version are mandatory. Identity, scalar-to-string and explicit boolean conversions are supported. Numeric narrowing and arbitrary code are not. Missing required fields and metadata-name conflicts fail visibly.

Float64 uses its JSON round-trip representation. Integers beyond JavaScript safe range remain exact decimal strings as supplied by the gateway. Do not parse these strings through Number in your receiver. Preview uses a sample, not production telemetry. Transformed events are bounded to 240000 UTF-8 bytes.

Delivery and recovery

Persistence, routing and per-destination intent commit before the authenticated device receipt. External calls happen asynchronously. Provider acceptance does not prove subscriber processing. The same durable queue, eight-attempt/24-hour retry cycle, dead letters, fenced leases and manual recovery from Delivery apply to every adapter. At-least-once attempts can cause duplicates after remote success followed by a lost response. Deduplicate stable event IDs.

Open Delivery to filter by destination and inspect each event’s attempt history, snapshotted routing version, mapping, failures and recovery actions. Replay targets the original destination/configuration only. After correcting a mapping, Retry failures with current mapping previews up to 100 eligible dead letters and explicitly requeues only those identities with the reviewed mapping version. The preview expires after ten minutes; payload retention and three recovery-cycle limits still apply. Provider acceptance IDs are recorded with attempts where returned. Rotating credentials affects future attempts, including old queued work. Pause first when changing resource access. Source payloads expire after seven days; diagnostics and audit history are retained for thirty days under the configured cleanup scheduler.

Security and current limits

Credentials are AES-256-GCM encrypted and bound to workspace and destination identity using a server-only integration key. Saved credentials are never returned to the browser. Replace credentials in Edit configuration to rotate them. Deleting a connection disables routing and erases its credentials while retaining delivery history.

All endpoints require verified TLS and public addresses. Every DNS result is checked and the connection is pinned; redirects, private databases, metadata endpoints, arbitrary SQL and ambient cloud credential discovery are disallowed. Current safety limits are twenty integrations per workspace, thirty management/test actions per minute, bounded worker concurrency and the shared queue capacity. These are infrastructure safeguards, not new subscription plans.

AWS uses official JavaScript SDK v3 with internal retries disabled. Azure and Google use their documented HTTPS APIs through the shared pinned transport. Current authentication is explicit AWS access/session credentials, Azure send-only SAS, Google service-account RSA credentials and PostgreSQL username/password plus optional CA. Role assumption, managed/workload identity, private connectivity, provider-native batch publication and additional connectors are not implemented. Local contract and PostgreSQL TLS tests are not authenticated live-cloud verification.

Versioned event example

New integrations use struct.event.v1. The stable event_id remains unchanged across retries. The timestamp is the stored sample timestamp, not proof of a trusted device clock. Schema metadata can be null for historical or unlinked slots. Original webhooks are not migrated to this envelope.

{
  "format_version": "struct.event.v1",
  "event_type": "telemetry.received",
  "event_id": "00000000-0000-0000-0000-000000000001",
  "device_id": "00000000-0000-0000-0000-000000000002",
  "timestamp": "2026-10-11T15:00:00Z",
  "schema": {
    "slot": 0,
    "version": 1
  },
  "data": {
    "temperature": 23.5,
    "humidity": 61.25,
    "is_active": true,
    "count": "18446744073709551615"
  }
}

Open device setup · Contact support