Skip to content

docs

Get startedin three steps.

Using a coding agent?

Copy the whole setup as one markdown file and paste it into your agent: the monitor, the API key, reporting job runs, the SDKs and the MCP connection.

or open it as a file

Create a monitor, report your jobs with one HTTP call, and connect your coding agent. For every field, response and error code, see the API reference.

Quickstart

  1. Create a monitor

    Sign in and add a monitor in the dashboard. Uptime, SSL, DNS and broken-link checks run from FastMonitor's side and need no code. For a cron job or worker, add a job monitor with its schedule and grace period, and note its monitor key.

  2. Create an API key

    In Settings → API, create a key with the monitor:telemetry scope. It is shown once and stored only as a hash, so keep it in a server-side secret.

  3. Report each run

    Send RUN when the job starts, then COMPLETE or FAIL when it ends. FastMonitor opens an issue if a run fails, runs too long or never arrives.

request
POST /e/execution-events
Authorization: Bearer <api-key>
Send it to your FastMonitor API address, shown with the telemetry snippet on each job monitor's page. Only monitorKey and state are required.
request body
{
  "monitorKey": "daily-report",
  "state": "RUN",
  "timestamp": "2026-06-13T10:00:00.000Z",
  "duration": 1234,
  "errorMessage": "optional error",
  "metadata": { "deployment": "prod", "region": "eu-west-2" },
  "idempotencyKey": "daily-report:2026-06-13T10:00:00Z:RUN"
}

Responses, error codes and retry rules: the endpoint reference.

SDKs

Publishing pending: the SDKs are not on npm, PyPI or Packagist yet, so these install commands will not work until they are published. Until then, send the HTTP request above: the SDKs send exactly that request.

  • JavaScript / TypeScript

    Publishing pending

    @maki/monitor on npm

    install
    npm install @maki/monitor
  • Python

    Publishing pending

    makimonitor on PyPI

    install
    pip install makimonitor
  • PHP

    Publishing pending

    maki/monitor-php on Packagist

    install
    composer require maki/monitor-php

Usage examples for each SDK are on the API page.

Agent plugins and MCP

Ask your coding agent what is failing, triage an incident or plan a check. FastMonitor serves a remote MCP endpoint at your API address followed by /mcp (Streamable HTTP, Authorization: Bearer with an MCP token). In the dashboard, open Settings → AI agents & MCP, create a token with only the permissions it needs, and copy it: it is shown once, next to ready-made setup with your server address filled in. Revoke it there at any time.

Claude Code

shell
claude mcp add --transport http fastmonitor https://<your-api-origin>/mcp \
  --header "Authorization: Bearer mcp_xxxxxxxx"

Codex

shell
export FASTMONITOR_MCP_TOKEN=mcp_xxxxxxxx
codex mcp add fastmonitor --url https://<your-api-origin>/mcp --bearer-token-env-var FASTMONITOR_MCP_TOKEN

Hermes Agent

~/.hermes/config.yaml
mcp_servers:
  fastmonitor:
    url: "${FASTMONITOR_MCP_URL}"
    headers:
      Authorization: "Bearer ${FASTMONITOR_MCP_TOKEN}"
MCP tools and permissions
ToolPermissionDoes
list_monitorsRead monitorsYour monitors with type, host, current state and status.
get_monitor_summaryRead monitorsOne monitor by id or key, with its last run.
list_open_issuesRead issuesOpen incidents.
get_issue_summaryRead issuesOne incident with its five latest updates.
acknowledge_issueAcknowledge issuesAdds a note and moves an unresolved incident to investigating. Nothing else.

Tokens are scoped to your own monitors and issues, hashed at rest, limited to 60 requests a minute and audited on every call. The Claude Code, Codex and Hermes plugins (the MCP connection plus skills such as a status summary and cron instrumentation) are publishing pending: they are not listed in the Claude, OpenAI or Nous plugin directories yet. The MCP setup above works without them.

Receiving webhook alerts

Plans: Starter & Enterprise

Add a webhook in Settings → Integrations with its URL, the method (POST, PUT or GET), any custom header fields and, optionally, a signing secret. FastMonitor sends each alert as JSON (a GET sends no body) and retries a failed delivery with backoff, so use dedupeKey to ignore one you have already handled. eventType is triggered or resolved.

With a signing secret, every request carries X-Alert-Signature: sha256=<hex HMAC-SHA256 of the body>. A GET is signed over the empty string. Check it against the raw body, before parsing it, and compare in constant time; reject the request when the function returns false.

webhook body
{
  "alertEventId": "<alert event id>",
  "monitorId": "<monitor id>",
  "issueId": "<issue id>",
  "ownerId": "<account id>",
  "severity": "critical",
  "title": "<short summary>",
  "body": "<what failed>",
  "dedupeKey": "<idempotency key>",
  "eventType": "triggered",
  "links": { "issueUrl": "<link to the issue in the dashboard>" }
}
verify.js (Node.js)
const crypto = require('node:crypto');

function verifyAlertSignature(rawBody, signatureHeader, signingSecret) {
  const expected =
    'sha256=' +
    crypto.createHmac('sha256', signingSecret).update(rawBody).digest('hex');
  const received = Buffer.from(String(signatureHeader || ''));
  const wanted = Buffer.from(expected);
  return (
    received.length === wanted.length &&
    crypto.timingSafeEqual(received, wanted)
  );
}

