Vestiarion

Registre officiel Finance et paiements

An AI treasury agent paying in USDC on Arc: read its decisions, ledger and books; add invoices.

Que pouvez-vous faire avec Vestiarion ?

  • AP automation — invoices typed in, imported from a bill list in its own columns, dates and currency, read from a PDF, forwarded by email, captured
  • Approvals inbox — approve and pay, reject, or return to the agent; claims keep two people from deciding the
  • Try a limit first — see which past bills a new payment limit, two-approvals figure or spending limit would have
  • Contractor milestones — verified by a merged pull request, by a person accepting the Asana task the work was
  • Payee links — a payee enters and confirms their own address, or creates a passkey wallet to be paid in.
  • Receivables — pay links on Arc, matched receipts, payments applied to several invoices or part of one with the
  • Customer statements — a link per customer to a page of what it owes, where it can say it paid, promise a day or
  • Commissions — a sales partner or referrer earns only on money a customer actually paid on Arc, for exactly the

Installation

Ajoutez ceci à la configuration MCP de votre client (Claude Desktop : claude_desktop_config.json ; Cursor : .cursor/mcp.json ; VS Code et les autres utilisent la même forme « mcpServers »).

Remote (streamable-http)
Claude Code
claude mcp add --transport http vestiarion 'https://www.vestiarion.xyz/api/mcp' --header 'Authorization: <A Vestiarion workspace API key, sent as a bearer token. Use a read-only key unless the agent must add records: the write tools need a read-and-write key. No tool can approve or pay.>'
Configuration JSON (Claude Desktop, Cursor, VS Code)
{
    "mcpServers": {
        "vestiarion": {
            "type": "http",
            "url": "https://www.vestiarion.xyz/api/mcp",
            "headers": {
                "Authorization": "<A Vestiarion workspace API key, sent as a bearer token. Use a read-only key unless the agent must add records: the write tools need a read-and-write key. No tool can approve or pay.>"
            }
        }
    }
}

Documentation

Tirée du README du projet sur GitHub, actualisée chaque semaine. Les liens ouvrent GitHub.

Sommaire
  1. Vestiarion
  2. Contents
  3. How to evaluate Vestiarion in 5 minutes
  4. Watch each flow
  5. What Vestiarion does
  6. Why it is different
  7. How payments work
  8. Safety architecture
  9. Arc mainnet and Arc testnet
  10. Product capabilities
  11. Integrations
  12. Primitives for Arc builders
  13. Quick start
  14. Verifiable activity
  15. Documentation
  16. Development
  17. License

Vestiarion

Your AI agent for bills and payments, for small businesses: it checks every bill before it is paid, pays in USDC on Arc inside limits a contract enforces, and signs every decision into a ledger you can verify.

Full tour (7:22) · See your first decision · Open numbers · Mainnet proof · Docs · MCP server · Security

Built on Arc and Circle · Works with Xero · QuickBooks Online · Zoho Books · HubSpot · Pipedrive · Zoho CRM · BlindPay · Asana · Google Sheets · GitHub · Slack · Telegram · Discord · Chrome · @vestiarionhq

Vestiarion runs a small business's money cycle with one agent: it screens counterparties, pays vendors, releases contractor pay, collects receivables and keeps idle cash working. A model proposes each action; ordinary code decides whether it may happen; a person decides what code sends to them; and on Arc mainnet, when the treasury is the owner's own wallet, the money itself can only leave through a spending-limit contract that wallet deployed. Every outcome, refusals included, is signed into a hash-chained ledger anyone in the workspace can verify.

Watch it work: the demo (2:59) or the full product tour (7:22), both recorded on the live product on October 15, 2026, with the Arc mainnet payment from October 12: a freelancer the agent pays on its own once a second member confirmed the address, a new supplier's first bill the model wanted to pay and code refused until a second member approved, the day the agent picks to pay, shadow mode and the customers' figures, Arc mainnet and the proof. The tour opens how the agent decided, line by line, on three of those decisions.

Tameion is ancient Greek for a treasury, the room the money was kept in. In Byzantium that room grew into the vestiarion, the department that minted the coin, held the stores and paid the army.

Contents

How to evaluate Vestiarion in 5 minutes

Everything below runs on the live app, www.vestiarion.xyz, with an email address and nothing else: no wallet, no USDC, no API key, nothing to install.

  1. Open a workspace on Arc testnet. Sign in at www.vestiarion.xyz/login with Continue with Google or Email me a sign-in link, give the workspace a name and choose Create workspace (a Test workspace, on Arc testnet, if you are asked). It starts as a sandbox: payments are simulated and nothing reaches a chain.
  2. Load sample data and run the agent. On Treasury, the console, choose Load sample data: six counterparties, eight invoices (seven to pay and one to collect) and two contractor milestones, chosen so that one cycle shows every outcome. Then choose Run cycle now. To try one of your own bills instead, follow See your first decision.
  3. Read the decisions and the refusals. On Bills & receivables, each bill shows what the agent decided: pay it, pay it on its discount's last day, ask for a missing purchase order, hold it above its supplier's limit, or flag it as a duplicate. Its card shows Agent’s reasoning and How the agent decided. Where the model wanted to pay and a rule in code stopped it, the card says "Blocked by code, not by the model" and names the rule. How payments are controlled lists every rule, and When the model and the policy disagree shows the payments code refused in production.
  4. Verify the signed ledger. Open Audit log and choose Verify hash chain: it checks every Ed25519 signature and hash link and answers "Chain intact". Under Download, Signed JSON exports the chain, and verify-ledger-export.mjs checks it on your own machine with Node.js alone (Verify an audit export).
  5. Check production. Open numbers reads production on every load: workspaces, payments, decisions and what code refused, per network, with our own payments linked to the explorer under "Verify it yourself". Mainnet proof walks through the first payment on Arc mainnet: held by code as a first payment to a new address, approved by a second person, and paid through the owner's spending-limit contract.

