24observe
checking… Sign in Start free
Built for agents · Used by humans

The first API your AI agent
won't fight you over.

Every other observability tool was built for engineers staring at dashboards. We built ours for the agent the engineer is about to deploy at 2am — so the agent can read what's broken, fix it, and log what it did, without anybody clicking a button.

0 SDKs to install 130 endpoints, all documented 3 tool-call formats out of the box 1 minute to first agent call
Why we're different

Seven principles. None of them
require you to install anything.

01

The spec is the SDK

Our OpenAPI document IS the client library — fresh on every release, no versioning drift, no abandoned language. Your agent reads it once, calls anything.

02

Idempotent by default

Agents retry. Networks flake. Every mutation accepts an Idempotency-Key — your agent can pound the API and we promise it pages on-call exactly once.

03

Tokens you can hand to a robot

21 narrow scopes including webhooks:read, webhooks:write, logs:write, incidents:write. Daily mutation caps. Per-call audit trail with the token id stamped on it. If your agent goes rogue, you see it in the log within seconds and revoke in one call.

04

Errors a parser can love

Every 4xx and 5xx ships with a machine-stable code field. Your agent branches on PAT_SCOPE_INSUFFICIENT, not on regex against English prose that we might rewrite next sprint.

05

Ready-made for your framework

OpenAI function-calling, Anthropic tool-use, LangChain — we serve the same operations in all three formats. Fetch one URL, pass it to your framework, ship.

06

Stop polling. Subscribe to events.

Register a URL with /api/v1/webhook-subscriptions and receive signed POSTs the moment incident.opened / acknowledged / resolved or monitor.status_changed fires — typically under 500ms from API action to your receiver. HMAC-SHA256 signed with your org's shared secret. 5-attempt exponential retry, auto-disable after 10 consecutive failures so a broken receiver never drains our queue. Full delivery log per subscription, including the bytes we sent. Your agent reacts instead of polls.

07

Open source, MIT licensed

Read the source. Fork it. Self-host. Your agent's training set can include our entire codebase — which it can, because there isn't a proprietary client to be wrong about.

Real code · live API

Four flows your agent already needs.
Copy. Paste. Ship today.

Real HTTP against the live API. curl, requests, fetch, net/http — whatever your agent runs on already speaks it. Nothing to npm install.

GET /api/v1/monitors

Your agent wakes up. What is broken?

First thing on-call asks. First thing your agent needs to know.

curl
curl https://api.24observe.com/api/v1/monitors \
  -H "Authorization: Bearer obs_<your_token>"
python
import requests
r = requests.get(
    "https://api.24observe.com/api/v1/monitors",
    headers={"Authorization": "Bearer obs_<your_token>"},
)
monitors = r.json()
javascript
const r = await fetch("https://api.24observe.com/api/v1/monitors", {
  headers: { Authorization: "Bearer obs_<your_token>" },
});
const monitors = await r.json();
go
req, _ := http.NewRequest("GET", "https://api.24observe.com/api/v1/monitors", nil)
req.Header.Set("Authorization", "Bearer obs_<your_token>")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
GET /api/v1/logs/search

Dig into logs without a human in the loop

No SPL to learn. No proprietary query DSL. Just a query string.

curl
curl "https://api.24observe.com/api/v1/logs/search?q=ECONNREFUSED&limit=50" \
  -H "Authorization: Bearer obs_<your_token>"
python
import requests
r = requests.get(
    "https://api.24observe.com/api/v1/logs/search",
    params={"q": "ECONNREFUSED", "limit": 50},
    headers={"Authorization": "Bearer obs_<your_token>"},
)
events = r.json()["events"]
javascript
const url = new URL("https://api.24observe.com/api/v1/logs/search");
url.searchParams.set("q", "ECONNREFUSED");
url.searchParams.set("limit", "50");
const r = await fetch(url, {
  headers: { Authorization: "Bearer obs_<your_token>" },
});
const { events } = await r.json();
go
u, _ := url.Parse("https://api.24observe.com/api/v1/logs/search")
q := u.Query(); q.Set("q", "ECONNREFUSED"); q.Set("limit", "50")
u.RawQuery = q.Encode()
req, _ := http.NewRequest("GET", u.String(), nil)
req.Header.Set("Authorization", "Bearer obs_<your_token>")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
POST /api/v1/incidents/{id}/acknowledge

Take ownership and let the team know

