Foxy Audit
Book a demo
← Back to all cards

One decorator, @foxy.audit(). That's the whole SDK.

No rearchitecting, no proxy, no rewriting your model calls. Add one line and each call becomes a content-blind commitment, graded and chained through a durable local queue.

your_app.py
$ pip install foxy-audit
$ export FOXY_API_KEY="YOUR_API_KEY"
$ export FOXY_BACKEND_URL="https://app.foxyaudit.tech"

from foxy_audit import audit

@audit(policy="soc2")
def ask_model(prompt):
    return llm.generate(prompt)

The decorator wraps your function transparently. In the default best-effort mode, the SDK saves a record of the call to a local spool on your own thread, which normally takes milliseconds, and a background thread sends it to Foxy Audit. Critical services can enable audit_required=True to fail closed when evidence cannot be delivered.

What actually leaves your machine

  • An HMAC commitment of the prompt and response, never the raw text. It is keyed with a key the SDK makes and keeps on your machine, which Foxy Audit never sees.
  • The token count, the model name and the policy tag you set. No time leaves with them: the ledger stamps each record when it arrives.
  • In block or redact mode, the local decision and the ids of the rules that fired. The judge's verdict is not among them: the judge grades this metadata on the server, after the record arrives.

Built to stay out of your way

  • Two delivery modes: best-effort background capture or audit_required fail-closed capture.
  • Default mode is best-effort: telemetry errors stay out of your app; audit_required intentionally fails closed.
  • Survives outages: records queue locally and sync when the backend is reachable again.

Learn it step by step

The SDK manual explains every feature, setting and command, starting with a first run that needs no account.

Wrap your first call today.

Book a demo and we'll get the SDK recording a real call on your stack in minutes.

Book a demo