Sign in
Developer docs

Everything the dashboard can do, over HTTPS.

Add websites from a deploy pipeline, wire alerts into the tools you already run, or let an AI assistant read your monitoring. One API key per organization, a versioned REST API, and an MCP server built on the same code.

Quickstart

Create a key under Settings → API keys in the dashboard. Choose Admin if the key should change monitoring and alerting, or Member for read-only access. The secret is shown once.

Send it as a bearer token. This lists the websites your organization monitors:

curl
curl https://api.upcheck.so/v1/domains \
  -H "Authorization: Bearer uck_your_key"

Adding a website starts all four checks and probes it inline, so the response usually carries a first result:

curl
curl -X POST https://api.upcheck.so/v1/domains \
  -H "Authorization: Bearer uck_your_key" \
  -H "Content-Type: application/json" \
  -d '{ "domain": "www.example.com", "friendlyName": "Marketing site" }'

The API reference is generated from the same schemas the API validates with, and includes a request builder and samples in several languages.

Authentication

Keys belong to an organization, not to the person who created them, so a key keeps working when a teammate leaves and every key a workspace has is visible to its admins. A key has one of two roles:

RoleCan
adminRead everything and change websites, alert rules, email lists, integrations, the team and the organization name.
memberRead everything. Every write returns 403.

Keys cannot create other keys, and billing checkout stays in the dashboard. Revoke a key from the same settings page; revocation is immediate.

Conventions

The base URL is https://api.upcheck.so and every path starts with /v1. Bodies are JSON. Timestamps are Unix milliseconds. Identifiers are opaque strings; pass them back exactly as returned.

Updates are partial. A PATCH changes only the fields you send, so { "enabled": false } pauses an alert rule without touching its scope.

Lists that grow (check history, alert events, activity) take limit and offset. Websites, rules, lists, integrations and members are returned whole; an organization holds at most 500 websites.

Rate limit. Each key may make 300 requests per minute. A 429 carries Retry-After in seconds.

Errors

Every error is JSON with a human-readable error and a stable code:

application/json
{ "error": "A valid hostname is required.", "code": "bad_request" }
StatusCodeMeaning
400bad_requestThe body or parameters are invalid. error names the first problem.
401unauthorizedThe key is missing, invalid or revoked.
402payment_requiredThe organization has no active subscription.
403forbiddenThe key is read-only, or the action needs a role the key lacks.
404not_foundNo such resource in this organization.
409conflictThe request conflicts with current state, for example the website limit.
429rate_limitedThe key exceeded 300 requests in a minute. Honour Retry-After.

Resources

ResourcePathWhat it covers
Domains/v1/domainsThe websites being monitored, their monitors and check history.
Alert rules/v1/alert-rulesWhat to alert on, how often, and where.
Alert events/v1/alert-eventsAlerts that were delivered.
Email lists/v1/email-listsNamed recipient sets for the email channel.
Integrations/v1/integrationsSlack, Discord, Teams and webhook destinations.
Team/v1/team/membersMembers and invitations.
Organization/v1/organizationThe workspace the key belongs to.
Account/v1/meKey introspection, stats, activity and billing.

Every operation, with its request and response schemas, is in the API reference. The raw document is served at https://api.upcheck.so/v1/openapi.json for client generators.

Webhook payloads

A generic webhook integration receives one JSON object per alert. The event names the check, so a receiver can route an expiring certificate to whoever owns deploys and an outage to whoever is on call:

application/json
{
  "event": "uptime.alert",
  "subject": "uptime",
  "domain": "www.example.com",
  "displayName": "Marketing site",
  "status": "crit",
  "daysRemaining": 0,
  "title": "Site down - www.example.com",
  "message": "www.example.com is not responding: HTTP 502 ...",
  "url": "https://upcheck.so/dashboard/domains/…",
  "timestamp": 1757900000000
}

Events are ssl.alert, domain.alert, uptime.alert and dns.alert. A test sent from the dashboard or the API uses the same shape with .test appended and "test": true, so a receiver that files tickets can ignore it. Slack, Discord and Teams integrations get the payload their incoming webhooks expect instead.

AI assistants

The same operations are available as tools over the Model Context Protocol, so Claude, Cursor or any MCP client can answer “what is failing right now?” or add a website for you. See the MCP server page for setup.