Documentation

API and webhooks

Read monitors and runs, trigger runs, and receive events in your own systems.

API keys

Create keys under Account → API KeysCreate API key. Give it a name (for example Zapier or Production integration) and click Create. The key is shown once — copy it straight away. Keys look like sm_live_…. Delete a key with the trash icon on the same page; deleted keys stop working immediately.

A key acts for the whole workspace, so anyone holding it can read all monitors and trigger runs. Treat it like a password.

Making requests

Base URL: https://simrixmonitor.com/api/v1

Send the key as a Bearer token:

curl https://simrixmonitor.com/api/v1/monitors \
  -H "Authorization: Bearer sm_live_..."

Each key is limited to 100 requests per hour. Over the limit you get 429 until the window resets.

Endpoints

GET /monitors

Lists every monitor in the workspace.

{
  "object": "list",
  "data": [
    {
      "id": "…",
      "name": "Homepage price block",
      "type": "change",
      "url": "https://example.com/pricing",
      "active": true,
      "interval_minutes": 60,
      "last_status": "passed",
      "last_run_at": "2026-09-11T14:00:00.000Z",
      "site": { "id": "…", "name": "Example" }
    }
  ]
}

GET /monitors/{id}/runs?limit=20

Recent runs for one monitor, newest first. limit defaults to 20, maximum 100. Each run has status, change_detected, change_significance, change_category, change_headline, annotation, ai_summary, failure_summary, duration_ms, http_status, screenshot_url, diff_screenshot_url, created_at, finished_at.

POST /monitors/{id}/trigger

Runs the monitor now and waits for the result.

{ "object": "run", "run_id": "…", "status": "passed", "change_detected": false }

Triggered runs count against your allowance like any other and follow the same billing rules — a workspace over its allowance gets 403 with the usage detail. If another manual run is already in progress for the workspace you get 429; retry after it finishes. Triggered runs don't send alert emails.

Webhooks

Webhooks push events to a URL you control the moment they happen. Add one under Account → WebhooksAdd webhook: give it a name, the endpoint URL, tick the events you want, and click Create webhook.

Events:

  • change_detected — a change monitor found a significant change
  • monitor_failed — a monitor failed
  • monitor_recovered — a failing monitor passed again

Each webhook gets a signing secret, shown once when you create it. Use it to verify requests. Endpoints can be paused (Pause / Enable) or deleted from the list.

Payload

{
  "event": "change_detected",
  "timestamp": "2026-09-11T14:05:12.000Z",
  "workspaceId": "…",
  "monitor": { "id": "…", "name": "Homepage price block", "type": "change", "url": "https://example.com/pricing" },
  "run": {
    "id": "…",
    "status": "passed",
    "changeDetected": true,
    "aiSummary": "Price changed from $49 to $79.",
    "failureSummary": null,
    "durationMs": 8421,
    "httpStatus": 200,
    "screenshotUrl": "https://simrixmonitor.com/api/artifacts/…",
    "diffScreenshotUrl": "https://simrixmonitor.com/api/artifacts/…"
  }
}

Verifying the signature

Every request carries X-Simrix-Event (the event name) and X-Simrix-Signature: sha256=<hex>, an HMAC-SHA256 of the raw request body using your signing secret. Compute the same HMAC and compare with a constant-time comparison before trusting the payload.

Each delivery is a single attempt with a 10-second timeout — there are no automatic retries, so make your endpoint accept quickly and process afterwards. Non-2xx responses are logged. Screenshot URLs in the payload require a signed-in workspace member to view.

Slack, Zapier, and friends

There's no native Slack integration yet. Point a webhook at a Zapier / Make catch-hook or at a tiny relay that formats the payload into a Slack message. Zapier and similar tools can also poll GET /monitors/{id}/runs with an API key.