Watch instead: the demo (2:59), the full product tour (7:22), and a short video for each main flow, two minutes or less each.

Reviewing security: www.vestiarion.xyz/security covers the architecture, tenant isolation, encryption, access control, connector tokens, webhooks, the subprocessors and what we do not claim. SECURITY.md says how to report a vulnerability.

Where things are in this repository:

PathWhat it holds
src/appThe Next.js routes: public pages, the workspace (o/[slug]), the shared links (receipt, pay, report, statement) and the API (api/v1, api/mcp)
src/libThe logic: the agent and the rules in code (agent/, agent/guardrails.ts), the signed ledger (ledger.ts), Circle and Arc (circle/), the connectors, the tenant data access layer (dal/) and secrets (secrets.ts)
src/componentsThe interface
supabase/migrationsThe Postgres schema, row-level security and database functions, as numbered migrations
contractsVestiarionSpendingLimit and VestiarionEscrow, in Solidity
sdk and cli@vestiarion/sdk and @vestiarion/cli: the TypeScript client and the vestiarion command
integrationsThe Slack app manifest and the HubSpot app project
extensionsVestiarion Invoice Capture, the Chrome extension that sends an invoice from the browser as a draft, with its store listing
content/docsThe docs site's pages, in MDX
scriptsOperator commands: migrations, a cycle, the payments switch, contract builds, research replays
testsThe Vitest suite npm run verify runs, every migration included, on an in-process Postgres
docsRunning it yourself, releasing, and each feature's design with its rollout record

Watch each flow

One short video for each main flow, recorded in the live product on Arc testnet with demo data in the team's own workspaces. Each plays at the top of its guide, with its transcript, and on YouTube.

FlowLengthWhat it showsYouTube
See your first decision1:46A supplier and one of its bills added in shadow mode, the agent's decision and why, and a verdict.Watch
Your first payment, paid by the agent1:32A bill the agent pays on its own, one that waits for a second person, and the record of both.Watch
Shadow mode on your own bills1:33Shadow mode on, test USDC for your real amounts, a mirror address, and a verdict on each decision.Watch
How payments are controlled1:25A payment code refused, the limits, the people who approve, and the pause.Watch
Take a workspace live on Arc1:26Wallets created, funded with testnet USDC and taken live, then a workspace on Arc mainnet.Watch
Get paid by a customer on Arc1:05An invoice to a customer, its pay link and pay page, and the agent's next step on Collections.Watch
Early-payment offers made by the agent1:13The bills worth paying early, an offer the agent made and the supplier accepted, and a counter.Watch
Pay a contractor for verified work1:01A freelancer paid through a one-time link, released by the agent, and milestone escrow.Watch
Bills from QuickBooks and Zoho Books1:00Open bills from QuickBooks and Zoho Books, reviewed and added, then decided by the agent.Watch
Bills that arrive on their own1:17An invoice PDF read into the form, a pasted list of bills, and the email and Chrome intake.Watch
Pay a vendor's bank account in pesos1:01Bank payouts set up with BlindPay, the vendor's bank account, and a payout followed to the end.Watch
Evidence and the audit export0:56Why a payment was made, how each fact is known, and the audit log's chain check.Watch
Bills from Xero, decided by the agent1:52Bills from the Xero Demo Company come in, one paid in Xero is caught before it is paid twice, and one is paid on Arc testnet.Watch
A deal from HubSpot, collected on Arc1:55A deal won in HubSpot is planned, its deposit is paid and matched, and the receipt is written back to HubSpot.Watch

What Vestiarion does

A small business pays vendors, contractors and recurring bills through several tools a person stitches together by hand, and checks none of it continuously. Vestiarion replaces that with one decision loop, the agent cycle, that reads the whole book each time it runs:

AreaWhat the agent does
PayablesThree-way match (purchase order, goods received, invoice), duplicate and risk checks, then pay, schedule, hold, request info or flag as fraud, with its reasoning attached; checks scheduled bills against the cash ahead, chooses which bills get the cash first when it cannot cover them all, and, when turned on, asks a supplier for more time on a bill it cannot pay, or a vendor for a bill's missing purchase order or goods receipt through a one-time link
ContractorsReleases a milestone once its evidence is verified, such as a merged GitHub pull request; on Arc testnet the milestone's USDC can sit in an escrow contract until then
ComplianceRe-screens every counterparty each cycle (OpenSanctions where configured) and tiers its payment limit down on a hit, reversibly. Checks every payout address against the addresses on OFAC's SDN list: the agent and people are refused one on it
ReceivablesA signed deal becomes a schedule of receivables released on their days; a client pays through a link; the agent matches the transfer to what was owed, suggests how to apply a payment that covers several invoices, part of one or falls a fee short, and, when turned on, sends reminders for what is still owed within bounds code sets, after weighing what the customer said, paid and was promised, its own rules and the HubSpot deal it was sold through, asking a person first when the step is theirs; and, when turned on, while bills are held for want of cash, offers customers a small discount to pay an open invoice within 5 days
TreasuryOn Arc testnet, sweeps idle cash above a 7-day buffer into Circle's USYC only when the yield beats the round-trip fee, and redeems ahead of what falls due
AuditAppends every decision, human action and system event to an Ed25519-signed, hash-chained ledger, exportable and verifiable in one click, and a monthly close pack: one row per payment with its bill, approvals, checks, transaction and signed entry, as a page, a CSV or signed JSON

