Skip to main content
El API de Fegora usa OAuth 2.0 con el flujo password grant. Antes de llamar a cualquier endpoint de negocio (DTE, cuenta, etc.) debe solicitar un token de acceso con su usuario y contraseña. Ese token se envía luego como Bearer en cada llamada subsiguiente.

Solicitar un token

Haga una solicitud POST con el usuario y la contraseña, codificados como formulario, al endpoint de token:
POST https://api.fegora.com/token

Headers

HeaderValor
Content-Typeapplication/x-www-form-urlencoded
Acceptapplication/json

Body (form-urlencoded)

CampoTipoObligatorioDescripción
grant_typestringSiempre password para esta solicitud.
client_idstringSiempre apiApp.
usernamestringEl usuario asignado a su cuenta Fegora. Por lo regular corresponde al NIT.
passwordstringLa contraseña asignada.
curl -X POST https://api.fegora.com/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -H "Accept: application/json" \
  -d "grant_type=password&client_id=apiApp&username=12345678&password=contrasenia-ejemplo"

Respuesta 200 OK

{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...ejemplo",
  "token_type": "bearer",
  "expires_in": 86399,
  "refresh_token": "9f2c1a7b8e4d4c2a9b0e1f3a5c6d7e8f"
}
CampoDescripción
access_tokenToken JWT que debe enviarse como Bearer en cada llamada al API.
token_typeSiempre bearer.
expires_inVigencia del token en segundos. El API emite tokens válidos por 24 horas.
refresh_tokenToken opaco que permite obtener un nuevo access_token sin volver a enviar usuario/contraseña.
El access_token es un JWT firmado. Dentro de sus claims viaja, entre otros datos, una o más entradas cuenta — vea Cuentas múltiples en un mismo token más abajo.

Renovar el token (refresh)

Cuando el access_token expira, use el refresh_token obtenido al solicitar el token original — no es necesario reenviar usuario y contraseña.
POST https://api.fegora.com/token

Body (form-urlencoded)

CampoTipoObligatorioDescripción
grant_typestringSiempre refresh_token.
refresh_tokenstringEl refresh_token recibido en la respuesta anterior.
client_idstringSiempre apiApp.
curl -X POST https://api.fegora.com/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -H "Accept: application/json" \
  -d "grant_type=refresh_token&refresh_token=9f2c1a7b8e4d4c2a9b0e1f3a5c6d7e8f&client_id=apiApp"
La respuesta 200 OK tiene la misma forma que la de la solicitud original: un nuevo access_token junto con un nuevo refresh_token.
Cada vez que se usa un refresh_token, éste se invalida y se reemplaza por uno nuevo en la respuesta. Un mismo refresh_token no puede reutilizarse dos veces.

Usar el token en las llamadas al API

Todas las llamadas al API (salvo POST /token) requieren el header Authorization con el access_token como Bearer:
curl -X GET https://api.fegora.com/dte \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...ejemplo"

Errores de autenticación

Si la solicitud de token falla, el endpoint responde HTTP 400 Bad Request con un cuerpo en el formato estándar de OAuth2 — distinto al formato { codigo, mensaje, ... } que usa el resto del API (vea Manejo de errores):
{
  "error": "invalid_grant",
  "error_description": "Credenciales inválidas"
}
errorCuándo ocurre
invalid_grantUsuario o contraseña incorrectos, o refresh_token inválido/expirado.
incorrect_statusEl usuario está bloqueado por intentos fallidos repetidos.
unsupported_grant_typeEl grant_type enviado no es password ni refresh_token.

Cuentas múltiples en un mismo token

Un usuario puede tener acceso a más de una cuenta (empresa emisora) en Fegora. En ese caso, el access_token incluye una entrada cuenta por cada cuenta asociada al usuario. Al crear un DTE (POST /dte), el campo idCuenta del body indica sobre qué cuenta se emite el documento:
  • Si el usuario tiene una sola cuenta, idCuenta puede omitirse — el API la infiere automáticamente.
  • Si el usuario tiene varias cuentas, se recomienda enviar idCuenta explícitamente. Si se omite, el API usa la primera cuenta asociada al usuario, lo cual puede no ser la cuenta esperada.