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.
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 allow30 requests per minute.
Headers
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:
pointscontaining at least three finite{ x, y }coordinates.Circle:
centercontaining finite{ x, y }coordinates and a positive finiteradius.
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?

