Statio

Documentation
API Reference
Changelog
concepts/Reading the audit log

Reading the audit log

Statio keeps two records, because they answer two different questions:

RecordAnswersIn the dashboard
Tool callsWho called which tool, and what happened?Activity
ChangesWho changed what: servers, credentials, keys, agents, access?Audit Logs

Both are written by Statio as the work happens, not reported by your agents, so an agent cannot leave something out.

Tool calls: Activity

Every tool call through the gateway is a row, whether it was allowed or refused.

FieldWhat it means
Outcomeallowed, or failed for anything that did not succeed, including a refusal
Tool and serverThe tool that was called, and the server it is on
CallerThe person or the agent that made the call
StatusThe HTTP status of the response
LatencyHow long the call took through the gateway, in milliseconds
ErrorFor a failed call, an error code and message (below)
Environmentproduction, or preview when the call went to a preview version
IP addressWhere the call came from
TimeWhen it happened

Each row also carries the request and response size, the client's user agent and a request ID.

Error codes

The error code says who said no:

CodeMeaning
STATIO_403, STATIO_429, ...Statio refused the call: no permission, a usage or rate limit, the security scan, a suspended server
HTTP_401, HTTP_500, ...The call reached the upstream API, and that is what it answered
PROXY_ERRORThe gateway could not reach the server at all

So a refusal by your policy and a rejection by the vendor never look the same. A run of HTTP_401 after a key was rotated upstream usually means the credential in Statio needs replacing too.

What is not a row

  • Protocol requests. initialize, tools/list and session requests are how a client connects, not tool calls, so they are not recorded or metered.
  • Requests that never named a server. A bad token or an unknown server name is refused before there is a server to record it against.

Filtering

Filter by tool name, server, outcome (failed or success) and a date range. The quickest audit question, "what was refused this week", is the failed filter with a date range.

Changes: Audit Logs

Audit Logs records administrative changes in one timeline: servers, deployments, credentials, API keys, catalog installs, webhooks and integrations, plus the changes made to agents and their access.

FieldWhat it means
WhatA sentence describing the change, with its action code (such as server.create)
WhoThe person who made it, by email, or the API key it was made with
KindWhat was changed: server, deployment, secret, API key, agent, access and so on
Resultsuccess, failed or denied
WhenWhen it happened
IP addressWhere the change came from

Filter by text, action code, kind, result and date range. denied is the row to watch: someone tried to make a change their role does not allow.

Credential changes are recorded as changes; the value never is. See Credentials.

Sending it to your SIEM

On Business and Enterprise, both records can be delivered to an HTTPS endpoint you run: your SIEM, a log pipeline or an observability stack. Set it up under Webhooks in the dashboard:

  1. Add a destination with its HTTPS URL. It must be publicly reachable.
  2. Choose what it receives: audit logs, tool calls, or both.
  3. Copy the signing secret. It is shown once; Rotate issues a new one.

A destination can be paused, edited or deleted at any time.

Each delivery

Every event is a POST with a JSON body and these headers:

HeaderWhat it carries
X-Statio-Event-TypeThe event type: audit.* for changes, invocation.* for tool calls
X-Statio-Delivery-IdA unique ID for the delivery. Retries reuse it, so deduplicate on it
X-Statio-TimestampWhen it was signed, in Unix seconds
X-Statio-Signaturev1= followed by the signature

The signature is an HMAC-SHA256, keyed with your signing secret, over the timestamp, a full stop, and the raw body, written as hex:

TEXT
v1=hex( HMAC_SHA256( secret, "<X-Statio-Timestamp>.<raw body>" ) )

To verify one: compute the same value from the raw body and the timestamp header, compare it with the header in constant time, and reject a timestamp more than five minutes from your clock. The timestamp is part of what is signed, so a captured delivery cannot be replayed later with a new one.

Answer with any 2xx to accept the event. Other answers are retried, except a 4xx: sending the same payload again would get the same answer, so a 4xx is not retried.

See also
Was this page helpful?
© Statio