Autenticación
La API de Mosend acepta dos métodos de autenticación. Toda ruta no marcada como pública requiere uno de los dos.
Bearer JWT (sesión interactiva)
Es el método que usa el dashboard. Obtienes un par accessToken + refreshToken con el endpoint POST /auth/login. El access token vive 15 minutos; renuévalo con POST /auth/refresh.
# Login
curl -X POST https://api.mosend.dev/auth/login \
-H 'Content-Type: application/json' \
-d '{
"email": "info@empresa.com",
"password": "...",
"twoFactorCode": "123456" // si tiene 2FA activado
}'
# Respuesta:
# { "data": { "user": {...}, "tokens": { "accessToken": "...", "refreshToken": "...", "expiresIn": 900 } } }Para todas las rutas posteriores, envía el header:
Authorization: Bearer <accessToken>
API Key (server-to-server)
Para integraciones desde tu backend usa una API Key con scopes específicos. Se crea desde el dashboard (Configuración → Integraciones → API Keys) o vía API POST /organizations/{orgId}/api-keys. La clave se muestra una sola vez en la respuesta.
# La API Key se envía en el mismo header que JWT — el backend distingue por prefijo Authorization: Bearer mosk_live_<api-key-secret> # Las API Keys se hashean con bcrypt en BD; lo que persistimos no permite reconstruir # el secreto original. Si la pierdes, debes regenerarla.
Scopes disponibles
conversations:read·conversations:writemessages:send·messages:readcontacts:read·contacts:writetemplates:read·templates:writephone-numbers:read·phone-numbers:writewaba:read·waba:writeorganizations:read·organizations:writewebhooks:read·webhooks:writebilling:read·billing:write
Solicita el mínimo necesario. Las API keys no expiran a menos que les pongas expiresAt.
2FA (TOTP)
Si el usuario tiene 2FA activada, el endpoint /auth/login exige el campo twoFactorCode (6 dígitos) o un código de recuperación. Códigos de recuperación se invalidan al usarse.
Multi-tenancy
Todas las rutas con prefijo /organizations/{orgId}/... validan que el sujeto autenticado (usuario o API key) pertenezca a esa organización y tenga el permiso requerido. Si no, devuelven 403 Forbidden.