{
"transfer_id": "2a7b9c1d-4e5f-6a70-8b9c-0d1e2f3a4b5c",
"from_account_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"to_account_id": "5e6f7a8b-9c0d-1e2f-3a4b-5c6d7e8f9a0b",
"asset": "USDT",
"amount": "25.000000",
"description": "Expense split",
"status": "completed",
"created_at": "2026-07-07T12:00:00Z",
"idempotency_hit": true
}{
"transfer_id": "2a7b9c1d-4e5f-6a70-8b9c-0d1e2f3a4b5c",
"from_account_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"to_account_id": "5e6f7a8b-9c0d-1e2f-3a4b-5c6d7e8f9a0b",
"asset": "USDT",
"amount": "25.000000",
"description": "Expense split",
"status": "completed",
"created_at": "2026-07-07T12:00:00Z"
}{
"error": "invalid_json",
"message": "request body is not valid JSON: unknown field"
}{
"error": "unauthorized",
"message": "invalid or missing credentials"
}{
"error": "insufficient_funds",
"message": "account balance is not enough for this operation"
}{
"error": "recipient_not_found",
"message": "no account matches that email"
}{
"error": "recipient_unavailable",
"message": "destination account cannot receive transfers"
}Crear una transferencia interna
Mueve saldo entre dos cuentas CBPay, de forma atómica y siempre gratuita — funciona cualquier combinación: persona a persona, persona a empresa, empresa a persona o empresa a empresa. Funciona con los diez saldos virtuales (USD, USDT, USDC, BTC, GOLD, SILVER, PLATINUM, BOB, MXN, ARS) y siempre entre saldos de la misma moneda (sin conversión). El destino se resuelve por to_account_id, to_email, to_phone (solo teléfonos verificados por OTP) o to_contact_id. Cada transferencia guarda al destinatario como contacto automáticamente (desactívalo con save_contact: false). Los suscriptores de webhooks del receptor reciben transfer_received.
{
"transfer_id": "2a7b9c1d-4e5f-6a70-8b9c-0d1e2f3a4b5c",
"from_account_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"to_account_id": "5e6f7a8b-9c0d-1e2f-3a4b-5c6d7e8f9a0b",
"asset": "USDT",
"amount": "25.000000",
"description": "Expense split",
"status": "completed",
"created_at": "2026-07-07T12:00:00Z",
"idempotency_hit": true
}{
"transfer_id": "2a7b9c1d-4e5f-6a70-8b9c-0d1e2f3a4b5c",
"from_account_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"to_account_id": "5e6f7a8b-9c0d-1e2f-3a4b-5c6d7e8f9a0b",
"asset": "USDT",
"amount": "25.000000",
"description": "Expense split",
"status": "completed",
"created_at": "2026-07-07T12:00:00Z"
}{
"error": "invalid_json",
"message": "request body is not valid JSON: unknown field"
}{
"error": "unauthorized",
"message": "invalid or missing credentials"
}{
"error": "insufficient_funds",
"message": "account balance is not enough for this operation"
}{
"error": "recipient_not_found",
"message": "no account matches that email"
}{
"error": "recipient_unavailable",
"message": "destination account cannot receive transfers"
}Autorizaciones
JWT de sesión (de register/login) o llave de API (pk_...).
X-API-Key: <token> se acepta como header alternativo.
Encabezados
Alternativa al campo idempotency_key del body.
Cuerpo
String decimal positivo, hasta los decimales de la moneda (2 para USD/BOB/MXN/ARS, 6 para USDT/USDC/GOLD/SILVER/PLATINUM, 8 para BTC).
"10.500000"
Teléfono E.164 de la cuenta destino. Solo resuelven cuentas con el teléfono verificado por OTP (si no, 404 recipient_not_found; 422 recipient_ambiguous si más de una cuenta comparte el número).
Envía directo a un contacto de tu libreta (usa su cuenta CBPay enlazada, o su teléfono verificado).
Token del QR de perfil de la cuenta destino (escaneado desde su QR CBPay). También acepta el payload extendido del QR de checkout (cbpay:pay?to=…&checkout=…) — el checkout token embebido se honra automáticamente.
Token opcional de un link de cobro universal para pagarlo directo. El destino se fuerza a la cuenta del link y el monto debe cubrir el due cotizado server-side en el asset elegido (422 checkout_amount_mismatch con el due actualizado si no). Al completar, el link se liquida y auto-convierte a su settlement_asset.
Moneda del saldo a mover; el destino recibe en esta misma moneda. Si se omite, se usa el asset de liquidación del emisor (USD es el saldo principal).
USD, USDT, USDC, BTC, GOLD, SILVER, PLATINUM, BOB, MXN, ARS El destino se guarda como contacto automáticamente; envía false para no guardarlo.