Audit log
The audit log is the organization’s tamper-resistant record of privileged actions. Unlike the activity feed, it is admin-only and records the security facts: actor, IP, user agent and structured metadata.
| Activity feed | Audit log | |
|---|---|---|
| Who can read | anyone with repository access | audit.read — ADMIN, OWNER |
| Purpose | understand the work | answer “who did this, from where?” |
| Records IP / user agent | no | yes |
| Reachable by an API token scope | yes | no — session-authenticated roles only |
| Plan | all plans | Team and Business |
Reading it
Section titled “Reading it”Organization settings → Audit log, or:
curl -sS "https://cavsnode.com/api/v1/organizations/acme-ai/audit" \ -H "Authorization: Bearer $CAVS_TOKEN"{ "events": [ { "id": "3f9a…", "organization_id": "0a11…", "actor_id": "77bc…", "action": "token.created", "resource_type": "token", "resource_id": "6f1a…", "ip_address": "203.0.113.7", "user_agent": "Mozilla/5.0 …", "metadata": { "name": "github-actions/vision-build", "kind": "CI" }, "created_at": "2026-07-28T12:00:04Z" } ]}What gets recorded
Section titled “What gets recorded”| Area | Actions |
|---|---|
| Organization | organization.updated, organization.deleted |
| Members | member.invited, member.removed, member.role_changed, member.left, organization.member.joined |
| Invitations | invitation.revoked, invitation.link_regenerated |
| Tokens | token.created, token.revoked |
| Repositories | repository.created, repository.updated, repository.deleted, repository.push, repository.index |
| Repository access | repository.member.invited, repository.member.joined, repository.member.upserted, repository.member.removed, repository.invitation.revoked |
| Releases & snapshots | repository.release.updated, repository.snapshot.requested |
| Lineage | repository.graph.edge.created, repository.graph.edge.deleted |
| Storage | storage.connection.created, .updated, .tested, .removed; storage_group.created, .updated, .deleted |
| Webhooks | webhook.created, webhook.updated, webhook.deleted |
| Billing | billing.checkout_started, billing.subscription_updated, billing.byos_addon_updated |
Each carries the metadata relevant to it — a push records its generation and object count, a token creation records the name and kind, a role change records the old and new roles.
Questions it answers
Section titled “Questions it answers”export API=https://cavsnode.com/api/v1export H="Authorization: Bearer $CAVS_TOKEN"AUDIT="$API/organizations/acme-ai/audit"
# Who created tokens recently?curl -sS "$AUDIT" -H "$H" | jq '.events[] | select(.action == "token.created")'
# Everything one actor didcurl -sS "$AUDIT" -H "$H" | jq --arg a "$USER_ID" '.events[] | select(.actor_id == $a)'
# Anything from an unexpected addresscurl -sS "$AUDIT" -H "$H" | jq -r '.events[] | "\(.created_at)\t\(.ip_address)\t\(.action)"'
# Deletionscurl -sS "$AUDIT" -H "$H" | jq '.events[] | select(.action | test("deleted|removed|revoked"))'Exporting for retention
Section titled “Exporting for retention”Since the endpoint keeps only the last 100 events, archive them somewhere durable if you have a retention obligation. Poll frequently enough that you never miss more than 100 events between runs — hourly is plenty for most organizations.
#!/usr/bin/env bashset -euo pipefail
ORG=acme-aiOUT="audit/$(date -u +%Y-%m-%d).jsonl"mkdir -p audit
curl -sS --fail-with-body \ "https://cavsnode.com/api/v1/organizations/$ORG/audit" \ -H "Authorization: Bearer $CAVS_ADMIN_TOKEN" \ | jq -c '.events[]' >> "$OUT"
# De-duplicate by event id, since consecutive polls overlap.sort -u -t'"' -k4,4 "$OUT" -o "$OUT"Investigating an incident
Section titled “Investigating an incident”- Contain first. Revoke the suspect token or remove the member. Investigation is second.
- Pull the audit log immediately, before it rolls past 100 events, and save it.
- Filter by
actor_idfor everything that actor touched. - Cross-check
ip_addressagainst expected ranges — and against the token list’s last-used IP. - Check
repository.pushandrepository.deletedentries for data changes. - Check
token.created— a common escalation is minting a new token before doing anything visible. - Check
storage.connection.updated— repointing storage is a quiet way to redirect data. - Quote the
request_idfrom any related API error when you contact support.
Availability
Section titled “Availability”The audit log is a Team and Business plan feature (features.audit_log).
Free and Developer organizations still have the activity feed
and per-token last-used data.
- API tokens — last-used data, revocation.
- Security model — what we store and how it’s protected.
- Usage & metering — the per-event ledger.

