Autenticación
Cómo autenticar tus solicitudes a la API de Core con una API key o un access token de OAuth 2.0.
Cada solicitud a la API de Core debe demostrar que viene de tu empresa. Puedes demostrarlo con una API key de larga duración, o con un access token de corta duración que tu servidor pide por su cuenta. Mono acepta ambos en todos los endpoints de Core, así que puedes elegir el que mejor encaje con tus prácticas de seguridad.
Una credencial pertenece a un solo servicio. Las credenciales de Core solo funcionan en la API de Core, y una credencial de Banking enviada a un endpoint de Core es rechazada.
Antes de empezar
Vas a necesitar:
- Una organización de Mono con Core habilitado, y acceso a su Mono Dashboard.
- Un cliente HTTPS. Mono rechaza las solicitudes que no usan TLS.
- Un lugar seguro para los secretos, como un gestor de secretos. Nunca subas credenciales al control de versiones.
Las convenciones que comparten todos los productos de Mono, como el formato del header y los entornos, están en Estándares de autenticación.
Elige una credencial
| API key | Access token de OAuth 2.0 | |
|---|---|---|
| Cuánto dura | Hasta que la revoques | 30 minutos; después pides uno nuevo |
| Qué puede hacer | Lo que permiten sus roles | Lo que permiten sus scopes |
| Cómo la obtienes | Se crea en el Mono Dashboard | Tu servidor la pide con un client ID y un secret |
| Dónde va | Authorization: Bearer <key> | Authorization: Bearer <access_token> |
Un rol es un conjunto de permisos con nombre, como "Admin" o "Viewer", asignado a una API key. Un scope es un permiso individual, como payouts:readonly, asignado a un access token. Mono relaciona cada permiso de rol con los scopes que autorizan la misma acción, así que un endpoint acepta cualquiera de las dos credenciales para la misma operación.
Opción 1: API keys
Una API key es una cadena secreta que sigue siendo válida hasta que la revoques. Para crear o revocar llaves, inicia sesión en el Mono Dashboard y abre la sección de gestión de API keys.
Al crear una llave, elige sus roles. La llave puede hacer exactamente lo que esos roles permiten.
Envía la llave en el header Authorization de cada solicitud:
curl https://api.cuentamono.com/v1/ledger/accounts \
-H "Authorization: Bearer $MONO_API_KEY"Las llaves no expiran, así que rotarlas es tu responsabilidad: crea una llave nueva, despliégala y luego revoca la anterior.
Opción 2: access tokens de OAuth 2.0
OAuth 2.0 es un estándar de la industria para emitir credenciales temporales. Mono usa su flujo de client credentials, pensado para integraciones de servidor a servidor. Tu servidor cambia un client ID y un client secret permanentes por un access token que dura 30 minutos. Piénsalo como cambiar el carné de empleado por un pase de un día: el pase vence y el carné se queda guardado en la caja fuerte.
Crea una credencial
En el Mono Dashboard, abre la sección Credentials de tu organización y crea una credencial:
- Elige los scopes que la credencial puede pedir. Puedes cambiarlos después.
- Copia el client ID y el client secret. El dashboard muestra el secret una sola vez.
- Guarda ambos en tu gestor de secretos.
No eliges entre Core y Banking: una organización de Core siempre recibe credenciales de Core. Desde la misma sección también puedes desactivar, activar o eliminar una credencial.
Pide un access token
Llama al endpoint de token de Core con grant_type=client_credentials, tu client ID y tu secret, y los scopes que necesitas, separados por espacios:
curl https://api.cuentamono.com/v1/core/oauth/token \
-d grant_type=client_credentials \
-d client_id="$MONO_CLIENT_ID" \
-d client_secret="$MONO_CLIENT_SECRET" \
-d scope="ledger:readonly payouts"El endpoint acepta application/x-www-form-urlencoded, como arriba, o los mismos campos en JSON. En sandbox, usa https://api.sandbox.cuentamono.com.
{
"access_token": "<access_token>",
"token_type": "Bearer",
"expires_in": 1800,
"refresh_token": "<refresh_token>",
"scope": "ledger:readonly payouts"
}Envía siempre scope. Si lo omites, Mono igual emite un token, pero sin scopes, y luego todos
los endpoints responden 403. Si pides un scope que tu credencial no tiene, toda la solicitud
falla con 400 invalid_scope; Mono nunca devuelve un token con solo una parte de lo que
pediste.
Llama a la API
Envía el access token en el header Authorization, igual que una API key:
curl https://api.cuentamono.com/v1/ledger/accounts \
-H "Authorization: Bearer $MONO_ACCESS_TOKEN"Renueva el token
expires_in es la vida restante del token en segundos: 1800 cuando se emite. Pide un token nuevo antes de que se acabe. Tienes dos formas:
- Pide un token nuevo con tus client credentials, igual que arriba. Es la opción más simple para un servidor que siempre tiene su secret.
- Usa el refresh token. La respuesta también trae un
refresh_token, válido por un día. Cámbialo por un access token nuevo:
curl https://api.cuentamono.com/v1/core/oauth/token \
-d grant_type=refresh_token \
-d client_id="$MONO_CLIENT_ID" \
-d client_secret="$MONO_CLIENT_SECRET" \
-d refresh_token="$MONO_REFRESH_TOKEN"Cada refresh devuelve un refresh token nuevo. Usa el nuevo la próxima vez y descarta el anterior.
Consulta o revoca un token
Otros dos endpoints reciben tu client ID y tu secret, más el token:
- Introspect (
grant_type=introspect) te dice si un token sigue activo, cuándo expira y qué scopes trae. Un token expirado o desconocido devuelve{"active": false}. - Revoke (
grant_type=revoke) invalida de inmediato un access token o un refresh token. Responde200aunque el token ya hubiera expirado.
Revoca los tokens que ya no necesites, por ejemplo cuando retires un servidor. Los contratos de los endpoints están en la referencia de autenticación de Core.
Scopes
Pide los scopes más acotados que necesite tu integración. Dos reglas aplican a todo el catálogo:
- Un scope sin sufijo, como
cards, autoriza todas las acciones sobre ese recurso, incluidas las acciones específicas que aparecen debajo. - Un scope
:readonlyautoriza solo lecturas. No incluye las acciones específicas:cards:readonlyno autorizacards:details.
| Scope | Autoriza |
|---|---|
ledger | Todos los permisos sobre los recursos del ledger, y leer sus programas |
ledger:readonly | Leer los recursos del ledger y sus programas |
payins | Todos los permisos sobre pagos, sus plantillas y sus intenciones de pago, y leer marcas y lotes de liquidación |
payins:readonly | Leer pagos, sus plantillas, sus intenciones de pago, marcas y lotes de liquidación |
payouts | Todos los permisos sobre payouts, la resolución de destinos Bre-B y el catálogo de bancos |
payouts:readonly | Leer payouts y el catálogo de bancos |
fees | Todos los permisos sobre comisiones y las políticas que las cobran |
fees:readonly | Leer comisiones y sus políticas |
fx_rates | Leer las tasas de cambio de las monedas soportadas |
fx_rates:readonly | Leer las tasas de cambio de las monedas soportadas |
cards | Todos los permisos sobre tarjetas |
cards:readonly | Leer tarjetas |
cards:details | Leer los datos sensibles de una tarjeta: número, código de seguridad y vencimiento |
spending_controls | Todos los permisos sobre los controles de gasto de tarjetas |
spending_controls:readonly | Leer los controles de gasto de tarjetas |
Bre-B es el sistema de pagos inmediatos de Colombia, operado por el Banco de la República. La resolución de destinos convierte una llave Bre-B, como un número de celular, en la cuenta a la que apunta.
Fallas
Los endpoints de token, introspect y revoke responden los errores en formato OAuth, con los campos error y error_description. Por ejemplo, 400 invalid_scope significa que pediste un scope que tu credencial no tiene.
Todos los demás endpoints responden con el envelope de error estándar:
| Estado | Código | Qué pasó |
|---|---|---|
401 | expired_token | El token expiró, fue revocado o pertenece a otro servicio, como Banking. |
403 | not_authorized | La credencial es válida, pero sus scopes o roles no permiten este endpoint. |
403 | not_authorized | Una organización que no es de Core llamó a un endpoint del ledger. |
Un token de Banking enviado a un endpoint de Core recibe el mismo 401 expired_token que un
token expirado. Si un token recién emitido es rechazado así, verifica que venga de
/v1/core/oauth/token y no de /v1/oauth/token.
Siguientes pasos
- Referencia de autenticación — los endpoints de token, introspect y revoke en detalle.
- Arquitectura — cómo fluye una solicitud después de la autenticación.
- Buenas prácticas — rotación de llaves, scopes mínimos y almacenamiento de credenciales.