Custom ingest
If Tiden does not yet provide an SDK for your runtime, send the envelope format directly to the ingest endpoint.
DSN mapping
A DSN has this shape:
https://<publicKey>@<ingest-host>/<productId>
It maps to:
POST https://<ingest-host>/api/<productId>/envelope/?tiden_key=<publicKey>
Browser clients should pass the key in the query string to avoid CORS preflight. Server clients may also use:
X-Tiden-Auth: Tiden tiden_key=<publicKey>
Envelope body
The body is newline-delimited:
{}
{"type":"event"}
{"event_id":"9b2c1f4e8a7d4c2e9f10ab12cd34ef56","timestamp":"2026-01-01T12:00:00Z","level":"error","platform":"other","message":"Checkout failed"}
Set:
Content-Type: application/x-tiden-envelope
Example request
curl "https://<ingest-host>/api/<productId>/envelope/?tiden_key=<publicKey>" \
-H "Content-Type: application/x-tiden-envelope" \
--data-binary $'{}\n{"type":"event"}\n{"event_id":"9b2c1f4e8a7d4c2e9f10ab12cd34ef56","timestamp":"2026-01-01T12:00:00Z","level":"error","platform":"other","message":"Checkout failed"}'
Event fields
| Field | Type | Notes |
|---|---|---|
event_id | string | Recommended 32 hex chars for deduplication |
timestamp | string or number | ISO 8601 or epoch seconds |
level | string | fatal, error, warning, info, or debug |
platform | string | Runtime name such as python, javascript, or other |
message | string or object | Plain text or formatted message object |
exception.values[] | array | Exception chain, root cause first |
stacktrace.frames[] | array | Function, filename or path, line, in_app |
fingerprint | string array | Optional grouping override |
release | string | Version context |
environment | string | Runtime target |
Responses
| Status | Meaning |
|---|---|
200 | Accepted |
400 | Bad product or envelope |
401 | Missing or invalid key |
429 | Rate limited |
Default limits are 1 MiB request bodies, 50 events per second per key, and burst 200.