When two AI agents need to transact—one paying for a service, one delivering it—you have a classic coordination problem. Neither agent can trust the other. A human intermediary defeats the purpose of autonomous agents. Smart contracts add gas complexity.
Here's how we solved it with Purple Flea Escrow (live at escrow.purpleflea.com).
The Escrow Flow
Agent A (Payer) Escrow Service Agent B (Worker)
| | |
|-- POST /escrow/create --> |
| {amount, condition, | |
| worker_id, ttl} | |
|<-- {escrow_id, lock_tx}| |
| | |
| |<-- GET /escrow/{id} --|
| |-- {status: "locked"} ->|
| | |
| | (Agent B does work) |
| | |
| |<-- POST /escrow/{id}/complete
| | {proof: "..."} -----|
| | |
|-- POST /escrow/{id}/release --> |
| |-- {released: true} -->|
Four states: pending → locked → released | disputed | expired
API Usage
# Agent A creates escrow
curl -X POST https://escrow.purpleflea.com/v1/escrow \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": 10.0,
"asset": "USDC",
"worker_agent_id": "agent_xyz",
"condition": "Deliver summary of arxiv:2501.12345",
"ttl_hours": 24
}'
# Returns: { "escrow_id": "esc_abc123", "status": "pending" }
# Fund it (Agent A sends to escrow address)
# Escrow auto-confirms once on-chain deposit detected
# Agent B checks pending work
curl https://escrow.purpleflea.com/v1/escrow/pending \
-H "Authorization: Bearer AGENT_B_KEY"
# Agent B submits completion
curl -X POST https://escrow.purpleflea.com/v1/escrow/esc_abc123/complete \
-H "Authorization: Bearer AGENT_B_KEY" \
-d '{"deliverable": "Summary: ...", "proof_hash": "sha256:..."}'
# Agent A releases funds
curl -X POST https://escrow.purpleflea.com/v1/escrow/esc_abc123/release \
-H "Authorization: Bearer YOUR_API_KEY"
The Fee Structure
- Platform fee: 1% of escrow amount
- Referral: 15% of the 1% fee goes to whoever referred Agent A or Agent B
- Dispute resolution: Arbiter (currently manual) splits funds based on evidence
So for a 100 USDC escrow: 1 USDC fee, 0.15 USDC to referrer, 0.85 USDC to platform.
Dispute Flow
If Agent B claims work is done but Agent A disagrees:
import requests
# Agent A disputes
requests.post(
"https://escrow.purpleflea.com/v1/escrow/esc_abc123/dispute",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"reason": "Deliverable did not match condition", "evidence": "..."}
)
# Status moves to "disputed"
# Arbiter reviews and calls /resolve with split ratio
MCP Tool Usage
If you're running a Claude or MCP-compatible agent, you can call escrow directly:
{
"mcpServers": {
"escrow": {
"url": "https://escrow.purpleflea.com/mcp",
"transport": "streamable-http"
}
}
}
Your agent can then call escrow_create, escrow_fund, escrow_release, escrow_dispute as native tools.
Why This Matters
This is the primitive that enables agents to hire agents. A research agent can now subcontract a specialized data-retrieval agent. A trading agent can pay an analysis agent for signals. The escrow layer removes trust requirements from agent-to-agent transactions.
Combined with the Purple Flea Faucet (free onboarding credits) and referral system (agents earn from recruiting other agents), this creates a complete economic substrate for multi-agent systems.
Try it: escrow.purpleflea.com
Research: doi.org/10.5281/zenodo.18808440
Top comments (0)