An audit log is only useful if you can trust two opposite things about it: that it captured what happened, and that it did not quietly capture more than you asked for. Meandr’s agent audit log is built around that tension. It records every call with its request, encrypted, and keeps the response only when a policy says to.
One row per call, with the request
Every resolved tool call becomes one immutable row. A row is small — on the order of a couple of hundred bytes — and it answers the questions an audit asks:
- Who — which agent made the call, and the caller’s IP it came from;
- What — which server and tool, and the method;
- When — the time and how long it took;
- Which rule — the policy that decided it, the verdict (allow, deny, or approve), and a short reason code;
- Outcome — the status, and how many bytes flowed each way.
Alongside that row, Meandr keeps the request, encrypted, for every call; the response only when a policy records responses. The row tells you a refund tool was called, by this agent, matched by that rule, and denied. This per-call log is the real, running surface: it is what powers the call timeline and the denial feed, and it holds for denied calls exactly as for allowed ones, so “we blocked this” is always on the record.
The verdict codes also drive billing. A call is billable only if it actually reached the upstream — a success or an upstream error — while policy blocks, approval holds, and rate-limit or quota blocks reached nothing and cost nothing.
Responses only when you ask: per policy
The request is always kept, encrypted. Sometimes you also need what came back — to debug an integration, or to satisfy a compliance requirement. Keeping the response is therefore a setting on the policy, not a global switch: each policy has a Record responses toggle, and the default policy has it on.
Because that toggle follows the same first-match rule as every other policy field, “keep responses everywhere except payroll” is expressible: a policy on the sensitive path leaves it off, while a broader policy keeps the rest. It applies to denials too, so a blocked call keeps the very request it was blocked on — which is exactly what makes “we stopped this” auditable.
Payload-blind by design
When a request or response is stored, it is encrypted before it leaves the proxy with AES-256-GCM, under a data key wrapped by a per-environment KMS key. The proxy holds the encrypt path; the backend holds the decrypt role. A stored body is decrypted only for authorized users of your account, in the console or in exports they request; export files are kept for about a day.
And Meandr does not read them. Recording is storage, not inspection — there is no DLP, no regex, no PII scanning over your traffic. That is a deliberate guarantee, not an omission: adding content inspection would break payload-blindness, so it is off by architecture. Meandr never scans what it stores; a body is decrypted only when an authorized user of your account opens or exports it.
Retention as a plan axis
How long a stored body lives is a retention class that travels with the object as a storage tag rather than something bolted on later — a shorter window on the entry plan, a longer one on Business. Retention is priced as its own axis, so you keep bodies as long as your obligations require and no longer. See the pricing page for how the tiers line up.
Decide on Record responses when you write your first policy, and read how a held call becomes a logged human decision.