Control agent spending from one inspectable boundary.
AllowanceOS evaluates payment attempts, generates local agent session keys, and tracks user-owned token grants on Base Sepolia and Solana Devnet.
- Current build
- 0.1 testnet preview
- Active boundaries
- CLI or testnet vault
- Observed spend
- Reported allowed attempts
- Settlement
- RPC evidence recorded
The control lifecycle
Go from browser to connected agent
#Create a control in the browser, then run the version-pinned CLI command in the agent workspace. You do not need to clone a repository, install a global binary, or save an executable file.
npx allowanceos@0.1.0 connect AOS-XXXXX-XXXXX --server https://qa.fatbeef.tech/allowanceOS
npx fetches the exact package version into npm's cache and runs it. The temporary pairing code expires after ten minutes and works once.
Create a spend control
#A control assigns a budget, a per-payment cap, recipient names or addresses, an expiry, and a pause state to one agent connection.
Use the product
- 1
Open onboarding or choose Create control from the product.
- 2
Name the control and set the total budget and per-payment limit.
- 3
Add one recipient per line and choose an expiry in the future.
Control management stays in the authenticated product in this release. The future operator CLI will use a browser-approved device flow instead of permanent management keys pasted into a shell.
Maximum observed allowed spend for the control.
Maximum amount for one payment attempt.
Exact strings the policy engine accepts.
ISO timestamp after which attempts receive CONTROL_EXPIRED.
Pair an agent workspace
#Run the generated npx command in the intended agent workspace. npm fetches and executes the exact package version; no repository, global install, or manually managed script is involved.
Read the package source.
Use the pinned npx command.
Redeem the one-time code.
The command names allowanceos@0.1.0. Check its source and npm provenance before running a release you have not reviewed.
A code works once for ten minutes. Creating a newer code invalidates the older code for that control.
npm view allowanceos@0.1.0 dist.integrity
npx allowanceos@0.1.0 connect AOS-XXXXX-XXXXX --server https://qa.fatbeef.tech/allowanceOS
Pairing writes .allowanceos.json with the server, control ID, connection token, and locally generated EVM and Solana session keys. AllowanceOS sends only the public addresses to the server. It also writes ALLOWANCEOS_AGENT.md with the authorization instruction for the agent.
Generate another pairing code
Open the control inspector and choose New code. Management actions require an authenticated operator session.
Redeeming a new pairing code rotates the connection token. A workspace connected with the old token will stop authorizing attempts for that control.
Add testnet onchain authority
#The same ownership model applies to both chains. You approve a token deposit from your wallet. The paired workspace receives a separate session key with limited authority. AllowanceOS never asks for your wallet seed phrase or private key.
An ERC-20 vault allows one agent address to transfer one token to up to eight recipients within the configured budget, per-payment cap, interval, and expiry.
An Anchor program controls an SPL-token vault through a grant PDA and applies the same recipient, amount, nonce, interval, expiry, pause, and revoke rules.
Your wallet can pause, revoke, rotate the session key, and withdraw remaining tokens.
Register the grant account and deployment transaction in the control inspector. AllowanceOS checks the public testnet RPC before it marks the grant active.
Request a payment decision
#The agent must ask the CLI for a decision before it calls the payment tool.
npx allowanceos@0.1.0 authorize --amount 1.25 --recipient research-api --description "Buy a research result"
{
"decision": "allowed",
"code": "ALLOWED",
"explanation": "This attempt fits the active control.",
"attemptId": "att_..."
}
{
"decision": "denied",
"code": "PER_PAYMENT_LIMIT_EXCEEDED",
"explanation": "The amount exceeds the per-payment limit.",
"attemptId": "att_..."
}
Continue to the payment tool after an allowed decision and exit code 0. A denied attempt still appears in Activity with its reason code.
Observe decisions and spend
#The Activity page reads attempts reported through one connection. Allowed attempts add to observed spend. Denied attempts remain in the ledger but do not consume the budget.
npx allowanceos@0.1.0 statusnpx allowanceos@0.1.0 activityPass --control <id> and --server <url> to inspect another control without changing the workspace configuration.
Operate a running control
#Authenticated operators can pause, resume, inspect, and reconnect controls from the product. Connected workspaces can read only their own control and activity using their scoped connection token.
CLI reference
#Run npx allowanceos@0.1.0 help from any agent workspace. Pinning the version keeps the package identity visible and prevents a future release from replacing the code under an existing command.
| Command | Purpose | Requires connection |
|---|---|---|
connect <pairing-code> | Pair the current workspace and write local configuration. | No |
authorize --amount --recipient | Evaluate one payment attempt. Accepts optional --description. | Yes |
status | Show state, observed spend, remaining budget, and server. | Yes |
activity | Print the latest 20 attempts for the connected control. | Yes |
doctor | Check local configuration and server reachability. | No |
The generated connection command includes --server <deployment-url>, so the workspace is bound to the deployment that issued its code. Operator management remains in the authenticated browser product.
HTTP API reference
#The testnet preview exposes JSON endpoints under the same origin. Management endpoints require a revocable, tenant-scoped operator session. Agent endpoints accept only the bearer token for the connected control.
GET /api/cliPackage, version, source, and registry metadataPublicGET /api/chainsSupported public testnet chain metadataPublicGET /api/controlsList controls in the current organizationOperator sessionPOST /api/controlsCreate a controlOperator sessionGET /api/controls/:idRead one controlOperator or connectionPATCH /api/controls/:idUpdate fields or pause stateOperator sessionPOST /api/controls/:id/pairingsCreate a pairing codeOperator sessionPOST /api/pairings/:code/redeemExchange a code for connection credentialsPairing codeGET /api/controls/:id/attemptsList reported attemptsOperator or connectionPOST /api/controls/:id/attemptsEvaluate a payment attemptBearer tokenGET /api/controls/:id/grantsList registered onchain grantsOperator sessionPOST /api/controls/:id/grantsRegister a grant deploymentOperator sessionPOST /api/controls/:id/grants/:grant/reconcileVerify the deployment transactionOperator sessionPOST /api/controls/:id/settlementsRecord an agent-submitted transaction IDBearer tokenGET /api/controls/:id/settlementsList settlement evidenceOperator sessionCreate a control
{
"name": "Research agent",
"budget": "50.00",
"perPayment": "5.00",
"recipients": ["research-api", "market-data"],
"expiresAt": "2026-08-17T18:00:00.000Z"
}
The response contains public control data, including a version and SHA-256 control hash. Connection tokens are returned only when a short-lived pairing code is redeemed; they are never placed in the generated shell command.
Evaluate an attempt
Authorization: Bearer aos_...
Idempotency-Key: 1f92f2d6-...
Content-Type: application/json
{
"amount": "1.25",
"recipient": "research-api",
"description": "Buy a research result",
"source": "custom-agent-wrapper"
}
The endpoint returns HTTP 200 for allowed attempts and 403 for denied attempts. Both responses include the recorded attempt.
Decision codes
#The policy engine checks rules in the order shown below. It returns the first failing code, which keeps denials deterministic.
INVALID_AMOUNTAmount is not a positive safe integer after conversion to cents.
CONTROL_PAUSEDThe operator paused the control.
CONTROL_EXPIREDThe control expiry is at or before the evaluation time.
RECIPIENT_NOT_ALLOWEDThe recipient string does not match an allowed recipient.
PER_PAYMENT_LIMIT_EXCEEDEDThe amount exceeds the control's per-payment cap.
BUDGET_EXCEEDEDObserved spend plus the requested amount exceeds the total budget.
ALLOWEDThe attempt fits every active rule.
Security boundary
#- Authenticate operators in tenant-scoped sessions.
- Keep user wallet keys out of the control plane.
- Generate agent session keys in the paired workspace.
- Ship EVM and Solana token-vault enforcement code.
- Reconcile registered transaction evidence.
- Protect an unrestricted wallet key given directly to an agent.
- Support native ETH or SOL transfers.
- Provide browser wallet grant creation yet.
- Claim audited contracts or mainnet readiness.
Customer-fund use still requires MFA and sensitive-action reauthentication, rate limits, a provenance-backed npm release, automated settlement reconciliation, contract audits, recovery drills, and completed legal and security reviews.
Troubleshooting
#Pairing code not found, expired, or already used
Generate a new code from the authenticated control inspector. The newest code invalidates older codes for the same control.
This workspace is not connected
Run the pairing command from the directory where the agent works. Confirm that directory contains .allowanceos.json after pairing.
Connection token rejected
Another pairing redemption may have rotated the token. Generate a new code and pair the intended workspace again.
AllowanceOS cannot reach the server
Run npx allowanceos@0.1.0 doctor. Check the service URL or pass --server <url> to choose another instance.
The agent received a denial
Read the stable decision code in the CLI output or Activity ledger. Use the decision table above to identify the first rule that failed.