HTTP checks and assertions

Plans: All plans

An HTTP check requests your URL on a schedule. It passes when the status code is one you expect and every assertion passes. An assertion that cannot be evaluated, such as a JSON path on a body that is not JSON, fails instead of passing silently.

HTTP check assertions
AssertionChecksOperators
response.codeThe final status code< <= = != > >=
response.timeHow long the request took, in milliseconds< <= = != > >=
response.bodyThe response body (the first 1 MiB)contains does not contain = !=
response.jsonA JSON value at a path such as data.items[0].status= != contains does not contain
response.headerA response header, by name= != contains does not contain

To avoid alerts for a single blip, set how many failed checks in a row, from 1 to 100, it takes before FastMonitor opens an issue. The issue resolves on its own when the check passes again.

SSL, DNS, domain-expiry and broken-link checks

Plans: Starter & Enterprise

  • SSL certificate. Connects to your host (port 443 unless you change it) and fails when the certificate is not valid, does not cover the host name, has an untrusted chain, or expires within your warning window: 30 days by default, with an optional stricter critical threshold. On an HTTPS check you can instead assert on ssl_certificate.expires_in, the days left on the certificate.
  • DNS record. Resolves an A, AAAA, CNAME, MX, TXT, NS or CAA record and compares the answer with the values you expect: an exact match, contains all of them, contains none of them, or any record at all.
  • Domain expiry. Reads your domain's registration through RDAP and warns when it expires within your warning window (30 days by default).
  • Broken links. Crawls your site from a start URL and its sitemap, 50 pages a run by default and up to 500, and reports broken pages and links and redirect loops. It reads the HTML and does not run JavaScript.

Notification lists and integrations

Plans: All plans

A notification list is a named group of email recipients and integrations. Each monitor alerts one list; a monitor without a list alerts your default list. Alert channels: email on every plan, Slack, webhooks, Microsoft Teams, Discord, Google Chat, Telegram, Lark / Feishu, Twilio SMS and voice, Pushover and n8n on Starter and Enterprise, and PagerDuty, Opsgenie and Splunk On-Call on Enterprise. Notification lists per account: 1 on Free, 10 on Starter and unlimited on Enterprise.

Environments, such as production and staging, group your monitors, and you switch between them in the dashboard. Environments per account: 2 on Free, 10 on Starter and unlimited on Enterprise. See every channel and its plans on Integrations.

Status pages and custom domains

Plans: Starter & Enterprise

A status page shows the uptime of the monitors you pick and any open incidents, with your logo and brand colour, at its own address from us. Status pages per account: up to 5 on Starter and unlimited on Enterprise.

To serve a page on your own domain, verify the domain in the dashboard with a TXT record, attach it to the page, and point a CNAME record at the target the dashboard shows. The page goes live on your domain once our team has confirmed the CNAME record.

Routing rules

Plans: Enterprise plan

Routing rules decide which notification lists receive an alert. A rule matches on any mix of monitor type, check type, environment, tags, monitor group, severity and schedule (days and hours in a time zone you choose), and sends to one or more lists. Rules run in priority order, lowest number first, and a rule set to stop processing keeps the rules after it from running.

"Where would this alert go?" in the dashboard shows which of your rules a sample alert matches and which lists it reaches. If no rule matches, the monitor's own notification list is alerted, or your default list when the monitor has none.

Workflow automation

Plans: Enterprise plan

After an alert, an automation rule can call a webhook, start an n8n workflow, post an update to a status page or create a ticket. A run can wait for approval, retries with backoff when the target fails, and keeps an audit trail. Before a rule is enabled it can be dry-run: the dry run checks the rule and its target and shows what it would send, without sending anything.

There is no automation screen in the dashboard yet: our team sets up your automation rules and handles run approvals with you, on request.

Teams and roles

Plans: All plans

Create an organization and invite people by email. Each member has one of 5 roles: owner, admin, billing, member and viewer. Owners and admins invite and manage members and teams, the billing role manages billing, and viewers have read-only access. There is no per-seat pricing. Monitors, notification lists and API keys belong to the person who created them.

Everyone can turn on two-factor sign-in with an authenticator app (TOTP) in Settings → Account, with single-use backup codes, and can sign in with Google or GitHub.

API keys and scopes

Plans: All plans

API keys authenticate the telemetry API. In Settings → API, create a key with the Telemetry purpose (the monitor:telemetry and monitor:write scopes), or choose Custom and pick from monitor:telemetry, monitor:read, monitor:write, issue:read and issue:write. You can limit a key to certain monitors and give it an expiry date. A key is shown once and stored only as a hash, and it can never report for another account's monitors.

Coding agents use separate MCP tokens, created in Settings → AI agents & MCP (see Agent plugins and MCP).

API reference

The public API is the telemetry endpoint, POST /e/execution-events. Authentication, every field, the responses, error codes and retry advice are on the API page. Monitors, alert settings and billing are set up in the dashboard.

Swagger UI

Running the FastMonitor backend yourself? It serves an interactive Swagger UI at /api-docs in development, and in production only when API_DOCS_ENABLED=true. The hosted service keeps it switched off.

More help

Expecting something faster than FastMonitor?

Come on, give it a go. You won't be disappointed.