Qeet Docs
Platform

Audit

An append-only, SHA-256 hash-chained audit log with a /verify integrity endpoint and behavioral-baseline anomaly detection — provable tamper-evidence most CIAM platforms don't offer.

Qeet ID writes an append-only audit log where each entry is SHA-256 hash-chained to the previous one. Because every record commits the hash of its predecessor, altering or deleting any entry breaks the chain — and a /verify endpoint proves the chain is intact.

A genuine differentiator

Tamper-evident, hash-chained audit with an integrity endpoint is something most mainstream identity platforms don't ship. (Externally-verifiable Merkle checkpoints — provable to a third party — are on the roadmap.)

Read the log

GET/v1/tenants/{tenantID}/auditQuery audit events
Bash
curl "https://api.id.qeet.in/v1/tenants/$TENANT/audit?limit=50&action=role.assigned&actor_user_id=$USER" \
  -H "Authorization: ApiKey $QEETID_API_KEY"

action, resource_type, and actor_user_id filter server-side; cursor (the id of the last-seen event) keyset-paginates through the rest.

Verify integrity

The verify endpoint recomputes the chain and reports whether it's intact (and where it breaks, if it doesn't).

GET/v1/tenants/{tenantID}/audit/verifyVerify the hash chain
Bash
curl "https://api.id.qeet.in/v1/tenants/$TENANT/audit/verify" \
  -H "Authorization: ApiKey $QEETID_API_KEY"
# → { "ok": true, "rows_checked": 12840 }

What's recorded

Security-relevant state changes are audited: sign-ins (success + failure), MFA events, refresh-token theft detection, role/permission and policy changes, session creation/revocation, admin configuration changes, API-key lifecycle, and GDPR operations. After a GDPR erasure, the audit record of the deletion survives with PII redacted — you keep a provable trail without retaining personal data.

Audit retention is governed by per-tenant retention settings; auto-purge respects the hash chain.

Anomaly detection

A background sweep builds a rolling behavioral baseline per (tenant, actor) — which action types they take, what hours they're normally active, which IPs they act from — and flags new events that deviate: a first-time action type, an unusual hour, or a brand-new IP. It's a transparent, weighted-novelty score (0–1), not a black-box model — every flag names exactly which signals fired.

GET/v1/tenants/{tenantID}/audit/anomaliesList anomalies
POST/v1/tenants/{tenantID}/audit/anomalies/{id}/resolveResolve an anomaly
an anomaly
JSON
{
  "action": "billing.plan_changed",
  "actor_email": "admin@acme.example",
  "score": 0.7,
  "reasons": ["new_action_type", "new_ip"],
  "status": "open"
}

Cold start

An actor needs a minimum history (20 events by default, min_baseline_events) before anything is flagged for them — otherwise a brand-new admin's very first actions would all look "100% novel." Tune this and the score threshold per tenant:

PUT/v1/tenants/{tenantID}/audit/anomaly-settingsUpdate detection settings

Also in the console: Security & Compliance → Audit Intelligence, alongside a finally- wired UI for the /verify integrity check above.

On this page