API
The /v1 REST API, authentication, limits, and the official TypeScript SDK.
Everything in the dashboard is programmable. The public REST API lives at
https://app.getuptimely.com/v1 and covers monitors, incidents, alerts,
scheduled maintenance, status pages, on-call, usage, and outbound webhook
endpoints — 22 operations, documented in the
interactive API reference.
Authentication
Create a key under Settings → API Keys → Public API keys in your project (keys are shown once and stored hashed), then send it as a Bearer token:
curl https://app.getuptimely.com/v1/monitors \
-H "Authorization: Bearer $UPTIMELY_API_KEY"Keys are project-scoped and carry the scopes you select at creation.
TypeScript SDK
npm install @uptimely/sdk — typed end to end from the same schemas the API
validates with, with built-in retries, idempotency keys and auto-pagination.
Source is mirrored at
github.com/DevinoSolutions/uptimely-sdk.
import Uptimely from "@uptimely/sdk";
const uptimely = new Uptimely(); // reads UPTIMELY_API_KEY
for await (const monitor of uptimely.monitors.list()) {
console.log(monitor.name, monitor.status.name);
}Errors
Every error is an RFC 9457 application/problem+json document with a stable
code to branch on and a type URI that resolves to a docs page — for
example rate_limited or
validation_failed.
Rate limits & quotas
- Free — read-only API access, 1,000 requests/month, 60 requests/minute burst.
- Pro — full read + write access and webhook management, 100,000 requests/month, 300 requests/minute burst.
GET /v1/usageshows live consumption — it never consumes quota and never denies. Webhook deliveries don't count against your quota.
Responses carry live ratelimit headers; 429s carry Retry-After.
Idempotency
POST requests accept an Idempotency-Key header: one unique key per logical
operation, reused only for byte-identical retries. The SDK does this
automatically.
Other machine endpoints
Not everything Uptimely exposes to machines belongs to /v1. These also live
on https://app.getuptimely.com and authenticate their own way:
- Prometheus scrape —
GET /api/metrics?projectId=<id>, carrying monitor status and response times in the Prometheus exposition format. It authenticates with a legacy project API key (the "API Keys" card under Settings → API Keys, below the public keys — the same key class the MCP tools take), sent asAuthorization: Bearer …. A publicuptimely_live_…key is for/v1and is not accepted here. - OpenTelemetry ingestion —
POST /api/otlp/v1/logs,/tracesand/metricsaccept OTLP and store the data in ClickHouse. Authenticate with a telemetry ingestion key in thex-uptimely-ingestion-keyheader (x-uptimely-service-tokenandx-uptimely-tokenare accepted as aliases, for OTel distros that send one of those). - Health probe —
GET /api/healthis public and reports the platform's own status, including the probe pipeline. Monitored by Uptimely itself, naturally. - Status page machine surfaces —
GET /status/<slug>/badgereturns an embeddable SVG status badge andGET /status/<slug>/rssan incident feed. Both are anonymous, and both answer only for a status page marked public.
The MCP endpoint is separate again — see MCP & AI.
The machine surface, in one place
- OpenAPI 3.1 document: /docs/api/openapi.json
- Interactive reference: /docs/api-reference
- Error-code pages: /docs/api/problems/…