Autenticación
Hay dos autenticaciones distintas en juego: el token de RECE.API, que identifica a tu sistema ante la API, y el ticket de AFIP, que la API gestiona sola usando tu certificado. Esta página cubre la primera; la segunda casi nunca la vas a tocar.
Cómo funciona
Todos los endpoints requieren un token, salvo el registro, el login y los de monitor. El token se obtiene al registrarte o haciendo login, y se manda en cada request.
| Categoría | Rutas | Token | Consume cuota |
|---|---|---|---|
| Públicas | /api/auth/register, /api/auth/login, /swagger/**, /api/monitor/** | No | No |
| Token sin consumo | /api/auth/token-info | Sí | No |
| Token con consumo | Todo el resto | Sí | Sí |
Registrar un usuario
Crea la cuenta y devuelve el primer token.
Body
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
email | string | Sí | Único por usuario. |
password | string | Sí | Contraseña de la cuenta. |
companyName | string | No | Nombre de la empresa, informativo. |
requestsLimit | int | No | Máximo de requests del token. null = ilimitado. |
{
"email": "sistema@miempresa.com",
"password": "MiPassword123",
"companyName": "Mi Empresa SRL",
"requestsLimit": 1000
}
Respuestas
// 200 OK
{ "ok": true, "token": "abc123XYZ...", "userId": 1, "message": null }
// 400 Bad Request
{ "ok": false, "token": null, "userId": null, "message": "El email ya esta registrado" }
Si email o password llegan vacíos, la respuesta es 400 con el mensaje "Email y contraseña son requeridos".
Iniciar sesión
Genera un token nuevo para un usuario existente.
{
"email": "sistema@miempresa.com",
"password": "MiPassword123",
"requestsLimit": 500
}
No reutiliza el anterior. Los tokens viejos siguen activos hasta que expiren o se desactiven. Si llamás a /login en cada arranque de tu aplicación, vas acumulando tokens vivos. Conviene obtener uno y guardarlo.
Enviar el token
Dos formas equivalentes. Elegí una y usala siempre:
# Opción A — header propio
X-Api-Token: abc123XYZ...
# Opción B — Bearer estándar
Authorization: Bearer abc123XYZ...
Un request completo:
POST /api/facturacion/emitir HTTP/1.1
Host: api.tudominio.com
Content-Type: application/json
X-Api-Token: abc123XYZ...
{ "ambiente": "homologacion", "puntoVenta": 1, ... }
Consultar el estado del token
Devuelve el consumo acumulado. No descuenta de la cuota, así que podés llamarlo libremente.
{
"ok": true,
"message": null,
"requestsUsed": 145,
"requestsLimit": 1000,
"requestsRemaining": 855,
"email": "sistema@miempresa.com",
"companyName": "Mi Empresa SRL",
"createdAt": "2026-01-15T10:00:00Z",
"expiresAt": null,
"isActive": true
}
requestsRemaining: null significa que el token no tiene límite.
Límite de requests
Cada token lleva un contador propio:
requestsLimit: nullo0— sin límite.- Cada request autenticado exitoso suma 1 al contador.
- Los rechazados con
401o429no se cuentan. GET /api/auth/token-infono cuenta.
Al agotarse, todos los endpoints devuelven:
// 429 Too Many Requests
{ "ok": false, "message": "Limite de consultas alcanzado" }
Para reponer el límite, hacé un nuevo login con el requestsLimit que necesites.
Errores de autenticación
| Código | Mensaje | Causa | Solución |
|---|---|---|---|
401 | Token requerido | No se envió ningún header de autenticación. | Agregar X-Api-Token o Authorization. |
401 | Token inválido o expirado | El token no existe, venció o el usuario está inactivo. | Hacer login para obtener uno nuevo. |
429 | Limite de consultas alcanzado | Se agotó el requestsLimit. | Login con un límite mayor. |
El cuerpo del error siempre tiene la misma forma:
{ "ok": false, "message": "Token requerido" }
Login WSAA de AFIP
La API obtiene y renueva los tickets de AFIP automáticamente. Estos endpoints existen para casos donde necesitás el ticket crudo — por ejemplo, para llamar a un web service de AFIP que la API todavía no expone.
{
"ambiente": "homologacion",
"servicio": "wsfe",
"cuit": "20409378472"
}
Valores válidos de servicio: wsfe, wsfex, wsremcarne.
{
"success": true,
"token": "PD94bWwgdmVyc2lvb...",
"sign": "ABC123...",
"generationTime": "2026-08-20T14:00:00",
"expirationTime": "2026-08-21T02:00:00",
"service": "wsfe",
"uniqueId": 12,
"cuit": "20409378472",
"ambiente": "homologacion",
"errorMessage": null
}
Este endpoint sí valida el ambiente: si ambiente no es exactamente homologacion
o produccion, devuelve 400. Es el único lugar de la API donde se hace esa validación.
Vigencia y caché del ticket
AFIP emite tickets de acceso con una vigencia típica de 12 horas. RECE.API los guarda en memoria y en disco, con clave por combinación de ambiente + servicio + CUIT, y los renueva unos minutos antes de que venzan. La renovación es perezosa: se dispara cuando llega un request que necesita el ticket.
AFIP rechaza los pedidos de ticket cuya marca de tiempo esté demasiado adelantada respecto de su propio reloj. Si el servidor se desfasa más de unos minutos, los logins empiezan a fallar sin causa aparente. Mantené NTP sincronizado.
Invalidar el caché
Fuerza a pedir un ticket nuevo en la próxima llamada. Útil después de reemplazar un certificado.
curl -X DELETE "https://api.tudominio.com/api/auth/afip/invalidar-cache?ambiente=homologacion&servicio=wsfe&cuit=20409378472" \
-H "X-Api-Token: abc123XYZ..."
cuit no es opcional en la práctica
Si lo omitís, el endpoint responde 200 pero no invalida nada: la clave de caché que arma no coincide con ninguna entrada real. Mandá siempre los tres parámetros.
Estado del servicio
{
"status": "healthy",
"timestamp": "2026-08-20T14:00:00Z",
"service": "RECE.API - WSAA Authentication"
}