ObserverKit

REST API

Read, resolve, and ignore your errors over HTTP. The same keys work for the MCP server.

Base URL

All endpoints are served from https://api.observerkit.com.

Authentication

Send your API key as a bearer token. Create one in your project API Access settings; the full key is shown once at creation. Keys are scoped to a single project, so a key only ever sees that project's errors.

curl -s "https://api.observerkit.com/v1/errors/groups?status=active" \
  -H "Authorization: Bearer YOUR_API_KEY"

Rate limits

Requests are limited to 120 requests per minute per key by default. Every response carries the current limit, remaining budget, and reset time as headers.

X-RateLimit-Limit: 120
X-RateLimit-Remaining: 118
X-RateLimit-Reset: 1753104000

Over the limit, the API responds with 429 and the body { "error": "Rate limit exceeded" }.

Error responses

Domain errors return a tagged JSON body with an HTTP status: 401 for a missing or invalid key, and 404 for a group the key cannot see.

{ "_tag": "ErrorGroupNotFound", "code": 4001, "message": "Error group not found" }

Invalid query parameters (400) and rate-limit rejections (429) use a simpler { "error": "..." } body instead of the tagged shape.

Endpoints

GET/v1/errors/groups

List error groups for the key's project, newest activity first.

statusoptionalFilter by status: active, ignored, or resolved.
sinceoptionalOnly groups active since this time. ISO 8601, or shorthand 30m, 2h, 7d (units m, h, d).
limitoptionalMaximum groups to return. Defaults to 50.
offsetoptionalNumber of groups to skip for pagination. Defaults to 0.
{
  "groups": [ {
  "id": "3f1c...",
  "projectId": "9a2b...",
  "fingerprint": "handleClick:TypeError",
  "message": "Cannot read properties of undefined (reading 'profile')",
  "errorType": "TypeError",
  "status": "active",
  "eventCount": 12,
  "firstSeenAt": "2026-07-01T09:12:00.000Z",
  "lastSeenAt": "2026-07-01T14:47:00.000Z"
} ],
  "total": 1,
  "limit": 50,
  "offset": 0
}
GET/v1/errors/groups/:groupId

Fetch one group with its latest event, including symbolicated stack frames.

{
  "group": {
  "id": "3f1c...",
  "projectId": "9a2b...",
  "fingerprint": "handleClick:TypeError",
  "message": "Cannot read properties of undefined (reading 'profile')",
  "errorType": "TypeError",
  "status": "active",
  "eventCount": 12,
  "firstSeenAt": "2026-07-01T09:12:00.000Z",
  "lastSeenAt": "2026-07-01T14:47:00.000Z"
},
  "latestEvent": {
    "id": "c4d5...",
    "resolvedFrames": [
      {
        "file": "src/components/Button.tsx",
        "line": 42,
        "functionName": "handleClick",
        "resolved": true
      }
    ]
  }
}
GET/v1/errors/groups/:groupId/events

List individual events belonging to a group, newest first.

limitoptionalMaximum events to return. Defaults to 20.
{
  "events": [
    {
      "id": "c4d5...",
      "timestamp": "2026-07-01T14:47:00.000Z",
      "origin": "https://example.com"
    }
  ]
}
PATCH/v1/errors/groups/:groupId/resolve

Mark a group resolved. Reopens automatically if the error recurs.

{ "group": {
  "id": "3f1c...",
  "projectId": "9a2b...",
  "fingerprint": "handleClick:TypeError",
  "message": "Cannot read properties of undefined (reading 'profile')",
  "errorType": "TypeError",
  "status": "active",
  "eventCount": 12,
  "firstSeenAt": "2026-07-01T09:12:00.000Z",
  "lastSeenAt": "2026-07-01T14:47:00.000Z"
} }
PATCH/v1/errors/groups/:groupId/unresolve

Reopen a resolved group. REST only; not exposed as an MCP tool.

{ "group": {
  "id": "3f1c...",
  "projectId": "9a2b...",
  "fingerprint": "handleClick:TypeError",
  "message": "Cannot read properties of undefined (reading 'profile')",
  "errorType": "TypeError",
  "status": "active",
  "eventCount": 12,
  "firstSeenAt": "2026-07-01T09:12:00.000Z",
  "lastSeenAt": "2026-07-01T14:47:00.000Z"
} }
PATCH/v1/errors/groups/:groupId/ignore

Ignore a group so it stops triggering notifications.

{ "group": {
  "id": "3f1c...",
  "projectId": "9a2b...",
  "fingerprint": "handleClick:TypeError",
  "message": "Cannot read properties of undefined (reading 'profile')",
  "errorType": "TypeError",
  "status": "active",
  "eventCount": 12,
  "firstSeenAt": "2026-07-01T09:12:00.000Z",
  "lastSeenAt": "2026-07-01T14:47:00.000Z"
} }