Skip to main content

Audit Log Export API

The Audit Log Export endpoint streams all audit events for your project within a requested date range directly to a file. It is designed for SOC2 evidence collection, compliance audits, and offline analysis.

Base URL: https://api.zeridion.com/flare/v1

Authentication is JWT + project-membership role of admin or owner only — Authorization: Bearer <api_key> is explicitly rejected on this surface, because audit-log rows expose security-event PII (IPs, user-agents, login attempts) that an unprivileged tenant API key must not read. Callers without a valid JWT receive 401 unauthorized; callers whose membership role is below admin receive 403 forbidden. The endpoint is subject to a dedicated rate limit of one export per minute per tenant — separate from the normal hourly quota.


GET /flare/v1/projects/{projectId}/audit-log/export​

Stream audit log rows in JSONL or CSV format for a date range up to 90 days.

Request​

GET /flare/v1/projects/{projectId}/audit-log/export?from=<iso>&until=<iso>&format=jsonl|csv
Authorization: Bearer <jwt_token>

Path parameters​

ParameterTypeRequiredDescription
projectIdstringyesThe project whose audit log to export. The caller's JWT must carry an admin or owner membership in this project.

Query parameters​

ParameterTypeRequiredDescription
fromstringyesISO 8601 start of the export window (inclusive).
untilstringyesISO 8601 end of the export window (inclusive).
formatstringnojsonl (default) or csv.

Response​

On success the response body is streamed directly — no JSON envelope. The Content-Disposition header carries the suggested filename.

HeaderValue
Content-Typeapplication/x-ndjson (jsonl) or text/csv
Content-Dispositionattachment; filename="zeridion-audit-\{projectId\}-\{date\}.\{ext\}"

The response is chunked-transfer — there is no Content-Length header.


JSONL format​

One JSON object per line (newline-delimited JSON / ndjson). Rows are ordered by created_at ascending, then id ascending.

{"id":"act_01J...","created_at":"2026-04-01T00:00:00+00:00","kind":"job_created","target_type":"job","target_id":"job_01J...","summary":"Job enqueued: send_email","metadata":{"queue":"default"}}
{"id":"act_01J...","created_at":"2026-04-01T00:05:12+00:00","kind":"job_created","target_type":"job","target_id":"job_01J...","summary":"Job enqueued: generate_report","metadata":null}

Field reference​

FieldTypeDescription
idstringUnique audit event ID (act_ prefix).
created_atISO 8601When the event was recorded (UTC).
kindstringEvent kind in snake_case wire format (e.g. job_created, not JobCreated). See ActivityKind values in the Activity API doc for the complete enumeration of kinds.
target_typestringResource type affected ("job", "alert", "recurring", …).
target_idstring | nullID of the affected resource, or null if not applicable.
summarystringHuman-readable description of the event.
metadataobject | nullShape-specific extra fields (queue, channel, …), or null.

CSV format​

RFC-4180 compliant. First row is the header. Fields containing commas, double-quotes, or newlines are enclosed in double-quotes; internal double-quotes are doubled.

Id,CreatedAt,Kind,TargetType,TargetId,Summary,Metadata
act_01J...,2026-04-01T00:00:00+00:00,job_created,job,job_01J...,"Job enqueued: send_email","{""queue"":""default""}"

curl examples​

JSONL export (last 30 days)​

curl -G "https://api.zeridion.com/flare/v1/projects/$PROJECT_ID/audit-log/export" \
-H "Authorization: Bearer $ZERIDION_JWT" \
--data-urlencode "from=$(date -u -v-30d +%Y-%m-%dT%H:%M:%SZ)" \
--data-urlencode "until=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
--data-urlencode "format=jsonl" \
-o audit-log.jsonl

CSV export (specific date range)​

curl -G "https://api.zeridion.com/flare/v1/projects/$PROJECT_ID/audit-log/export" \
-H "Authorization: Bearer $ZERIDION_JWT" \
--data-urlencode "from=2026-01-01T00:00:00Z" \
--data-urlencode "until=2026-03-31T23:59:59Z" \
--data-urlencode "format=csv" \
-o audit-log.csv

Error responses​

All errors follow the standard error envelope.

CodeHTTPDescription
invalid_from400from is missing or not a valid ISO 8601 date-time.
invalid_until400until is missing or not a valid ISO 8601 date-time.
invalid_range400from is not before until.
range_too_large400The requested window exceeds 90 days.
invalid_format400format is not "jsonl" or "csv".
rate_limit_exceeded429The tenant has already requested an export in the last 60 seconds. The response carries Retry-After: 60 (the full cooldown window, as an upper bound).

Notes​

  • Rows are paginated internally in 500-row pages and streamed without buffering — the endpoint is safe to call for very large projects.
  • The metadata field is raw JSON stored on write. In JSONL it is embedded as a nested object (not a string). In CSV it is serialized as a JSON string.
  • The export does not include deleted projects' rows — rows are filtered strictly to the authenticated tenant.

See also​

  • Activity API — read the same audit rows as a cursor-paginated dashboard feed
  • Monitoring guide — ship audit exports to SIEM and log-storage backends
  • Errors — rate_limit_exceeded, invalid_format, and other failure modes