Observe. Control. Analyze.
The control room
for every AI agent
that moves your money.
ctrl payments sits between any agent and the money it moves. Every attempt is on the record, your rules decide what goes through, and you see the pattern before anyone else does. Built on ctrlrun, open source.
Know exactly what your AI agents are paying,
everywhere you gave them access.
Observe.
Every payment your agents attempt, seen live, before it moves.
Every attempt, refused ones included, leaves a receipt: tamper-evident, across every rail, verifiable without us.
- 09:58support-agent refunds $312.50allowed, under the line
- 10:12support-agent refunds $4,000.00 to cus_9Kx, never refunded beforeheld for finance-approver
- 10:14p.rao approved exactly $4,000.00committed
- 10:15the same refund at $5,000.00, under that approvalrefused, mismatch
- agent
- support-agent, through the gateway
- payment
- refund $4,000.00 USD on Stripe, ch_1Pq
- decision
- held, then approved by p.rao, policy v14
- outcome
- COMMITTED, reconciled with the rail
- chain
- prev 3f9c1e…a1 this 8be27d…7d
- verify
- chain intacton your machine, without us
Control.
Your rules run before the payment does. Inside the band it goes through. Above it, a person decides. Outside it, nothing leaves.
Budgets per agent, per counterparty, per day. A yes is for one exact amount. Payouts never go alone.
Can it pay a vendor on its own?
- support-agentrefunds $312.50 to cus_9Kxallowed, under the line
- support-agentproposes a $4,000.00 refund to a customer it has never refundedheld for finance-approver
- invoice-agentproposes a $18,400.00 payout to a vendor, on its ownNo. Held for 2 of 3
- procurement-agenttries a $2,400.00 purchase with no rule for itrefused, nothing leaves
One yes. Exactly that amount.
The finance lead approves exactly $4,000.00 from the tool they already use: the dashboard, their own assistant, or Slack. The approval is tied to that payment and that amount. Anything else needs a new yes.
Analyze.
What each agent tried to pay, to whom, how often, and where that is drifting.
Ask in plain language and get answers backed by the receipts.
Refunds to cus_4Ab, a day, this week. Today, three in forty minutes.
- 10:02refund $480.00, under the $500 lineallowed
- 10:21refund $450.00, under the line againallowed
- 10:40refund $470.00, the seven-day budget for this customer is spentrefused
- signalsplitting: three refunds under the line to one customer in forty minutes, named as a patternowner notified
- you ask
What did support-agent refund this week, and to whom?
answered from 41 receipts
Whatever AI assistant you use for payments, just add this. Every payment is observed, controlled and analyzed, all in one dashboard.
The agent's MCP configuration changes one URL and loses one key. Free in test mode, no card.
ctrlpayments serve --public
# then add the URL it prints in the vendor's console,
# as a tool of your own
https://pay.your-company.com/mcp
pip install ctrlpayments
from ctrlpayments import Payments
payments = Payments.from_file("ctrlpayments.yaml")
@payments.protect("refund") # one line above the function that pays
def issue_refund(customer, amount):
...
pip install ctrlpayments
ctrlpayments init --rail stripe
ctrlpayments serve
# add the URL it prints to your assistant's MCP config
{ "ctrlpayments": { "url": "http://127.0.0.1:8401/mcp" } }
All three land in the same dashboard. Every agent, every connector, every rail, observed, controlled and analyzed in one place.
Works with any integration, and we add integrations on request. Built on ctrlrun, the open-source kernel.
Transparent by design
The kernel that decides and refuses is ctrlrun, open source under Apache-2.0. The receipt format and the payment model are published. Run the verification yourself, on your machine, against our product.
Trust is something you verify, not something we ask for.
Read the code on GitHub Docs at ctrlrun.dev
No finance agent yet, or not sure what it should do?
On Enterprise we design and build it with you, controlled from the first payment.