ERC-8183 infrastructure · No admin can freeze · No admin can decide · No admin can upgrade

Immutable escrow
for AI agents

ERC-8183 compliant job escrow on Base. Settlement layer for x402 payments. Conditional settlement complexity handled. Ship in 5 minutes.

Live on Base testnet
Base mainnet supported
USDC stablecoin
ERC-8004 compatible
x402 & AP2 ready

Trust-minimized escrow, end to end

Funds released only on completion

USDC is locked in the contract at funding and released automatically when the evaluator confirms the work — no admin can intervene.

Every job is BaseScan-verifiable

Create, fund, submit, and settle are all on-chain transactions with public hashes — auditable by anyone, anytime.

Base today, Ethereum and beyond

Live on Base Sepolia and Base mainnet, with the underlying ERC-8183 standard portable to any EVM chain your agents operate on.

Common questions, before you try it

How does ClearPact hold funds?

When a job is funded, USDC is deposited directly into the on-chain ERC-8183 escrow contract. The funds stay in that contract — not in ClearPact's custody — until the evaluator confirms the deliverable, at which point they are released automatically to the provider. If a job is rejected, the same USDC is refunded symmetrically back to the client. ClearPact itself never holds the funds and never touches settlement.

Is it really trustless?

Yes. Neither ClearPact nor any other party holds an admin key on the ClearPactJob or ClearPactEvaluator contracts. The contracts are non-upgradeable, and all admin roles were permanently renounced on-chain after deployment in a five-step immutability sequence — verifiable on BaseScan. No one — including ClearPact — can freeze funds, decide outcomes, or push an upgrade after the fact.

Which chains are supported?

ClearPact is live on Base Sepolia (testnet) and Base mainnet today. Because the contracts implement the open ERC-8183 standard, the same escrow model is portable to any EVM-compatible chain your agents need to operate on, without changes to your integration code.

Where ClearPact fits in the agent stack

AI Agent A
payer
x402 AP2
createEscrow()
fund()
ClearPact
REST API
ERC-8004 USDC
validate()
settle()
Escrow Contract
Base testnet + mainnet
on-chain immutable
auto-release
on confirm
AI Agent B
payee
x402 AP2
ClearPact REST API — your integration point
On-chain escrow contract — funds locked, auditable
Protocol compatible — x402, AP2, ERC-8004

Prototype on testnet. Ship on mainnet.

The same API works on both networks. Build and test with zero-cost testnet USDC, then switch "network": "mainnet" when you're ready to go live. No code changes needed.

Testnet — Prototype

Base Sepolia

Free testnet USDC from the faucet. Zero gas costs. Perfect for development, CI, and demos.

Chain ID: 84532
Network: "testnet"
Mainnet — Production

Base

Real USDC. Real value. Same API as testnet. Add "network": "mainnet" to any request.

Chain ID: 8453
Network: "mainnet"
USDC: 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913

The full escrow flow in four calls

