REST API

Manage monitors and read incidents from your own code, scripts or AI agents.

Overview

The API lives at https://notifier.so/api/v1/. It speaks JSON and uses the same rules as the dashboard, so your plan's monitor limit and fastest check interval apply.

The API is available on every plan, including Free. Free keys can make 30 requests per minute; paid plans get 300.

Authentication

  1. Go to Integrations in the monitoring dashboard.
  2. In API keys, click Create API key and give it a name. Tick Read-only if it only needs to read.
  3. Copy the key. It starts with ntf_ and is only shown once.

Send it on every request:

curl https://notifier.so/api/v1/account \
  -H "Authorization: Bearer ntf_your_key_here"

X-API-Key: ntf_... works too. A key acts as the person who created it, on the team it was created in. Revoke a key in the dashboard and it stops working immediately.

Endpoints

Method and path What it does
GET /accountTeam, plan, monitor limit and usage, rate limit
GET /monitorsList monitors. Filters: status, search
POST /monitorsCreate a monitor
GET /monitors/{id}One monitor, with uptime for 24h, 7d, 30d and 90d
PATCH /monitors/{id}Change any field you send
DELETE /monitors/{id}Delete a monitor and its history
POST /monitors/{id}/pauseStop checking (no alerts while paused)
POST /monitors/{id}/resumeStart checking again
GET /monitors/{id}/response-timesResponse times. range: 1h, 24h (default), 7d, 30d, 365d
GET /incidentsIncidents, newest first. Filters: monitor_id, status (ongoing or resolved)
GET /incidents/{id}One incident, including why the check failed

All paths are relative to https://notifier.so/api/v1. List endpoints take page and per_page (up to 100) and return data, total and has_more.

Creating a Monitor

curl -X POST https://notifier.so/api/v1/monitors \
  -H "Authorization: Bearer ntf_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com", "name": "Example", "check_interval_seconds": 60}'

Fields:

  • type: http (default), keyword, ping, port or dns. DNS needs Solo or above.
  • url: for http and keyword monitors. hostname and port: for ping, port and dns monitors.
  • name: optional friendly name.
  • check_interval_seconds: 30, 60, 300, 1800, 3600, 43200 or 86400. Defaults to your plan's fastest (5 minutes on Free, 1 minute on Solo).
  • alert_channels: any of email, sms, voice, slack, telegram. Defaults to ["email"].
  • keyword: for keyword monitors, {"value": "In stock", "condition": "exists", "case_sensitive": false}. Condition is exists or not_exists.
  • dns_records: for dns monitors, [{"type": "A", "expected_value": "93.184.216.34"}].
  • active: false creates it paused.

A monitor in a response looks like this:

{
  "id": 1726,
  "name": "Example",
  "type": "http",
  "url": "https://example.com",
  "hostname": null,
  "port": null,
  "status": "up",
  "active": true,
  "check_interval_seconds": 60,
  "alert_channels": ["email"],
  "keyword": null,
  "last_checked_at": "2026-10-21T09:41:00+00:00",
  "up_since": "2026-10-21T09:30:00+00:00",
  "down_since": null,
  "created_at": "2026-10-21T09:29:12+00:00",
  "dashboard_url": "https://notifier.so/new/monitoring/monitor/?id=1726"
}

status is one of up, down, paused or pending (not checked yet).

Pausing During Deploys

Pause a monitor before a deploy and resume it after, so planned downtime doesn't alert anyone:

curl -X POST https://notifier.so/api/v1/monitors/1726/pause -H "Authorization: Bearer $NOTIFIER_API_KEY"
./deploy.sh
curl -X POST https://notifier.so/api/v1/monitors/1726/resume -H "Authorization: Bearer $NOTIFIER_API_KEY"

Incidents

{
  "id": 59511,
  "monitor_id": 1726,
  "monitor_name": "Example",
  "status": "resolved",
  "started_at": "2026-10-20T20:04:32+00:00",
  "resolved_at": "2026-10-20T20:09:30+00:00",
  "duration_seconds": 297,
  "reason": "Timeout (no response in 25s)"
}

reason says why the check failed, such as a timeout, an HTTP status or a connection error. Incidents from before October 21, 2026 have no reason.

Errors and Limits

Errors return a non-2xx status and a JSON body:

{"error": "Validation failed.", "details": {"check_interval_seconds": ["Check interval must be at least 5 minutes for your plan"]}}
  • 400: invalid input or a plan limit. details lists the problem fields.
  • 401: missing, invalid or revoked key.
  • 403: a read-only key tried to change something.
  • 404: no such monitor or incident on your team.
  • 429: rate limit hit. Wait a minute and retry.

Monitors can only check public addresses. Private, internal and cloud metadata addresses are rejected.

Help

Questions or a missing endpoint you need? Email support@notifier.so or use the chat on any page. Want alerts pushed to your systems instead? See Webhooks. Using an AI assistant? Connect it with the MCP server.