The agent cycle: reconcile -> receipts -> compliance -> document checks -> follow-up -> recurring -> services -> liquidity -> AP -> contractors -> treasury -> forecast -> proposals -> collections -> early offers -> customer offers -> term requests -> document requests -> cash alert -> notices -> telegram -> slack -> discord, each stage's outcome appended to the ledger.

Why it is different

  • The model argues; it cannot pay. Anthropic, OpenAI or DeepSeek returns a structured {action, reasoning, confidence}. Code re-checks every hard rule after the model decides and before money moves, and with no model key at all a transparent rule-based policy takes the model's place. Every ledger entry records which one decided, and the written policy's answer is recorded beside the model's (research: when the model and the policy disagree).
  • The limit is on the money's path, not only in the code. On Arc mainnet a workspace can pay from a wallet its owner holds. The agent's wallet can only call pay on a contract that wallet deployed, which refuses anything past the daily or 7-day figure, whatever Vestiarion's code decided.
  • Vestiarion does not hold that treasury's USDC. On that path the USDC stays in the owner's wallet or passkey smart account; Vestiarion holds no key to it, and the agent's wallet holds only gas. (Other setups differ; see Custody, by setup.)
  • People decide what matters. A first payment to a new address, a payment above the two-approval figure, and anything the agent held all wait for a person, and some for two.
  • Figures are read, not asserted. Open numbers is queried from the production database on every load, with Arc mainnet and Arc testnet counted apart and our own workspaces counted apart from customers'.

How payments work

On Arc mainnet, a workspace whose treasury is its owner's wallet pays like this:

flowchart TD
    T["Owner's treasury<br/>passkey smart account or browser wallet<br/>(Circle Modular Wallets)"]
    C["VestiarionSpendingLimit<br/>deployed and approved by the treasury"]
    A["Vestiarion agent<br/>proposes pay / hold / flag"]
    P["Code: deterministic policy and guardrails"]
    H["Approvals inbox<br/>one or two people"]
    W["Agent wallet<br/>holds gas only"]
    V["Vendor address"]

    T -- "approve(contract)" --> C
    A --> P
    P -- "held, flagged, new payee,<br/>above two-approval figure" --> H
    P -- "allowed" --> W
    H -- "approve and pay" --> W
    W -- "pay(to, amount, ref)" --> C
    C -- "transferFrom(treasury, vendor)<br/>within daily and 7-day figures" --> V
    V -. "settles on Arc in seconds;<br/>Paid event + signed ledger entry" .-> L[("Ledger")]

