Audit log
Available: signed-in dashboard routes. The audit log is the stored record of who changed what in a team or project. It is append-only and holds identifiers, roles and labels, never a secret, a token, an email address or card data.
GET /v1/audit
GET /v1/tenants/{tenant_id}/audit
GET /v1/teams/{team_id}/audit
Who can read it
| Route | Allowed |
|---|---|
/v1/teams/{team_id}/audit | The team's owners and admins (members:manage): member and invite changes and every entry of the team's projects |
/v1/tenants/{tenant_id}/audit | The project's owners, admins and developers (keys:manage): project entries |
/v1/audit | Everything the caller may read through the two rules above, across teams; team_id and tenant_id narrow it |
| Any of them | Ivora staff read every entry |
Operators, viewers and billing members are refused with 403. API keys and app
tokens are refused too: the log is read by a signed-in person.
What is recorded
| Action | When |
|---|---|
team.member.added, team.member.updated, team.member.removed | A member joins, changes role or project limit, or leaves or is removed |
team.invite.created, team.invite.accepted, team.invite.declined, team.invite.revoked | An invite changes state (the address is not stored) |
project.created, project.renamed | A project is created or renamed |
project.api_key.created, project.api_key.revoked | A project API key is created (label and scopes) or revoked |
metadata.updated | An object's metadata changed: target is <object>:<id> (such as station:1042), detail the keys set with their values cut to 100 characters and the keys deleted |
migration.rollback_requested, migration.rollback_applied_socket_open, migration.rollback_applied, migration.rollback_failed, migration.rollback_superseded, migration.rollback_expired | A pilot charger rollback was asked for (station, name, reason and source), and each later status: the charger proxy's result, the connection to Ivora closing, a later forward flip, or 24 hours without a result (system:migration) |
migration.proxy_routes_changed | The charger proxy reported a charger on another route than before, or stopped reporting it |
network_import.dry_run, network_import.applied, network_import.reverted | A network import was dry-run (source and counts), applied (status) or reverted. With an API key, detail names the key (key_id, key_kind) and who made it (key_created_by) |
ocpi.payment_terminal.enabled, ocpi.payment_terminal.disabled | The project chose or stopped an OCPI payment-terminal partner: target is the partner ID. While chosen, that partner may start charging at the project's ready EVSEs and charges drivers' cards for the sessions' charge records |
station.decommissioned, station.recommissioned | A station is decommissioned (name, reason and source: tenant or ivora) or recommissioned, by the project or by Ivora staff |
An entry has id, at, actor (user:{id}), action, team_id,
tenant_id (null for team-level entries), target and detail.
Filters and paging
action takes an exact action or a family (team.member). actor matches the
actor exactly. since (inclusive) and until (exclusive) are ISO 8601
timestamps with an offset. Results are newest first, up to limit (1 to 100,
default 50); pass next_cursor as cursor for the next, older page. It is
null on the last page.
An entry is written beside the change it describes; if storing it fails, the change still succeeds.
Entries are kept for at least 1 year and then deleted. No entry can be changed, and none can be deleted before then.



