Authorization:
X-API-Key: <token> como header alternativo.
Tipos de credencial
- Sesión JWT (personas con login)
- API key (servidor a servidor)
Se obtiene con Las cuentas empresa pueden tener varios miembros con roles — ver
miembros de una empresa más abajo.
POST /v1/auth/register o POST /v1/auth/login y dura
24 horas. Pensada para apps con usuarios que inician sesión. Junto al
access_token recibes un refresh token para renovar la sesión sin pedir
la contraseña de nuevo — ver renovación de sesión.Si la política de la cuenta exige OTP en el login, la respuesta trae
otp_required: true con un pending_token en vez de la sesión: el segundo
paso se completa en POST /v1/auth/login/otp con el código recibido por
SMS/WhatsApp. Flujo completo en seguridad y 2FA.También puedes ofrecer registro e inicio de sesión con Google, Apple,
Microsoft o Facebook (sin contraseña) — ver login social.
Renovación de sesión (refresh tokens)
Elaccess_token dura 24 horas; el refresh_token (rt_…) permite obtener
un par nuevo sin re-login durante 30 días, renovables en cada uso hasta
un máximo de 90 días desde el login original. Es de un solo uso: cada
canje devuelve un refresh_token nuevo y el anterior queda invalidado
(rotación).
- Rotación estricta: al canjear, el access token anterior de ese dispositivo queda revocado al instante (solo hay un access token vivo por cadena). Reemplaza siempre AMBOS tokens con los de la respuesta.
- Reúso = robo: si un refresh token ya canjeado vuelve a presentarse, la
cadena completa del dispositivo se revoca (tokens y sesiones) y queda un
evento
refresh_token_reuseenGET /v1/me/security/events. El usuario debe iniciar sesión de nuevo. - Muere con la sesión: cerrar sesión (
DELETE /v1/me/sessions/{id}),POST /v1/me/sessions/revoke-allo un cambio/reset de contraseña invalidan también los refresh tokens asociados. - Cualquier rechazo responde
401 invalid_refresh_token— ante ese error, manda al usuario al login. - Guarda el refresh token en almacenamiento seguro (Keychain/Keystore en
móvil; en web, preferir memoria + re-login o cookie httpOnly de tu
backend). Las API keys
pk_no usan refresh: no expiran.
¿Cada cuánto debo refrescar?
¿Cada cuánto debo refrescar?
Cuando el access token esté por vencer (usa
expires_at) o al recibir un
401 en una llamada normal. Evita refrescar en paralelo desde varios
lugares: si dos canjes del mismo token llegan a la vez, uno gana y el otro
recibe 401 sin castigo — pero un canje de un token YA rotado revoca la
cadena.¿Qué pasa a los 90 días?
¿Qué pasa a los 90 días?
El tope absoluto de la cadena es 90 días desde el login original: aunque
refresques a diario, al llegar al límite el refresh devuelve
401 y el
usuario debe autenticarse de nuevo (con su contraseña, passkey o login
social).¿El refresh funciona con API keys?
¿El refresh funciona con API keys?
No aplica: las API keys
pk_ no expiran ni tienen sesión. El refresh es
solo para sesiones JWT de usuarios humanos.Nivel de acceso
Tu credencial (JWT de sesión o API key) opera tu propia cuenta: saldos, payouts, payins, transferencias, crypto, KYC/KYB y webhooks propios. Si un endpoint responde403 account_required o 403 org_admin_required, esa
operación corresponde a otro nivel de credencial — contacta al equipo de
CBPay.
Tu perfil de cuenta
PATCH /v1/me acepta display_name, tax_id, phone y country (envía
solo los que cambian). El email, status y kyc_status no se
autogestionan: los resuelve el administrador.
Miembros de una empresa
Las cuentas empresa pueden tener varios usuarios con login propio y distinto nivel de permiso:POST /v1/members responde 403 company_only.
Buenas prácticas
- Guarda las API keys en un gestor de secretos; nunca en el código ni en el navegador.
- Usa una key por ambiente/servicio (
labeldescriptivo) para poder rotar sin downtime.
1
Rotación sin downtime
Emite la key nueva con
POST /v1/api-keys (label nuevo).2
Despliega
Actualiza tu servicio para usar la key nueva.
3
Retira la antigua
Pide al equipo de CBPay revocar la key anterior una vez que el tráfico
migró.
- Las sesiones JWT son para front-ends; para procesos automatizados usa siempre API keys.