Saltar al contenido principal
La libreta de contactos elimina el tipeo repetido de datos: cada envío (transferencia interna, payout fiat o retiro crypto) guarda el destino como contacto automáticamente, puedes importar la agenda del celular para descubrir quién de tus contactos tiene CBPay, y las transferencias aceptan directamente un número de teléfono o un contact_id como destino.

Los contactos se crean solos

Cada envío guarda su destino en tu libreta (deduplicado: repetir el mismo destino no crea contactos duplicados, solo lo marca como usado): ¿No quieres guardar un destino puntual? Agrega "save_contact": false al body del envío. El auto-guardado jamás afecta el envío: si algo falla, el envío sale igual.

Importar la agenda del celular

Sube los contactos del teléfono (hasta 1.000 por request; pagina si hay más) y CBPay te dice quién ya tiene cuenta — el match es por número de teléfono y solo contra cuentas del mismo operador:
Respuesta 200:
  • Los números se normalizan a E.164 solos: acepta +…, 00… y números locales (se les antepone el país de tu cuenta). Los inválidos se saltan.
  • Re-importar es seguro: los contactos existentes no se duplican.
  • has_cbpay: true significa que ese teléfono corresponde a una cuenta activa del mismo operador — puedes transferirle al instante.

Enviar plata por teléfono

Las transferencias internas aceptan to_phone (además de to_account_id, to_email y to_contact_id):
Por seguridad, to_phone solo resuelve cuentas con el teléfono verificado por OTP (jamás adivinamos un destino de dinero con un número sin verificar). Si el número no está verificado: 404 recipient_not_found; si más de una cuenta comparte el número: 422 recipient_ambiguous (usa to_account_id o to_email).

Enviar a un contacto

Cualquier envío acepta el contacto directo:
  • Payouts: usa el beneficiario guardado más reciente del contacto para ese país (y método si lo envías; si no, se usa el del destino guardado). Un beneficiary explícito en el body siempre gana. Sin destino guardado para ese corredor: 422 no_saved_destination.
  • Crypto: usa la dirección guardada para esa chain; un to_address explícito gana.
  • Transfers: usa la cuenta CBPay enlazada del contacto; si el contacto solo tiene teléfono, se intenta por su número (verificado). Contacto sin ninguno: 422 contact_not_linked.

Administrar la libreta

Detalle de un contacto (200):
También puedes agregar destinos a mano (POST /v1/contacts/{id}/destinations con type: payout|crypto|cbpay y sus campos) y borrarlos (DELETE .../destinations/{destination_id}).

Errores

Preguntas frecuentes

No. La libreta es privada de tu cuenta: importar la agenda o guardar contactos no notifica a nadie ni comparte tus datos. Solo tú ves tu libreta.
El match es por número de teléfono exacto (E.164) contra cuentas del mismo operador. Si esa persona registró otro número (o ninguno) en su cuenta, no hay match. En cuanto registre y verifique ese teléfono, un re-import lo detecta.
No por transferencia interna (no hay cuenta a la cual abonar). Pero puedes hacerle un payout fiat a su cuenta bancaria o un envío crypto a su wallet — y esos destinos también quedan guardados en el contacto.
El envío por teléfono falla explícito con 422 recipient_ambiguous — nunca adivinamos un destino de dinero. Usa to_account_id o to_email en ese caso.
El match es solo contra cuentas de tu mismo operador, con un cap de 1.000 contactos por request y bajo el rate limit global de la API. No expone datos de la cuenta matcheada más allá del hecho de existir (necesario para poder transferirle).
Última modificación el 10 de julio de 2026