In words:

  1. The owner's wallet is the treasury. In Go live the owner either connects a browser wallet (MetaMask, Rabby…) or creates a passkey wallet: a Circle smart account on Arc mainnet owned by their passkey, with an optional recovery address. The owner's wallet deploys the workspace's VestiarionSpendingLimit, approves it on USDC and sends the agent's wallet its gas; with a passkey that is one confirmation, after the browser checks every call against what it built itself.
  2. The agent proposes. Each cycle the model reads the invoice, the counterparty's screening, the match and the cash position, and proposes an action with its reasoning.
  3. Code decides. Duplicate, risk, payment-limit, three-way-match, new-payee, spending-limit and liquidity rules run as ordinary code. They can overrule the model; nothing the model writes can overrule them.
  4. A person decides what code sends them, in the approvals inbox (or from Slack on Arc testnet). A person's approval goes through the same payment step the agent uses.
  5. The contract decides last. The agent's wallet calls pay(to, amount, ref). The contract pulls USDC from the treasury to the vendor only within the daily and 7-day figures, and never twice for the same ref. Only the owner's wallet can change the figures (setLimits), or stop the agent by setting its approval to 0.
  6. Arc settles; the ledger records. Payment status is read back from Circle and the chain, the fee from the receipt (Arc's gas token is USDC, so the receipt is the dollar cost), and the outcome is signed into the ledger.

On Arc testnet the same decision path pays from Circle wallets instead, through the same contract once an owner or admin turns on Enforce on Arc.

Custody, by setup
SetupWhere the USDC sitsWho can move it
Arc mainnet, your own wallet or passkeyThe owner's walletThe owner; the agent only through the contract, within its figures
Your own Circle account (testnet or mainnet)Developer-Controlled Wallets in the customer's Circle accountVestiarion, with the API key and entity secret the owner pasted, stored encrypted
Hosted testnet walletWallets in Vestiarion's own Circle testnet accountVestiarion (Arc testnet only)

Safety architecture

flowchart LR
    M["Model<br/>proposes"] --> R["Rules in code<br/>refuse or hold"] --> P["People<br/>approve"] --> K["Contract<br/>caps the spend"] --> S["Signed ledger<br/>records all of it"]
LayerWhat it guarantees
Guardrails in codeNever pay a counterparty screened high risk, above its limit, a duplicate of a settled invoice, or with an incomplete match. A refusal records the model's argument and the rule that overruled it
New-payee checkThe first payment to a payee at an address needs two people behind it: the agent never makes one that only the person who gave the address stands behind, and that person cannot approve it either. Whoever creates a payee link counts as having given the address the payee sends, read from the link's signed ledger entry, or from the link's own record when that entry is missing. For an address sent on GitHub, or one no member can be named as having given, no confirmation counts as the second person: one member confirms it and a different one approves its first payment, and no one approves it alone before another member has confirmed it. The agent asks the same before it sends a payment again whose earlier send was never recorded, so an address changed while a payment waited does not slip past it
Payee lockOff on Arc testnet until an owner turns it on. A workspace created on Arc mainnet starts with it on, with no wait, and there too an owner can turn it off or set a wait in Settings. A changed payout address is paid only once a person records how they checked it (for a call or a message, the contact they used, which they say was on file before the change) and, if the owner sets one, after a wait of 4, 24, 48 or 72 hours from the change. Whoever entered the address cannot confirm it while another member can; where no one else can, they confirm it alone, and the record says so. With the lock on, approving a payment no longer confirms its address. An address that matches or looks like another payee's, or like one the same payee had before, is flagged
Two approvalsAbove a figure the owner sets, a payment needs two different people. Arc mainnet workspaces start at 100 USDC, and the owner can raise it but not turn it off there
Maker and checkerRoles are owner, admin, approver, viewer and accountant, who books and reads but decides no payment. No one approves an invoice they created; only Compliance clears a high-risk counterparty
Agent spending limitA daily and a 7-day figure, checked in code and, where enforced, by the contract. Arc mainnet workspaces start at 50 USDC a day and 150 USDC in 7 days
Project budgetsA bill or milestone in a project has its money set aside in the project's budget, under a database lock, before the agent pays or schedules it; one the budget cannot cover waits for a person. An earmark in Vestiarion, never money locked on chain. A bill and a milestone for the same purchase order or delivered work are one obligation: the second waits for a person
Try a limit firstA new payment limit, two-approvals figure or spending limit can be tried on the agent's past 30 or 90 days of decisions: the code's checks replayed on what each recorded, in order, with no model call. Applying it is the setting's own change, refused if the setting moved since, and its signed entry records the replay
Exactly onceA database claim makes one decision exclusive; an idempotency key keyed on the invoice keeps a payment from leaving twice; the contract refuses a repeated ref
Stop switchesAnyone who can approve can pause the agent for the workspace; an owner's wallet can stop the contract; an operator can stop every payment on every deployment within 10 seconds
Audit trailEvery entry is Ed25519-signed and covers the hash of the one before. The verifier names the first entry that breaks; signed webhooks push each entry as it is written
Shadow modeOn Arc testnet a business keeps paying its bills itself, a person agrees or disagrees with each agent decision, and only agreed payments are made. What the business really paid is recorded beside each decision, never guessed
Quality LabEvery change runs fixed scenarios through the real decision code in CI, the model's answers scripted, often to what an attacker would want: prompt injection in a memo or purchase order, a payee whose address just changed, a send whose answer was lost, clean bills that should be paid. A transfer or schedule where money should stop, one to another address or for another amount, or a second one for a bill fails CI. The result is on Open numbers and, scenario by scenario, in the Quality Lab

The contract source is in contracts/. It was written for Vestiarion and has not been audited.

Arc mainnet and Arc testnet

Each workspace lives on one network, chosen when it is created, and never moves.

Arc testnetArc mainnet
Who can use itAnyone who signs inAnyone who signs in at vestiarion.xyz; a self-hosted deployment chooses who with MAINNET_ALLOWLIST
MoneyTestnet USDC and EURC from Circle's faucetReal USDC, sent on Arc or brought from another chain through CCTP
TreasuryHosted wallet, or your own Circle accountYour own wallet or passkey wallet, or your own Circle account
Spending-limit contractOpt-in, deployed through Circle's Smart Contract PlatformDeployed by the owner's wallet on the own-wallet path
Also availableUSYC reserve, milestone escrow, EURC swaps, CCTP and Gateway payouts to other chains, x402, shadow modeUSDC on Arc, and CCTP payouts to Base and Arbitrum; features Arc mainnet lacks are not shown
Mainnet proof

On Oct 7, 2026 a workspace we run made its first payment on Arc mainnet, from a passkey wallet, through its spending-limit contract:

  1. The owner's passkey wallet deployed and approved its contract in one transaction, with figures of 50 USDC a day and 150 USDC in 7 days: 0xe6261540…a9bb.
  2. The agent decided to pay a 0.10 USDC invoice. Code held it: a first payment to a new address (counterparty.new_payee).
  3. A second member, an admin, approved and paid it. The agent's wallet called the contract, which moved 0.10 USDC from the passkey treasury to the vendor and emitted Paid; fee 0.0035 USDC, confirmed in under a second, in block 24,710,870 at 09:43:13 UTC: 0xcecef38e…dee6.

Contract: 0xd90cA89Fc318d0330Bb14eaeF78B72C3CA7E7fB6.

On Oct 19, 2026 two of our own test workspaces, not customers, made the first payouts from Arc mainnet to Base. Each paid 1 USDC to a wallet on Base through CCTP V2, with Circle's Forwarding Service minting it there, the CCTP fee on top. In both, the agent read the live CCTP fee and chose to pay on the due date: the bill offered no early-payment discount, so keeping the cash until then cost nothing. Code then held it as a first payment to a new address, and the workspace's only approver approved it.

  • From a workspace's own Circle account (#453): the burn on Arc, 0x89f66f7b…17e9, and the mint on Base, 0x33b0f0e5…f0ac.
  • From the owner's passkey wallet, through version 2 of the spending-limit contract: the agent's gas-only wallet called payAcrossChains (#454), which took the payment and its fee from the passkey wallet and burned them on Arc, 0x7c3b4b6b…2a17, and the mint on Base, 0x9ea0fe5a…150c.

On Oct 22, 2026 the same test workspace on its own Circle account made the first payout from Arc mainnet to Arbitrum (#498). The agent read Circle's live fee to Arbitrum, 0.077 USDC, weighed it against the 10% cap on a 1 USDC bill, and chose the due date again; code held it as a first payment to a new address, and the workspace's only approver approved it. The burn on Arc, 0xce0a7911…d7b8, and the mint on Arbitrum, 0x385363d4…f987: 1 USDC to the payee, the 0.077084 USDC fee on top. Its shared receipt checks the mint on Arbitrum and states the invoice number, the fee and who paid it.

Arc mainnet has no customer workspace yet; Open numbers shows the current count.

Proof on Arc testnet

Made by the agent in production:

  • a USDC payable paid 53 seconds after it was added, with no one pressing Run: 0x81381c50…4e68;
  • a payment through the spending-limit contract, within its daily figure: 0xa79cb982…e71e;
  • a EURC invoice, weighed against a USDC limit at a rate quoted by Circle's Stablecoin Service: 0x2e66257f…8f58;
  • a payout to Base Sepolia through CCTP: the burn on Arc, 0xbc1961bb…d49c, and the mint Circle forwarded, 0x6c749323…ef9a;
  • an invoice read from a PDF by the model, checked by a person, and paid 16 seconds after it was added: 0x197e979f…64b3;
  • idle cash into Circle's USYC through its Teller, 0x1cf65900…f42e, then the missing 0.88 USDC redeemed for a bill due today, 0x4b5186db…c7f2, and the bill paid 34 seconds after it was added, 0x365da374…9d8b;
  • with the cash short of two bills due the same day, the 50 USDC of database backups the agent chose to pay first, over a 30 USDC one-off migration the written policy put first, 0x1adfad84…3a7b;
  • with the payee lock on, a vendor's payout address changed to a fresh wallet holding 0 USDC. The agent held its 3 USDC bill while the address was unconfirmed. The member who entered the address could not confirm it, even with a full record. A second member confirmed it, and the agent then held the bill through the 4-hour wait. Only after that did it pay, and the wallet went from 0 to 3 USDC: 0x49787501…0551;
  • the same in a workspace with one member. A record that did not say the contact was on file before the change was refused, and so was Agree and pay during the wait. Once the wait ended, the first payment to the new address still needed the approver: 0x7948ea38…72c5.

Each feature's design under docs/superpowers/specs/ ends with its rollout record: what was run in production, with its ledger entries and transactions.

Product capabilities

  • AP automation — invoices typed in, imported from a bill list in its own columns, dates and currency, read from a PDF, forwarded by email, captured from the browser with the Chrome extension, or sent through the API; recurring payables; early-payment discounts taken when they pay; late fees weighed when a bill waits and when cash is short, never added to what is paid.
  • Approvals inbox — approve and pay, reject, or return to the agent; claims keep two people from deciding the same row.
  • Try a limit first — see which past bills a new payment limit, two-approvals figure or spending limit would have held or let through, then apply it from the result.
  • Contractor milestones — verified by a merged pull request, by a person accepting the Asana task the work was delivered in, or by a person; GitHub bounties with /bounty and /payto; a pull request comment once paid.
  • Payee links — a payee enters and confirms their own address, or creates a passkey wallet to be paid in.
  • Receivables — pay links on Arc, matched receipts, payments applied to several invoices or part of one with the agent's suggestions, credit and fees kept apart, reversals appended, reminders for what is still owed that follow the customer's context (a dispute, a claim, a promise, its own rules, its HubSpot deal's owner), and a search by invoice number, id, purchase order, amount or transaction.
  • Customer statements — a link per customer to a page of what it owes, where it can say it paid, promise a day or dispute an invoice; the agent's reminders wait while a promise or a dispute stands.
  • Commissions — a sales partner or referrer earns only on money a customer actually paid on Arc, for exactly the amount applied; a person turns what is due into a payable the agent pays like any bill, and the partner never approves their own payout.
  • Deals — a signed deal (a deposit and the balance, milestones, a retainer or custom lines) as a schedule that adds up to its total exactly; each line released as a receivable on its day, by a person or the agent; a price change or a cancel is a signed new version that never rewrites what was invoiced or paid.
  • Projects — a budget and a buffer in USDC for each job, client or launch; its bills, milestones and deals, what is set aside, paid and still available, what its deals collected, and its days in the payment plan. The agent never sets aside the same money twice, and holds what a budget cannot cover for a person.
  • Treasury — safe-to-spend today, cash outlook, USYC reserve with Bring cash back (Arc testnet).
  • Cross-currency and cross-chain — EURC invoices and swaps, CCTP and Gateway payouts (Arc testnet), and CCTP payouts to Base and Arbitrum from Arc mainnet.
  • Supplier payment status — a link per supplier to a page of its own bills: where each one stands, from received to paid, with each payment's transaction on Arc, and never why a bill is held.
  • Early-payment offers — the agent's later bills, each with the discount worth asking for paying today; an owner or admin sends the supplier a one-time link, or turns on the agent's own offers: it picks the bills and the discount up to a ceiling, only from cash it can pay today, and emails the supplier the link. An accepted offer is paid at the discounted amount the same day.
  • When the cash is short — the agent checks each scheduled bill against the cash ahead and holds one it will not cover days early. When the bills due within 14 days come to more than the cash, the model orders them by what costs the business most to pay late, saying why for each, and code pays in that order only while the cash lasts. When turned on, it asks a supplier for more time on a bill it cannot pay, answers a supplier who proposes fewer days, and takes the request back once the cash is there; and it offers customers a small discount to pay sooner. It tells the owner how much is needed and by when, in the console, Telegram and Slack.
  • Weekly brief — on Mondays, owners, admins and approvers get the week by email: what was paid and received, the decisions, what waits for them, what leaves next, whether the cash covers the next 30 days, and the week's payee address changes, frozen payees first. In shadow mode it reports the verdicts instead, and how often the business agreed with the agent.
  • Bank payouts — a vendor's bills paid to its bank account in Mexico, in pesos over SPEI through BlindPay, from the workspace's USDC; a person sees what the vendor receives and approves every one (BlindPay's development instance).
  • Shadow mode — try the agent on real bills, paid in the business's own way, before it pays anything itself.
  • Report — what the agent did with a workspace's real bills: payments with their transactions, what it stopped and why, how often a person stepped in, discounts measured from the transfers, and what is left before a live slice, with how often the business agreed with the agent by decision and by vendor and the number of verdicts behind each figure, which an owner then opens on Arc mainnet with the vendors they choose, each showing that agreement, carried over without typing them in again. Agent vs what really happened lays each bill's decision beside what the business recorded paying outside Vestiarion, one bill at a time, from a CSV, or from a bank statement whose lines are matched to the bills they could have paid, each figure linked to its signed entry. Value keeps measured, estimated and not-counted figures apart, and an owner or admin can share a live copy by a revocable link, with suppliers as labels and amounts hidden if they choose.
  • Workspaces and members — per-network workspaces, invitations, five roles, per-member notifications; an accountant console across the businesses an outside accountant looks after, and a one-time link an accountant sends a new client, who opens their own workspace in shadow mode with the accountant already in it.
  • When a payment does not settle — each exceptional state says who acts, what Vestiarion already did and what to do next; paying again always looks for the earlier transfer first.
  • Why it was paid — one page per payment, link by link from the purchase order to the receipt, each fact marked checked by code, verified outside or stated by a person; entries checked again in the browser, and a JSON download.
  • Audit — the signed ledger, one-click verification, exports, and signed webhooks.

Integrations

Circle integrations
Circle productUsed for
Developer-Controlled WalletsTreasury and agent wallets, transfers, balances, confirmation
Modular WalletsPasskey smart accounts: the owner's treasury on Arc mainnet, and a payee's wallet
Smart Contract PlatformDeploying the escrow and spending-limit contracts on Arc testnet
Gas StationPaying the agent wallet's gas on Arc testnet
USYCThe yield-bearing reserve, through its Teller (Arc testnet)
CCTP V2 and GatewayPaying payees on other chains: through CCTP and Gateway on Arc testnet, where Gateway also settles x402 purchases, and through CCTP to Base and Arbitrum from Arc mainnet
CCTP V2 Forwarding ServiceAdding USDC to a workspace's wallet on Arc from Base, Ethereum and other chains, minted by Circle so the wallet needs no gas (both networks)
Stablecoin ServiceEURC quotes and USDC→EURC swaps (Arc testnet)
NotificationsSettlement and incoming-transfer webhooks, recorded within seconds
Team and developer tools
SurfaceWhat it does
SlackDecisions in a channel, with bills waiting for approval and a Review button each; /vestiarion today, waiting, ledger; Approve and pay, Reject and Return buttons on Arc testnet within a limit; add an invoice from a message
TelegramEach member's own chat: decisions with reasons, bills waiting for approval with a Review link, /today, /waiting, /ledger, invoices read from a PDF. The bot never approves or pays
DiscordBills the agent holds or flags for a person, posted to a channel through its webhook after each cycle, each with a link to review it in Approvals. A link never approves
REST API/api/v1 with per-member keys: read everything, each payment's evidence and receipt and the monthly close pack included, and with write access add counterparties, invoices, milestones and payee links. A key never approves or pays
TypeScript SDK@vestiarion/sdk: a typed client for every /api/v1 operation, plus webhook and ledger verification, and offline checks of evidence, receipts and close packs
CLI@vestiarion/cli: the vestiarion command for every /api/v1 operation but the evidence reads, asking before each write, plus offline checks of audit exports and webhook signatures
PostmanA Getting Started collection, from a key to a first call and a first write, and an API reference collection with every /api/v1 operation, both generated from the OpenAPI document and served at /postman/
MCP server/api/mcp, whose tools are the /api/v1 operations but the evidence reads, for AI agents; server.json describes it for the MCP Registry
WebhooksUp to 5 HTTPS endpoints per workspace receive every ledger entry, signed, with retries
GitHubMilestone verification from merged pull requests, bounties, and payment comments
EmailA workspace address that reads forwarded invoices into drafts a person adds
Chrome extensionVestiarion Invoice Capture sends the invoice text you select on a page, or a file you choose, to your workspace as a draft: you check the fields it read and send it, and an owner or admin adds it as a bill through the same checks as any bill. It connects by signing in and allowing it, never with an API key, and can only create and read its own drafts: it never adds a bill, approves or pays. Add it to Chrome from the Chrome Web Store, or download it and load it unpacked, as the guide says. Its source is in extensions/chrome-invoice-capture
AsanaA milestone linked to the Asana task its work is delivered in is ready for acceptance when the task is completed; a person checks the deliverables against the criteria and accepts it, and the agent then decides its payment as for any verified milestone. A task completed in Asana is never by itself a reason to pay, and a task reopened or changed after acceptance is flagged
HubSpotWon deals come in with their customers every 15 minutes; Plan collections fills in the New deal form, and a deal changed in HubSpot afterwards is flagged on its deal for a person to change or keep; once allowed, each planned deal's receipts are written back to it (collected, still owed, last receipt, reconciliation), read back, never over a person's change; one account per workspace. Watch it (1:55)
PipedriveWon deals come in with their organizations and persons as soon as Pipedrive says a deal changed, and every 15 minutes; Plan collections fills in the New deal form, and a deal changed in Pipedrive afterwards is flagged on its deal for a person to change or keep; once allowed, each planned deal's receipts are written back to it in Vestiarion's own deal fields, read back, never over a person's change. Pipedrive names no developer sandbox, so only payments on Arc mainnet outside shadow mode are written; one company per workspace
BlindPayBank payouts: a vendor given its CLABE has its bills paid to its bank account in Mexico, in pesos over SPEI, from the workspace's USDC on Arc. Only the bank and last four digits are kept; every payout is held for a person, who sees BlindPay's quote of what the vendor receives, and takes exactly the bill's amount or sends nothing. BlindPay's development instance in this version
Zoho CRMWon deals come in with their accounts and contacts every 15 minutes, from the Zoho data center the account lives in (any but China's); Plan collections fills in the New deal form, and a deal changed in Zoho CRM afterwards is flagged on its deal for a person to change or keep; read-only, and several workspaces may connect the same organization
XeroBills approved in Xero come in for review every 15 minutes, through the same check as a bill list, and become payables when a person adds them; once paid on Arc, each payment is drafted as a booking against its bill, which an owner or admin reviews field by field and approves before anything is written to Xero. A payment on Arc testnet or in shadow mode is booked only into a Xero demo company. Watch it (1:52)
QuickBooks OnlineOpen bills in QuickBooks come in for review every 15 minutes, and sooner when QuickBooks says one changed, through the same check; a bill partly paid there comes in at what is left; read-only, with the bank account payments will be booked to chosen ahead
Zoho BooksOpen bills in Zoho Books come in for review every 15 minutes, through the same check, from the Zoho data center the account lives in (any but China's); a bill partly paid there comes in at what is left, and one paid or voided after it was added is flagged; a person with several organizations picks one; read-only, and a bill deleted in Zoho Books is not seen
Google SheetsA month's close pack exported to a spreadsheet in the connected Google Drive: one row per payment with its signed entry, a summary with the tab's SHA-256, updated in place on the next export. Access to the files it makes only; it never shares them

The Postman collections are also in a public workspace, Vestiarion API, and the MCP server is in the MCP Registry as io.github.duongnq2798/vestiarion.

npm install @vestiarion/sdk            # the typed client
npm install --global @vestiarion/cli   # the vestiarion command

The vestiarion command works with a workspace from a terminal, with a key from Settings → API keys:

vestiarion login                                            # asks for the key, checks it, saves it for your user
vestiarion bills list --status held                         # what the agent held; bills show <id> says why
vestiarion ledger verify vestiarion-acme-ledger-1042.json   # an audit export, checked offline

Operators of a deployment of their own also run the repository's scripts (npm run cycle, npm run status, …), listed in docs/self-hosting.md.

Primitives for Arc builders

Pieces of Vestiarion another Arc app can take as they are, under this repository's license. Each is tested on its own.

To fork just the two contracts and the ledger verifier, without the app, use duongnq2798/vestiarion-primitives: a Foundry project with both contracts byte for byte, a build that reproduces the Arc mainnet bytecode and a script that checks it against the chain, unit, fuzz and invariant tests, deploy scripts, the deployment addresses, and viem examples for each call.

PrimitiveWhat it gives an Arc appWhere
VestiarionSpendingLimitAn agent that pays from a treasury it does not hold. Only the agent's wallet calls pay(to, amount, ref); it never passes a daily or a 7-day figure and never pays a ref twice. The treasury keeps its USDC and approves the contract, so the contract holds nothing; its owner changes the figures with setLimits, or stops the agent by approving 0. Runs on Arc mainnet: 0xd90cA89Fc318d0330Bb14eaeF78B72C3CA7E7fB6, source verified on Sourcify.contracts/VestiarionSpendingLimit.sol, deploy and calls in src/lib/spending-limit/, tested in an in-process EVM in tests/spending-limit-contract.test.ts
VestiarionSpendingLimitV2Version 2, which path C deploys since Oct 19, 2026: all of the above, and payAcrossChains(amount, maxFee, domain, recipient, ref), which pays a vendor on Base through CCTP V2 from the same treasury, counting the amount and its fee against the same figures. The token messenger and the allowed domains are fixed at deployment, the fee is capped at 10% and 2 USDC, and the contract holds nothing after a call. Not audited. Runs on Arc mainnet: 0x00b83bA62F17cd49c9ccB8e782e166c481e5d94F, source verified on Sourcify. Every deployed contract is listed with its verified source on Contracts on Arc.contracts/VestiarionSpendingLimitV2.sol, the upgrade in src/lib/treasury/contract-upgrade.ts, tested in tests/spending-limit-v2-contract.test.ts
VestiarionEscrowMilestone escrow in about 80 lines: the payer locks USDC for a payee, releases it, or takes it back from a set date. No owner, no upgrade.contracts/VestiarionEscrow.sol, src/lib/circle/escrow-holds.ts, tests/escrow-contract.test.ts
A signed decision ledgerEvery decision an agent makes, with the facts it saw, as an Ed25519-signed, hash-chained entry. Anyone verifies one entry or a whole chain, in a browser or offline from an export.src/lib/ledger.ts, verifyLedgerEntry in the SDK, Verify an audit export
Shadow modeA way to try an agent on a business's real bills without moving its money: each decision waits for a person's verdict, each agreed payment settles on Arc testnet at the real amount, the agreement rate is counted, overall and by decision kind and vendor with the number of verdicts behind each figure, and what the business really paid is recorded and compared bill by bill.src/lib/shadow-mode.ts, src/lib/verdicts.ts, src/lib/autonomy-ladder.ts, src/lib/actual-payments-compare.ts, Shadow mode
@vestiarion/sdkA typed client with no dependencies, plus webhook and ledger signature checks.sdk/, npm

What these add to the circlefin/arc-\* samples. The samples show how to move USDC on Arc: checkout, peer-to-peer payments, a treasury across chains, an escrow released by an AI review, an agent paying for x402 services. An agent's budget there, as in arc-nanopayments' --limit, is enforced by the agent's own process. Here the bound is a contract on Arc that the agent's wallet cannot get past, while the treasury keeps custody. Each payment carries a signed record of why it was made, and shadow mode measures how often people agree with the agent before it pays on its own.

Quick start

Use the hosted app — no wallet or keys needed to start:

  1. Sign in at www.vestiarion.xyz with your email and open a workspace on Arc testnet, in shadow mode.
  2. Add a supplier and one of your bills, or load sample data, and watch the agent decide within a minute.
  3. Agree or disagree with its decision, read the Report of what the agent did, then verify the signed ledger.

The whole path is in See your first decision. To move testnet USDC, follow Go live and fund the wallet from Circle's faucet.

Call the API — create a key under Settings, then:

curl -H "Authorization: Bearer $VESTIARION_API_KEY" https://www.vestiarion.xyz/api/v1/status

See the Quickstart and Authentication.

Verifiable activity

  • Open numbers — workspaces, payments, the agent's decisions, what code refused and what people decided, per network, customers apart from us, read from production on every load. Figures change daily, so this README links there instead of copying them.
  • The ledger — every workspace's /audit verifies its whole chain in one click; exports and webhooks carry the same signed entries.
  • Research — three weeks of the model's decisions recorded beside the written policy's, including where code had to refuse it.
  • Quality Lab — fixed scenarios run through the real decision code on every change, each one's expected and actual outcome, and how many wrong payments: none may merge.
  • Address lookalike checker — a free page that compares an address with ones you know, with a broader rule than the lookalike warning on Counterparties, and checks its characters, checksum and OFAC's list in the browser.
Contracts on Arc testnet

Vestiarion's own contracts, the copies in our test workspace:

ContractAddress
VestiarionEscrow0x74af203fec3f121ff1cd3a763092d1211487702b
VestiarionSpendingLimit0x9da3c47f73ea9399ac566806a189b0bf47b7d4ba

The Circle contracts it calls:

What each one is for, the wallets around them, and the USDC of the chains payees are paid on: Contracts.

Documentation

Development

Next.js, TypeScript, Supabase Postgres with row-level security, Vitest, Solidity 0.8.37.

npm install
cp .env.example .env.local   # Supabase URL and keys, VESTIARION_MASTER_KEYS, SUPABASE_JWT_SECRET
npm run db:migrate
npm run dev

You need a Supabase project (Project Settings → API for the URL and keys, the JWT secret under JWT Keys). With no Circle or model keys, payments are simulated against Arc's measured fee and latency, and decisions come from the rule-based policy, so the app runs end to end with no credentials.

npm run verify   # typecheck, lint and the full test suite: what CI runs

The suite needs no Supabase, Circle or model key: it covers the ledger's tamper cases, risk tiering, treasury economics, guardrails and provider fallback, and runs every migration on an in-process Postgres (PGlite) to hold the database's half of the hash chain to the verifier.

It also runs the Quality Lab (tests/quality-lab.test.ts): the scenarios in src/lib/quality-lab/scenarios.ts through the real AP stage, with the model's answers scripted. Beside them, tests/quality-lab-shadow.test.ts replays the team's own shadow-mode decisions (src/lib/quality-lab/shadow-decisions.json) through the same stage, with the model's answers as recorded. Each fails on any wrong payment, and while its committed result (src/lib/data/quality-lab.json, src/lib/data/quality-lab-shadow.json) is not what the run gives. After a change to the decision code, the scenarios or the exported decisions:

npm run quality-lab   # runs the scenarios and the replay and writes both result files; commit them

docs/self-hosting.md covers the rest: environment variables, the founding workspace, every script, going live per path, the scheduled jobs (Supabase Cron), Circle notifications, GitHub, and what is live versus simulated.

License

MIT. Zoho, Zoho Books and Zoho CRM are trademarks of Zoho Corporation Pvt. Ltd. Google Sheets and Google Drive are trademarks of Google LLC. Arc, Circle, Slack, Telegram, Discord, Xero, QuickBooks, HubSpot, Pipedrive, Asana and npm are trademarks of their respective owners; their names show what Vestiarion is built on and connects to, not an endorsement.

Questions fréquentes

Qu'est-ce que Vestiarion ?

An AI treasury agent paying in USDC on Arc: read its decisions, ledger and books; add invoices.

Comment installer Vestiarion ?

Il fonctionne comme serveur distant. Dans Claude Code : claude mcp add --transport http vestiarion 'https://www.vestiarion.xyz/api/mcp' --header 'Authorization: <A Vestiarion workspace API key, sent as a bearer token. Use a read-only key unless the agent must add records: the write tools need a read-and-write key. No tool can approve or pay.>'. Pour les autres clients, collez la configuration JSON de cette page dans leurs réglages MCP.

Faut-il une clé API pour Vestiarion ?

Oui. Il attend Authorization, à renseigner dans sa configuration.

Vestiarion est-il open source ?

Oui. Son code est sur GitHub sous licence MIT.

Qui maintient Vestiarion ?

Il est publié par duongnq2798. AI.tn le référence sans le maintenir ni le recommander.

Issu du registre MCP officiel. Être listé n'est pas une recommandation : vérifiez le code et les permissions d'un serveur avant de lui donner accès à vos données.