Appearance
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
| Action | Required Permission | Scope |
|---|---|---|
| Resolve | Error Groups: Update | Within accessible projects |
| Ignore | Error Groups: Update | Within accessible projects |
| Reopen | Error Groups: Update | Within accessible projects |
| Promote to issue | Error Groups: Update | Within accessible projects |
Admins and project owners bypass all permission checks for project-scoped resources.
Endpoints
| Method | Endpoint | Description |
|---|---|---|
POST | /api/projects/{projectId}/error-groups/{errorGroupId}/resolve | Mark a group as Resolved |
POST | /api/projects/{projectId}/error-groups/{errorGroupId}/ignore | Mark a group as Ignored |
POST | /api/projects/{projectId}/error-groups/{errorGroupId}/reopen | Reopen a group to Open |
POST | /api/projects/{projectId}/error-groups/{errorGroupId}/promote | Create a Bug issue from the error group |
Error Group Resource
All three endpoints return the updated error group resource.
| Field | Type | Description |
|---|---|---|
id | integer | Unique identifier |
project_id | integer | The project this group belongs to |
environment | string | Deployment environment (e.g. production) |
release | string | null | Version or deploy identifier |
fingerprint | string | SHA-256 fingerprint used for deduplication |
exception_class | string | Fully-qualified exception class |
latest_message | string | Most recent exception message |
latest_stack_trace | string | Most recent stack trace |
occurrence_count | integer | Total number of times this error has been reported |
status | integer | 0 = Open, 1 = Resolved, 2 = Ignored |
resolved_at | string | null | ISO 8601 timestamp when the group was resolved; null if not Resolved |
resolved_by_id | integer | null | ID of the user who resolved the group; null if not Resolved |
linked_issue_id | integer | null | ID of the Bug issue created from this group via promote; null until promoted |
first_seen_at | string | ISO 8601 timestamp of the first occurrence |
last_seen_at | string | ISO 8601 timestamp of the most recent occurrence |
created_at | string | ISO 8601 timestamp |
updated_at | string | ISO 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_atandresolved_by_idare set - Ignored — the error is acknowledged but not actionable;
resolved_atandresolved_by_idare 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
| Status | Cause |
|---|---|
401 | Token is missing, invalid, revoked, or expired |
403 | Missing Error Groups: Update permission, or the Error Tracking feature is disabled |
404 | Error group not found, or does not belong to the specified project |
See Also
- Error Events API — Ingest exceptions and create error groups
- Error Tracking guide — Wire the kendo-error-tracker client into a Laravel app
- Project Tokens API — Manage tokens for external error ingestion