Esta guia te llevara paso a paso para hacer tu primera llamada a Pan API. Al final, habras creado una wallet, consultado su balance, y ejecutado tu primer intent de lending.
Antes de Empezar
Registrate en Pan
Visita app.pan.dev y crea tu cuenta. El plan gratuito incluye:
100 wallets
100 creditos de API
Acceso a testnets
No necesitas tarjeta de credito para comenzar.
Obtiene tu API Key
Una vez registrado, navega a Settings > API Keys y copia tu API key. Tu API key tiene el formato: pan_sk_ seguido de 64 caracteres hexadecimales. pan_sk_a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef123456
Nunca expongas tu API key en codigo del lado del cliente, repositorios publicos, o logs. Tratala como una contrasena.
Configura tu entorno
Guarda tu API key como variable de entorno: export PAN_API_KEY = "pan_sk_tu_api_key_aqui"
Tu Primera Llamada API
1. Crea una Wallet
Las wallets son la base de Pan. Cada wallet representa un usuario en tu aplicacion y soporta automaticamente todas las blockchains.
cURL
JavaScript
Python
TypeScript (SDK)
curl -X POST https://api.pan.dev/v1/wallets \
-H "Authorization: Bearer $PAN_API_KEY " \
-H "Content-Type: application/json" \
-d '{
"userId": "mi_primer_usuario",
"metadata": {
"nombre": "Usuario de Prueba",
"app": "mi-app"
}
}'
{
"id" : "pan_wallet_a1b2c3d4e5f6" ,
"userId" : "mi_primer_usuario" ,
"address" : "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb" ,
"chainType" : "ethereum" ,
"chains" : [
"ethereum-sepolia" ,
"arbitrum-sepolia" ,
"base-sepolia"
],
"metadata" : {
"nombre" : "Usuario de Prueba" ,
"app" : "mi-app"
},
"createdAt" : "2024-01-15T10:30:00Z"
}
Guarda el id de la wallet (pan_wallet_...). Lo necesitaras para todas las operaciones posteriores.
2. Fondea la Wallet (Testnet)
Para probar en testnet, necesitas obtener tokens de prueba. Pan ofrece un endpoint de demo para fondear wallets en testnet:
curl -X POST https://api.pan.dev/v1/demo/fund \
-H "Authorization: Bearer $PAN_API_KEY " \
-H "Content-Type: application/json" \
-d '{
"walletId": "pan_wallet_a1b2c3d4e5f6"
}'
El endpoint demo/fund siempre envia 1 USDC en arbitrum-sepolia . No se puede configurar cantidad ni chain.
Tambien puedes usar faucets externos para obtener tokens de testnet:
3. Consulta el Balance
Verifica que los fondos llegaron consultando el balance de la wallet:
cURL
JavaScript
TypeScript (SDK)
curl -X GET "https://api.pan.dev/v1/balances/pan_wallet_a1b2c3d4e5f6" \
-H "Authorization: Bearer $PAN_API_KEY "
{
"walletId" : "pan_wallet_a1b2c3d4e5f6" ,
"address" : "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb" ,
"chains" : [
{
"chain" : "arbitrum-sepolia" ,
"tokens" : [
{
"asset" : "USDC" ,
"balance" : "1000000" ,
"balanceFormatted" : "1.00" ,
"decimals" : 6 ,
"valueUsd" : 1.00
}
]
},
{
"chain" : "base-sepolia" ,
"tokens" : []
},
{
"chain" : "ethereum-sepolia" ,
"tokens" : []
}
],
"totalValueUsd" : 1.00
}
4. Consulta los Mejores Yields
Antes de prestar, veamos donde conviene depositar:
curl -X GET "https://api.pan.dev/v1/yields" \
-H "Authorization: Bearer $PAN_API_KEY "
{
"rates" : [
{
"chain" : "base-sepolia" ,
"protocol" : "aave" ,
"asset" : "USDC" ,
"apy" : 8.52
},
{
"chain" : "arbitrum-sepolia" ,
"protocol" : "aave" ,
"asset" : "USDC" ,
"apy" : 7.23
},
{
"chain" : "ethereum-sepolia" ,
"protocol" : "aave" ,
"asset" : "USDC" ,
"apy" : 5.15
}
],
"best" : {
"chain" : "base-sepolia" ,
"asset" : "USDC" ,
"apy" : 8.52 ,
"reasoning" : "Highest APY available"
}
}
5. Ejecuta tu Primer Intent
Ahora viene la magia. Crea un intent de lending y Pan se encargara de todo:
cURL
JavaScript
TypeScript (SDK)
curl -X POST https://api.pan.dev/v1/intents \
-H "Authorization: Bearer $PAN_API_KEY " \
-H "Content-Type: application/json" \
-d '{
"walletId": "pan_wallet_a1b2c3d4e5f6",
"action": "lend",
"amount": 1000,
"asset": "USDC"
}'
{
"id" : "intent_xyz789abc123" ,
"walletId" : "pan_wallet_a1b2c3d4e5f6" ,
"status" : "planning" ,
"action" : "lend" ,
"amount" : 1 ,
"asset" : "USDC" ,
"executionPlan" : {
"strategy" : "direct-deposit" ,
"steps" : [
{
"type" : "deposit" ,
"chain" : "arbitrum-sepolia" ,
"protocol" : "aave" ,
"asset" : "USDC" ,
"amount" : 1
}
],
"reasoning" : "Direct deposit on arbitrum-sepolia with 7.23% APY"
},
"createdAt" : "2024-01-15T10:40:00Z"
}
Observa el plan de ejecucion : Pan analiza los balances disponibles y los APYs en cada chain para determinar la estrategia optima. En este caso, como los fondos ya estan en arbitrum-sepolia, usa direct-deposit.
6. Monitorea la Ejecucion
Los intents se ejecutan de forma asincrona. Consulta el estado periodicamente:
cURL
JavaScript
TypeScript (SDK)
curl -X GET "https://api.pan.dev/v1/intents/intent_xyz789abc123" \
-H "Authorization: Bearer $PAN_API_KEY "
{
"id" : "intent_xyz789abc123" ,
"walletId" : "pan_wallet_a1b2c3d4e5f6" ,
"status" : "completed" ,
"action" : "lend" ,
"amount" : 1 ,
"asset" : "USDC" ,
"executionPlan" : {
"strategy" : "direct-deposit" ,
"steps" : [ ... ]
},
"results" : {
"completedSteps" : 1 ,
"transactions" : [
{
"type" : "deposit" ,
"txHash" : "0x456def..." ,
"chain" : "arbitrum-sepolia" ,
"gasUsed" : "200000" ,
"gasCostUsd" : 0.05
}
],
"totalGasUsed" : "200000" ,
"totalGasCostUsd" : 0.05 ,
"finalAmount" : "1.00" ,
"apy" : 7.23
},
"createdAt" : "2024-01-15T10:40:00Z" ,
"completedAt" : "2024-01-15T10:41:30Z"
}
Resumen del Flujo Completo
1. POST /v1/wallets → Crear wallet para el usuario
2. POST /v1/demo/fund → Fondear wallet (solo testnet)
3. GET /v1/balances/:id → Verificar que llegaron los fondos
4. GET /v1/yields → Ver mejores oportunidades
5. POST /v1/intents → Crear intent de lending
6. GET /v1/intents/:id → Monitorear hasta completar
Codigo Completo
Aqui tienes un script completo que puedes copiar y ejecutar:
script-completo.js
script_completo.py
import 'dotenv/config' ;
const API_KEY = process . env . PAN_API_KEY ;
const BASE_URL = 'https://api.pan.dev/v1' ;
async function request ( method , endpoint , body = null ) {
const options = {
method ,
headers: {
'Authorization' : `Bearer ${ API_KEY } ` ,
'Content-Type' : 'application/json'
}
};
if ( body ) {
options . body = JSON . stringify ( body );
}
const response = await fetch ( ` ${ BASE_URL }${ endpoint } ` , options );
return response . json ();
}
async function main () {
console . log ( '=== Pan API - Inicio Rapido === \n ' );
// 1. Crear wallet
console . log ( '1. Creando wallet...' );
const wallet = await request ( 'POST' , '/wallets' , {
userId: `usuario_ ${ Date . now () } ` ,
metadata: { app: 'inicio-rapido' }
});
console . log ( ` Wallet: ${ wallet . id } ` );
console . log ( ` Address: ${ wallet . address } \n ` );
// 2. Fondear (solo testnet)
console . log ( '2. Fondeando wallet...' );
await request ( 'POST' , '/demo/fund' , {
walletId: wallet . id
});
console . log ( ' Fondeo iniciado (1 USDC en arbitrum-sepolia) \n ' );
// Esperar un poco para que lleguen los fondos
await new Promise ( r => setTimeout ( r , 10000 ));
// 3. Consultar balance
console . log ( '3. Consultando balance...' );
const balances = await request ( 'GET' , `/balances/ ${ wallet . id } ` );
console . log ( ` Total USD: $ ${ balances . totalValueUsd } \n ` );
// 4. Ver yields
console . log ( '4. Consultando yields...' );
const yields = await request ( 'GET' , '/yields' );
console . log ( ` Mejor APY: ${ yields . best . apy } % en ${ yields . best . chain } \n ` );
// 5. Crear intent
console . log ( '5. Creando intent de lending...' );
const intent = await request ( 'POST' , '/intents' , {
walletId: wallet . id ,
action: 'lend' ,
amount: 1000 ,
asset: 'USDC'
});
console . log ( ` Intent: ${ intent . id } ` );
console . log ( ` Estrategia: ${ intent . executionPlan ?. strategy } \n ` );
// 6. Monitorear
console . log ( '6. Monitoreando ejecucion...' );
let status = intent . status ;
while ( status !== 'completed' && status !== 'failed' ) {
await new Promise ( r => setTimeout ( r , 5000 ));
const updated = await request ( 'GET' , `/intents/ ${ intent . id } ` );
status = updated . status ;
console . log ( ` Estado: ${ status } ` );
}
console . log ( ' \n === Completado! ===' );
}
main (). catch ( console . error );
Proximos Pasos
Tokens de testnet : Recuerda que Pan actualmente opera en testnets. Obtiene tokens gratuitos de los faucets para experimentar con la API.