Skip to content

Error Groups API

Error groups are deduplicated exception records created by the Error Events API. Each group tracks how often and how recently a particular error occurs. Groups have a status lifecycle — Open, Resolved, or Ignored — that developers use to triage their error queue. A group can also be promoted to a Bug issue in one action, pre-filled from the error's details and bidirectionally linked.

Requires the Error Tracking feature

These endpoints are only available when the Error Tracking feature is enabled for your workspace. If it is disabled, requests return 403 with "feature_restricted": true.

Permissions

ActionRequired PermissionScope
ResolveError Groups: UpdateWithin accessible projects
IgnoreError Groups: UpdateWithin accessible projects
ReopenError Groups: UpdateWithin accessible projects
Promote to issueError Groups: UpdateWithin accessible projects

Admins and project owners bypass all permission checks for project-scoped resources.

Endpoints

MethodEndpointDescription
POST/api/projects/{projectId}/error-groups/{errorGroupId}/resolveMark a group as Resolved
POST/api/projects/{projectId}/error-groups/{errorGroupId}/ignoreMark a group as Ignored
POST/api/projects/{projectId}/error-groups/{errorGroupId}/reopenReopen a group to Open
POST/api/projects/{projectId}/error-groups/{errorGroupId}/promoteCreate a Bug issue from the error group

Error Group Resource

All three endpoints return the updated error group resource.

FieldTypeDescription
idintegerUnique identifier
project_idintegerThe project this group belongs to
environmentstringDeployment environment (e.g. production)
releasestring | nullVersion or deploy identifier
fingerprintstringSHA-256 fingerprint used for deduplication
exception_classstringFully-qualified exception class
latest_messagestringMost recent exception message
latest_stack_tracestringMost recent stack trace
occurrence_countintegerTotal number of times this error has been reported
statusinteger0 = Open, 1 = Resolved, 2 = Ignored
resolved_atstring | nullISO 8601 timestamp when the group was resolved; null if not Resolved
resolved_by_idinteger | nullID of the user who resolved the group; null if not Resolved
linked_issue_idinteger | nullID of the Bug issue created from this group via promote; null until promoted
first_seen_atstringISO 8601 timestamp of the first occurrence
last_seen_atstringISO 8601 timestamp of the most recent occurrence
created_atstringISO 8601 timestamp
updated_atstringISO 8601 timestamp

Status Lifecycle

        ┌─────────────────────────────────┐
        │                                 ▼
     Open (0) ──resolve──► Resolved (1)  ◄── reopen
        ▲                       │
        │                    ignore
        │                       │
     reopen              Ignored (2)
        └──────────────────────►
  • Open — the default state for every new error group
  • Resolved — a developer marked the error as fixed; resolved_at and resolved_by_id are set
  • Ignored — the error is acknowledged but not actionable; resolved_at and resolved_by_id are cleared

Regression detection: If a new occurrence arrives for a Resolved group, kendo automatically flips it back to Open and clears resolved_at / resolved_by_id. Ignored groups are not affected by new occurrences.

All three transition endpoints are idempotent — calling resolve on an already-Resolved group returns 200 with unchanged state.

Resolve an Error Group

POST /api/projects/{projectId}/error-groups/{errorGroupId}/resolve

Transitions the group to Resolved. Sets resolved_at to the current time and resolved_by_id to the authenticated user's ID. No-ops if the group is already Resolved.

bash
curl -X POST https://{tenant}.kendo.dev/api/projects/1/error-groups/42/resolve \
  -H "Authorization: Bearer your-token"
json
{
  "id": 42,
  "project_id": 1,
  "environment": "production",
  "release": "v1.4.2",
  "fingerprint": "a3f2...",
  "exception_class": "RuntimeException",
  "latest_message": "Undefined array key \"user_id\"",
  "latest_stack_trace": "#0 app/Http/Controllers/OrderController.php(42): handle()",
  "occurrence_count": 7,
  "status": 1,
  "resolved_at": "2026-06-19T14:30:00.000000Z",
  "resolved_by_id": 3,
  "linked_issue_id": null,
  "first_seen_at": "2026-06-15T09:00:00.000000Z",
  "last_seen_at": "2026-06-19T14:00:00.000000Z",
  "created_at": "2026-06-15T09:00:00.000000Z",
  "updated_at": "2026-06-19T14:30:00.000000Z"
}

