The normalized uplink contract
The actual output of the Ghost Signal 0.1 adapters.
Identity comes first
The adapter requires a trusted tenantId, integrationId and expected applicationId from the caller. Incoming application identity must match that binding. Device ownership is a separate authorization check for your receiver.
| Field | Meaning |
|---|---|
| schemaVersion | 0.1; explicitly versioned envelope |
| source / eventId | Provider and its event identity |
| deduplicationKey | JSON tuple of tenant, integration, source and provider event ID |
| device.devEui | Validated 16-character hexadecimal identifier |
| receivedAt | Provider receive time converted to UTC ISO format |
| frameCounter / fPort | Unsigned frame counter and application port 1–223 |
| payloadBase64 | Original application bytes represented as padded base64 |
| decoded | Detached provider object, or null; units unchanged |
Explicit limits
Only application uplinks are accepted. Payload text is limited to 4,096 characters. Counter values must be integers within the unsigned 32-bit range. Invalid identifiers, ports, times and payload encodings throw TypeError. The library does not silently coerce these fields.
Retries are not universal duplicates
The key detects repeat delivery of the same provider event. Separate events representing the same radio transmission may have different IDs. If your system receives from multiple providers, define reconciliation separately. Never deduplicate using the frame counter alone; resets and sessions complicate its meaning.