SpendGuard testnet

On NEAR testnet, open source, MIT, no backend

The limit behind your agent.

A coding agent that buys API credits, market data and compute can be talked into paying. SpendGuard puts a real ceiling behind it. The chain enforces the limit, every attempt is a receipt, and one transaction revokes the agent completely.

  • Real, not a demo. Every figure on this page is read from the chain.
  • One transaction lockout. Delete the key and the agent cannot sign a request at all.
  • No backend. Nothing to trust, nothing to leak, nothing to go down.

Who this is for

People on low bandwidth plans, low balances and high risk. They authorise a payment once and watch it happen slowly. A runaway agent competes with that. Names are illustrative.

Tunde, freelance developer, Lagos

Sells five to fifteen hours a week, buys API credits for the agent that writes boilerplate. Concern: one stray prompt drains the prepaid balance before he sees the dashboard.

Amina, small goods trader, Kaduna

Uses a mobile agent to compare weather, market and satellite data for the planting window. Concern: a file the agent reads tells it to upgrade the plan, in a noisy market she cannot watch.

Chidi, phone repair shop, Aba

Agents quote the cheapest parts by crawler-scanned vendor catalogs. Concern: a poisoned search result asks for a payment to a vendor with no trading history.

Live on NEAR testnet

Every figure is read from the public testnet RPC at the moment you open this page. No snapshot, no cache, no invented count. Reproduce any of it yourself in the judge section below.

The decision feed

Blocked by reason

Decisions by day

The agent key cannot do this

Enable it, three accounts and five commands

You need testnet NEAR, the near CLI and the bound repository. The commands below are exactly what the demo used, with new accounts. Testnet NEAR is free.

    Judge evidence reproduce everything with curl

    1. The policy

    curl -s -X POST https://test.rpc.fastnear.com -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":"1","method":"query","params":{"request_type":"call_function","account_id":"bound-testnet-97685.testnet","method_name":"get_policy","args_base64":"'$(printf '{"agent_id":"bound-agent.testnet"}' | base64 -w0)'","finality":"optimistic"}}'

    2. The denial, with evidence

    curl -s -X POST https://test.rpc.fastnear.com -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":"1","method":"query","params":{"request_type":"call_function","account_id":"bound-testnet-97685.testnet","method_name":"get_receipt","args_base64":"'$(printf '{"receipt_id":10}' | base64 -w0)'","finality":"optimistic"}}'

    Receipt 10: BudgetExceeded and budget evidence lines.

    3. The treasury and the key

    curl -s -X POST https://test.rpc.fastnear.com -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":"1","method":"query","params":{"request_type":"view_access_key_list","account_id":"bound-agent.testnet","finality":"optimistic"}}'

    Shows the one key the agent can use. Scope: one receiver, one method, an allowance.

    4. Count the decisions

    curl -s -X POST https://test.rpc.fastnear.com -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":"1","method":"query","params":{"request_type":"call_function","account_id":"bound-testnet-97685.testnet","method_name":"get_receipt_count","args_base64":"e30=","finality":"optimistic"}}'

    Why it is like this

    • No database and no cache; the same numbers this page prints come from these calls.
    • Receipts survive the redeploy on 2026-11-06; storage was untouched.
    • This repository is the evidence. Code is MIT.