Pay Humans in Fiat
Agent has USDC. Human wants dollars, euros, or pounds in their bank account, Venmo, Wise, or Revolut. This skill bridges that gap -- the agent spends USDC, the human receives fiat. No bank account needed on the agent side.
Why Not Stripe or PayPal?
| Method | Fee | Settlement | KYC Required | Agent-Native |
|---|---|---|---|---|
| Stripe Connect | 2.9% + $0.30 | 2-3 business days | Yes | No |
| PayPal Payouts | 2% | 1-3 business days | Yes | No |
| Wire Transfer | $15-45 flat | 1-5 business days | Yes | No |
| Peer Protocol | ~1% spread | Minutes | No | Yes |
Agents cannot complete KYC. They have no government ID, no SSN, no selfie. Peer Protocol requires none of that -- it is pure on-chain escrow with off-chain fiat settlement proven via zkTLS.
How It Works
1. FIND LP Agent queries for a liquidity provider offering the best rate 2. LOCK USDC Agent locks USDC in an on-chain escrow contract 3. LP SENDS FIAT LP sends fiat to the human's payment account (Venmo, Wise, bank, etc.) 4. PROOF + SETTLE LP proves payment via zkTLS, escrow releases USDC to LP
Result: the human gets fiat, the agent's USDC covers it. The agent never touches fiat rails and does not generate any proofs -- the LP handles that.
Supported Payment Platforms
| Platform | Regions | Example Currencies |
|---|---|---|
| Venmo | US | USD |
| CashApp | US | USD |
| Zelle | US | USD |
| PayPal | Global | USD, EUR, GBP, AUD |
| Wise | Global | USD, EUR, GBP, INR, BRL, 35+ |
| Revolut | EU/UK/US | EUR, GBP, USD |
| Monzo | UK | GBP |
| N26 | EU | EUR |
| MercadoPago | LATAM | BRL, ARS, MXN |
Quick Example
import { OfframpClient } from '@zkp2p/sdk';
const client = new OfframpClient({
walletClient, // viem wallet on Base
chainId: 8453,
runtimeEnv: 'production',
apiKey: process.env.ZKP2P_API_KEY,
});
// 1. Find best LP for Venmo/USD
const quote = await client.getQuote({
paymentPlatforms: ['venmo'],
fiatCurrency: 'USD',
user: agentAddress,
recipient: agentAddress,
destinationChainId: 8453,
destinationToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
amount: '150000000', // 150 USDC (6 decimals)
});
// 2. Approve USDC to escrow
await client.ensureAllowance({
token: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
amount: 150_000000n,
});
// 3. Lock USDC and tell the LP who to pay
const intentTx = await client.signalIntent({
depositId: quote.depositId,
amount: '150000000',
toAddress: agentAddress,
processorName: 'venmo',
payeeDetails: quote.payeeDetails,
fiatCurrencyCode: 'USD',
conversionRate: quote.conversionRate,
});
// Done. LP sends fiat to the human, proves it, and collects the escrowed USDC.
Cost Example
To pay a freelancer $150 via Venmo:
- •Agent spends: ~152 USDC (1.3% spread)
- •Freelancer receives: $150 in their Venmo account
- •Settlement time: minutes
- •Gas cost: <$0.01 (Base L2)
Full Implementation Details
See the peer-offramp skill for the complete SDK reference, including:
- •Payee detail hashing and registration
- •Intent monitoring and fulfillment polling
- •Intent cancellation and USDC recovery
- •Rate selection strategy
- •Direct indexer queries (GraphQL)
- •Error handling and edge cases
Environment Variables
export PRIVATE_KEY="0x..." # Agent wallet private key (Base) export ZKP2P_API_KEY="..." # ZKP2P API key for LP queries
Key Contracts (Base Mainnet)
| Contract | Address |
|---|---|
| Escrow | 0x2f121CDDCA6d652f35e8B3E560f9760898888888 |
| USDC | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 |