# Monitoring
Monitors, their results and uptime, and deploy markers.
**Common tasks**
- [Create a monitor](#post-organizations-organization-monitoring-checks)
- [Pause a monitor during a deploy](#post-organizations-organization-monitoring-checks-monitoringcheck-pause)
- [The monthly uptime report](#get-organizations-organization-uptime-report)
**Only in the app:** Nothing. Monitors can be fully managed with a token.
**How it works in the app:** [help article](https://infranest.io/docs/add-a-monitor).
**Scopes:** Read with `monitoring.read`, change with `monitoring.write`. See [Tokens and scopes](../tokens-and-scopes.md#scopes).
[Attention summary](#attention-summary) 1 · [Deploy events](#deploy-events) 3 · [Deploy links](#deploy-links) 5 · [Deploy tokens](#deploy-tokens) 1 · [Email DNS monitors](#email-dns-monitors) 2 · [External services](#external-services) 1 · [Monitoring](#monitoring) 1 · [Monitoring checks](#monitoring-checks) 25 · [Status](#status) 1 · [Uptime report](#uptime-report) 2
Every endpoint below takes a token in the `Authorization: Bearer` header and answers JSON. Errors use the shared format in [Errors](../errors.md). Base address: `https://api.infranest.io/api`.
## Attention summary
### Get your attention summary preview {#get-organizations-organization-attention-summary}
`GET` `/organizations/{organization}/attention-summary`
**Scope:** `monitoring.read` · **Changes data:** no
When your next “needs you” summary for this organization is due, how it is delivered, and a preview of up to 10 items it would contain. `receives` is false when you have turned the summary off, and `available` is false when it cannot be put together right now.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/attention-summary" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"hour": null,
"organisation_hour": 10,
"next_at": "2026-01-16T10:00:00+00:00",
"via": "email",
"telegram": true,
"receives": true,
"available": true,
"count": 13,
"new": 13,
"will_send": true,
"items": [
{
"title": "northwind-labs.com will not renew itself",
"detail": "Expires Jan 24, 2026 and auto-renew is off.",
"route": "/domains/14",
"severity": "warning",
"new": true
},
{
"title": "northwind.shop will not renew itself",
"detail": "Expires Jan 26, 2026 and auto-renew is off.",
"route": "/domains/10",
"severity": "warning",
"new": true
}
]
}
```
## Deploy events
### List deploys for a monitor or server {#get-organizations-organization-deploy-events}
`GET` `/organizations/{organization}/deploy-events`
**Scope:** `monitoring.read` · **Changes data:** no
The deploys linked to one monitor (`monitor`) or server (`server`) between `from` and `to`; the window defaults to the 24 hours before `to`, which defaults to now. Also lists the repositories linked to it.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitor`
body | integer | This field is required when server is not present. |
| `server`
body | integer | This field is required when monitor is not present. |
| `from`
body | string, nullable | Must be a valid date. |
| `to`
body | string, nullable | Must be a valid date. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/deploy-events" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"data": [],
"links": [],
"receives_deploys": true,
"manage_path": "/integrations/github"
}
```
---
### Get what a deploy changed {#get-organizations-organization-deploy-events-deployevent-changes}
`GET` `/organizations/{organization}/deploy-events/{deployEvent}/changes`
**Scope:** `monitoring.read` · **Changes data:** no
The commits and pull requests since the previous successful deploy to the same place. Returns `first: true` when there is no earlier deploy to compare with, and `unavailable: true` when GitHub could not say.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `deployEvent_id`
path · required | integer | The deployEvent's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/deploy-events/1/changes" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"first": true
}
```
---
### List repositories that have deployed {#get-organizations-organization-deploy-events-sources}
`GET` `/organizations/{organization}/deploy-events/sources`
**Scope:** `monitoring.read` · **Changes data:** no
Each repository and environment that has already reported a deploy to your organization, up to 500.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/deploy-events/sources" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"data": [
{
"repository": "northwind-cloud/app",
"environment": "production"
},
{
"repository": "northwind-cloud/storefront",
"environment": "production"
}
]
}
```
## Deploy links
### List deploy links {#get-organizations-organization-deploy-links}
`GET` `/organizations/{organization}/deploy-links`
**Scope:** `monitoring.read` · **Changes data:** no
Your links between a repository and a monitor, server or tag, each with its newest deploy. Pass `monitor` to list only that monitor’s own links; `deploys_connected` says whether anything can report deploys to your organization.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/deploy-links" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"data": [
{
"id": 1,
"repository": "northwind-cloud/app",
"kind": "deployment",
"environment": "production",
"workflow": null,
"branch": null,
"target_type": "monitor",
"target_id": 2,
"target_name": "App — northwind-app.dev",
"last_deploy_at": "2026-01-15T11:18:00+00:00",
"has_deployments": true,
"checking": true
},
{
"id": 2,
"repository": "northwind-cloud/storefront",
"kind": "deployment",
"environment": "production",
"workflow": null,
"branch": null,
"target_type": "monitor",
"target_id": 4,
"target_name": "Checkout flow",
"last_deploy_at": "2026-01-15T11:17:00+00:00",
"has_deployments": true,
"checking": true
}
],
"deploys_connected": true,
"source": {
"key": "github",
"label": "GitHub"
}
}
```
---
### Create a deploy link {#post-organizations-organization-deploy-links}
`POST` `/organizations/{organization}/deploy-links`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Links deploys of a `repository` to a monitor, server or tag (`target_type` and `target_id`). `kind` chooses what counts as a deploy: `deployment` (optionally for one `environment`), `workflow` (a `workflow` file, optionally on one `branch`) or `release`; earlier deploys are imported in the background.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `repository`
body · required | string | Must not be greater than 255 characters. |
| `environment`
body | string, nullable | Must not be greater than 255 characters. |
| `target_type`
body · required | string | |
| `target_id`
body · required | integer | |
| `kind`
body | string, nullable | What counts as a deploy. A workflow is named by its file, as GitHub's API addresses it. |
| `workflow`
body | string, nullable | This field is required when kind is workflow. Must match the regex /^[\w.-]+\.ya?ml$/. Must not be greater than 255 characters. |
| `branch`
body | string, nullable | Must not be greater than 255 characters. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`idempotency_in_progress`](../errors.md#idempotency_in_progress), [`validation_failed`](../errors.md#validation_failed), [`idempotency_key_reused`](../errors.md#idempotency_key_reused), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X POST "https://api.infranest.io/api/organizations/42/deploy-links" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"repository":"northwind-cloud/app","target_type":"server","target_id":1}'
```
**Response** · 201 — Created
```json
{
"id": 3,
"repository": "northwind-cloud/app",
"kind": "deployment",
"environment": null,
"workflow": null,
"branch": null,
"target_type": "server",
"target_id": 1,
"target_name": "web-01",
"last_deploy_at": "2026-01-15T11:18:00+00:00",
"has_deployments": true,
"checking": true
}
```
---
### Delete a deploy link {#delete-organizations-organization-deploy-links-deploylink}
`DELETE` `/organizations/{organization}/deploy-links/{deployLink}`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Removes the link, so its deploys no longer appear on that monitor, server or tag.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `deployLink_id`
path · required | integer | The deployLink's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X DELETE "https://api.infranest.io/api/organizations/42/deploy-links/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"ok": true
}
```
---
### Check whether a repository has deploys {#get-organizations-organization-deploy-links-check}
`GET` `/organizations/{organization}/deploy-links/check`
**Scope:** `monitoring.read` · **Changes data:** no
Whether GitHub has any deployment for `repository`, so you can tell before linking one that never deploys. `has_deployments` is null when GitHub could not be asked.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/deploy-links/check" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"has_deployments": null
}
```
---
### List deploy link targets {#get-organizations-organization-deploy-links-targets}
`GET` `/organizations/{organization}/deploy-links/targets`
**Scope:** `monitoring.read` · **Changes data:** no
The monitors, servers and tags a deploy link can point at, by ID and name.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/deploy-links/targets" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"monitors": [
{
"id": 3,
"name": "API health"
},
{
"id": 2,
"name": "App — northwind-app.dev"
}
],
"servers": [
{
"id": 13,
"name": "analytics-01"
},
{
"id": 3,
"name": "api-01"
}
],
"tags": [
{
"id": 3,
"name": "Customer-facing"
},
{
"id": 4,
"name": "Internal"
}
]
}
```
## Deploy tokens
### List deploy tokens {#get-organizations-organization-deploy-tokens}
`GET` `/organizations/{organization}/deploy-tokens`
**Scope:** `monitoring.read` · **Changes data:** no
Your deploy tokens, newest first, with their name, creator, the monitors each token applies to, whether a signature is required and when each token was last used. Token secrets are never returned.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/deploy-tokens" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
[
{
"id": 1,
"name": "CI — deploy hook",
"created_by": 1,
"last_used_at": "2026-01-11T12:00:00.000000Z",
"monitor_ids": [],
"require_signature": true,
"created_at": "2026-01-15T12:00:00.000000Z",
"creator": {
"id": 1,
"name": "Alex Rivera",
"analytics_id": null
}
},
{
"id": 2,
"name": "Staging redeploy",
"created_by": 1,
"last_used_at": "2025-12-27T12:00:00.000000Z",
"monitor_ids": [],
"require_signature": false,
"created_at": "2026-01-15T12:00:00.000000Z",
"creator": {
"id": 1,
"name": "Alex Rivera",
"analytics_id": null
}
}
]
```
## Email DNS monitors
### Preview email DNS monitors for a domain {#get-organizations-organization-email-dns-monitors}
`GET` `/organizations/{organization}/email-dns-monitors`
**Scope:** `monitoring.read` · **Changes data:** no
Looks up the MX, SPF and DMARC records the domain in `domain` publishes and returns the DNS monitors that would watch those records. Nothing is created; `resolved` is false when the lookup failed.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/email-dns-monitors" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
---
### Create email DNS monitors for a domain {#post-organizations-organization-email-dns-monitors}
`POST` `/organizations/{organization}/email-dns-monitors`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Creates one DNS monitor for each MX, SPF and DMARC record the domain in `domain` publishes right now, and queues a first check of each. Either every monitor is created or none is: the request is refused when the domain publishes none of those records or the monitors would exceed your plan.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`idempotency_in_progress`](../errors.md#idempotency_in_progress), [`validation_failed`](../errors.md#validation_failed), [`idempotency_key_reused`](../errors.md#idempotency_key_reused), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X POST "https://api.infranest.io/api/organizations/42/email-dns-monitors" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
## External services
### List external services {#get-organizations-organization-external-services}
`GET` `/organizations/{organization}/external-services`
**Scope:** `monitoring.read` · **Changes data:** no
The third-party services you can watch: the curated catalogue plus any you added yourself. Each comes with its status page address, overall status, components and when it was last polled.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/external-services" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
[
{
"id": 16,
"name": "Anthropic",
"status_url": "https://status.anthropic.com",
"schema": null,
"overall_status": "unknown",
"components": null,
"is_curated": true,
"last_polled_at": null
},
{
"id": 19,
"name": "Atlassian",
"status_url": "https://status.atlassian.com",
"schema": null,
"overall_status": "unknown",
"components": null,
"is_curated": true,
"last_polled_at": null
}
]
```
## Monitoring
### List active probe regions {#get-monitoring-active-regions}
`GET` `/monitoring/active-regions`
**Scope:** `monitoring.read` · **Changes data:** no
The regions that currently have at least one active probe, as a sorted list of region names. Use these values when choosing where a monitor runs.
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/monitoring/active-regions" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
[]
```
## Monitoring checks
### List monitors {#get-organizations-organization-monitoring-checks}
`GET` `/organizations/{organization}/monitoring-checks`
**Scope:** `monitoring.read` · **Changes data:** no
A paginated list of your monitors with their type, target, interval, current status, 24-hour uptime and a 24-hour status chart, plus status counts in `meta`. Filter with `search`, `type`, `kind` (`own` or `external`), `status`, `enabled` and `tag`, and sort with `sort` and `dir`; pass `all=true` for a plain unpaginated list of every monitor.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/monitoring-checks" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"current_page": 1,
"data": [
{
"id": 3,
"organization_id": 1,
"name": "API health",
"type": "http",
"target": "https://api.northwind.com/health",
"enabled": true,
"settings": [],
"last_status": "up",
"last_checked_at": "2026-01-15T11:58:00.000000Z",
"deleted_at": null,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"last_message": "HTTP 200 — OK",
"consecutive_failures": 0,
"flap_threshold": 2,
"last_status_changed_at": "2026-01-14T12:00:00.000000Z",
"consensus_threshold": 1,
"preferred_regions": [
"EU"
],
"probe_mode": "any",
"ip_version": "prefer_ipv4",
"slow_response_ms": null,
"ssl_check_enabled": true,
"ssl_expiry_days": 21,
"heartbeat_uuid": null,
"last_ping_at": null,
"silenced_until": null,
"silenced_by": null,
"is_suppressed_by_parent": false,
"external_service_id": null,
"external_component_ids": null,
"external_alerts_enabled": false,
"region_checked_at": null,
"region_consensus_threshold": null,
"last_reason_code": null,
"last_reason_params": null,
"interval_seconds": 300,
"badge_enabled": false,
"badge_token": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null,
"server_id": null,
"server_link": null,
"pagerduty_down_severity": "critical",
"pagerduty_degraded_severity": "warning",
"alert_channels_count": 0,
"uptime_24h": "0.0",
"uptime_chart_24h": [
"up",
"up"
],
"in_maintenance": false,
"effective_interval_seconds": 300,
"interval_minutes": 5,
"tags": [
{
"id": 5,
"name": "Northwind Retail",
"color": "#0ea5e9",
"pivot": {
"taggable_type": "App\\Models\\MonitoringCheck",
"taggable_id": 3,
"tag_id": 5
}
},
{
"id": 1,
"name": "Production",
"color": "#ef4444",
"pivot": {
"taggable_type": "App\\Models\\MonitoringCheck",
"taggable_id": 3,
"tag_id": 1
}
}
]
},
{
"id": 2,
"organization_id": 1,
"name": "App — northwind-app.dev",
"type": "http",
"target": "https://northwind-app.dev",
"enabled": true,
"settings": [],
"last_status": "up",
"last_checked_at": "2026-01-15T11:58:00.000000Z",
"deleted_at": null,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"last_message": "HTTP 200 — OK",
"consecutive_failures": 0,
"flap_threshold": 2,
"last_status_changed_at": "2026-01-14T12:00:00.000000Z",
"consensus_threshold": 1,
"preferred_regions": [
"EU"
],
"probe_mode": "any",
"ip_version": "prefer_ipv4",
"slow_response_ms": null,
"ssl_check_enabled": true,
"ssl_expiry_days": 21,
"heartbeat_uuid": null,
"last_ping_at": null,
"silenced_until": null,
"silenced_by": null,
"is_suppressed_by_parent": false,
"external_service_id": null,
"external_component_ids": null,
"external_alerts_enabled": false,
"region_checked_at": null,
"region_consensus_threshold": null,
"last_reason_code": null,
"last_reason_params": null,
"interval_seconds": 300,
"badge_enabled": false,
"badge_token": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null,
"server_id": null,
"server_link": null,
"pagerduty_down_severity": "critical",
"pagerduty_degraded_severity": "warning",
"alert_channels_count": 0,
"uptime_24h": "0.0",
"uptime_chart_24h": [
"up",
"up"
],
"in_maintenance": false,
"effective_interval_seconds": 300,
"interval_minutes": 5,
"tags": [
{
"id": 6,
"name": "Northwind Platform",
"color": "#14b8a6",
"pivot": {
"taggable_type": "App\\Models\\MonitoringCheck",
"taggable_id": 2,
"tag_id": 6
}
},
{
"id": 1,
"name": "Production",
"color": "#ef4444",
"pivot": {
"taggable_type": "App\\Models\\MonitoringCheck",
"taggable_id": 2,
"tag_id": 1
}
}
]
}
],
"first_page_url": "http://localhost/api/organizations/1/monitoring-checks?page=1",
"from": 1,
"last_page": 1,
"last_page_url": "http://localhost/api/organizations/1/monitoring-checks?page=1",
"links": [
{
"url": null,
"label": "« Previous",
"page": null,
"active": false
},
{
"url": "http://localhost/api/organizations/1/monitoring-checks?page=1",
"label": "1",
"page": 1,
"active": true
}
],
"next_page_url": null,
"path": "http://localhost/api/organizations/1/monitoring-checks",
"per_page": 25,
"prev_page_url": null,
"to": 13,
"total": 13,
"meta": {
"locked_ids": [],
"counts": {
"total": 13,
"up": 10,
"down": 1,
"degraded": 1,
"paused": 1,
"silenced": 0,
"pending": 0
},
"tags": [
{
"id": 6,
"name": "Northwind Platform",
"color": "#14b8a6"
},
{
"id": 5,
"name": "Northwind Retail",
"color": "#0ea5e9"
}
]
}
}
```
---
### Create a monitor {#post-organizations-organization-monitoring-checks}
`POST` `/organizations/{organization}/monitoring-checks`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Creates a monitor and queues its first check. Pass `external_service_id` instead of a target to watch a third-party status page; a heartbeat monitor gets its own ping URL as its target. Refused when the monitor count, interval, check type or regions are beyond your plan.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `name`
body · required | string | Must not be greater than 255 characters. |
| `type`
body · required | string | One of: `http`, `port`, `ssl`, `dns`, `keyword`, `redirect`, `ping`, `api`, `heartbeat`, `third_party`. |
| `external_service_id`
body | integer, nullable | |
| `external_component_ids`
body | array | Must not be greater than 255 characters. |
| `external_alerts_enabled`
body | boolean, nullable | |
| `target`
body · required | string | Must not be greater than 500 characters. |
| `interval_seconds`
body | integer | One of: `30`, `60`, `120`, `300`, `600`, `900`, `1800`, `3600`, `7200`, `10800`, `21600`, `32400`, …. |
| `enabled`
body | boolean | |
| `pagerduty_down_severity`
body | string | One of: `critical`, `error`, `warning`, `info`. |
| `pagerduty_degraded_severity`
body | string | One of: `critical`, `error`, `warning`, `info`. |
| `flap_threshold`
body | integer | Must be at least 1. Must not be greater than 10. |
| `region_consensus_threshold`
body | integer, nullable | Must be at least 1. Must not be greater than 10. |
| `preferred_regions`
body | array | |
| `probe_mode`
body | string | One of: `any`, `all`. |
| `ip_version`
body | string | One of: `ipv4`, `ipv6`, `prefer_ipv4`, `prefer_ipv6`. |
| `slow_response_ms`
body | integer, nullable | Must be at least 50. Must not be greater than 30000. |
| `ssl_check_enabled`
body | boolean | |
| `ssl_expiry_days`
body | integer, nullable | Must be at least 1. Must not be greater than 90. |
| `settings`
body | object | |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`idempotency_in_progress`](../errors.md#idempotency_in_progress), [`validation_failed`](../errors.md#validation_failed), [`idempotency_key_reused`](../errors.md#idempotency_key_reused), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X POST "https://api.infranest.io/api/organizations/42/monitoring-checks" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"name":"Checkout API","type":"http","target":"https://example.com/health","interval":300}'
```
**Response** · 201 — Created
```json
{
"last_status": "unknown",
"enabled": true,
"pagerduty_down_severity": "critical",
"pagerduty_degraded_severity": "warning",
"name": "Checkout API",
"type": "http",
"target": "https://example.com/health",
"organization_id": 1,
"server_id": null,
"server_link": null,
"settings": [],
"updated_at": "2026-01-15T12:00:00.000000Z",
"created_at": "2026-01-15T12:00:00.000000Z",
"id": 15,
"alert_channels_count": 0,
"interval_minutes": 0,
"tags": []
}
```
---
### Get a monitor {#get-organizations-organization-monitoring-checks-monitoringcheck}
`GET` `/organizations/{organization}/monitoring-checks/{monitoringCheck}`
**Scope:** `monitoring.read` · **Changes data:** no
One monitor with its settings, alert channels, tags, dependencies, maintenance windows, the status pages it appears on, its 30 most recent results and the interval it actually runs at under your plan.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/monitoring-checks/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"id": 1,
"organization_id": 1,
"name": "Marketing site",
"type": "http",
"target": "https://northwind.com",
"enabled": true,
"settings": [],
"last_status": "up",
"last_checked_at": "2026-01-15T11:58:00.000000Z",
"deleted_at": null,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"last_message": "HTTP 200 — OK",
"consecutive_failures": 0,
"flap_threshold": 2,
"last_status_changed_at": "2026-01-14T12:00:00.000000Z",
"consensus_threshold": 1,
"preferred_regions": [
"EU"
],
"probe_mode": "any",
"ip_version": "prefer_ipv4",
"slow_response_ms": null,
"ssl_check_enabled": true,
"ssl_expiry_days": 21,
"heartbeat_uuid": null,
"last_ping_at": null,
"silenced_until": null,
"silenced_by": null,
"is_suppressed_by_parent": false,
"external_service_id": null,
"external_component_ids": null,
"external_alerts_enabled": false,
"region_checked_at": null,
"region_consensus_threshold": null,
"last_reason_code": null,
"last_reason_params": null,
"interval_seconds": 300,
"badge_enabled": false,
"badge_token": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null,
"server_id": null,
"server_link": null,
"pagerduty_down_severity": "critical",
"pagerduty_degraded_severity": "warning",
"results_count": 576,
"alert_channels_count": 0,
"status_pages": [
{
"id": 1,
"name": "Northwind Cloud Status",
"slug": "northwind",
"is_public": true,
"display_name": "Website"
}
],
"recent_statuses": [
"up",
"up"
],
"recent_results": [
{
"status": "up",
"checked_at": "2026-01-15T09:35:00Z",
"region": null
},
{
"status": "up",
"checked_at": "2026-01-15T09:40:00Z",
"region": null
}
],
"pagerduty_oncall": [],
"released_address": null,
"effective_interval_seconds": 300,
"interval_minutes": 5,
"alert_channels": [],
"tags": [
{
"id": 5,
"name": "Northwind Retail",
"color": "#0ea5e9",
"pivot": {
"taggable_type": "App\\Models\\MonitoringCheck",
"taggable_id": 1,
"tag_id": 5
}
},
{
"id": 1,
"name": "Production",
"color": "#ef4444",
"pivot": {
"taggable_type": "App\\Models\\MonitoringCheck",
"taggable_id": 1,
"tag_id": 1
}
}
],
"parent_checks": [],
"child_checks": [],
"maintenance_windows": [
{
"id": 2,
"organization_id": 1,
"name": "Load balancer certificate rotation",
"description": "Replaced the certificate on web-lb and reloaded the listeners.",
"starts_at": "2026-01-06T01:00:00.000000Z",
"ends_at": "2026-01-06T01:30:00.000000Z",
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"recurrence_type": "none",
"recurrence_days": null,
"start_time": null,
"duration_minutes": null,
"suppress_alerts": true,
"status": "completed",
"notified_at": null,
"source": "manual",
"deploy_id": null,
"deleted_at": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null,
"created_by": null,
"checks": [],
"tags": []
},
{
"id": 1,
"organization_id": 1,
"name": "Database cluster upgrade",
"description": "Rolling upgrade of the PostgreSQL primary and its replica. Brief API slowdowns are possible; no downtime is expected.",
"starts_at": "2026-01-18T02:00:00.000000Z",
"ends_at": "2026-01-18T03:00:00.000000Z",
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"recurrence_type": "none",
"recurrence_days": null,
"start_time": null,
"duration_minutes": null,
"suppress_alerts": true,
"status": "scheduled",
"notified_at": null,
"source": "manual",
"deploy_id": null,
"deleted_at": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null,
"created_by": null,
"checks": [],
"tags": []
}
],
"latest_ssl_certificate": {
"id": 1,
"organization_id": 1,
"source": "probe",
"monitoring_check_id": 1,
"domain_id": 1,
"cloud_server_id": null,
"provider_credential_id": null,
"fingerprint": "6f6f72db300125c26f8b2c866124ffb57e60a201177144ed5e5b6711eba24cb9",
"subject": "northwind.com",
"issuer": "Let's Encrypt (R3)",
"serial": "2395BA42",
"sans": [
"northwind.com",
"www.northwind.com"
],
"not_before": "2025-12-30T12:00:00.000000Z",
"not_after": "2026-03-30T12:00:00.000000Z",
"purpose": "tls_server",
"key_algo": "rsa",
"key_bits": 2048,
"sig_algo": "SHA256-RSA",
"trust": "public",
"validation": "DV",
"is_wildcard": false,
"is_multi_san": true,
"managed": true,
"renewal_source": "Let's Encrypt (R3)",
"classification_override": null,
"status": "valid",
"superseded_by_id": null,
"dismissed_at": null,
"deployment_locations": [
{
"endpoint": "northwind.com:443",
"last_seen": "2026-01-15T11:50:00+00:00",
"first_seen": "2026-01-08T12:00:00+00:00"
}
],
"owner": null,
"notes": null,
"first_seen_at": "2025-11-16T12:00:00.000000Z",
"last_seen_at": "2026-01-15T06:00:00.000000Z",
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"subject_org": null,
"subject_location": null,
"chain": [
{
"subject": "northwind.com",
"issuer": "Let's Encrypt (R3)",
"is_ca": false,
"self_signed": false,
"not_after": "2026-03-30T12:00:00+00:00",
"fingerprint": "6f6f72db300125c26f8b2c866124ffb57e60a201177144ed5e5b6711eba24cb9"
},
{
"subject": "Let's Encrypt (R3)",
"issuer": "ISRG Root X1",
"is_ca": true,
"self_signed": false,
"not_after": "2030-01-15T12:00:00+00:00",
"fingerprint": "e04ca19ed66485fb479283c98fbfb4cda1ab67de1965304902bec3f6a55a2c8e"
}
],
"chain_status": "trusted",
"sources": [
{
"source": "probe",
"last_seen": "2026-01-15T06:00:00+00:00",
"first_seen": "2025-11-16T12:00:00+00:00"
}
],
"crl_url": null,
"ocsp_url": null,
"caa_status": "ok",
"caissuer_url": "http://r3.i.lencr.org/",
"no_auto_merge": false,
"price_yearly": "0.00",
"price_source": "manual",
"price_currency": "EUR",
"billing_interval": "yearly",
"interval_count": 1,
"renewal_type": "automatic",
"renewal_type_basis": "guess",
"served_status": "served",
"served_checked_at": "2026-01-15T11:50:00.000000Z",
"subscription_ends_at": null,
"seller": null,
"role": null,
"ct_finding": null,
"owner_user_id": null
}
}
```
---
### Update a monitor {#put-organizations-organization-monitoring-checks-monitoringcheck}
`PUT` `/organizations/{organization}/monitoring-checks/{monitoringCheck}`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Changes only the fields you send; keys inside `settings` are merged rather than replaced. Refused when a new interval, check type or set of regions is beyond your plan.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
| `name`
body | string | Must not be greater than 255 characters. |
| `server_id`
body | integer, nullable | Must match an existing stored value. |
| `server_link_auto`
body | boolean | |
| `type`
body | string | One of: `http`, `port`, `ssl`, `dns`, `keyword`, `redirect`, `ping`, `api`, `heartbeat`, `third_party`. |
| `external_component_ids`
body | array | Must not be greater than 255 characters. |
| `external_alerts_enabled`
body | boolean | |
| `target`
body | string | Must not be greater than 500 characters. |
| `interval_seconds`
body | integer | One of: `30`, `60`, `120`, `300`, `600`, `900`, `1800`, `3600`, `7200`, `10800`, `21600`, `32400`, …. |
| `enabled`
body | boolean | |
| `pagerduty_down_severity`
body | string | One of: `critical`, `error`, `warning`, `info`. |
| `pagerduty_degraded_severity`
body | string | One of: `critical`, `error`, `warning`, `info`. |
| `flap_threshold`
body | integer | Must be at least 1. Must not be greater than 10. |
| `region_consensus_threshold`
body | integer, nullable | Must be at least 1. Must not be greater than 10. |
| `preferred_regions`
body | array | |
| `probe_mode`
body | string | One of: `any`, `all`. |
| `ip_version`
body | string | One of: `ipv4`, `ipv6`, `prefer_ipv4`, `prefer_ipv6`. |
| `slow_response_ms`
body | integer, nullable | Must be at least 50. Must not be greater than 30000. |
| `ssl_check_enabled`
body | boolean | |
| `ssl_expiry_days`
body | integer, nullable | Must be at least 1. Must not be greater than 90. |
| `settings`
body | object | |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`validation_failed`](../errors.md#validation_failed), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X PUT "https://api.infranest.io/api/organizations/42/monitoring-checks/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"interval_seconds":300}'
```
**Response** · 200
```json
{
"id": 1,
"organization_id": 1,
"name": "Marketing site",
"type": "http",
"target": "https://northwind.com",
"enabled": true,
"settings": [],
"last_status": "up",
"last_checked_at": "2026-01-15T11:58:00.000000Z",
"deleted_at": null,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"last_message": "HTTP 200 — OK",
"consecutive_failures": 0,
"flap_threshold": 2,
"last_status_changed_at": "2026-01-14T12:00:00.000000Z",
"consensus_threshold": 1,
"preferred_regions": [
"EU"
],
"probe_mode": "any",
"ip_version": "prefer_ipv4",
"slow_response_ms": null,
"ssl_check_enabled": true,
"ssl_expiry_days": 21,
"heartbeat_uuid": null,
"last_ping_at": null,
"silenced_until": null,
"silenced_by": null,
"is_suppressed_by_parent": false,
"external_service_id": null,
"external_component_ids": null,
"external_alerts_enabled": false,
"region_checked_at": null,
"region_consensus_threshold": null,
"last_reason_code": null,
"last_reason_params": null,
"interval_seconds": 300,
"badge_enabled": false,
"badge_token": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null,
"server_id": null,
"server_link": null,
"pagerduty_down_severity": "critical",
"pagerduty_degraded_severity": "warning",
"alert_channels_count": 1,
"interval_minutes": 5
}
```
---
### Delete a monitor {#delete-organizations-organization-monitoring-checks-monitoringcheck}
`DELETE` `/organizations/{organization}/monitoring-checks/{monitoringCheck}`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Permanently deletes the monitor. A monitor locked because it is over your plan’s limit cannot be deleted this way.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X DELETE "https://api.infranest.io/api/organizations/42/monitoring-checks/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 204 — no content
---
### List what an external service affects {#get-organizations-organization-monitoring-checks-monitoringcheck-affected}
`GET` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/affected`
**Scope:** `monitoring.read` · **Changes data:** no
For a monitor that watches a third-party status page: the DNS zones, domains, monitors and servers of yours that depend on that service. Each has a `source` of `manual` (linked by you) or `auto` (zones and domains at the matching provider, detected by InfraNest).
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/monitoring-checks/1/affected" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"provider": null,
"resources": []
}
```
---
### Link a resource to an external service {#post-organizations-organization-monitoring-checks-monitoringcheck-affected}
`POST` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/affected`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Records that one of your resources, given by `resource_type` and `resource_id`, depends on the third-party service this monitor watches. Only works on monitors that watch a third-party status page.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
| `resource_type`
body · required | string | |
| `resource_id`
body · required | integer | |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`idempotency_in_progress`](../errors.md#idempotency_in_progress), [`validation_failed`](../errors.md#validation_failed), [`idempotency_key_reused`](../errors.md#idempotency_key_reused), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X POST "https://api.infranest.io/api/organizations/42/monitoring-checks/1/affected" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"resource_type":"","resource_id":16}'
```
---
### Unlink a resource from an external service {#delete-organizations-organization-monitoring-checks-monitoringcheck-affected-type-resourceid}
`DELETE` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/affected/{type}/{resourceId}`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Removes a resource you linked to the third-party service this monitor watches. Automatically detected links cannot be removed this way.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
| `type`
path · required | string | The type. |
| `resourceId`
path · required | string | The resourceId. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X DELETE "https://api.infranest.io/api/organizations/42/monitoring-checks/1/affected/1/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
---
### Get a monitor’s uptime and response times for a period {#get-organizations-organization-monitoring-checks-monitoringcheck-aggregates}
`GET` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/aggregates`
**Scope:** `monitoring.read` · **Changes data:** no
Totals for one window: `uptime_percent` (the share of the time no confirmed outage covered, the figure the app shows), `up_percent` (the share of checks that came back up), checks by outcome, p50 and p95 response time in milliseconds, and the number and minutes of unplanned incidents. Pick `period` (`24h`, `7d`, `30d` or `90d`, default `24h`) or set `from` and `to` (ISO 8601, at most 366 days apart; longer is refused with `range_too_large`); the window starts on the hour `from` falls in. Pass `region` for one probe region, where `uptime_percent` is the share of checks that were up. Response times over more than one hour or probe are averaged from hourly figures, weighted by the number of checks, so they are close rather than exact. `uptime_percent` is null when nothing was measured.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
| `period`
query | string | `24h`, `7d`, `30d` or `90d`. Default `24h`; ignored when `from` or `to` is sent. |
| `from`
query | string | Start of the window, ISO 8601; rounded down to the hour. |
| `to`
query | string | End of the window, ISO 8601; default now. |
| `region`
query | string | Only checks from probes in this region. |
| `period`
body | string | |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/monitoring-checks/1/aggregates" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"monitoring_check_id": 1,
"period": "24h",
"from": "2026-01-14T12:00:00Z",
"to": "2026-01-15T12:00:00Z",
"region": null,
"uptime_percent": null,
"up_percent": 100,
"checks": {
"total": 288,
"up": 288,
"degraded": 0,
"down": 0
},
"response_time_ms": {
"p50": 180,
"p95": 288
},
"incidents": {
"count": 0,
"down_minutes": 0
}
}
```
---
### Attach an alert channel to a monitor {#post-organizations-organization-monitoring-checks-monitoringcheck-alerts}
`POST` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/alerts`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Sends this monitor’s alerts to the alert channel in `alert_channel_id`, which must belong to your organization. Refused if the channel is already attached.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
| `alert_channel_id`
body · required | integer | |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`idempotency_in_progress`](../errors.md#idempotency_in_progress), [`validation_failed`](../errors.md#validation_failed), [`idempotency_key_reused`](../errors.md#idempotency_key_reused), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X POST "https://api.infranest.io/api/organizations/42/monitoring-checks/1/alerts" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"alert_channel_id":1}'
```
**Response** · 201 — Created
```json
{
"id": 1,
"organization_id": 1,
"name": "Ops team — email",
"type": "email",
"settings": {
"email": "ops@northwind.example"
},
"enabled": true,
"deleted_at": null,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"subscriptions": [
"monitoring_down",
"monitoring_recovered"
],
"is_personal": false,
"user_id": null,
"format": "html",
"last_sent_at": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null,
"consecutive_failures": 0,
"last_failure_at": null,
"last_error": null,
"last_error_type": null,
"broken_since": null,
"broken_notified_at": null,
"broken_notify_count": 0,
"awaiting_confirmation_at": null,
"categories": null,
"telegram_link_id": null,
"telegram_chat_id": null,
"slack_installation_id": null,
"slack_channel_id": null
}
```
---
### Detach an alert channel from a monitor {#delete-organizations-organization-monitoring-checks-monitoringcheck-alerts-alertchannel}
`DELETE` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/alerts/{alertChannel}`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Stops sending this monitor’s alerts to the channel. A monitor with no channels left keeps running, but no channel receives its alerts.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
| `alertChannel_id`
path · required | integer | The alertChannel's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X DELETE "https://api.infranest.io/api/organizations/42/monitoring-checks/1/alerts/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 204 — no content
---
### Copy a monitor {#post-organizations-organization-monitoring-checks-monitoringcheck-clone}
`POST` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/clone`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Creates a copy named with “(copy)” appended, with the same settings but no history. The copy starts paused, and counts against your plan like any new monitor.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`idempotency_in_progress`](../errors.md#idempotency_in_progress), [`validation_failed`](../errors.md#validation_failed), [`idempotency_key_reused`](../errors.md#idempotency_key_reused), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X POST "https://api.infranest.io/api/organizations/42/monitoring-checks/1/clone" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 201 — Created
```json
{
"organization_id": 1,
"name": "Marketing site (copy)",
"type": "http",
"target": "https://northwind.com",
"enabled": false,
"settings": [],
"deleted_at": null,
"flap_threshold": 2,
"consensus_threshold": 1,
"preferred_regions": [
"EU"
],
"probe_mode": "any",
"ip_version": "prefer_ipv4",
"slow_response_ms": null,
"ssl_check_enabled": true,
"ssl_expiry_days": 21,
"heartbeat_uuid": null,
"last_ping_at": null,
"silenced_until": null,
"silenced_by": null,
"is_suppressed_by_parent": false,
"external_service_id": null,
"external_component_ids": null,
"external_alerts_enabled": false,
"region_checked_at": null,
"region_consensus_threshold": null,
"last_reason_code": null,
"last_reason_params": null,
"interval_seconds": 300,
"badge_enabled": false,
"badge_token": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null,
"server_id": 1,
"server_link": "inferred",
"pagerduty_down_severity": "critical",
"pagerduty_degraded_severity": "warning",
"updated_at": "2026-01-15T12:00:00.000000Z",
"created_at": "2026-01-15T12:00:00.000000Z",
"id": 16,
"alert_channels_count": 0,
"interval_minutes": 5
}
```
---
### List a monitor’s dependencies {#get-organizations-organization-monitoring-checks-monitoringcheck-dependencies}
`GET` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/dependencies`
**Scope:** `monitoring.read` · **Changes data:** no
The monitors this one depends on (`parents`) and the monitors that depend on it (`children`), each with its name, type, target and current status.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/monitoring-checks/1/dependencies" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"parents": [],
"children": []
}
```
---
### Add a monitor dependency {#post-organizations-organization-monitoring-checks-monitoringcheck-dependencies}
`POST` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/dependencies`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Pass `parent_check_id` to make this monitor depend on another, or `child_check_id` to make another depend on it. Both monitors must be yours, and a dependency on itself or one that would form a loop is refused.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
| `parent_check_id`
body | integer, nullable | This field is required when child_check_id is not present. Must match an existing stored value. |
| `child_check_id`
body | integer, nullable | This field is required when parent_check_id is not present. Must match an existing stored value. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`idempotency_in_progress`](../errors.md#idempotency_in_progress), [`validation_failed`](../errors.md#validation_failed), [`idempotency_key_reused`](../errors.md#idempotency_key_reused), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X POST "https://api.infranest.io/api/organizations/42/monitoring-checks/1/dependencies" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"child_check_id":3}'
```
**Response** · 201 — Created
```json
{
"parent_check_id": 1,
"child_check_id": 3,
"organization_id": 1,
"updated_at": "2026-01-15T12:00:00.000000Z",
"created_at": "2026-01-15T12:00:00.000000Z",
"id": 2
}
```
---
### Remove a monitor dependency {#delete-organizations-organization-monitoring-checks-monitoringcheck-dependencies-othercheck}
`DELETE` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/dependencies/{otherCheck}`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Removes the dependency between the two monitors, in whichever direction it runs.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
| `otherCheck_id`
path · required | integer | The otherCheck's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X DELETE "https://api.infranest.io/api/organizations/42/monitoring-checks/1/dependencies/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"message": "Deleted."
}
```
---
### List a monitor’s incidents {#get-organizations-organization-monitoring-checks-monitoringcheck-incidents}
`GET` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/incidents`
**Scope:** `monitoring.read` · **Changes data:** no
The monitor’s 20 most recent incidents, newest first, with their status, impact, start and end times and duration.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/monitoring-checks/1/incidents" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
[
{
"id": 2,
"source": "monitor",
"title": "Brief marketing-site blip",
"status": "resolved",
"impact": "minor",
"started_at": "2026-01-09T11:45:00.000000Z",
"resolved_at": "2026-01-09T12:00:00.000000Z",
"duration_seconds": 900,
"cause": null,
"description": null,
"external_status": null,
"external_url": null,
"is_planned": false,
"acknowledged_at": null
}
]
```
---
### Edit a monitor incident {#patch-organizations-organization-monitoring-checks-monitoringcheck-incidents-incident}
`PATCH` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/incidents/{incident}`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Changes an incident’s `description`, or marks it as planned with `is_planned`, which takes it out of uptime figures and the status page’s incident history. Incidents imported from a third-party status page cannot be edited.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
| `incident_id`
path · required | integer | The incident's ID. |
| `description`
body | string, nullable | Must not be greater than 2000 characters. |
| `is_planned`
body | boolean, nullable | |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`validation_failed`](../errors.md#validation_failed), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X PATCH "https://api.infranest.io/api/organizations/42/monitoring-checks/1/incidents/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"description":"Caused by an expired upstream certificate.","is_planned":false}'
```
**Response** · 200
```json
{
"id": 2,
"monitoring_check_id": 1,
"started_at": "2026-01-09T11:45:00.000000Z",
"resolved_at": "2026-01-09T12:00:00.000000Z",
"duration_seconds": 900,
"cause": null,
"affected_probe_ids": null,
"acknowledged_at": null,
"acknowledged_by": null,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"description": "Caused by an expired upstream certificate.",
"is_planned": false,
"title": "Brief marketing-site blip",
"status": "resolved",
"impact": "minor",
"source": "monitor",
"server_id": null,
"cloud_server_alert_rule_id": null,
"external_status": null,
"external_url": null,
"alert_rule_state_id": null,
"folded_into": null,
"unstable_at": null,
"unstable_ended_at": null,
"outage_count": 1,
"down_since": null,
"downtime_seconds": 0,
"outages": null,
"acknowledged_by_name": null
}
```
---
### Pause a monitor {#post-organizations-organization-monitoring-checks-monitoringcheck-pause}
`POST` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/pause`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Stops the monitor from running until you resume it, and returns the updated monitor.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`idempotency_in_progress`](../errors.md#idempotency_in_progress), [`validation_failed`](../errors.md#validation_failed), [`idempotency_key_reused`](../errors.md#idempotency_key_reused), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X POST "https://api.infranest.io/api/organizations/42/monitoring-checks/1/pause" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"id": 1,
"organization_id": 1,
"name": "Marketing site",
"type": "http",
"target": "https://northwind.com",
"enabled": false,
"settings": [],
"last_status": "up",
"last_checked_at": "2026-01-15T11:58:00.000000Z",
"deleted_at": null,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"last_message": "HTTP 200 — OK",
"consecutive_failures": 0,
"flap_threshold": 2,
"last_status_changed_at": "2026-01-14T12:00:00.000000Z",
"consensus_threshold": 1,
"preferred_regions": [
"EU"
],
"probe_mode": "any",
"ip_version": "prefer_ipv4",
"slow_response_ms": null,
"ssl_check_enabled": true,
"ssl_expiry_days": 21,
"heartbeat_uuid": null,
"last_ping_at": null,
"silenced_until": null,
"silenced_by": null,
"is_suppressed_by_parent": false,
"external_service_id": null,
"external_component_ids": null,
"external_alerts_enabled": false,
"region_checked_at": null,
"region_consensus_threshold": null,
"last_reason_code": null,
"last_reason_params": null,
"interval_seconds": 300,
"badge_enabled": false,
"badge_token": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null,
"server_id": null,
"server_link": null,
"pagerduty_down_severity": "critical",
"pagerduty_degraded_severity": "warning",
"interval_minutes": 5
}
```
---
### Get who an outage alert would reach {#get-organizations-organization-monitoring-checks-monitoringcheck-reach}
`GET` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/reach`
**Scope:** `monitoring.read` · **Changes data:** no
Whether an outage on this monitor would reach anybody right now: `state` is `ok`, `nobody` or `failing`, with the alert channels it would use, how many members get the status email, and whether it would escalate.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/monitoring-checks/1/reach" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"state": "ok",
"channels": [
{
"id": 1,
"name": "Ops team — email",
"type": "email",
"failing": false
},
{
"id": 2,
"name": "On-call — critical only",
"type": "email",
"failing": false
}
],
"members": 4,
"escalation": {
"via": "pagerduty"
}
}
```
---
### List a monitor’s check results {#get-organizations-organization-monitoring-checks-monitoringcheck-results}
`GET` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/results`
**Scope:** `monitoring.read` · **Changes data:** no
The monitor’s check results, newest first. With `resolution=raw` (the default) each result is one check by one probe, filterable by `status`; individual results are kept for 3 days. With `resolution=hour` or `day` each row sums one hour or one day across probes: checks by outcome (`checks_up`, `checks_degraded` for slow checks, `checks_down` for failures), `up_percent` and the p50 and p95 response times, reaching back as far as your plan keeps history. Set the window with `from` and `to` (ISO 8601; default: everything kept for raw, the last 24 hours for hours, the last 30 days for days), narrow it to one probe `region`, and page with `page` and `per_page` (up to 500, default 50). A range longer than the resolution allows — 3 days raw, 31 days by hour, 366 days by day — is refused with `range_too_large`. `window` repeats the range that was applied.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
| `resolution`
query | string | `raw` (each check, the default), `hour` or `day` (summed across probes). |
| `from`
query | string | Start of the window, ISO 8601. |
| `to`
query | string | End of the window, ISO 8601; default now. |
| `status`
query | string | Raw results only: only this status (`up`, `down`, `degraded`). |
| `region`
query | string | Only results from probes in this region. |
| `per_page`
query | integer | Rows per page, 1 to 500. Default 50. |
| `page`
query | integer | Page number, from 1. |
| `per_page`
body | string | |
| `page`
body | integer | Must be at least 1. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/monitoring-checks/1/results" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"current_page": 1,
"data": [
{
"id": 1,
"monitoring_check_id": 1,
"status": "up",
"response_time_ms": 180,
"status_code": 200,
"message": "HTTP 200 — OK",
"checked_at": "2026-01-15T12:00:00.000000Z",
"meta": null,
"probe_id": null,
"is_failover": false,
"failover_from_region": null,
"ssl_fingerprint": null,
"ssl_expires_at": null,
"scheduled_for": null,
"suppressed_by_probe": false,
"reason_code": null,
"reason_params": null
},
{
"id": 2,
"monitoring_check_id": 1,
"status": "up",
"response_time_ms": 191,
"status_code": 200,
"message": "HTTP 200 — OK",
"checked_at": "2026-01-15T11:55:00.000000Z",
"meta": null,
"probe_id": null,
"is_failover": false,
"failover_from_region": null,
"ssl_fingerprint": null,
"ssl_expires_at": null,
"scheduled_for": null,
"suppressed_by_probe": false,
"reason_code": null,
"reason_params": null
}
],
"first_page_url": "http://localhost/api/organizations/1/monitoring-checks/1/results?page=1",
"from": 1,
"last_page": 12,
"last_page_url": "http://localhost/api/organizations/1/monitoring-checks/1/results?page=12",
"links": [
{
"url": null,
"label": "« Previous",
"page": null,
"active": false
},
{
"url": "http://localhost/api/organizations/1/monitoring-checks/1/results?page=1",
"label": "1",
"page": 1,
"active": true
}
],
"next_page_url": "http://localhost/api/organizations/1/monitoring-checks/1/results?page=2",
"path": "http://localhost/api/organizations/1/monitoring-checks/1/results",
"per_page": 50,
"prev_page_url": null,
"to": 50,
"total": 576,
"window": {
"from": null,
"to": null,
"resolution": "raw"
}
}
```
---
### Resume a monitor {#post-organizations-organization-monitoring-checks-monitoringcheck-resume}
`POST` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/resume`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Starts a paused monitor again, queues a check straight away and returns the updated monitor.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`idempotency_in_progress`](../errors.md#idempotency_in_progress), [`validation_failed`](../errors.md#validation_failed), [`idempotency_key_reused`](../errors.md#idempotency_key_reused), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X POST "https://api.infranest.io/api/organizations/42/monitoring-checks/1/resume" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"id": 1,
"organization_id": 1,
"name": "Marketing site",
"type": "http",
"target": "https://northwind.com",
"enabled": true,
"settings": [],
"last_status": "up",
"last_checked_at": "2026-01-15T11:58:00.000000Z",
"deleted_at": null,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"last_message": "HTTP 200 — OK",
"consecutive_failures": 0,
"flap_threshold": 2,
"last_status_changed_at": "2026-01-14T12:00:00.000000Z",
"consensus_threshold": 1,
"preferred_regions": [
"EU"
],
"probe_mode": "any",
"ip_version": "prefer_ipv4",
"slow_response_ms": null,
"ssl_check_enabled": true,
"ssl_expiry_days": 21,
"heartbeat_uuid": null,
"last_ping_at": null,
"silenced_until": null,
"silenced_by": null,
"is_suppressed_by_parent": false,
"external_service_id": null,
"external_component_ids": null,
"external_alerts_enabled": false,
"region_checked_at": null,
"region_consensus_threshold": null,
"last_reason_code": null,
"last_reason_params": null,
"interval_seconds": 300,
"badge_enabled": false,
"badge_token": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null,
"server_id": null,
"server_link": null,
"pagerduty_down_severity": "critical",
"pagerduty_degraded_severity": "warning",
"interval_minutes": 5
}
```
---
### Run a monitor now {#post-organizations-organization-monitoring-checks-monitoringcheck-run}
`POST` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/run`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Queues an immediate check of the monitor and answers 202 straight away; the result appears in its results once the check has run. Limited by your plan’s hourly allowance of manual checks.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`idempotency_in_progress`](../errors.md#idempotency_in_progress), [`validation_failed`](../errors.md#validation_failed), [`idempotency_key_reused`](../errors.md#idempotency_key_reused), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X POST "https://api.infranest.io/api/organizations/42/monitoring-checks/1/run" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 202
```json
{
"message": "Check queued."
}
```
---
### Silence a monitor’s alerts {#post-organizations-organization-monitoring-checks-monitoringcheck-silence}
`POST` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/silence`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Mutes the monitor’s alerts for `duration_minutes` (1 to 10,080), or until you unsilence it when you leave that out. The monitor keeps running.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
| `duration_minutes`
body | integer, nullable | Must be at least 1. Must not be greater than 10080. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`idempotency_in_progress`](../errors.md#idempotency_in_progress), [`validation_failed`](../errors.md#validation_failed), [`idempotency_key_reused`](../errors.md#idempotency_key_reused), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X POST "https://api.infranest.io/api/organizations/42/monitoring-checks/1/silence" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"duration_minutes":60}'
```
**Response** · 200
```json
{
"id": 1,
"organization_id": 1,
"name": "Marketing site",
"type": "http",
"target": "https://northwind.com",
"enabled": true,
"settings": [],
"last_status": "up",
"last_checked_at": "2026-01-15T11:58:00.000000Z",
"deleted_at": null,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"last_message": "HTTP 200 — OK",
"consecutive_failures": 0,
"flap_threshold": 2,
"last_status_changed_at": "2026-01-14T12:00:00.000000Z",
"consensus_threshold": 1,
"preferred_regions": [
"EU"
],
"probe_mode": "any",
"ip_version": "prefer_ipv4",
"slow_response_ms": null,
"ssl_check_enabled": true,
"ssl_expiry_days": 21,
"heartbeat_uuid": null,
"last_ping_at": null,
"silenced_until": "2026-01-15T13:00:00.000000Z",
"silenced_by": 1,
"is_suppressed_by_parent": false,
"external_service_id": null,
"external_component_ids": null,
"external_alerts_enabled": false,
"region_checked_at": null,
"region_consensus_threshold": null,
"last_reason_code": null,
"last_reason_params": null,
"interval_seconds": 300,
"badge_enabled": false,
"badge_token": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null,
"server_id": null,
"server_link": null,
"pagerduty_down_severity": "critical",
"pagerduty_degraded_severity": "warning",
"interval_minutes": 5
}
```
---
### Unsilence a monitor’s alerts {#delete-organizations-organization-monitoring-checks-monitoringcheck-silence}
`DELETE` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/silence`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Lifts a silence straight away so the monitor’s alerts are sent again, and returns the updated monitor.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X DELETE "https://api.infranest.io/api/organizations/42/monitoring-checks/1/silence" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"id": 1,
"organization_id": 1,
"name": "Marketing site",
"type": "http",
"target": "https://northwind.com",
"enabled": true,
"settings": [],
"last_status": "up",
"last_checked_at": "2026-01-15T11:58:00.000000Z",
"deleted_at": null,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"last_message": "HTTP 200 — OK",
"consecutive_failures": 0,
"flap_threshold": 2,
"last_status_changed_at": "2026-01-14T12:00:00.000000Z",
"consensus_threshold": 1,
"preferred_regions": [
"EU"
],
"probe_mode": "any",
"ip_version": "prefer_ipv4",
"slow_response_ms": null,
"ssl_check_enabled": true,
"ssl_expiry_days": 21,
"heartbeat_uuid": null,
"last_ping_at": null,
"silenced_until": null,
"silenced_by": null,
"is_suppressed_by_parent": false,
"external_service_id": null,
"external_component_ids": null,
"external_alerts_enabled": false,
"region_checked_at": null,
"region_consensus_threshold": null,
"last_reason_code": null,
"last_reason_params": null,
"interval_seconds": 300,
"badge_enabled": false,
"badge_token": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null,
"server_id": null,
"server_link": null,
"pagerduty_down_severity": "critical",
"pagerduty_degraded_severity": "warning",
"interval_minutes": 5
}
```
---
### Get a monitor’s uptime and response-time stats {#get-organizations-organization-monitoring-checks-monitoringcheck-stats}
`GET` `/organizations/{organization}/monitoring-checks/{monitoringCheck}/stats`
**Scope:** `monitoring.read` · **Changes data:** no
Uptime for the last 24 hours, 7 days and 30 days, incident counts, response-time figures and chart series for the chosen `period` (`24h`, `7d` or `30d`, default `24h`). Pass `region` to narrow the figures to one probe region; the regions with data are listed in `regions`.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `monitoringCheck_id`
path · required | integer | The monitoringCheck's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/monitoring-checks/1/stats" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"uptime": {
"24h": null,
"7d": null,
"30d": null
},
"chart_data": [
{
"time": "2026-01-14T12:00:00+00:00",
"avg": 176,
"min": 164,
"max": 186
},
{
"time": "2026-01-14T13:00:00+00:00",
"avg": 167,
"min": 154,
"max": 178
}
],
"uptime_chart_data": [
{
"time": "2026-01-14T12:00:00+00:00",
"up": 12,
"total": 12,
"degraded": 0,
"down_seconds": 0,
"status": "up"
},
{
"time": "2026-01-14T13:00:00+00:00",
"up": 12,
"total": 12,
"degraded": 0,
"down_seconds": 0,
"status": "up"
}
],
"period": "24h",
"response_time": {
"avg": 180,
"min": 137,
"max": 223
},
"incident_stats": {
"24h": {
"count": 0,
"down_minutes": 0
},
"7d": {
"count": 1,
"down_minutes": 15
},
"30d": {
"count": 1,
"down_minutes": 15
}
},
"regions": [],
"region": null,
"chart_by_region": null
}
```
## Status
### Get the current status of everything {#get-organizations-organization-status}
`GET` `/organizations/{organization}/status`
**Scope:** `monitoring.read` · **Changes data:** no
Everything in your organization as it stands right now, in one call: every monitor with its `status` (`up`, `down`, `degraded`, `paused` or `unknown`), when it was last checked and its 24-hour uptime; every server with its state, whether its agent is reporting (null when no agent is installed) and how many of its alert rules are breaching; the open incidents; the maintenance windows running now; and counts of each in `summary`. Pass `tag` (a tag ID) to narrow it to monitors and servers with that tag, their incidents, and maintenance that carries the tag or covers them. `servers` is null when the token has no Cloud scope or your role cannot see servers.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `tag`
query | integer | Only monitors and servers with this tag, and what concerns them. |
| `tag`
body | integer, nullable | |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/status" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"generated_at": "2026-01-15T12:00:00Z",
"tag": null,
"summary": {
"monitors": {
"total": 13,
"up": 10,
"down": 1,
"degraded": 1,
"paused": 1,
"unknown": 0
},
"servers": {
"total": 14,
"running": 12,
"agent_not_reporting": 0,
"breaching": 0
},
"open_incidents": 1,
"active_maintenance": 0
},
"monitors": [
{
"id": 3,
"name": "API health",
"type": "http",
"status": "up",
"enabled": true,
"silenced": false,
"last_checked_at": "2026-01-15T11:58:00Z",
"uptime_24h": 0
},
{
"id": 2,
"name": "App — northwind-app.dev",
"type": "http",
"status": "up",
"enabled": true,
"silenced": false,
"last_checked_at": "2026-01-15T11:58:00Z",
"uptime_24h": 0
}
],
"servers": [
{
"id": 13,
"name": "analytics-01",
"status": "stopped",
"monitoring_enabled": false,
"agent_reporting": null,
"breaching_alerts": 0
},
{
"id": 3,
"name": "api-01",
"status": "running",
"monitoring_enabled": true,
"agent_reporting": true,
"breaching_alerts": 0
}
],
"incidents": [
{
"id": 1,
"title": "Checkout returning 503",
"status": "investigating",
"impact": "major",
"started_at": "2026-01-15T11:20:00Z",
"acknowledged_at": null,
"monitoring_check_id": 4,
"server_id": null
}
],
"maintenance": []
}
```
## Uptime report
### Get the monthly uptime report {#get-organizations-organization-uptime-report}
`GET` `/organizations/{organization}/uptime-report`
**Scope:** `monitoring.read` · **Changes data:** no
Uptime per monitor for one calendar month, with downtime, incidents, longest outage and the basis of each figure. Pass `month` as `YYYY-MM` (default: the last full month) and `tag` to limit it to monitors with that tag.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/uptime-report" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"month": "2025-12",
"closed": true,
"days_in_month": 31,
"checks": [
{
"id": 3,
"name": "API health",
"type": "http",
"target": "https://api.northwind.com/health",
"uptime_pct": 99.951,
"downtime_minutes": 22,
"incidents": 1,
"longest_outage_minutes": 22,
"monitored_minutes": 44640,
"days_with_data": 31,
"planned_minutes_excluded": 0,
"probes": [],
"started_monitoring": "2026-01-15"
},
{
"id": 2,
"name": "App — northwind-app.dev",
"type": "http",
"target": "https://northwind-app.dev",
"uptime_pct": 100,
"downtime_minutes": 0,
"incidents": 0,
"longest_outage_minutes": 0,
"monitored_minutes": 44640,
"days_with_data": 31,
"planned_minutes_excluded": 0,
"probes": [],
"started_monitoring": "2026-01-15"
}
],
"summary": {
"checks": 13,
"checks_measured": 12,
"worst_uptime_pct": 99.951,
"mean_uptime_pct": 99.996,
"incidents": 1,
"downtime_minutes": 22
},
"findings": [
{
"key": "uptimeReport.findings.worst",
"params": {
"check": "API health",
"percent": 99.951,
"minutes": 22,
"n": 1
},
"tone": "warning"
},
{
"key": "uptimeReport.findings.unmeasured",
"params": {
"n": 1,
"total": 13
},
"tone": "warning"
}
],
"generated_at": "2026-01-15T12:00:00+00:00",
"months": [
{
"month": "2025-02",
"closed": true,
"checks": 13,
"checks_measured": 0,
"worst_uptime_pct": null,
"mean_uptime_pct": null,
"incidents": 0,
"downtime_minutes": 0
},
{
"month": "2025-03",
"closed": true,
"checks": 13,
"checks_measured": 0,
"worst_uptime_pct": null,
"mean_uptime_pct": null,
"incidents": 0,
"downtime_minutes": 0
}
],
"applied_filters": []
}
```
---
### Download the monthly uptime report as CSV {#get-organizations-organization-uptime-report-export}
`GET` `/organizations/{organization}/uptime-report/export`
**Scope:** `monitoring.read` · **Changes data:** no
The same report as a CSV file, one row per monitor. Takes the same `month` and `tag` parameters, and every download is recorded in your audit log.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/uptime-report/export" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200 — The month's uptime report as CSV. (`text/csv`)