Ignore an Error Group

POST /api/projects/{projectId}/error-groups/{errorGroupId}/ignore

Transitions the group to Ignored. Clears resolved_at and resolved_by_id. No-ops if the group is already Ignored.

bash
curl -X POST https://{tenant}.kendo.dev/api/projects/1/error-groups/42/ignore \
  -H "Authorization: Bearer your-token"
json
{
  "id": 42,
  "project_id": 1,
  "environment": "production",
  "release": "v1.4.2",
  "fingerprint": "a3f2...",
  "exception_class": "RuntimeException",
  "latest_message": "Undefined array key \"user_id\"",
  "latest_stack_trace": "#0 app/Http/Controllers/OrderController.php(42): handle()",
  "occurrence_count": 7,
  "status": 2,
  "resolved_at": null,
  "resolved_by_id": null,
  "linked_issue_id": null,
  "first_seen_at": "2026-06-15T09:00:00.000000Z",
  "last_seen_at": "2026-06-19T14:00:00.000000Z",
  "created_at": "2026-06-15T09:00:00.000000Z",
  "updated_at": "2026-06-19T14:35:00.000000Z"
}

Reopen an Error Group

POST /api/projects/{projectId}/error-groups/{errorGroupId}/reopen

Transitions the group back to Open. Clears resolved_at and resolved_by_id. No-ops if the group is already Open.

bash
curl -X POST https://{tenant}.kendo.dev/api/projects/1/error-groups/42/reopen \
  -H "Authorization: Bearer your-token"
json
{
  "id": 42,
  "project_id": 1,
  "environment": "production",
  "release": "v1.4.2",
  "fingerprint": "a3f2...",
  "exception_class": "RuntimeException",
  "latest_message": "Undefined array key \"user_id\"",
  "latest_stack_trace": "#0 app/Http/Controllers/OrderController.php(42): handle()",
  "occurrence_count": 7,
  "status": 0,
  "resolved_at": null,
  "resolved_by_id": null,
  "linked_issue_id": null,
  "first_seen_at": "2026-06-15T09:00:00.000000Z",
  "last_seen_at": "2026-06-19T14:00:00.000000Z",
  "created_at": "2026-06-15T09:00:00.000000Z",
  "updated_at": "2026-06-19T14:40:00.000000Z"
}

Create Issue from Error Group

POST /api/projects/{projectId}/error-groups/{errorGroupId}/promote

Creates a new Bug issue pre-filled from the error group and links the two bidirectionally. The issue title is set to {ExceptionClass}: {latest message} (truncated to 255 characters); the description includes the stack trace, occurrence count, environment, first/last seen timestamps, and a back-link to the error group.

Important: Promoting an error group does not change its status — the error stays Open after a Bug is filed (it is not fixed yet). linked_issue_id and status are independent facts.

Returns 422 if the error group already has a linked_issue_id set — to surface an existing linked issue, read linked_issue_id from the resource before calling this endpoint.

bash
curl -X POST https://{tenant}.kendo.dev/api/projects/1/error-groups/42/promote \
  -H "Authorization: Bearer your-token"
json
{
  "id": 42,
  "project_id": 1,
  "environment": "production",
  "release": "v1.4.2",
  "fingerprint": "a3f2...",
  "exception_class": "RuntimeException",
  "latest_message": "Undefined array key \"user_id\"",
  "latest_stack_trace": "#0 app/Http/Controllers/OrderController.php(42): handle()",
  "occurrence_count": 7,
  "status": 0,
  "resolved_at": null,
  "resolved_by_id": null,
  "linked_issue_id": 301,
  "first_seen_at": "2026-06-15T09:00:00.000000Z",
  "last_seen_at": "2026-06-19T14:00:00.000000Z",
  "created_at": "2026-06-15T09:00:00.000000Z",
  "updated_at": "2026-07-03T10:00:00.000000Z"
}
json
{
  "message": "This error group is already linked to an issue."
}

Common Errors

StatusCause
401Token is missing, invalid, revoked, or expired
403Missing Error Groups: Update permission, or the Error Tracking feature is disabled
404Error group not found, or does not belong to the specified project

See Also