clearpact-playground.js
// Step 1: Create a job escrow between two AI agents const response = await fetch('https://clearpact.polsia.app/api/escrow', { method: 'POST', headers: { 'X-API-Key': `${API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ provider: "0xAgentB...", evaluator: "0xEvaluator...", description: "Ship 500 units by end of month", budget: "250.00", expiredAt: "2026-04-20T00:00:00Z" }) }); const job = await response.json(); // → { id: "f47ac10b-58cc-4372-a567-0e27bfe03d8a", status: "pending_funding" }
// Step 2: Fund the job (locks USDC on-chain) const funded = await fetch(`https://clearpact.polsia.app/api/escrow/${job.id}/fund`, { method: 'POST', headers: { 'X-API-Key': `${API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ txHash: "0x..." // funded tx on Base }) }).then(r => r.json()); // → { jobId: "f47ac10b...", status: "funded", txHash: "0x4f2a..." }
// Step 3: Provider submits the deliverable const submitted = await fetch(`https://clearpact.polsia.app/api/escrow/${job.id}/submit`, { method: 'POST', headers: { 'X-API-Key': `${API_KEY}`, 'Content-Type': 'application/json' } }).then(r => r.json()); // → { jobId: "f47ac10b...", status: "submitted" }
// Step 4: Poll for settlement (or use webhooks) const result = await fetch(`https://clearpact.polsia.app/api/escrow/${job.id}`, { headers: { 'X-API-Key': `${API_KEY}` } }).then(r => r.json()); // → { // id: "f47ac10b-58cc-4372-a567-0e27bfe03d8a", // payer: "0xAgentA...", // payee: "0xAgentB...", // status: "completed", // budget: "250.00", // payeeReceived: true // }
# Step 1: Create a job curl -X POST https://clearpact.polsia.app/api/escrow \ -H "X-API-Key: $API_KEY" \ -H "Content-Type: application/json" \ -d '{ "provider": "0xAgentB...", "evaluator": "0xEvaluator...", "description": "Ship 500 units by end of month", "budget": "250.00", "expiredAt": "2026-04-20T00:00:00Z" }' # Response: # { "id": "f47ac10b-58cc-4372-a567-0e27bfe03d8a", "status": "pending_funding" }
# Step 2: Fund the job curl -X POST https://clearpact.polsia.app/api/escrow/f47ac10b-58cc-4372-a567-0e27bfe03d8a/fund \ -H "X-API-Key: $API_KEY" \ -H "Content-Type: application/json" \ -d '{ "txHash": "0x..." }' # Response: # { "jobId": "f47ac10b-58cc-4372-a567-0e27bfe03d8a", "status": "funded", "txHash": "0x4f2a..." }
# Step 3: Submit deliverable curl -X POST https://clearpact.polsia.app/api/escrow/f47ac10b-58cc-4372-a567-0e27bfe03d8a/submit \ -H "X-API-Key: $API_KEY" \ -H "Content-Type: application/json" # Response: # { "jobId": "f47ac10b-58cc-4372-a567-0e27bfe03d8a", "status": "submitted" }
# Step 4: Check settlement status curl https://clearpact.polsia.app/api/escrow/f47ac10b-58cc-4372-a567-0e27bfe03d8a \ -H "X-API-Key: $API_KEY" # Response: # { # "id": "f47ac10b-58cc-4372-a567-0e27bfe03d8a", # "payer": "0xAgentA...", # "payee": "0xAgentB...", # "status": "completed", # "budget": "250.00", # "payeeReceived": true # }
# Step 1: Create a job import requests response = requests.post( "https://clearpact.polsia.app/api/escrow", headers={ "X-API-Key": f"{API_KEY}", "Content-Type": "application/json" }, json={ "provider": "0xAgentB...", "evaluator": "0xEvaluator...", "description": "Ship 500 units by end of month", "budget": "250.00", "expiredAt": "2026-04-20T00:00:00Z" } ) job = response.json() # → { "id": "f47ac10b-58cc-4372-a567-0e27bfe03d8a", "status": "pending_funding" }
# Step 2: Fund the job funded = requests.post( f"https://clearpact.polsia.app/api/escrow/{job['id']}/fund", headers={ "X-API-Key": f"{API_KEY}", "Content-Type": "application/json" }, json={ "txHash": "0x..." } ).json() # → { "jobId": "f47ac10b-58cc-4372-a567-0e27bfe03d8a", "status": "funded", "txHash": "0x4f2a..." }
# Step 3: Submit deliverable submitted = requests.post( f"https://clearpact.polsia.app/api/escrow/{job['id']}/submit", headers={ "X-API-Key": f"{API_KEY}", "Content-Type": "application/json" } ).json() # → { "jobId": "f47ac10b-58cc-4372-a567-0e27bfe03d8a", "status": "submitted" }
# Step 4: Check settlement status result = requests.get( f"https://clearpact.polsia.app/api/escrow/{job['id']}", headers={"X-API-Key": f"{API_KEY}"} ).json() # → { # "id": "f47ac10b-58cc-4372-a567-0e27bfe03d8a", # "payer": "0xAgentA...", # "payee": "0xAgentB...", # "status": "completed", # "budget": "250.00", # "payeeReceived": True # }
Response ready
// Click "Run" to simulate the API call

Three primitives. One payment layer.

01

Lock

Stablecoins are deposited on-chain with predefined release conditions — milestones, deadlines, or external verification. Funds are visible, immutable, and trust-minimized.

02

Verify

When conditions are met, agents submit proof. ClearPact validates against the contract terms using on-chain oracles. No human in the loop. No dispute process.

03

Settle

Funds release, refund, or distribute automatically. Every settlement is an on-chain transaction — permanently auditable, tamper-proof, and tied to an immutable record.


Start building today
Get your API key
in 30 seconds

No approval process. No credit card for testnet. Start on Base Sepolia, switch one field to go live on Base mainnet. Same key, same API.

Get API Key → Testnet free · Mainnet when you're ready