Skip to content

List an incident's activity

GET
/incidents/{id}/events
curl --request GET \
--url https://app.tunnelhq.com/api/v1/incidents/inc_318/events \
--header 'X-API-Key: <X-API-Key>' \
--header 'X-Project-Id: prj_12'

The incident’s activity log, oldest first. Any role in the project can call it.

Need an API key? See Getting an API key.

id
required
string

The incident, as inc_318 or 318.

Example
inc_318
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

The activity log.

Media typeapplication/json
object
incident_id
required
string
events
required
Array<object>
object
type
required
string
Allowed values: opened status_changed acknowledged unacknowledged comment resolved reopened
actor
required

system for automatic events; otherwise the person’s email.

string | null
message
required

A comment or an acknowledgement note.

string | null
detail
required

{"status": …} when opened; {"from": …, "to": …} when the status changed.

object | null
created_at
required

ISO 8601, UTC.

string
Example
{
"incident_id": "inc_301",
"events": [
{
"type": "opened",
"actor": "system",
"message": null,
"detail": {
"status": "degraded"
},
"created_at": "2026-09-24T22:05:10.000Z"
},
{
"type": "acknowledged",
"actor": "[email protected]",
"message": "Looking into the upstream route",
"detail": null,
"created_at": "2026-09-24T22:06:02.000Z"
},
{
"type": "resolved",
"actor": "system",
"message": null,
"detail": null,
"created_at": "2026-09-24T22:08:14.000Z"
}
]
}
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 incident ID isn’t a valid ID, or the X-Project-Id header is missing or malformed.

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": "Invalid incident ID"
}

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>"
}

The key can’t reach this project.

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": 403,
"message": "This API key is scoped to a different organization"
}

The project has no such incident.

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": 404,
"message": "Incident 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"
}