Uptime monitors

Have Drumbeats call your public endpoint on a schedule and tell you when it stops answering properly.

The only monitor type where Drumbeats calls you:

bash
curl -X POST https://api.drumbeats.io/v1/monitors \
  -H "X-API-Key: $DRUMBEATS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "project_id": "<project-id>",
    "name": "Production API health",
    "type": "UPTIME_HTTP",
    "schedule": "5m",
    "uptime_url": "https://api.myapp.com/health",
    "uptime_expected_status": [200],
    "uptime_keyword": "\"status\":\"ok\"",
    "uptime_timeout_ms": 5000
  }'
curl -X POST https://api.drumbeats.io/v1/monitors \
  -H "X-API-Key: $DRUMBEATS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "project_id": "<project-id>",
    "name": "Production API health",
    "type": "UPTIME_HTTP",
    "schedule": "5m",
    "uptime_url": "https://api.myapp.com/health",
    "uptime_expected_status": [200],
    "uptime_keyword": "\"status\":\"ok\"",
    "uptime_timeout_ms": 5000
  }'

Your service sends no pings. Drumbeats requests the URL on the interval you set and records what came back.

Use it for APIs, marketing sites, and health endpoints that should answer from the public internet. For internal jobs and queue workers, use Cron, Heartbeat, or Event-driven instead.

What each check records#

Every check stores the HTTP status code, the round-trip response time in milliseconds, an up or down verdict, and a failure reason when it failed. The reason is one of timeout, dns_failure, connection_refused, or ssl_error.

Configure the monitor#

FieldRequiredDefaultWhat it does
uptime_urlyesThe HTTP or HTTPS endpoint. Credentials in the URL are rejected, use uptime_headers instead
scheduleyesCheck interval as an interval string, such as 5m
uptime_methodnoGETGET, HEAD, or POST
uptime_expected_statusnoany 2xxExplicit list of acceptable status codes, such as [200, 301]
uptime_keywordnononeThe response body must contain this string. Up to 1024 characters
uptime_keyword_absentnofalseSet true to invert the keyword check, so the string must not appear
uptime_headersnononeCustom request headers as a JSON object. Use this for auth tokens
uptime_request_bodynononeRequest body for POST checks. Up to 10 000 characters
uptime_timeout_msno10000Per-request timeout. Must be between 1000 and 30 000
uptime_follow_redirectsnotrueFollow redirects before checking the status code
uptime_verify_sslnotrueSet false to accept self-signed or expired certificates
failure_toleranceno1Failed cycles in a row before the monitor flips DOWN

Free accounts cannot check more often than every 60 seconds, paid plans every 30 seconds.

Hop-by-hop headers are rejected in uptime_headers because the HTTP layer controls them: host, content-length, transfer-encoding, connection, upgrade, keep-alive, trailer, te, expect, proxy-authorization, proxy-authenticate, proxy-connection.

Check the body, not just the status#

A 200 proves the web server answered. It does not prove the database behind it is reachable. Point the check at an endpoint that exercises the dependency and assert on the body:

bash
-d '{
  "uptime_url": "https://api.myapp.com/health",
  "uptime_expected_status": [200],
  "uptime_keyword": "\"database\":\"ok\""
}'
-d '{
  "uptime_url": "https://api.myapp.com/health",
  "uptime_expected_status": [200],
  "uptime_keyword": "\"database\":\"ok\""
}'

A cached error page that returns 200 with the word maintenance in it fails the keyword check and pages you. A status-only check would call that healthy.

What happens when it breaks#

A single failed check does not page anyone. When a check fails, Drumbeats waits 5 seconds and tries again, up to 3 attempts total. Only when all three fail does the cycle count as a failure.

SituationIncident eventMonitor status
Three attempts in a row fail, failure_tolerance reachedFAILEDDOWN
The TLS certificate crosses 30, 14, 7, or 1 day remainingSSL_EXPIRINGStays UP. Warning only
The Drumbeats probe itself is unreachablenoneUnchanged. Counted as unknown, never as your failure

Certificate warnings fire once per threshold crossed, not once per check, and they never flip the monitor DOWN. They give you a runway to renew rather than an outage. Renew the certificate and Drumbeats notices the new expiry date on the next check, clears the threshold history, and resolves any open SSL_EXPIRING incident on its own.

How you get alerted#

The incident pages every notification group on the monitor. The message carries the status code or failure reason.

When the next check passes, Drumbeats resolves the incident, flips the monitor to UP, and sends a recovery message to the same groups with the outage duration.

Reach Drumbeats through your firewall#

Checks come from a small set of static addresses. Allowlist them so your WAF does not filter the check and page you for its own blocking.

Check locationIP address
Europe (eu-central), the default37.120.185.240
US East (us-east), betaNot yet published

Every request also carries this User-Agent, which works if your filters match on that instead:

plaintext
Drumbeats/1.0 (+https://drumbeats.io/docs/monitor-types/uptime)
Drumbeats/1.0 (+https://drumbeats.io/docs/monitor-types/uptime)

Check from more than one location#

By default a monitor is checked from eu-central only. In beta you can add us-east. Drumbeats opens an incident only when every checked location agrees the endpoint is down, which filters out a bad route from one vantage point. A location whose probe is unreachable counts as unknown, not as a failure.

Each location checks independently, so a two-location monitor costs 2 beats per cycle instead of 1.

The US East probe is not live in production yet and its egress IP is unpublished. If your firewall needs an exact list, allowlist the Europe address and leave us-east off that monitor.

Read check history#

bash
# Latest result
GET /v1/monitors/<id>/check-results/latest

# Paginated history, 50 per page by default
GET /v1/monitors/<id>/check-results?page=1&limit=50

# Response-time stats over a window
GET /v1/monitors/<id>/response-time-stats?period_hours=24
# Latest result
GET /v1/monitors/<id>/check-results/latest

# Paginated history, 50 per page by default
GET /v1/monitors/<id>/check-results?page=1&limit=50

# Response-time stats over a window
GET /v1/monitors/<id>/response-time-stats?period_hours=24

The same data drives the monitor's status page when you publish one. Status pages show current state, 24 hour, 7 day, and 30 day uptime percentages, recent incidents, and response-time charts.

Next#

Monitor types covers when Uptime is the wrong choice. Status pages publishes this data. REST API monitors is the full CRUD reference.