One POST. Idempotency-Key means retries never double-page on-call.

curl
curl -X POST https://api.24observe.com/api/v1/incidents/42/acknowledge \
  -H "Authorization: Bearer obs_<your_token>" \
  -H "Idempotency-Key: ack-incident-42-agent-run-7"
python
import requests
r = requests.post(
    "https://api.24observe.com/api/v1/incidents/42/acknowledge",
    headers={
        "Authorization": "Bearer obs_<your_token>",
        "Idempotency-Key": "ack-incident-42-agent-run-7",
    },
)
r.raise_for_status()
javascript
await fetch("https://api.24observe.com/api/v1/incidents/42/acknowledge", {
  method: "POST",
  headers: {
    Authorization: "Bearer obs_<your_token>",
    "Idempotency-Key": "ack-incident-42-agent-run-7",
  },
});
go
req, _ := http.NewRequest("POST",
  "https://api.24observe.com/api/v1/incidents/42/acknowledge", nil)
req.Header.Set("Authorization", "Bearer obs_<your_token>")
req.Header.Set("Idempotency-Key", "ack-incident-42-agent-run-7")
http.DefaultClient.Do(req)
POST /api/v1/monitors

Provision monitoring for a job you just deployed

Your CI agent ships code. Same agent registers the heartbeat for the new cron — done in the same run.

curl
curl -X POST https://api.24observe.com/api/v1/monitors \
  -H "Authorization: Bearer obs_<your_token>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "nightly-etl",
    "url": "nightly-etl",
    "type": "heartbeat",
    "intervalSec": 3600,
    "timeoutMs": 5000
  }'
python
import requests
r = requests.post(
    "https://api.24observe.com/api/v1/monitors",
    headers={
        "Authorization": "Bearer obs_<your_token>",
        "Content-Type": "application/json",
    },
    json={
        "name": "nightly-etl",
        "url": "nightly-etl",
        "type": "heartbeat",
        "intervalSec": 3600,
        "timeoutMs": 5000,
    },
)
monitor_id = r.json()["id"]
javascript
const r = await fetch("https://api.24observe.com/api/v1/monitors", {
  method: "POST",
  headers: {
    Authorization: "Bearer obs_<your_token>",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    name: "nightly-etl",
    url: "nightly-etl",
    type: "heartbeat",
    intervalSec: 3600,
    timeoutMs: 5000,
  }),
});
const { id } = await r.json();
go
payload := `{"name":"nightly-etl","url":"nightly-etl","type":"heartbeat","intervalSec":3600,"timeoutMs":5000}`
req, _ := http.NewRequest("POST",
  "https://api.24observe.com/api/v1/monitors",
  strings.NewReader(payload))
req.Header.Set("Authorization", "Bearer obs_<your_token>")
req.Header.Set("Content-Type", "application/json")
http.DefaultClient.Do(req)
Drop-in for every framework

Your agent's framework already knows our API.

We do the schema-conversion work so you don't have to. Fetch one URL, hand the array to your framework, and your agent is calling production in under a minute.

What we don't pretend to be

We'd rather lose your business than waste your weekend.

Here's exactly what we don't ship. Read it before you sign up — we built the list so you don't have to find out the hard way three weeks in.

— no

APM, distributed tracing, flame graphs

If you need to chase a request across 14 microservices, keep Datadog APM. We're for the logs, uptime, and alerts layer underneath.

— no

Real User Monitoring or session replay

We don't watch your end-users' browsers. Sentry, LogRocket, and FullStory all do this well. Use them.

— no

Multi-step browser scripts

We run HTTP, TCP, SSL, keyword, DNS, ping, port, SMTP, and heartbeat checks. We do not run Playwright login flows. If you need that, Checkly does it well.

— no

Full SIEM, UBA, MITRE correlation

If you need to satisfy your SOC's compliance checklist, keep Splunk Enterprise Security. We replace the log search and alerts beneath it, not the SIEM itself.

— no

Infrastructure agent collecting CPU + memory

We accept OTLP — bring whatever agent or collector you already have. We won't ship you another daemon to run on every host.

— no

Machine-learning anomaly detection

Threshold alerts only. We don't pretend the math is smarter than your engineers — and we don't bill you for the pretense.

Mint a token. Drop in our spec.
Your agent ships tonight.

Free plan covers 25 monitors. No credit card. The OpenAPI spec is public. The repo is MIT.