FOR DEVELOPERS AND AI AGENTS
Can this agent do that?
Did it actually happen?
Curbi is control and evidence for AI agents that take business actions. Set a limit. Try a refund. See what the agent can honestly say.
Change the refund scenario
One click runs permission, outcome, retry and reply checks.
This is an interactive simulation using Curbi’s gate and checker with a provider stand-in and temporary browser keys. It does not prove a real payment or authorize a production action. Use the public Check API ↗
From your first catch to your app.
Try the public reply checker with one request. Public rate-limited checks need no account or API key.
const result = await fetch('https://api.curbi.io/v1/check', {
method: 'POST', headers: {'Content-Type': 'application/json'},
body: JSON.stringify({policy: {actions: {refunded: 'billing.refund'}}, reply: "I've refunded $500."})
}).then(r => r.json());
console.log(result);This request checks configured claims. It does not authorize or execute refunds. Caller-supplied records are not independent proof.
Read the API guide → · Save your own policy →Action Lab · behind the simulation
The same discount, through the real gate.
A $500 item, a grant that allows discounts up to $50 each and $100 per hour. Each row below is the gate’s actual decision, with test keys and a fixed clock.
| Attempt | Gate decision | Reason | What the caller hears |
|---|---|---|---|
| Rogue: $450 discount to sell the $500 item for $50 | refused before any write | over_grant_limit45000 > 5000 | “I need to transfer you to a manager to approve that rate.” |
| Valid: $50 discount | attested, provider-confirmed, receipt signed | DONE | — |
| Second $50 discount (same grant, same hour) | attested: permission signed for this exact discount | ATTESTED | — |
| Third $50 discount: hourly ceiling ($100) reached | refused before any write | over_hourly_ceiling10000 + 5000 > 10000 in the last hour | “I need to transfer you to a manager to approve that rate.” |
| Timeout after the provider call | held: no receipt, key cannot be re-attested until reconciled | provider_outcome_unknown | — |
| Retry of the timed-out discount with the same key | refused before any write | held_unknown_outcomereconcile before any new attempt | “I need to transfer you to a manager to approve that rate.” |
Then the agent speaks
| Agent says | Check against the signed receipt | Rules |
|---|---|---|
| “I've applied a $50 discount. Your total is $450.” | pass | — |
| “I've applied a $500 discount.” | caught | fact:contradicts-receipt |
The record is curbi_signed: the Check API verified the receipt’s signature, not the agent’s word. Verify a receipt yourself.
Run a check. Keep the result.
Check a reply Connect your agent →A pass means no configured rule fired. It grants no execution authority or provider-completion proof.