For the complete documentation index, see llms.txt. This page is also available as Markdown.

Manage Room Zones

Retrieve and mutate backend-authoritative GEO and degradation zones for a Sonoran Radio room.

These endpoints manage the canonical GEO and degradation zone configuration for one Radio room. Emergency zones remain panel-managed and are not modified by these routes.

Method
Route
Purpose

GET

/v2/servers/:communityId/rooms/:roomId/zones

Retrieve the complete room snapshot

POST

/v2/servers/:communityId/rooms/:roomId/zones/:zoneType

Create or replace a zone by name

PATCH

/v2/servers/:communityId/rooms/:roomId/zones/:zoneType/:zoneName

Replace an existing zone

DELETE

/v2/servers/:communityId/rooms/:roomId/zones/:zoneType/:zoneName

Delete an existing zone

zoneType must be geo or degrade. The zoneName path value must be URL encoded.

Rate limits: reads allow 12 requests per minute; mutations allow 30 requests per minute.

Headers

Name
Value

Authorization

Bearer <community-api-key>

Content-Type

application/json for POST and PATCH

POST and PATCH accept a zone object. GEO zones contain transmitChannels, scanChannels, and acePerms; degradation zones contain degradeStrength.

A zone must use exactly one supported shape:

  • Polygon: points containing at least three finite { x, y } coordinates.

  • Circle: center containing finite { x, y } coordinates and a positive finite radius.

Both shapes use options.minZ and options.maxZ for their vertical bounds. For example, a circle shape can replace the points property in the examples below with center: { x: 0, y: 0 }, radius: 100.

Examples

local snapshot = client.radio:getZonesV2()

local created = client.radio:createZoneV2("geo", {
  points = {
    { x = -100.0, y = -100.0 },
    { x = -100.0, y = 100.0 },
    { x = 100.0, y = 100.0 }
  },
  options = {
    name = "Downtown",
    minZ = 0,
    maxZ = 100,
    transmitChannels = { 143504 },
    scanChannels = {},
    acePerms = {}
  }
})

local updated = client.radio:updateZoneV2("geo", "Downtown", updatedZone)
local deleted = client.radio:deleteZoneV2("geo", "Downtown")
const snapshot = await instance.radio?.getZonesV2();

const created = await instance.radio?.createZoneV2('geo', {
  points: [
    { x: -100, y: -100 },
    { x: -100, y: 100 },
    { x: 100, y: 100 }
  ],
  options: {
    name: 'Downtown',
    minZ: 0,
    maxZ: 100,
    transmitChannels: [143504],
    scanChannels: [],
    acePerms: []
  }
});

const updated = await instance.radio?.updateZoneV2('geo', 'Downtown', updatedZone);
const deleted = await instance.radio?.deleteZoneV2('geo', 'Downtown');

Response

Every successful operation returns the complete canonical mutable-zone snapshot for the room:

Last updated

Was this helpful?