Built so no one sees more than their job needs. Including us.

Your agents never hold platform keys. Credentials are stored encrypted, opened in memory for a single call, and every decision is recorded. This page shows where each piece lives and who can touch it.

The short version.

If you only read one part of this page, read this. Everything below is the detail behind these five lines.

What your agents hold
A signing key that proves which agent is calling. Never a platform credential.
How credentials are kept
Encrypted at rest, opened in memory for one call, then dropped. Never logged, never returned to the agent.
Whose key locks them
Your organisation’s own key. On paid plans it sits in a hardware security module that won’t release it.
What the record allows
New rows only. The audit log can’t be edited or deleted through any path in the product, and every decision carries a signed receipt.
Where it runs
Australia, in one region without multi-region failover. If the service is unreachable, calls fail closed. Need data held in another region? We can stand one up for you.

Four zones, and what each one holds.

A call crosses these from left to right. A usable credential never sits in plain text on both sides of a boundary, and each zone would fail in a different way.

  1. Your machine

    Where your agent runs

    No credential here

    Holds

    • The agent’s private signing key
    • A signed token, for about 60 seconds

    Never here

    • Any platform credential

    Break in here, and you get

    One agent’s signing key. It opens only what you granted that agent, and revoking the agent stops it on the next call.

  2. The AgentValet broker

    In Australia, reachable only through an encrypted tunnel

    Unlocked in memory, for one call

    Holds

    • The checks: who is calling, and may it?
    • A decrypted credential, for one call

    Never here

    • Credentials at rest
    • Your agent’s private key

    Break in here, and you get

    No stored credentials. The broker keeps none at rest, and each one it unlocks is dropped when its call returns.

  3. Encrypted storage

    PostgreSQL and Key Vault

    Locked, with the keys kept apart

    Holds

    • Credentials, encrypted
    • The keys that unlock them, themselves locked
    • The append-only audit log

    Never here

    • A plain-text credential

    Break in here, and you get

    Ciphertext. The keys that unlock it are locked in Key Vault, so a copy of the database alone opens nothing.

  4. The platforms you connect

    Slack, GitHub, Gmail and the rest

    As the platform issued it

    Holds

    • The account you authorised, with the access you chose

    Never here

    • Your other platforms’ credentials

    Break in here, and you get

    That one platform’s account. It holds nothing that opens your other tools.

The token broker that refreshes OAuth tokens runs alongside the broker, in Australia. Exactly where credentials are stored is set out once, in the trust centre.

Four keys, two holders.

You hold one key: your agent’s private signing key. AgentValet holds the other three, each with one job. Stealing our PostgreSQL database alone opens nothing, because the keys that unlock it live somewhere else.

You hold

Agent identity keyProves which agent is calling. The installer makes it on your machine.

AgentValet holds

Organisation key locks

Credential key locks

Your Slack token, one credential

A lock inside a lock. A stolen copy of the database holds only the inner two, still locked. On paid plans the outer key never leaves its hardware.

Receipt keySigns a receipt for every decision.
  • Agent identity key

    Proves which agent is calling. Every request is signed with it.

    RSA 2048, signing RS256 tokens that expire in about 60 seconds

    Held by

    You hold the private half. We hold the public half.

    If it’s lost

    One agent

    Revoke the agent and install it again with a new key. Nothing else changes.

  • Organisation key

    Locks every credential key that belongs to your organisation.

    Paid: RSA 4096 in hardware. Free: a 256-bit key derived with HKDF-SHA256

    Held by

    AgentValet. On paid plans, inside a hardware security module in Key Vault. On Free, a per-organisation key derived inside Key Vault.

    If it’s lost

    Every stored credential

    Every stored credential for your organisation becomes unreadable. You reconnect your tools.

  • Credential key

    Encrypts one credential. A fresh key is made for each one and bound to your organisation.

    AES-256-GCM

    Held by

    AgentValet, stored only in locked form next to the credential it encrypts.

    If it’s lost

    One tool

    That one credential is gone. You reconnect that one tool.

  • Receipt key

    Signs a receipt for every decision, so anyone can check a record wasn’t altered.

    ES256 (P-256)

    Held by

    AgentValet. The public keys are published.

    If it’s lost

    Nothing stops working

    We rotate it. Retired public keys stay published, so old receipts still verify.

On the Free plan

Every credential still gets its own AES-256-GCM key bound to your organisation. What Free doesn’t get is an organisation key held in dedicated hardware, which is what makes a key impossible to copy out and gives each key its own access log. Upgrading moves you onto a hardware key automatically, with no downtime.

Where the agent key is made

The installer generates it on your machine and sends us only the public half. Two setup paths generate it on our side instead: adding a Claude Desktop agent from the dashboard, and accepting a teammate invite. There we hand the private key over once and keep no copy.

One credential, from sign-in to gone.

