Observe
Product analytics, error tracking, request traces and alerts for every app, in one dashboard.
Recording events
curl -X POST https://api.dianthan.com/v1/logs \
-H "X-API-Key: dn_live_…" -H "X-App-Id: app_…" \
-H "Content-Type: application/json" \
-d '{
"type": "export.completed",
"actor_user_id": "usr_x81…",
"body": { "format": "pdf", "pages": 14, "ms": 812 }
}'typenames the event. Usenoun.verbin the past tense:export.completed,invite.sent.actor_user_idis optional. It must be a user of this app, and it links the event to that person.bodyholds whatever you want to break down by later.
Read events back with GET /v1/logs, filtered by type or actor_user_id. That makes a "your activity" page a single request. GET /v1/logs/counts returns daily and total counts per type.
The dashboard
Your dashboard lists every app with sign-ups, sign-ins, active users and your own events, each compared with the previous period. Open an app for daily charts and breakdowns by any field in an event's body, such as success rate by format or failures by host. Sign-in uses a single-use emailed link. The dashboard sets no third-party cookies and loads no third-party assets.
Errors and traces
Report errors from your server or browser:
curl -X POST https://api.dianthan.com/v1/telemetry/errors \
-H "X-API-Key: dn_live_…" -H "X-App-Id: app_…" \
-H "Content-Type: application/json" \
-d '{"message":"Cannot read properties of undefined (reading \"id\")","stack":"…","url":"/exports/42"}'Errors are grouped by cause. Dianthan also traces a sample of its own requests for each app, so GET /v1/telemetry/traces shows latency percentiles for each route without any extra setup.
Alerts
curl -X POST https://api.dianthan.com/v1/alerts \
-H "X-API-Key: dn_live_…" -H "X-App-Id: app_…" \
-H "Content-Type: application/json" \
-d '{"name":"Slow API","metric":"p95_latency_ms","threshold":800,"window_minutes":15,"webhook_id":"whk_…"}'Two metrics are available: new_errors (errors in the window above the threshold) and p95_latency_ms (latency above the threshold). Alerts are checked every few minutes. When one fires, it's delivered to the webhook you named, which can forward it to email, Slack or anything else.
In preview: a weekly digest across all your apps, and uptime checks against your public URLs with a status page you can share.
Undo
Every record change is written to the audit log with the key or person that made it and a copy of the record as it was before. That makes one credential's changes reversible: give each agent its own key, and if one does something it shouldn't, roll back everything it changed in a window.
curl -X POST https://api.dianthan.com/v1/audit-log/revert \
-H "Authorization: Bearer $OWNER_TOKEN" -H "X-App-Id: app_…" -H "Content-Type: application/json" \
-d '{ "api_key_id": "key_…", "since": "2026-11-13T02:00:00Z" }'The first call is a preview (dry_run defaults to true) and lists each change with how it would be undone: records the key created are deleted, changed records get their earlier version back, deleted records are brought back with their original id. Send "dry_run": false to apply it. A record that someone else has changed since is skipped and listed, never overwritten. The undo is itself written to the audit log as audit.reverted.
Undo needs an owner or admin of the app, and covers records. The console has the same thing under Operations, Audit and undo.