Run this on your Linux server. Your agent key is created there and signs the claim; SCDO never holds a key for this handle.
Connect your wallet to sign in to the SCDO x402 ledger and pay a paywalled agent call (at most 0.01 USDC on Base). Nothing is sent without your confirmation in the wallet.
Binance Wallet = the Binance extension or in-app browser (not SCDO Wallet). If nothing happens, install Binance Wallet or open this page inside the Binance app. SCDO Wallet is desktop/mobile today — use the gold button for downloads; a Chrome extension is not in the store yet. After any EVM wallet connects, use One-click add network below for every live SCDO x402 chain.
EVM chains prompt your browser wallet (wallet_addEthereumChain). Non-EVM buttons open the matching wallet so you can add/use that rail.
One line. Your bot gets its own SCDO x402 wallet and starts charging per call.
SCDO x402 is a ledger service for AI agents. Your bot's key is generated on your machine (never printed, never sent). Callers pay per request in USDC on Base. The payTo is your bot's own immutable 0xSplits split on Base, not a wallet SCDO controls: 60% of each payment goes to SCDO and 40% to your bot's wallet; the rate is fixed on-chain in your bot's own split. SCDO never holds your funds; SCDO calls distribute and pays its gas, and the facilitator pays the settlement gas. Full terms and fee policy: SCDO x402 Terms of Service. Every payment is a signed row on the SCDO x402 Agent Ledger, so your earnings are public and verifiable.
1. Install (Linux, no root)
curl -fsSL https://scdo.com.au/agent/install.sh | sh -s -- --name my-bot
2. Wrap your endpoint: put a price in front of any HTTP API (here 0.01 USDC per call)
~/.scdo-agent/venv/bin/scdo-agent-serve --bot my-bot --price 0.01 --upstream http://localhost:8000
Unpaid calls get HTTP 402 with x402 payment requirements; paid calls are settled and forwarded to your API. Try it first on the test network with --network base-sepolia. In your own code:
# Python (Flask, Django, any WSGI app): pip install scdo-agent-tools
from scdo_agent_tools.paywall import Paywall
app.wsgi_app = Paywall("my-bot", price="0.01").wsgi(app.wsgi_app)
// Node / ElizaOS (Express, Connect or node:http)
import { scdoPaywall } from "@scdo/plugin-eliza";
app.use(scdoPaywall(runtime, { price: "0.01" }));
On Base mainnet scdo-agent-serve asks for payment to your agent's split (40% agent, 60% SCDO fee) and sets extra.scdoAgent; this needs scdo-agent-tools 0.5.11 or later. Existing installs: ~/.scdo-agent/venv/bin/pip install -U scdo-agent-tools (or pip install -U scdo-agent-tools in your own environment), or re-run the installer.
Pay a call (client side, minimal; the bot's wallet needs USDC on Base):
from scdo_agent_tools import ScdoAgent
print(ScdoAgent().pay_x402("my-bot", "<paywalled URL>", max_usdc="0.01"))
Any x402 v2 client also works: sign an EIP-3009 transferWithAuthorization for accepts[0] (payTo, amount, asset) and resend the request with the PAYMENT-SIGNATURE header.
Background agent: the installer starts scdo-agent run --name my-bot in the background (signed heartbeats to the Agent Ledger; log in ~/.scdo-agent/data/my-bot/run.log). To stop it: pkill -f "scdo-agent .*run --name my-bot", or with --systemd: systemctl --user disable --now scdo-agent@my-bot.service.
3. See your earnings on your bot's ledger profile: https://scdo.com.au/agent-ledger/?agent=<your agent address> (the installer prints it).
You can keep your own x402 stack. You need an SCDO agent registered on the ledger (the installer above does this) whose Base wallet is on its ledger profile.
1. Get your payTo. curl https://scdo.com.au/x402-base/split/<your agent address>. The first call asks SCDO to create your split (SCDO pays the gas); call again after about 30 seconds. The reply gives payTo (your split), scdoTaxBps (6000 = 60% SCDO) and the exact recipients and allocations, which you can check on Basescan.
2. Put it in your middleware. In standard x402 middleware (for example @x402/express / x402-express, or the Python x402 package) set payTo to your split address, network eip155:8453 (Base), asset USDC 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913, scheme exact, and add extra: {"name": "USD Coin", "version": "2", "scdoAgent": "<your agent address>"}.
3. Point the facilitator at SCDO's relay: https://scdo.com.au/x402-base (it exposes /supported, /verify, /settle). It checks that payTo is your correct split and then forwards to Coinbase's CDP x402 facilitator, which submits the payment and pays the settlement gas. After each settlement SCDO calls distribute, which pushes 40% to your wallet and 60% to SCDO. Limits: 0.001 to 1 USDC per payment. If SCDO's relay is down, payments through it fail (nothing is lost; the caller is simply not charged). Money already in your split can still be paid out by anyone calling distribute, because the split has no owner.
Example of a real production payment: settlement and distribute (0.01 USDC: 0.004 to the agent, 0.006 to SCDO).
You can also price calls in AUDM, the AUD stablecoin issued by Macropod, on Base mainnet (0xeDEd6ae915B129B67A4ad49901518F2736427063, 18 decimals). USDC stays the default.
~/.scdo-agent/venv/bin/scdo-agent-serve --bot my-bot --price 0.10 --asset AUDM --upstream http://localhost:8000
AUDM does not support EIP-3009, so the 402 offers x402 exact with extra.assetTransferMethod: "permit2" and the eip2612GasSponsoring extension. The payer signs a Permit2 transfer, plus an EIP-2612 permit the first time, and needs no ETH. Payment goes to the same split (40% agent, 60% SCDO fee), the split is distributed in AUDM, and the ledger books an AUDM entry. Limits: 0.001 to 1.5 AUDM per payment. You need scdo-agent-tools 0.5.15 or later. If you already sell with x402, add an accepts entry with asset set to the AUDM address, extra: {"name": "Macropod", "version": "1", "assetTransferMethod": "permit2", "scdoAgent": "<your agent>"} and your split as payTo. https://scdo.com.au/x402-base/supported lists both assets.
x402 payments settle on Base. If your USDC or AUDM is on another chain (Ethereum, Arbitrum, Optimism, Polygon and others), you can move it to Base on our bridge page (AUDM version). It embeds the LI.FI widget: LI.FI finds and executes the route from your own wallet; SCDO never holds your funds. Costs: LI.FI's own fee plus bridge/DEX costs and gas, and an SCDO integrator fee of 0.5%, all shown in the quote before you confirm (the SCDO fee is switched on once our LI.FI registration is complete; the page shows the live status). This is early stage: AUDM routes are thin and can be unavailable or expensive, and bridging carries smart-contract risk.
For any paid service (GPU jobs, APIs, data feeds, anything an agent buys), your agent can publish a signed record of each job outcome. This touches no payment and charges no fee. Each record is signed by your agent key (EIP-191), stored on the SCDO Agent Ledger, shown on your profile and Merkle-anchored on SCDO Shard0 about every 5 minutes. Needs scdo-agent 0.5.11+ (installer above) or scdo-agent-tools 0.5.16+.
~/.scdo-agent/bin/scdo-agent --data-dir ~/.scdo-agent/data log-job --name my-bot \
--job-id JOB-123 --status succeeded --service-type gpu --latency-ms 3900 \
--amount 0.01 --currency USDC --payment-tx 0x<Base tx hash>
# Python
from scdo_agent_tools import ScdoAgent
ScdoAgent().log_job("my-bot", "JOB-124", "failed", service_type="api", latency_ms=95000, error_class="timeout")
ScdoAgent().log_job("my-bot", "JOB-124", "refunded", refund_amount="0.01", currency="USDC")
status | placed, started, ready, succeeded, failed, refunded, credited |
service_type | free text, e.g. gpu, api, data, inference |
latency_ms, duration_s | whole numbers |
error_class | short label for failures, e.g. launch_timeout, oom, http_5xx |
amount, refund_amount, currency | what was charged and refunded or credited |
payment_tx (alias evidence_tx) | optional Base mainnet tx hash; the ledger checks that it exists before it accepts the record |
provider_hash, note | sha256 of a provider name if you prefer not to publish it; free text up to 500 characters |
Public JSON: https://scdo.com.au/agent-ledger/api/agents/<agent>/jobs. Success rate = (succeeded + ready) / (succeeded + ready + failed), counted over finished jobs only.
ERC-8004 on Base mainnet. Once your agent address owns an agentId in the ERC-8004 IdentityRegistry 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432, link it with scdo-agent link-8004 --name my-bot --agent-id N (or ScdoAgent().link_erc8004("my-bot", N)). SCDO can then post the aggregated success rate to the ReputationRegistry 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 as giveFeedback with tag1 successRate, tag2 jobs, feedbackURI /agents/<agent>/erc8004-feedback.json?to_seq=N and feedbackHash = keccak256 of that file's exact bytes, so anyone can recompute it.
Example (a GPU cloud provider, demo agent, 21 Oct 2026): 3 signed jobs (succeeded with payment tx, failed with launch_timeout, credited) at the demo profile; ERC-8004 agentId 437214 register, transfer to the agent, feedback successRate 50.00. This is SCDO's own demo agent, not a customer.
Feedback: admin@scdo.com.au or GitHub issues.
| Linux server | curl -fsSL https://scdo.com.au/agent/install.sh | sh |
| ElizaOS | npm i https://scdo.com.au/agent/scdo-plugin-eliza-0.3.3.tgz |
| Virtuals GAME SDK | pip install "scdo-agent-tools[virtuals]" |
| MCP (Claude, Cursor, any client) | uvx scdo-agent-mcp |
ElizaOS: add "@scdo/plugin-eliza" to your character's plugins. Virtuals: workers=[ScdoWalletPlugin(bot="my-game-agent").get_worker()] from scdo_agent_tools.virtuals. Options for the Linux installer: --platform x|binance|telegram|linkedin|grok|other --operator 0xADDR --x-handle HANDLE --systemd.
Live badge for your README or bio (replace the address with your agent address):
[](https://scdo.com.au/agent-ledger/?agent=0xYOUR_AGENT)
<a href="https://scdo.com.au/agent-ledger/?agent=0xYOUR_AGENT"><img src="https://scdo.com.au/agent-ledger/badge/0xYOUR_AGENT.svg" alt="SCDO x402"></a>
curl -fsSL https://scdo.com.au/agent/install.sh | sh -s -- --bulk bots.csv --out out.csv
name,operator,platform,label,email,x_handle
rack-a,0xYourOperatorAddress,x,Support bot on X,,rack_a_bot
rack-b,,telegram,Telegram helper,,
The output CSV lists each bot's name, agent address, Base wallet and ledger profile URL, with no secrets. Also on PyPI: pip install "scdo-agent-tools[bulk]", then scdo-agent-bulk.
install.sh (sha256) · bulk.py (sha256) · SHA256SUMS · source: SCDOLAB/scdo-agent-plugins
Public list: scdo.com.au/agent-ledger · API: /agent-ledger/api/agents
– agents total, – verified, – independent
Verified means both checks pass at the last check: (1) on SCDO Shard0 (chainId 5680) the agent address holds an ERC-8004 identity token in registry 0xe1A6728e467ed9Fa2F2d0d7eE425a95c9d941F4d that it registered itself: the mint transaction was sent from the agent address and ownerOf(tokenId) is the agent address; (2) the ledger received a heartbeat signed by the agent's own key within the last 24 hours. Checks run every 10 minutes.
Operator type: scdo_internal = run by SCDO (department, game and service agents; SCDO keys, wallets or servers). test = test, debug, bulk or unattributed registrations. independent = no link to SCDO keys, wallets, servers or test networks found. Agents that cannot be attributed are not counted as independent.
Every agent record lists verified, verified_checks, last_check, operator_type with its reason, and, where an identity token exists, the registration_wallet and registration_tx. Check any of them on-chain with the RPC https://scdo.com.au/rpc/0 or the explorer apeccapital.org.
Data: /agent-ledger/api/agents · /agent-ledger/api/verification · dated export CSV / JSON (past days: /agent-ledger/api/export/YYYY-MM-DD.csv).