Plain text exists only for the moment it takes to encrypt it or use it. The rest of the time, it’s ciphertext.

  1. You connect a tool

    In your browser, through the platform’s own sign-in

    The platform hands a token to AgentValet over TLS. We make a fresh credential key, encrypt the token with it, lock that key with your organisation key, and forget both plain-text copies.

  2. Only ciphertext is stored

    PostgreSQL, isolated per organisation

    The database keeps the encrypted credential, the locked credential key, and a reference to which organisation key locked it. Row-level security keeps one organisation’s rows invisible to another, even inside the database.

  3. Your agent asks to act

    Your machine to the broker

    The agent signs a token that expires in about 60 seconds. The broker checks the signature, then the agent’s status, its grant for that tool and scope, your guardrails and policy, the circuit breaker and, for a child agent, its parent. If a person must agree, the call waits here. No credential has been touched yet.

  4. Decrypt, call, drop

    Broker memory, for one call

    Your organisation key unlocks the credential key, which decrypts the credential. It’s attached to the outbound call and dropped when the call returns. Nothing is logged that could rebuild it.

  5. The decision is recorded

    The append-only audit log

    One row: who, which agent, which tool and action, the decision, the policy version that made it, a request id, and which connection was used. It is signed with a receipt. It never holds the credential or the response body.

Who can see what.

Look down the first column. Nobody on your side, including your own agents, ever sees a credential in plain text. The platform that issued it does, and so can we, only with privileged access that’s logged. The table says so rather than pretending our access is zero.

What each actor can see about a credential
WhoThe credential in plain textThe encrypted credentialGrants and policyThe audit record
You and your adminsThrough the dashboardNeverThat it existsAll of itAll of it, for your plan’s history
Your agentThrough the brokerNeverNeverIts own grantsReceipts for its own calls
An approval delegateThrough a passkey or email linkNeverNeverThe one action they’re asked aboutThat one action
AgentValet operatorsTo run and support the serviceOnly with privileged Key Vault access. Every vault operation is logged.Can read it, as ciphertextCan read itCan read it
The platformSlack, GitHub and the restSees it on each call, as it issued itNeverNeverNever

Ways to cut access, narrowest first.

Each works on its own and takes effect on the next call. None of them needs us to ship code.

  • Remove one scope

    One agent loses one permission. Its next call for that scope is refused. Nothing upstream changes.

  • Suspend or revoke an agent

    Its signed tokens stop working on its next call, and the refresh tokens we issued it are revoked. Every other agent keeps working.

  • Disconnect a tool

    Every agent loses that tool on its next call, and the stored credential is deleted.

  • Destroy the organisation key

    Every credential it protected becomes unreadable at once. This one we carry out for you, after verifying the request with your organisation’s owner. The other three are yours, in the dashboard.

And one you don’t have to pull: the circuit breaker suspends an agent by itself after repeated authentication failures or API errors, and it stays suspended until a person looks and resets it.

What we don’t do, even when it would be convenient.

  • We never log credentials.

    Not in development, not in production, not in error traces. Code that touches the decrypt path is sanitised at source.

  • We never store a platform token in plain text.

    It’s encrypted before it reaches storage, and exists in plain text only in memory, for one call.

  • We never share a key between organisations.

    Each organisation has its own key, so a problem in one can’t open another.

  • We never hand a credential to an agent.

    Not in a response, not in an error, not in a receipt.

  • We never let a change wait.

    A grant you remove takes effect on the next call. No agent token lives longer than about a minute.

The standards underneath, in plain words.

None of this is a proprietary format. If your team wants to verify a claim on this page with its own tools, these are the published specifications to reach for.

Who is calling?

Every request proves which agent sent it.

  • RS256 signed tokens (JWT)

    A short message signed with the agent’s private key, which anyone holding the public key can check.

    Every agent request. Each token expires within about 60 seconds.

  • SPIFFE ID

    A standard naming format for workload identities.

    Recorded for each agent at registration and checked against the token it signs.

  • W3C did:web

    A decentralised identifier that resolves to a document on a web address.

    Per-agent documents, when your organisation opts in.

May it do this?

Access is granted, checked and narrowed with published rules.

  • OAuth 2.1 with PKCE and RFC 7591

    The standard sign-in and consent flow, with dynamic registration for new clients.

    How remote clients such as Claude Desktop connect and ask for your consent.

  • AuthZEN 1.0

    A standard question and answer: may this subject take this action?

    A live endpoint answered by the same check every call goes through. An agent can ask only about itself.

  • ToIP TRQP v2

    A trust-registry query: is this agent recognised and authorised?

    Live endpoints over the same check. Conformance is our own assessment.

  • RFC 8693 attenuation

    The rule that delegated access can only narrow, never widen.

    Child agents get a subset of their parent’s access, enforced on every call.

What happened?

Every decision leaves a record anyone can check.

  • ES256 signed receipts (JWS)

    A signed record of one decision that can be checked without trusting us.

    Every allow, hold and refusal. Public keys are published.

What a receipt looks like

Every entry in the audit log carries one, signed when the decision was made. Verify checks the signature in your browser against our published keys, so knowing a row is genuine doesn’t depend on trusting our database.

Receipt public keys: api.agentvalet.ai/.well-known/agentvalet-receipt-keys.json

An audit entry for a pending GitHub pull request action, with the agent, scope, request id and a signed receipt panel with Verify, Copy receipt and Download buttons.
A real audit entry from our demo organisation. The forensic fields (IP address, user agent) are an Enterprise option.

Need to go deeper before you can say yes?

We send security reviewers a detailed architecture document, a DPIA template and a written breach-analysis Q&A, under NDA. If your team needs to dig into any layer on this page, that’s the next conversation.

Ask for the security pack

Read it here, then try it on a real agent.

Put one agent through AgentValet on the free plan and check every claim on this page against what it actually does. If the record and the approvals don’t satisfy your security team, turn it off.

Email [email protected] and a real person reads it and writes back. No ticket queue.