Local Relay
Local Relay is an on-premises component for sites that need license enforcement with constrained cloud connectivity. The Host syncs outbound to the cloud, keeps a local store, and can serve LAN validation (and optional floating actions) without putting the full Management plane on-site.
Relay engine internals stay proprietary to the platform. Public docs describe the role and boundaries — not Host source layout or private messaging.
What Relay is for
| Need | Relay role |
|---|---|
| Intermittent / limited WAN | Outbound sync + local leases so the site keeps working between syncs |
| LAN products | Local validation path for devices on the site network |
| No continuous HTTPS | Pair with air-gapped operator packages instead of (or between) sync windows |
Relay does not open cloud message brokers from the Host. Continuous sync and air-gap handoff are separate transports with the same fail-closed crypto posture.
LAN activation, validation, and refresh require an active verified V2 License
snapshot. A legacy entitlement-only store, offline grace, or a historical lease
whose ProductId came from entitlement.Code cannot authorize a decision;
validate/refresh report relay.host.no_snapshot until V2 state is delivered.
See the Wave 74.15 cutover
guide.
Safe LAN retries
LAN activation, lease refresh, and device registration use a stable
Idempotency-Key per logical attempt. Reusing the same key with the same
request returns the original result even after a Host restart; changing the
request under a live key returns 409 relay.host.idempotency_conflict. If the
Host cannot recover its protected original result, it returns
503 relay.host.idempotency_unavailable and does not repeat the mutation.
Keys must contain 1–128 printable ASCII characters without spaces.
Local usage reporting
An authorized LAN client reports a usage fact with a signed edge-lan-v1
request to POST /api/edge/v1/usage/report using operation usage.report.
The request supplies a UUIDv7 local event id, expected License and Product,
normalized meter code, positive quantity and UTC occurrence time. Product in
the request is not authority: Relay resolves Product, Tenant, Customer and the
meter definition from the active Cloud-signed local generation and checks the
client's Product scope.
Relay appends the fact to SQLite once. An exact local-event retry returns the
same receipt; changed reuse returns 409. The Host freezes pending facts into
immutable batches of at most 500 events and uploads the exact stored bytes with
Gateway ES256 proof and a batch-derived idempotency key. A network failure or
Host restart retries the same bytes. Local evidence is acknowledged only after
Cloud returns the exact durable batch receipt. Usage facts do not grant or
extend license rights.
Health and local diagnostics
Anonymous GET /health and GET /ready responses contain only status,
service, and version. They do not disclose tenant, customer, site, license
counts, synchronization state, provider information, key ids, paths, or error
details.
Detailed diagnostics use GET /api/edge/admin/v1/diagnostics. Access requires
both a loopback caller and a separate RelayAdmin credential; LAN client and
gateway credentials are not accepted. Host configuration stores only the
credential's SHA-256 digest in RelayHostAdmin:CredentialSha256. The former
anonymous GET /diagnostics path is removed. Security diagnostics expose only
provider type names and the active signing key id, never credentials, key
material, key coordinates, protected references, or configuration paths.
Vendor Console (operator)
In Vendor Console, Offline / Floating / Relays list pages accept optional product context (productCode / productId query) and Operations nav exposes Offline + Floating alongside Relays. Local Relay enrollment uses a multi-step setup wizard (optional license bind → one-time token checklist → Offline air-gap export deep-link). Product filter query params are Console-side only in this release — Management list APIs remain tenant-wide.
Not the same as webhooks
Customer webhooks are platform → your HTTPS URL event pushes for integrators. Relay sync is Host → cloud reconciliation plus local LAN validation. Do not configure a webhook URL expecting it to feed a Relay Host, and do not treat webhook delivery as proof of a signed lease.
When to use
- Hospitality / branch sites with flaky WAN but many local clients.
- You want local enforcement plus periodic cloud reconciliation.
- Pure online Runtime-only products with stable connectivity → you may not need Relay.
Related
- Offline · Air-gapped · Floating
- Gateway public-key registration
- Gateway bundle synchronization
- Vocabulary: Core Concepts
- Mode map: Licensing Models
- Integrators: API Reference · SDKs
Next steps
- Getting Started
- Operations topics (deployment / troubleshooting) land in later public docs waves