Skip to content

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.

AuthenticationRequiredScope
Project tokenThe error-events:write abilityThe 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

MethodEndpointDescription
POST/api/projects/{projectId}/error-eventsIngest 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

FieldTypeRequiredDescription
environmentstringYesDeployment environment, max 255 characters (e.g. production, staging). Part of the grouping key — the same error in different environments forms separate groups
exception_classstringYesFully-qualified exception class, max 255 characters (e.g. RuntimeException)
messagestringYesHuman-readable exception message, max 65,535 characters. May be an empty string, but the field must be present
stack_tracestringYesRaw stack trace text, max 131,072 characters. Used to compute the fingerprint. May be an empty string, but the field must be present
releasestringNoVersion 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_class and a normalized stack_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 to vendor/. For example, both /home/forge/app/Foo.php and /var/www/app/Foo.php normalize to app/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: 1 and first_seen_at == last_seen_at.
  • Repeat — a matching fingerprint increments occurrence_count and bumps last_seen_at (and the latest message / stack trace). first_seen_at never 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

StatusCause
401Token is missing, invalid, revoked, or expired
403Token lacks the error-events:write ability, or the Error Tracking feature is disabled ("feature_restricted": true)
422Request validation failed, or the token is not linked to (or is inactive for) the target project
429Rate limit exceeded — ingestion is limited to 1,000 requests per minute per token

See Also