Agent Skills
The Conto skill adds spending-policy enforcement to any AI agent built on OpenClaw or Nous Hermes. It checks every payment against 40+ policy rule types before money leaves the wallet. Both frameworks use the same wrapper script (conto-check.sh) and the same Conto REST API. Only the install command and the config file location differ.
In the examples below,
pathUSD refers to Tempo Testnet. For production wallets on Tempo Mainnet,
use USDC.e.How it works
- Integrated (PRIVY/SPONGE). Your wallet provider holds the keys. Conto evaluates policies and orchestrates execution through the provider.
- External. Agent holds the keys. Agent calls approve, transfers itself, then confirms.
Which endpoint do I call?
| Integrated (PRIVY/SPONGE) | External | |
|---|---|---|
| Custody type | PRIVY or SPONGE | EXTERNAL |
| Who holds keys | Wallet provider | Your agent |
| Endpoint | POST /api/sdk/payments/request | POST /api/sdk/payments/approve |
| Calls per payment | 1 (with autoExecute: true and payments:execute) | 3 (approve, transfer, confirm) |
| Approval expiry | 5 minutes | 10 minutes |
chainId | Resolved from wallet | Required in request body |
EXTERNAL and let Conto act as the policy gate.
If you enable AgentScore-backed merchant gating, the integrated flow can also return
VERIFICATION_REQUIRED before execution. In that case the human verifies identity through the
provided URL, Conto re-runs policy evaluation with the merchant compliance result, and then the
payment proceeds or fails normally.
Install
Requirements:conto-check.sh uses curl, jq, and python3. Install jq via your package manager if missing (brew install jq, apt install jq). python3 runs a short-lived localhost callback server during browser auth.
- OpenClaw
- Nous Hermes
Quick setup
After installing, run setup with your agent name and wallet address:- An agent record linked to your organization
- Your wallet registered as
EXTERNALcustody - Default spend limits (500/day)
- An SDK key written to the framework’s config file (see below)
| Argument | Default | Description |
|---|---|---|
agent_name | required | Name for your agent |
wallet_address | required | Your wallet address (0x... for EVM, base58 for Solana) |
chain_type | EVM | EVM or SOLANA |
chain_id | 42431 | Common: 8453 (Base), 42431 (Tempo Testnet), 1 (Ethereum) |
Config file locations
The skill writes the SDK key to a framework-specific path:- OpenClaw
- Nous Hermes
~/.openclaw/openclaw.json:Manual setup
If browser-based setup doesn’t work, configure manually:- Connect your agent in Conto. Sign in to the Conto dashboard and create the agent record.
- Link your wallet. Go to Agents > your agent > Wallets > Link Wallet. Enter the address and chain. Set initial spending limits.
- Generate an SDK key. Go to Agents > your agent > SDK Keys > Generate New Key. Pick Admin if you want the skill to execute payments, approve external-wallet transfers, or manage policies. Pick Standard only for request/read-only evaluation or if you already have a custom-scoped standard key with the payment scopes this skill needs.
- Save the key to the config path for your framework (above).
Finding your wallet address
How you obtain a wallet address depends on your setup. Existing MCP wallet (Sponge, AgentCash). Ask your agent or run theget_balance / list_accounts tool. Copy the address for the chain you want to use.
Create a wallet in Conto. Dashboard > Wallets > Create Wallet > pick PRIVY or SPONGE custody > select chain > Provision. Conto creates the wallet onchain and shows the address.
Your own external wallet (hardware, MetaMask, etc.). Register the address in Conto as EXTERNAL custody. Your agent handles the onchain transfer itself.
Usage
Standard vs Admin SDK keys
| Capability | Standard | Admin |
|---|---|---|
| Request policy evaluation | Yes | Yes |
| Execute approved payments | No | Yes |
| Approve / confirm payments | No | Yes |
| Pre-authorize x402 calls | Yes | Yes |
| Create merchant acceptance gates | No | Yes |
| Read policies and transactions | Yes | Yes |
| Create/update/delete policies | No | Yes |
| Manage agents and wallets | No | Yes |
Supported policy types
| Type | What it controls |
|---|---|
MAX_AMOUNT | Per-transaction cap |
DAILY_LIMIT / WEEKLY_LIMIT / MONTHLY_LIMIT | Cumulative spend caps |
ALLOWED_CATEGORIES / BLOCKED_CATEGORIES | Category allowlist/blocklist |
ALLOWED_COUNTERPARTIES / BLOCKED_COUNTERPARTIES | Address allowlist/blocklist |
TIME_WINDOW / DAY_OF_WEEK | Business hours, allowed days |
BLACKOUT_PERIOD | Maintenance windows |
VELOCITY_LIMIT | Transaction rate limiting |
REQUIRE_APPROVAL_ABOVE | Human approval threshold |
GEOGRAPHIC_RESTRICTION | Country / OFAC restrictions |
CONTRACT_ALLOWLIST | DeFi contract restrictions |
X402_PRICE_CEILING | Max per x402 API call |
X402_ALLOWED_SERVICES / X402_BLOCKED_SERVICES | x402 service allowlist/blocklist |
X402_MAX_PER_SERVICE | Per-service daily cap |
End-to-end example: pay a vendor on Tempo Testnet
This walks the full external-wallet flow: approve, transfer onchain, confirm back to Conto.Prerequisites
- Conto account with the agent connected
- Conto skill installed in OpenClaw or Hermes
- SDK key configured (see Config file locations)
- A wallet address (see Finding your wallet address)
Step 1. Tempo Testnet details
| Detail | Value |
|---|---|
| Network | Tempo Testnet |
| Chain ID | 42431 |
| Currency | pathUSD (TIP-20 stablecoin) |
| Gas | Paid in pathUSD (no separate gas token) |
| Explorer | explore.moderato.tempo.xyz |
Step 2. Get testnet funds
- Conto Privy wallets: dashboard Wallets > your wallet > Faucet.
- Tempo faucet:
faucet.tempo.network. - Sponge MCP wallets: ask your agent for the balance and swap or bridge if needed.
pathUSD to cover the test payment plus a small amount for fees.
Step 3. Register the wallet in Conto
Dashboard > Agents > your agent > Wallets > Link Wallet. Set:- Chain: Tempo Testnet (
42431) - Custody type:
EXTERNAL(orPRIVYif you created one in Conto) - Per Transaction: 200 pathUSD
- Daily: 1,000 pathUSD
- Weekly: 5,000 pathUSD
Step 4. Create a policy
POST /api/sdk/policies and returns the policy ID. Verify:
Step 5. Request a payment
approvalId and approvalToken. If policy
requires manual approval and a workflow matches, the response includes approvalRequestId instead.
Once that workflow approves the payment, the agent confirms the onchain transfer back to Conto with
the final txHash.
Step 6. Transfer onchain
The agent transferspathUSD itself using its own keys. The skill handles this for you.
Step 7. Confirm back to Conto
After the onchain transfer succeeds:Step 8. Verify
What happens when a policy blocks the payment?
PER_TX_LIMIT, DAILY_LIMIT, WEEKLY_LIMIT, MONTHLY_LIMIT, BLOCKED_COUNTERPARTY, TIME_WINDOW, CATEGORY_RESTRICTION, VELOCITY_LIMIT. See Advanced policies for the full list.
Rate limits
| Endpoint type | Limit |
|---|---|
Payment endpoints (/approve, /request, /execute, /confirm) | 60 requests/min per agent |
Read endpoints (/wallets, /policies, /transactions, etc.) | 120 requests/min per agent |
429, the API returns a Retry-After header. The skill retries automatically.
See the Defaults page for all rate-limit and default values.
Troubleshooting
Skill can't reach Conto (connection refused / timeout)
Skill can't reach Conto (connection refused / timeout)
Verify A valid JSON response means the URL is reachable.
CONTO_API_URL is correct. For the hosted platform, use https://conto.finance. For local dev, http://localhost:3006. Test:'Invalid or expired SDK key'
'Invalid or expired SDK key'
SDK keys are scoped to a single agent. Check that:
- The key starts with
conto_agent_(notconto_) - The key has not been revoked in Agents > SDK Keys
- You’re using the correct key for the correct agent
Payment denied unexpectedly
Payment denied unexpectedly
The denial response includes a
violations array listing every rule that failed. Common causes:- Spend limit exceeded. Check daily/weekly/monthly counters in Agents > Spend Tracking.
- Counterparty not on allowlist. If you have an
ALLOWED_COUNTERPARTIESpolicy, the recipient must be listed. - Outside time window.
TIME_WINDOWandDAY_OF_WEEKrules use the timezone set on the policy. - Category mismatch. If
ALLOWED_CATEGORIESis set and nocategoryis provided, the rule is skipped.BLOCKED_CATEGORIESalways denies on match.
Payment approved but no onchain transfer (external wallet)
Payment approved but no onchain transfer (external wallet)
In external wallet mode, Conto only enforces policy. The agent must transfer funds itself. If
/approve succeeds but no transfer happens:- Check the agent has enough
pathUSDin its wallet. - Check the agent logs for transfer errors.
- Ensure the wallet address in Conto matches the agent’s actual wallet.
/confirm call may have failed. Retry:Admin commands fail with 'insufficient permissions'
Admin commands fail with 'insufficient permissions'
Policy management requires an Admin SDK key. The default Standard preset can request policy
evaluation and read agent data, but it does not include
payments:execute,
payments:approve, or payments:confirm. Check the key type in Agents > SDK Keys (scope
column shows standard or admin).Policies not evaluating (all payments approved)
Policies not evaluating (all payments approved)
Policies must be assigned to the agent. Creating a policy alone doesn’t activate it. Assign via the dashboard (Policies > Assign to Agent) or via the API:Verify the policy status is
ACTIVE.OpenClaw errors after editing openclaw.json
OpenClaw errors after editing openclaw.json
If every OpenClaw command fails after a manual edit, the JSON file likely has a syntax error. Validate:If
jq reports an error, fix the JSON or delete and re-run setup: