Signed command addresses a structure served by a CMS
Webhook device_command.issued
Sent to the organisation of every structure that a CMS installation serves when a signed command addresses it, so that the CMS can fetch the command from the relay at once instead of waiting for its next poll.
Headers we send
| Name | In | Type | Required | Description | Example |
|---|---|---|---|---|---|
X-Tanba-Delivery | header | string (uuid) | yes | Identifier of the delivery. It is the same on every retry; use it to ignore duplicates. | 9b2e4c60-1f7a-4d83-a5c6-3e8d0b7f2a11 |
X-Tanba-Event | header | string | yes | The event name. | approval.issued |
X-Tanba-Signature | header | string | yes | t=<unix seconds>,v1=<hex HMAC-SHA256 of t + "." + the raw body, keyed with the webhook secret>. See the guide on webhook signatures. | t=1790000000,v1=5f2d9c1a0b7e4d63a8c15e90f4b2d7a3c6e81f0594ab2d3c7e6f1a08b9d4c5e2 |
Body we send
application/json
| Name | Type | Required | Description | Example |
|---|---|---|---|---|
event | const | yes | The event name, the same as in the X-Tanba-Event header. | "device_command.issued" |
occurred_at | string (date-time) | yes | When the event was stored. | "2026-10-14T09:00:04+05:00" |
data | object | yes | The command. | |
data.command_id | string (uuid) | yes | Identifier of the command. | "01a1377e-c8e3-7c41-8ae9-3a8dc9413fbd" |
data.type | string | yes | What the command does: cutoff, restore, restart, content_switch or emergency_broadcast. | "cutoff" |
data.scope | string | yes | How the command was addressed. | "structure" |
data.scenario | string | null | yes | Scenario name for a content switch or an emergency broadcast; otherwise null. | null |
data.not_after | string (date-time) | yes | The command must not be executed after this moment. | "2026-10-14T10:00:00+05:00" |
data.structures | array of string | yes | Codes of the organisation's structures the command applies to. | |
data.installations | array of string (uuid) | yes | Identifiers of the CMS installations that serve those structures. |
Example
{
"event": "device_command.issued",
"occurred_at": "2026-10-14T09:00:04+05:00",
"data": {
"command_id": "01a1377e-c8e3-7c41-8ae9-3a8dc9413fbd",
"type": "cutoff",
"scope": "structure",
"scenario": null,
"not_after": "2026-10-14T10:00:00+05:00",
"structures": [
"ALM-0012"
],
"installations": [
"5d0c8e7a-21b4-4c3f-9a6e-0b1d2c3e4f50"
]
}
}
Responses
200 The delivery is accepted. Any 2xx status counts; the body is ignored.
No body.
410 Any other status, or no answer within 10 seconds, counts as a failure and the delivery is retried.
No body.