Skip to main content

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​

FieldTypeNotes
event_idstringRecommended 32 hex chars for deduplication
timestampstring or numberISO 8601 or epoch seconds
levelstringfatal, error, warning, info, or debug
platformstringRuntime name such as python, javascript, or other
messagestring or objectPlain text or formatted message object
exception.values[]arrayException chain, root cause first
stacktrace.frames[]arrayOldest call first, crash frame last. Function, filename or abs_path, line, in_app
fingerprintstring arrayOptional grouping override
releasestringVersion context
environmentstringRuntime target

Frame paths and the component tag decide which component an error belongs to. See How errors get a component.

Responses​

StatusMeaning
200Accepted
400Bad product or envelope
401Missing or invalid key
429Rate limited

Default limits are 1 MiB request bodies, 50 events per second per key, and burst 200.