Appearance
Error Events API
Error events are exceptions reported by your applications and external systems. kendo fingerprints each event, deduplicates identical errors into a single error group, and tracks how often and how recently each group occurs. External systems submit events using a project token carrying the error-events:write ability.
Laravel apps: use the client library
For Laravel applications, the canonical integration is the kendo-error-tracker Composer package. It scrubs PII before sending, normalizes file paths, and reports asynchronously without blocking the request. The raw POST documented below is the language-agnostic fallback for non-Laravel systems. See the Error Tracking guide.
Requires the Error Tracking feature
This endpoint is only available when the Error Tracking feature is enabled for your workspace. If it is disabled, requests return 403 with "feature_restricted": true.
Permissions
Error ingestion requires a project token carrying the error-events:write ability. Personal access tokens cannot call this endpoint — it is reserved for external systems submitting into a single project.
| Authentication | Required | Scope |
|---|---|---|
| Project token | The error-events:write ability | The single project the token is linked to |
The project token's owner must also be able to create error groups in the project (the Error Groups: Create permission, or admin / project-owner bypass).
Endpoints
| Method | Endpoint | Description |
|---|---|---|
POST | /api/projects/{projectId}/error-events | Ingest an error event |
Ingest an Error Event
POST /api/projects/{projectId}/error-events
Submits a single exception. kendo computes a fingerprint from the exception class and a normalized stack trace, then either creates a new error group or increments the matching one. The endpoint returns 202 Accepted with an empty body — clients should not depend on a response payload.
Authenticate with a project token that has the error-events:write ability. This endpoint does not accept personal access tokens.
Request Fields
| Field | Type | Required | Description |
|---|---|---|---|
environment | string | Yes | Deployment environment, max 255 characters (e.g. production, staging). Part of the grouping key — the same error in different environments forms separate groups |
exception_class | string | Yes | Fully-qualified exception class, max 255 characters (e.g. RuntimeException) |
message | string | Yes | Human-readable exception message, max 65,535 characters. May be an empty string, but the field must be present |
stack_trace | string | Yes | Raw stack trace text, max 131,072 characters. Used to compute the fingerprint. May be an empty string, but the field must be present |
release | string | No | Version or deploy identifier (e.g. a git SHA or tag). Stored for reference but not part of the fingerprint, so deploys of the same code deduplicate together |
bash
curl -X POST https://{tenant}.kendo.dev/api/projects/1/error-events \
-H "Authorization: Bearer your-project-token" \
-H "Content-Type: application/json" \
-d '{
"environment": "production",
"release": "v1.4.2",
"exception_class": "RuntimeException",
"message": "Undefined array key \"user_id\"",
"stack_trace": "#0 /var/www/app/Http/Controllers/OrderController.php(42): handle()\n#1 {main}"
}'text
202 Accepted
(empty body)How Deduplication Works
kendo groups errors so that the same fault reported many times appears once, with an occurrence count:
- Fingerprint — derived from the
exception_classand a normalizedstack_trace. Host-specific path prefixes are stripped before hashing, so the same exception reported from different servers deduplicates into one group:/var/www/and/home/<user>/(any user) are removed, and any…/vendor/path is collapsed tovendor/. For example, both/home/forge/app/Foo.phpand/var/www/app/Foo.phpnormalize toapp/Foo.php. - Fallback — if the stack trace is empty or cannot be parsed, the fingerprint falls back to the exception class plus the first non-empty line of the normalized stack trace. An event is never rejected for an unparseable trace.
- New group — the first event with a given fingerprint creates a group with
occurrence_count: 1andfirst_seen_at == last_seen_at. - Repeat — a matching fingerprint increments
occurrence_countand bumpslast_seen_at(and the latest message / stack trace).first_seen_atnever changes.
Only the fields above are stored. Any additional fields in the request body are ignored — kendo deliberately does not persist request bodies, user data, or arbitrary context with error groups.
Retention
Error groups are operational data and are pruned automatically. A group is deleted once its last_seen_at is older than the retention window (default 90 days). Active errors that keep occurring are never pruned.
Common Errors
| Status | Cause |
|---|---|
401 | Token is missing, invalid, revoked, or expired |
403 | Token lacks the error-events:write ability, or the Error Tracking feature is disabled ("feature_restricted": true) |
422 | Request validation failed, or the token is not linked to (or is inactive for) the target project |
429 | Rate limit exceeded — ingestion is limited to 1,000 requests per minute per token |
See Also
- Error Tracking guide — Wire the kendo-error-tracker client into a Laravel app
- Project Tokens API — Create tokens with the
error-events:writeability - Reports API — Submit feedback reports via project tokens
- Tokens API — Personal access tokens for full API access