Skip to content

Set where a monitor's alerts go

PUT
/servers/{id}/channels
curl --request PUT \
--url https://dev.tunnelhq.com/api/v1/servers/srv_42/channels \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <X-API-Key>' \
--header 'X-Project-Id: prj_12' \
--data '{ "channel_ids": [ "chn_21", "chn_22" ] }'

Replaces the whole list of channels a check’s or tunnel’s alerts go to. Send every channel it should keep: Get where a monitor’s alerts go gives the current list. An empty list ([]) means its alerts go to no channel.

Channel IDs come from List alert channels. A channel already linked to it is accepted too, so you can always send back the list you read. A channel of another project is refused by name. Up to 50 channels.

It needs a role that can edit monitors (Owner, Admin and Manager have it by default).

Need an API key? See Getting an API key.

id
required
string

The monitor, as srv_42 or 42.

Example
srv_42
X-Project-Id
required
string

The project, as prj_12 or 12. A workspace key can only reach its own workspace’s projects.

Example
prj_12
Media typeapplication/json
object
channel_ids
required

Every channel its alerts should go to, as chn_21 or 21. [] for none.

Array<string>
<= 50 items
Examples

Two channels

{
"channel_ids": [
"chn_21",
"chn_22"
]
}

Its channels after the change.

Media typeapplication/json
object
id
required

The check or tunnel.

string
channel_ids
required

The IDs of channels, ready to change and send back.

Array<string>
channels
required
Array<object>

An alert channel, without its settings.

object
id
required
string
name
required
string
type
required

The kind of channel, such as slack, telegram, smtp (email), or webhook.

string | null
active
required

Whether the channel is switched on. One that is off sends nothing.

boolean
Examples
Exampledefault

A check whose alerts go to two channels

{
"id": "srv_42",
"channel_ids": [
"chn_21",
"chn_22"
],
"channels": [
{
"id": "chn_21",
"name": "Ops Slack",
"type": "slack",
"active": true
},
{
"id": "chn_22",
"name": "On call email",
"type": "smtp",
"active": true
}
]
}
X-RateLimit-Limit
integer

Requests the workspace’s plan allows per minute.

X-RateLimit-Remaining
integer

Requests left in the current minute.

X-RateLimit-Reset
integer

Unix time, in seconds, when the current minute ends.

The list isn’t a list of channel IDs, has more than 50, names a channel of another project, or the monitor is a group.

Media typeapplication/json
object
error
required
boolean
code
required

The HTTP status, repeated.

integer
message
required

What went wrong.

string
details

More detail, on some errors.

retry_after

Seconds to wait, on the 429 for wrong keys.

integer
Examples
{
"error": true,
"code": 400,
"message": "channel_ids must be a list of channel ids from GET /api/v1/channels, such as [\"chn_12\"]; [] means no channel."
}

The API key is missing, wrong, expired, switched off, or no longer valid.

Media typeapplication/json
object
error
required
boolean
code
required

The HTTP status, repeated.

integer
message
required

What went wrong.

string
details

More detail, on some errors.

retry_after

Seconds to wait, on the 429 for wrong keys.

integer
Examples
{
"error": true,
"code": 401,
"message": "API key is required. Provide X-API-Key header or Authorization: Bearer <key>"
}

Your role can’t edit monitors.

Media typeapplication/json
object
error
required
boolean
code
required

The HTTP status, repeated.

integer
message
required

What went wrong.

string
details

More detail, on some errors.

retry_after

Seconds to wait, on the 429 for wrong keys.

integer
Example
{
"error": true,
"code": 403,
"message": "Changing where alerts go needs a role that can edit monitors."
}

The project has no check or tunnel with this ID, or the project doesn’t exist.

Media typeapplication/json
object
error
required
boolean
code
required

The HTTP status, repeated.

integer
message
required

What went wrong.

string
details

More detail, on some errors.

retry_after

Seconds to wait, on the 429 for wrong keys.

integer
Examples
{
"error": true,
"code": 404,
"message": "Check or tunnel not found"
}

A usage limit was reached, or this IP address made too many requests with a wrong key.

Usage limits are per workspace and plan: per minute (Retry-After: 60), per day (Retry-After: 3600), and per month (no Retry-After). They use their own body shape. An IP address may send 10 wrong keys a minute; one more is allowed every 6 seconds. While that allowance is used up, every request from the address is refused, even one with a valid key.

Media typeapplication/json
One of:
object
error
required
string
Allowed values: Rate limit exceeded Daily limit exceeded Monthly limit exceeded
message
required
string
retry_after

Seconds to wait. Absent for the monthly limit.

integer
Examples
{
"error": "Rate limit exceeded",
"message": "Per-minute limit of 60 requests exceeded",
"retry_after": 60
}
Retry-After
integer

Seconds to wait. 60 for the per-minute limit, 3600 for the daily limit, 6 after wrong keys. Absent for the monthly limit.

Something failed on TunnelHQ’s side.

Media typeapplication/json
object
error
required
boolean
code
required

The HTTP status, repeated.

integer
message
required

What went wrong.

string
details

More detail, on some errors.

retry_after

Seconds to wait, on the 429 for wrong keys.

integer
Example
{
"error": true,
"code": 500,
"message": "Internal server error"
}