Enruta

Product

One call from the agent.

An agent asks to pay. Enruta checks the policy your controller signed, issues a signed mandate or routes the request to a named person, executes on your own rail, and seals one record of every payment.

How it works

Five steps, one payment. Click through, or use the arrow keys.

request → decision → execution → seal · synthetic data1 / 5
> request_payment
    agent=agt_procurement_02  payee=store.enruta.ai (verified)
    amount=168.40 USD  purpose="20 reams A4 paper, 1 stapler"
    checkout=ucp:chk_8f3…  evidence=[quote sha256:…]  idempotency=a3c9…

Six moments

What must be true at each step, and what Enruta holds.

  1. 1

    Consent

    A bounded authority is delegated to a named agent.

    holds: policy · mandate

  2. 2

    Identity

    The agent shows who it is and whose authority it carries.

    holds: attestation

  3. 3

    Decision

    The request is checked against the policy, inside the budget.

    holds: decision · inputs

  4. 4

    Execution

    The mandate becomes a control and a licensed rail moves the money.

    holds: instruction · receipt

  5. 5

    Post-purchase

    Declines, refunds and disputes are handled with the mandate as evidence.

    holds: dispute file

  6. 6

    Reconciliation

    Settlement is matched and the record is sealed for the audit window.

    holds: sealed record

Decide

A policy your controller signed, evaluated in order, reserved atomically.

Try the sample policy. Change the payee, the amount or the category and watch the decision, the reasons and what would be compiled onto the card.

payeecategorywindowcapbudgetduplicatescreeningthresholdallow/step_up/denyany failed check denies; the budget is reserved at the moment it passes

pol_office_supplies · v7 · budget left $400.00 of $1000

Policy: verified payees only · office supplies or shipping · ≤ $200 per payment · $1,000 a month · above $150 a person signs.

decision

step_up

  • approval_required above $150: a named person must sign
approval: {
  required_from: "usr_controller", method: "passkey",
  binds: "sha256:<request hash>", expires_in: "15m"
}
mandate: null   // issued after the signature

More on policies

Execute

The mandate becomes the control your rail already understands.

Enruta decides first, then compiles the decision into the rail’s own control. The rail moves the money on your account. Enruta never does.

The mandate becomes

A single-use virtual card on your own Stripe account: amount equal to the mandate, the payee as the allowed merchant, expiry equal to the mandate’s. The real-time authorization request is answered against the mandate inside the two-second window.

The card token reaches the payee. The card number never reaches the agent and is never stored by Enruta.

// on allow — on the customer's Stripe account, with a key the administrator scoped
issuing.cards.create({
  cardholder: "ich_agent_procurement_02",
  type: "virtual",
  spending_controls: {
    spending_limits: [{ amount: 16840, interval: "per_authorization" }],
    allowed_merchant_countries: ["US"],
  },
  metadata: { mandate: "mnd_7c2a…d1f0", agent: "agt_procurement_02" },
})

// issuing_authorization.request → answered in 41 ms
{ "approved": true, "metadata": { "mandate": "mnd_7c2a…d1f0" } }

Prove

One file per payment. Verifiable in 2033 without us.

Records are sealed and chained by hash; time-stamps and proofs live in a companion bundle; records roll into a signed daily root.Sealed bytesrec_…VZsha256 e91a…0c3dprev …bundleRFC 3161 · proofs · keysrec_…W6sha256 b0d4…71c9prev e91a…0c3dbundleRFC 3161 · proofs · keysrec_…X1sha256 4c2f…a9e0prev b0d4…71c9bundleRFC 3161 · proofs · keysOutside the bytesTime-stamps, inclusion proofs and renewals never change the record hash.daily rootsigned checkpoint

Sixteen core fields that AP2 mandates, ACP allowances, UCP consent objects, x402 and MPP receipts, card-issuer authorizations and finance-system exports all map into, plus six addendum fields for the rails procurement pays on.

Canonicalized, hashed, chained per customer, rolled into a daily root, time-stamped by public authorities. Everything that changes after sealing lives in a companion bundle, so a record can be renewed for seven years without being touched.

Explore the record

verify, offline
$ npx enruta-verify rec_01J9Q2W6G5X8ZK3R7T1V9M4N2B.json
enruta-verify 0.1.0
canonical form   ok
seal             ok  sha256:b0d4…71c9
chain            ok  prev rec_01J9Q2VZ…
timestamps       ok  4 of 4 proofs valid
keys             ok  snapshot 2026-09
PASS

Reconcile

Joined per payment, exceptions surfaced weekly.

  1. credential
  2. authorization
  3. posted transaction
  4. receipt
  5. ledger

The weekly report has fixed fields: payment, bill or purchase order, vendor, amount, rail, agent task, policy version, decision, exception code, approval and release events with their actors, release method, agreement with the human outcome, record hash and verifier status. Your controller signs it; your auditor can re-run it.

Where it runs

The same five tools in every host.

The plugin bundles the MCP server, the enruta-pay skill and a hook that blocks checkout calls without a mandate.

/plugin marketplace add enruta-ai/claude-plugin
/plugin install enruta@enruta

Quickstart

What Enruta is not

Working with the first design partners.

A small number of finance teams and agent vendors are shaping the first records with us. If your agents already pay, or are about to, write to us.

hello@enruta.ai