Acceso cedido entre cuentas
Permite que otra cuenta alcance todos o algunos de tus NIF con nivel view u operate, y qué puede y qué no puede hacer.
Una cuenta puede dejar que otra cuenta trabaje con todos o algunos de sus NIF, sin compartir ninguna contraseña y sin mover nada. La cuenta que lo permite es la cuenta cedente, y los NIF siguen siendo suyos. La cuenta que recibe el acceso es la cuenta receptora. Es lo que usa una empresa cuando quiere que su asesoría emita y consulte sus documentos.
Es un solo acceso entre dos cuentas. Tiene un nivel, view u operate, y un alcance: todos los NIF de la cuenta cedente, o solo los que ella elige. La cuenta receptora alcanza esos NIF con sus propias credenciales a través del segmento {company} del eje de NIF. Esta guía explica cómo se cede un acceso, qué puede y qué no puede hacer con él la cuenta receptora y qué pasa con sus claves cuando el acceso se reduce o termina.
No es una cuenta gestionada, que crea un proveedor para su cliente, ni es un grant, que da a un miembro de tu propia cuenta acceso a uno de tus NIF. Cuando el titular de una cuenta gestionada asume el pago, el acceso del proveedor pasa a ser un acceso cedido: precio y cambio de pagador lo explica.
El acceso en resumen
| Aspecto | Cómo funciona |
|---|---|
| Quién cede | Un titular o administrador de la cuenta cedente, desde la aplicación web. |
| Quién recibe | Un titular o administrador de la cuenta receptora, que lo acepta desde la aplicación web. |
| Nivel | view lee. operate lee y escribe. none no es un nivel que se pueda ceder. |
| Alcance | all: todos los NIF de la cuenta cedente, también los que añada más adelante. list: solo los NIF elegidos. |
| Accesos abiertos | Como mucho un acceso pendiente o vigente entre las mismas dos cuentas. Uno terminado no impide abrir otro nuevo. |
| Coste | No necesita plan ni módulo, y no ocupa plaza de usuario en ninguna de las dos cuentas. La cuenta cedente sigue pagando sus NIF. |
| Fin | La cuenta cedente puede revocarlo en cualquier momento y la cuenta receptora puede renunciar a él en cualquier momento. |
Con all, un NIF que la cuenta cedente añada más adelante entra en el acceso por sí solo, y uno que archive o traspase a otra cuenta sale de inmediato. Con list, el acceso cubre los NIF de la lista que siguen siendo de la cuenta cedente. Un NIF que solo está desactivado se queda en el alcance y responde 403 company_inactive hasta que se reactive.
Ceder, cambiar y revocar en la aplicación web
Ceder, cambiar y revocar un acceso se hace solo en la aplicación web. No existe ninguna ruta de la API ni ninguna herramienta MCP para ello, a propósito: una credencial filtrada no debe poder abrir los NIF de una cuenta a otra. Aceptar, rechazar y renunciar a un acceso también son operaciones de la aplicación web.
| Cuenta | Dónde | Qué hace allí |
|---|---|---|
| Cedente | Ajustes → Accesos a mi cuenta | Invita, reenvía o retira una invitación, cambia el nivel o los NIF y revoca el acceso. |
| Receptora | Ajustes → Accesos recibidos | Acepta o rechaza una invitación, renuncia a un acceso vigente y lo reparte con su equipo. |
- Quién puede. Solo un titular o administrador de la cuenta de cada lado. Un miembro y una persona ajena a la cuenta reciben el mismo
403 forbidden_action. - Invitar por email o por código de cuenta. Por email, Factuarea envía la invitación a esa dirección, y una persona que aún no tiene cuenta puede registrarse y aceptar con el mismo enlace. Por código de cuenta, la cuenta cedente pega el código de la otra cuenta, que es su
account.id, el UUID que devuelveGET /v1/me. La cuenta receptora lo encuentra en Ajustes → Accesos a mi cuenta, y la invitación espera entonces en sus invitaciones pendientes. Cada invitación lleva un nivel y un alcance. - Un solo acceso abierto por pareja. Invitar a una cuenta que ya tiene contigo un acceso pendiente o vigente responde
422 relation_already_exists, y lo mismo ocurre al aceptar una invitación por email cuando las dos cuentas ya tienen uno abierto. Un código que nombra tu propia cuenta, que no existe o que está mal formado responde el mismo422 relation_self_grant_not_allowed, para que el campo no sirva para sondear cuentas. Una lista de NIF que nombra alguno que la cuenta cedente no tiene, o que viene vacía, responde422 relation_company_not_in_grantory no dice cuál falla. - Caducidad. Una invitación caduca a los 7 días. Reenviarla emite un secreto y una caducidad nuevos, y el enlace anterior deja de valer. Una invitación caducada sigue pendiente y no se puede aceptar (
422 relation_invitation_expired). Una enviada por código de cuenta mantiene ocupada la pareja hasta que se reenvíe o se retire. Invitar y reenviar comparten un mismo límite de peticiones por cuenta cedente. - Aceptar. Una invitación por código de cuenta se acepta desde la lista de invitaciones pendientes, y una por enlace se acepta eligiendo qué cuenta administra la persona. Una invitación por email la tiene que aceptar la persona con esa dirección. El secreto vale una sola vez: uno vacío, desconocido, ya usado, retirado o dirigido a otra persona responde el mismo
422 relation_invitation_invalid, a propósito. - Cambiar y terminar. La cuenta cedente puede cambiar el nivel entre
viewyoperate, cambiar los NIF y revocar el acceso en cualquier momento, también mientras la invitación está pendiente. La cuenta receptora puede rechazar una invitación pendiente y renunciar a un acceso vigente. Un cambio que el estado del acceso no admite responde422 relation_transition_not_allowed. - Quién recibe aviso. Una invitación, su aceptación, una revocación, un rechazo y una renuncia avisan por correo a la otra cuenta. Cambiar el nivel o los NIF no envía ningún correo, y llega a la cuenta receptora en su siguiente petición.
Alcanzar un NIF cedido
La cuenta receptora alcanza un NIF cedido como uno propio: por el segmento {company}, en /v1/companies/{company}/…. {company} es el id del NIF (UUID v7), nunca su tax_id. El segmento {account} de /v1/accounts/{account}/… sigue siendo tu propia cuenta: la cuenta cedente no es una cuenta que administres, y nombrarla responde el mismo 404 account_not_found que cualquier cuenta que no es tuya. El servidor MCP alcanza los mismos NIF: nombra el NIF con la cabecera X-Company-Id en lugar de un segmento de ruta, con los mismos niveles y los mismos límites.
Una persona de la cuenta receptora alcanza un NIF cedido con este nivel:
| Rol en la cuenta receptora | Nivel en un NIF cedido |
|---|---|
owner (titular) y admin (administrador) | El nivel del acceso, sin necesidad de grant. |
member (miembro) | El menor entre el nivel del acceso y su propio grant sobre ese NIF. Sin grant, no alcanza el NIF. |
En la aplicación web, los NIF cedidos aparecen como cuentas de clientes, aparte de los NIF de tu propia cuenta. Una credencial recibe el nivel de la persona que la emitió, como explica el techo de tus claves.
Una credencial alcanza un NIF cedido solo cuando su ámbito lo nombra. Las claves que ya existían no cambian cuando se cede un acceso, y una clave que creas por la API sin scoped_company_ids alcanza los mismos NIF que la credencial que la crea, y nunca más. Por eso:
- La primera clave se crea en la aplicación web. En Ajustes → Desarrolladores → API Keys, el campo de ámbito de NIF lista los NIF del acceso en un grupo llamado Cuentas de clientes, cada uno con el nivel más alto que admite. Solo un titular o un administrador de la cuenta receptora puede crear claves ahí y, con ello, añadirlos: un miembro no puede, ni siquiera sobre los NIF en los que tiene un grant.
- La API reduce y nunca amplía.
POST /v1/accounts/{account}/api-keysconscoped_company_idsyPATCH /v1/accounts/{account}/api-keys/{api_key}/nif-scope, los dos con el scopeaccount:write, solo aceptan NIF que la clave que llama ya alcanza. Pedir uno más responde422 business_rule_violationcon el subcódigonif_scope_exceeds_issuer, y un NIF de una cuenta que no te ha cedido nada responde422 invalid_param_value, igual que uno que no existe.
Cuando una clave los alcanza, GET /v1/me los lista en scope. No aparecen en GET /v1/accounts/{account}/companies, que lista solo los NIF de la cuenta del path. El bloque client_accounts de GET /v1/me lista las cuentas que te cedieron acceso (origin granted) solo cuando la clave lleva el scope privilegiado accounts:read en vigor, lo que exige el privilegio de proveedor de cuentas gestionadas de tu cuenta. Si no, va vacío y client_accounts_visible es false.
Qué puedes hacer en cada nivel
El nivel del acceso decide qué puedes hacer en un NIF cedido.
| Cuando llamas a | Con view | Con operate |
|---|---|---|
| Una lectura de los datos del NIF (facturas, contactos, series, documentos, etc.) | 200 | 200 |
| Una escritura de los datos del NIF (crear, modificar, enviar, borrar) | 403 company_read_only, sin crear ni modificar nada | Permitida, como administrador del NIF |
| Una de las operaciones de la cuenta cedente en el eje de NIF | 403 forbidden_action, también las lecturas | 403 forbidden_action, también las lecturas |
Una ruta de la cuenta cedente bajo /v1/accounts/{account}/… | 404 account_not_found | 404 account_not_found |
Un acceso operate te hace administrador del NIF, no de la cuenta que lo posee. Trabajas con los datos del NIF dentro de lo que permite el plan de la cuenta cedente, y lo que creas pertenece a ese NIF. El servidor MCP aplica los mismos niveles y responde el mismo 403 company_read_only.
Un POST /v1/companies/{company}/invoices en un NIF con view responde:
{
"error": {
"type": "authorization_error",
"code": "company_read_only",
"message": "Tu acceso a esta empresa es de solo lectura.",
"doc_url": "https://docs.factuarea.com/guides/errors#company_read_only",
"request_id": "req_01J8Y3M2Q40000000000000007"
}
}Lo que se queda en la cuenta cedente
Algunas operaciones del eje de NIF pertenecen a la cuenta que posee el NIF, no a los datos del NIF. En un NIF cedido responden 403 forbidden_action antes de leer o cambiar nada, con cualquiera de los dos niveles y también las lecturas. El mensaje no nombra la cuenta cedente.
| Área | Operaciones | Por qué se queda con la cuenta dueña |
|---|---|---|
| Registros de peticiones | GET …/request-logs y GET …/request-logs/{request_id} | Muestran la actividad de desarrollador de las credenciales de la cuenta dueña. |
| Eventos | GET …/events y GET …/events/{event} | Son el flujo de eventos que alimenta los webhooks de la cuenta dueña. |
| Webhook endpoints | Las once operaciones de …/webhook-endpoints: listar, crear, consultar, modificar, borrar, entregas, reenvío, ping, rotate-secret y test-event | Fijan destinos, secretos de firma y reenvíos que configura y paga la cuenta dueña. |
| Facturación | GET …/billing | Es el plan y la facturación de la cuenta dueña, que solo decide y consulta la cuenta que paga. |
| Consumo de automatizaciones | GET …/automations/usage | Es el consumo de la cuota de automatizaciones del plan de la cuenta dueña. |
| Credenciales de cobro | PATCH …/stripe-autoinvoicing/config, PATCH …/connected-accounts/{account} y DELETE …/connected-accounts/{account} | Configuran o desconectan las credenciales de cobro que conectó la cuenta dueña. Leerlas sigue siendo leer datos del NIF. |
Un POST /v1/companies/{company}/webhook-endpoints en un NIF cedido responde, con view o con operate:
{
"error": {
"type": "authorization_error",
"code": "forbidden_action",
"message": "Esta operación solo la puede hacer la cuenta dueña del NIF: con un acceso por relación entre cuentas no está disponible.",
"doc_url": "https://docs.factuarea.com/guides/errors#forbidden_action",
"request_id": "req_01J8Y3M2Q40000000000000008"
}
}Sus herramientas MCP responden lo mismo. El resto de las operaciones del eje de NIF son datos del NIF y se sirven con tu nivel. La cuenta que posee el NIF llama a estas mismas operaciones como siempre.
Las capacidades de la propia cuenta cedente viven bajo /v1/accounts/{account}/…: su equipo, invitaciones, titularidad, API keys, cartera y traspasos de NIF, webhooks de cuenta y registros de peticiones. {account} tiene que ser tu propia cuenta, así que no puedes dirigirte a ellas. Las operaciones que llevan en el path un NIF de la cuenta también rechazan uno cedido: activar, desactivar, editar o archivar un NIF cedido por la ruta de tu propia cuenta responde 404 resource_not_found, sin cambio de estado ni cargo. La aplicación web bloquea las mismas capacidades mientras un NIF cedido es tu empresa activa: la facturación, el equipo, las invitaciones, la titularidad, las claves, la compra, el traspaso y el archivo de NIF, los webhooks de empresa y los ajustes de la cuenta se quedan con la cuenta cedente.
Tus claves: nivel y techo
El nivel de una clave en un NIF cedido se fija cuando el NIF entra en la clave, al emitirla o al cambiar su ámbito, y solo baja. Es el menor entre el nivel del acceso y el nivel que tiene en ese NIF la persona que emite la clave, que para un member queda además limitado por su grant. En cada escritura cuenta el menor entre el nivel guardado en la clave y el que la persona emisora tiene hoy.
- Escribir exige
operate. Una clave con cualquier scope que no sea de lectura (:read), incluido el scope*, necesitaoperateen cada NIF que nombra. Nombrar un NIF que solo tieneviewjunto con uno de esos scopes responde422 business_rule_violationcon el subcódigonif_access_level_exceeds_emittery no crea nada. Si no declarasscoped_company_ids, se dejan fuera los NIF por debajo del nivel que piden los scopes, y cuando no queda ninguno la respuesta es el mismo 422. En la aplicación web, un NIF conviewsolo admite scopes de lectura. - Un NIF que quien emite no alcanza. Un NIF cedido en el que un miembro no tiene grant, o uno de una cuenta que no te ha dado acceso, responde
422 invalid_param_valueconparamscoped_company_ids, igual que un NIF que no existe. - El plan es el plan del NIF. Un NIF cedido aporta el plan de su propia cuenta. Una clave recibe un scope solo si el plan de todos los NIF de su ámbito lo permite, y el exceso nunca se recorta en silencio: responde
422 scope_not_allowed_by_plan. - Las claves de pruebas no lo alcanzan. Una clave
fact_test_alcanza solo la empresa sandbox de su cuenta, así que nunca alcanza un NIF cedido y responde404 profile_not_found. Usa una clavefact_live_.
Cuando el acceso se reduce o termina
Un acceso se reduce cuando la cuenta cedente lo revoca, baja su nivel o le quita NIF, cuando la cuenta receptora renuncia a él, y cuando un NIF sale de la cuenta cedente. Cada una de estas cosas surte efecto en la siguiente petición:
- Se retiran los grants que los miembros de la cuenta receptora tenían sobre los NIF perdidos.
- Cada clave de la cuenta receptora se recalcula a la baja. Un NIF sin nivel sale del ámbito de la clave, un nivel bajado a
viewconvierte las escrituras de esa clave en403 company_read_only, y una clave que se queda con el ámbito vacío se revoca. El resto de la clave sigue funcionando sobre sus NIF propios. - Un NIF que la cuenta receptora ya no alcanza responde
404 profile_not_found, igual que uno que no existe, así que la respuesta no revela que existe.
Nada sube por sí solo. Subir el nivel, ampliar los NIF o aceptar un acceso nuevo no toca las claves que ya existen: emite una clave nueva para ese NIF para obtener el nivel nuevo.
Repartir el acceso con tu equipo
Un titular o administrador de la cuenta receptora decide qué miembros de su equipo trabajan con los NIF cedidos. Un miembro recibe un grant con view u operate sobre un NIF del alcance de un acceso vigente, y lo alcanza con el menor entre el grant y el nivel del acceso. La aplicación web lo hace desde la cuenta de cliente, en Accesos recibidos. La API lo replica con las operaciones de los grants de miembro, donde {company} es el NIF cedido:
| Operación | Scope | Qué hace |
|---|---|---|
GET /v1/accounts/{account}/members/{member}/grants/{company} | members:read | Devuelve el grant sobre un NIF. |
PUT /v1/accounts/{account}/members/{member}/grants/{company} | members:write | Crea o reemplaza el grant sobre un NIF. |
DELETE /v1/accounts/{account}/members/{member}/grants/{company} | members:write | Revoca el grant sobre un NIF. |
- Quién y qué. La persona que emitió la credencial tiene que ser titular o administrador de la cuenta, y el ámbito de la credencial tiene que incluir ya ese NIF. Los scopes
members:*necesitan el módulouser_management. - Gana el nivel menor. Dar
operatesobre un acceso que esviewno se rechaza: el nivel se guarda tal cual y el miembro alcanza el NIF con el menor de los dos. - Fuera del acceso. Un NIF fuera de un acceso vigente, o uno cuyo acceso terminó, responde
422 grant_company_not_in_accountal escribir y404 member_not_foundal leer, sin decir que alguna vez hubo un acceso. Unownero unadminresponde422 grants_only_for_member, porque ya alcanza todos los NIF del acceso. - Sin correo. Dar, cambiar o retirar un grant no envía ningún correo.
Seguir el acceso como cuenta cedente
La cuenta cedente puede seguir sus accesos con tres eventos account.* en sus webhooks de cuenta:
| Evento | Cuándo se envía |
|---|---|
account.access_granted | La cuenta receptora acepta y el acceso pasa a vigente. |
account.access_level_changed | La cuenta cedente cambia el nivel. data.previous_level lleva el anterior. |
account.access_revoked | Termina un acceso vigente: la cuenta cedente lo revoca o la cuenta receptora renuncia a él. Retirar o rechazar una invitación que nunca se aceptó no se publica. |
Su data es un objeto account_relation con id, origin (granted), level, previous_level, grantor_account_id, grantee_account_id y status. Solo los endpoints de la cuenta cedente los reciben: a la cuenta receptora no se le envía nada de un acceso cedido. Un cambio de los NIF del acceso tampoco se publica.
La cuenta receptora no puede suscribirse a lo que ocurre en un NIF cedido. Los webhook endpoints del eje de NIF responden 403 forbidden_action sobre él, como dice la tabla anterior, y sus webhooks de cuenta cubren solo sus propios NIF y las cuentas que aprovisiona.
Ten en cuenta
- Identidad de envío. Un NIF cedido no hereda nada de la cuenta receptora: su estado de confianza y su comprobación de identidad de envío siguen siendo los de su propia cuenta. Envío de documentos describe la comprobación.
- Automatizaciones. Las automatizaciones de cartera de la empresa titular de la cuenta receptora cubren, además de sus otros NIF, los NIF cedidos en los que el acceso es
operate, y ninguno conview. Automatizaciones las explica.
Relacionado
la cuenta, su equipo, los grants por NIF y el traspaso de NIF.
elige el NIF en cada petición con el segmento {company}.
claves que alcanzan solo una parte de la cuenta.
aprovisiona cuentas para tus clientes por API.
qué pagas por cada cuenta gestionada y qué cambia cuando el cliente asume el pago.
recibe en un solo endpoint los eventos de tu cuenta y de sus NIF.
todos los códigos de las reglas de acceso, con su causa y qué hacer.