Perfil de usuario
El recurso profile devuelve los datos básicos del usuario autenticado y las empresas disponibles para la credencial actual. Es la operación que usa una integración OAuth para resolver qué companyId puede usar en el resto de llamadas.
Cuando la petición procede de una aplicación conectada, la respuesta incluye solo las empresas que el usuario autorizó para esa conexión y añade sus permisos efectivos.
Excepciones de este endpoint
/profile es el único endpoint de la API pública que rompe con dos convenciones del resto del catálogo:
No lleva
companyIden la ruta. El path es literalmente/profile: el usuario puede tener acceso a varias empresas, y este endpoint sirve precisamente para descubrirlas antes de fijar una.Es OAuth-only. Las API Keys no pueden llamar a este endpoint: una API key está ya ligada a una empresa concreta, así que no tiene sentido pedir su perfil de empresas.
Scope
El scope efectivo es profile. No aparece como permiso seleccionable porque se incluye automáticamente en el cliente OAuth facturadirecta-api al hacer login. No hace falta pedirlo explícitamente.
Estructura
El endpoint devuelve { profile } con la siguiente forma:
Campo | Tipo | Significado |
| string | Email del usuario autenticado (es el identificador único). |
| string | Mismo valor que |
| string | Nombre del usuario (del campo |
| string | Apellidos del usuario (del campo |
| array | Empresas disponibles para la credencial actual. |
| object | Solo con una aplicación conectada. Identifica la conexión y permite abrir su gestión. |
El objeto opcional connection contiene:
Campo | Tipo | Significado |
| string | Identificador de la conexión. |
| string | Nombre de la aplicación conectada. |
| string | Página de FacturaDirecta donde el usuario puede cambiar sus empresas y permisos. |
Cada elemento de companies:
Campo | Tipo | Significado |
| string | ID de empresa. Es el valor que debes usar como |
| string | Nombre de la empresa. Si la empresa tiene primer apellido ( |
| string | CIF/NIF de la empresa. |
| string | Marca comercial, si está informada (opcional). |
| string | Email del propietario de la empresa. |
| string | Rol del usuario autenticado en esa empresa concreta. |
| object | Solo con una aplicación conectada. Permisos efectivos por recurso: |
| boolean | Solo con una aplicación conectada. |
| string | Solo con una aplicación conectada. Página para cambiar los permisos de esa empresa. |
Operaciones
Obtener el perfil
GET /profile devuelve el perfil del usuario autenticado y sus empresas.
No lleva parámetros de path ni de consulta. Solo el header accept-version para fijar la versión de la API. Ver Autenticación.
Copy as cURL
curl -s -H "Authorization: Bearer $ACCESS_TOKEN" \ "https://app.facturadirecta.com/api/profile"
Respuesta típica:
{
"profile": {
"username": "ana@ejemplo.com",
"email": "ana@ejemplo.com",
"firstName": "Ana",
"lastName": "García López",
"companies": [
{
"id": "com_3a7e8d29-4f5b-4c6e-9a1d-2b8c4e7f5d3a",
"name": "Estudio Diseño SL",
"taxCode": "B12345674",
"owner": "ana@ejemplo.com",
"role": "admin"
},
{
"id": "com_8b1c5e94-2d6a-4f7e-9c3b-1a5d8f4e2c7b",
"name": "Cooperativa Norte",
"taxCode": "F87654328",
"brand": "Norte",
"owner": "luis@cooperativa.com",
"role": "accountant"
}
]
}
}
Respuesta de una aplicación conectada
Una aplicación conectada recibe solo la selección autorizada. Los permisos ya están limitados por la concesión, el rol actual del usuario y el plan de cada empresa:
{
"profile": {
"username": "ana@ejemplo.com",
"email": "ana@ejemplo.com",
"firstName": "Ana",
"lastName": "García López",
"companies": [
{
"id": "com_3a7e8d29-4f5b-4c6e-9a1d-2b8c4e7f5d3a",
"name": "Estudio Diseño SL",
"taxCode": "B12345674",
"owner": "ana@ejemplo.com",
"role": "admin",
"permissions": {
"contacts": "read",
"invoices": "full"
},
"accountingModule": false,
"manageUrl": "https://app.facturadirecta.com/connections/<id-conexion>?company=<id-empresa>"
}
],
"connection": {
"id": "<id-conexion>",
"clientName": "Asistente de ejemplo",
"manageUrl": "https://app.facturadirecta.com/connections/<id-conexion>"
}
}
}
Flujo típico de integración
El usuario completa el login OAuth. Tu integración recibe el
access_token.Llamas a
GET /profilepara descubrir las empresas disponibles.Si aparece
connection, respetas la selección y lospermissionsde cada empresa. LosmanageUrlpermiten que el usuario amplíe el acceso sin volver a conectar.Eliges una empresa entre las devueltas.
Usas su
idcomo{companyId}en las llamadas siguientes a la API.
Recomendaciones
No cachees indefinidamente: la lista de empresas y sus permisos pueden cambiar cuando el usuario modifica la conexión, cambia de rol o deja una empresa. Refresca al iniciar sesión y ante un
401o403.roleinforma, no autoriza por sí solo: la autorización efectiva combina los scopes de la credencial y los permisos del rol. En una aplicación conectada también se limita por la concesión de cada empresa.Usa
permissionscuando esté presente para adaptar las acciones de tu aplicación antes de intentar una escritura.Usa
accountingModulepara elegir el informe antes de pedirlo: sin el módulo de Contabilidad, la empresa no tiene los informes contables.Para API Keys, no llames a
/profile: la API key ya conoce su empresa. Si tu integración alterna entre OAuth y API Key, detéctalo en el cliente y omite el paso.
Errores comunes
401 Unauthorized(code: "auth_*") — elaccess_tokenno es válido o ha expirado. Refresca el token vía OAuth.403 Forbidden— intento de llamar con una API key. Este endpoint es OAuth-only por diseño.Una empresa que no pertenece a la conexión no aparece en
companies. Si se intenta usar directamente, el resto de endpoints responde403concode: "company_not_in_connection"y puede incluirmanageUrl.
Ver Errores y validaciones y Autenticación para los detalles del flujo OAuth.
Referencia exhaustiva
Esta página cubre el único endpoint del recurso y todos sus campos. Para el contrato JSON literal, consulta el Swagger UI o el openapi crudo.
Endpoints
Método | Path | operationId | Scopes | Descripción |
GET |
|
| — | Perfil de usuario |