Which agent is this?
“Hi, I’m Alice’s shopping assistant” is a string anyone can send. Shared API keys and user-agent headers don’t prove which agent is making the request, or who runs it.
Early-stage MVP · open for design partners
AgentTrust is the identity and authorization layer between AI agents and your business systems. It verifies which agent is calling, checks that the customer actually delegated the action, and returns a deterministic decision with a reason code before anything touches your systems.
Built and tested today: signed agent requests, scoped customer delegations, a deterministic policy engine, human approvals, and an append-only audit log. Voice detection runs on a mock provider in the MVP.
The problem
Shopping assistants, browser agents and voice bots now contact companies for their users over APIs, chat and the phone. Every one of those requests raises the same questions, and most businesses can’t answer any of them today.
“Hi, I’m Alice’s shopping assistant” is a string anyone can send. Shared API keys and user-agent headers don’t prove which agent is making the request, or who runs it.
An agent asks to cancel a plan and refund the last order. Did Alice ask for both? Up to what amount? Until when? Most systems can’t tell a scoped request from an improvised one.
When a customer changes their mind or a key leaks, the next request has to fail. Waiting for a cached token to expire is too late.
A synthetic voice asking for a refund can sound exactly like a person. “Sounds like a bot” is not an identity, and “sounds human” is not authorization.
How it works
AgentTrust sits between the agent and your systems. Nothing reaches a connector until every check passes, and every step is written to the audit log.
Each request carries an AgentSig: a JWS signed with the agent’s private key and bound to the method, URL and body hash. It lives 60 seconds, works once, and is checked against the key’s current status.
The customer granted this agent specific actions on specific resources, such as sub_2001 cancel or ord_3001 refund up to $50.00 in total. Grants are scoped, expiring and revocable, and ownership is re-checked on every decision.
A pure function with a fixed order of checks returns ALLOW, DENY or REQUIRE_APPROVAL with a reason code like RESOURCE_OUT_OF_SCOPE. Same facts, same answer. No LLM decides.
The Agent Desk runs typed actions through a connector with idempotency keys. Approved actions are re-authorized right before execution, write timeouts become OUTCOME_UNKNOWN instead of a guess, and every step is audited.
Detection providers estimate whether a caller is a person or an automated agent. That can raise suspicion, but it never proves who is calling. An agent proves its identity by signing a voice attestation for the call with its registered key, and the requested action still goes through the same delegation and policy checks. If detection is unavailable, an unverified caller gets a fail-safe CHALLENGE, never ALLOW. The MVP uses a deterministic mock detection provider; real vendor integrations are on the roadmap.
Live demo
Runs entirely in your browser. Mirrors the AgentTrust decision logic; no data leaves this page.
Your browser generates an agent key pair with WebCrypto and signs genuine AgentSig tokens. A JavaScript port of the server’s verification and decision code evaluates them against synthetic data. The server remains the authority.
The interactive demo needs JavaScript and WebCrypto (available on HTTPS pages and on localhost). Here is what each step shows.
Alice granted sub_2001 read, and she owns it. The sandbox returns the plan details.
Executed once through the connector. A second cancel is allowed but fails in the business system: already cancelled.
The delegation doesn’t cover sub_2002. Policies can’t add access.
Within the $50.00 grant and under the $20.00 approval threshold.
Refunds of $20.00 or more (running total) need a human. On approval the request is re-authorized against current facts, then executed.
Above the $50.00 limit of the grant.
The token’s jti was already used. Rejected before the policy engine runs.
A $15 refund was signed; the body was changed to $49 in transit. The body hash no longer matches bdh.
Copies the agent ID and key ID, signs with a different key. The registered public key doesn’t verify it.
The next request is denied, and a pending approval is denied when it is re-authorized.
Even a valid signature from the revoked key is rejected on the next request.
Detection says “automated” (simulated). The claimed identity is unverified, so the requested action isn’t authorized.
The agent signs an attestation for the call; the delegation and policy checks pass.
Missing detection is never treated as “human”. An unverified caller gets the fail-safe decision.
…… …sub_2001 and order ord_3001 ($49.99). Bob (synthetic) owns sub_2002.sub_2001 read + cancel; ord_3001 refund up to $50.00 USD in total. Expires in 7 days. …ord_3001The impostor copies the agent ID and key ID but signs with its own key. A thief holding the real key would pass the signature check; that is what “Revoke key” is for.
A call asks to cancel sub_2001. Detection comes from a deterministic mock provider (no audio is analyzed). Identity comes only from a signed attestation.
Press any button. Each one signs a fresh request in your browser and runs it through verification, the policy engine and, if allowed, the sandbox connector.
No events yet.
Event names match the server’s audit log.
Design principles
Agents are probabilistic. The component that says yes to a refund shouldn’t be.
The AgentTrust decision engine is a pure function over current facts: the agent’s key and status, the customer’s delegation and grants, resource ownership, and organization policies. Its checks run in a fixed order. You can test it with a table, read it line by line, and explain every DENY with a reason code.
A model can help an agent build a typed request. Whether it is allowed is decided by the engine, never by a model.
Permission comes only from a customer’s delegation. Organization policies can deny or require approval. They can’t add permissions.
Key, agent and delegation state is checked on every request, so revocation applies to the very next one.
Agents register public keys only. A key that includes private members is rejected, and the database refuses to store one.
The log is append-only at the database level: the application role can only insert and read, and a trigger blocks updates and deletes for every role.
Not cryptographically tamper-evident yet: a database superuser could still alter history. Hash-chaining is on the roadmap.
Anything that can’t be established is DENY. Missing voice detection is never treated as “human”.
For developers
The agent keeps its private key and signs every request. AgentTrust answers with a decision and a reason code your code can branch on.
from agenttrust import AgentClient, AgentKey
key = AgentKey.load("shopping-assistant.key.json") # stays with the agent
client = AgentClient("https://api.example.com", agent_id=AGENT_ID, key=key)
decision = client.authorize(
delegation_id=DELEGATION_ID,
resource_type="order",
resource_id="ord_3001",
action="refund",
amount_minor=3000, # $30.00 in minor units
currency="USD",
)
if decision.allowed:
issue_refund()
elif decision.requires_approval:
wait_for_human() # reason_code == "APPROVAL_REQUIRED"
else:
explain(decision.reason_code) # e.g. "CONSTRAINT_VIOLATED"
BODY='{"delegation_id":"…","resource_type":"order","resource_id":"ord_3001","action":"refund","amount_minor":3000,"currency":"USD"}'
curl -sS -X POST https://api.example.com/api/v1/agent/authorize \
-H "Content-Type: application/json" \
-H "Authorization: AgentSig $JWS" \
--data-binary "$BODY" # exact bytes: bdh binds them
# $JWS: a compact JWS signed with the agent's private key
# header {"alg":"EdDSA","typ":"agent-request+jwt","kid":"<RFC 7638 thumbprint>"}
# claims iss = sub = <agent id> aud = https://api.example.com
# iat, exp (at most 60 s) jti (random, single use)
# htm = POST htu = <full request URL>
# bdh = base64url(SHA-256($BODY))
# 200 OK
{"decision":"REQUIRE_APPROVAL","reason_code":"APPROVAL_REQUIRED",…}
AgentSig is an AgentTrust profile built on JWS, JWT, EdDSA and JWK thumbprints (RFC 7515, 7519, 8037, 7638). It is not an IETF standard.
OUTCOME_UNKNOWN on write timeouts, reconciliation (sandbox connector)FAQ
No. AgentTrust doesn’t issue bearer tokens today. Every agent request is signed with the agent’s own key and checked against the current state of the key, the agent and the delegation, which is what makes revocation immediate. It sits next to your existing customer login and identity provider rather than replacing them. If relying parties later need offline verification, the plan is short-lived, sender-constrained tokens.
No. AgentSig is an AgentTrust profile built from standard parts: JWS, JWT, EdDSA and JWK thumbprints. It is not an IETF standard. Support for HTTP Message Signatures (RFC 9421) is on the roadmap so agents can interoperate with other ecosystems.
No. AgentTrust integrates detection providers behind an adapter and treats their output as untrusted evidence. The MVP ships with a deterministic mock provider, so no real audio analysis happens yet. On a call, identity comes from the agent’s signed attestation, not from how it sounds.
No. Decisions come from a deterministic engine with a fixed evaluation order and machine-readable reason codes. An LLM can help an agent turn a customer’s words into a typed request; it has no say in whether that request is allowed.
In the MVP, an operator at the business records the customer’s consent, obtained out of band (for example through a support ticket), as a delegation with explicit grants and an expiry. A customer-facing consent screen is on the roadmap.
The cryptography: your browser generates the agent’s key pair with WebCrypto and signs genuine AgentSig tokens. The decision logic is a JavaScript port of the server’s engine, run against synthetic data. Nothing is sent anywhere, and the page’s Content Security Policy blocks network requests. The server remains the authority.
AgentTrust is an early-stage MVP. We’re looking for design partners: businesses that already see, or expect, AI agents acting for their customers on subscriptions, refunds, orders or support. Request early access.
We’re working with a small number of design partners. Tell us which actions agents ask for, and we’ll show you how AgentTrust handles them.