Cartera de NIF
Da de alta, sigue y gestiona los NIF de tu cuenta por la API v1 — la plaza contratada que ocupa un NIF adicional, el aprovisionamiento, el estado activo, inactivo y archivado, las estadísticas y la aptitud de emisión.
La cartera de NIF es la lista de NIF que opera tu cuenta. Reúne la empresa titular con la que se abrió la cuenta y cada NIF adicional que das de alta o recibes por un traspaso. Estas operaciones dan de alta un NIF, siguen cómo se prepara, lo desactivan, lo reactivan y lo archivan, y leen sus estadísticas y si puede emitir.
Son operaciones de la cuenta, así que cuelgan de /v1/accounts/{account}/companies. {account} es el account.id que devuelve GET /v1/me, y {company} es el id de un NIF, un UUID v7 opaco, no su tax_id. Trabajar dentro de un NIF (sus facturas, contactos y series) pasa por el eje de empresa, /v1/companies/{company}/…: alcanzar un NIF lo explica. Los NIF de otra cuenta que alcanzas por un acceso cedido o por una cuenta gestionada no forman parte de tu cartera, y el listado nunca los muestra.
| Operación | Endpoint | Scope |
|---|---|---|
| Listar NIF | GET /v1/accounts/{account}/companies | companies:read |
| Dar de alta un NIF | POST /v1/accounts/{account}/companies | companies:write |
| Consultar un NIF | GET /v1/accounts/{account}/companies/{company} | companies:read |
| Actualizar un NIF | PATCH /v1/accounts/{account}/companies/{company} | companies:write |
| Archivar un NIF | DELETE /v1/accounts/{account}/companies/{company} | companies:delete |
| Consultar el estado de creación | GET /v1/accounts/{account}/companies/{company}/creation-status | companies:read |
| Verificar la creación | POST /v1/accounts/{account}/companies/{company}/verify-creation | companies:write |
| Desactivar un NIF | POST /v1/accounts/{account}/companies/{company}/deactivate | companies:write |
| Reactivar un NIF | POST /v1/accounts/{account}/companies/{company}/activate | companies:write |
| Reactivar NIF en lote | POST /v1/accounts/{account}/companies/activate | companies:write |
| Previsualizar el cargo | GET /v1/accounts/{account}/companies/seat-charge-preview | companies:read |
| Estadísticas por NIF | GET /v1/accounts/{account}/companies/stats | companies:read |
| Aptitud de emisión | GET /v1/accounts/{account}/companies/{company}/issuing-readiness | companies:read |
Dar de alta un NIF
POST /v1/accounts/{account}/companies da de alta un NIF en tu cuenta. name y tax_id son los únicos campos obligatorios: el resto del perfil fiscal es opcional y puede ir en la misma petición. El tax_id (NIF / CIF / NIE) debe pasar la validación fiscal y ser único dentro de tu cuenta. Requiere el scope companies:write y una Idempotency-Key: sin ella la respuesta es 422 idempotency_key_required, antes de que se ejecute nada.
Todo NIF posterior al primero es un NIF adicional. El alta pasa por su gate antes de crear nada. Ocupa una plaza contratada libre de la cuenta y no cobra. Sin plaza libre, la aplicación web responde 422 contracted_seats_exhausted y te pide comprar plazas, mientras que la API v1 y el MCP compran las que faltan en la propia llamada. Si falla cualquier comprobación, no se crea nada y no se cobra nada.
curl -X POST https://api.factuarea.com/v1/accounts/$ACCOUNT_ID/companies \
-H "Authorization: Bearer $FACTUAREA_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"name": "Talleres García",
"business_name": "Talleres García, Sociedad Limitada",
"tax_id": "B12345674"
}'Respuesta (201), con una cabecera Location que lleva la URL canónica del NIF nuevo:
{
"data": {
"object": "company",
"id": "01931b3e-7c4a-7f2e-9a8b-4d6e7f8a9b0c",
"name": "Talleres García",
"business_name": "Talleres García, Sociedad Limitada",
"tax_id": "B12345674",
"status": "active",
"address": "Calle Mayor 1",
"city": "Madrid",
"postal_code": "28013",
"province": "Madrid",
"country_aeat_zone": "peninsula",
"email": "contacto@talleresgarcia.es",
"phone": "+34911234567",
"logo_url": null,
"paid_until": "2026-07-15T10:00:00+00:00",
"suspension_reason": null,
"created_at": "2026-01-15T09:30:00+00:00",
"updated_at": null
}
}Cuerpo de la petición
| Campo | Obligatorio | Notas |
|---|---|---|
name | sí | Nombre con que se conoce a la empresa (1–100 caracteres): su nombre comercial o, sin business_name, su razón social. |
tax_id | sí | Identificador fiscal español (NIF / CIF / NIE), hasta 20 caracteres. Inmutable tras el alta. |
business_name | no | Razón social cuando es distinta de name, hasta 100 caracteres. Si no se envía, name es la razón social. |
address | no | Domicilio fiscal, hasta 255 caracteres. |
city | no | Localidad del domicilio fiscal, hasta 100 caracteres. |
postal_code | no | Código postal, hasta 10 caracteres. De él se deriva la zona AEAT (country_aeat_zone en las respuestas). |
province | no | Provincia, hasta 100 caracteres. |
country | no | País, hasta 100 caracteres. |
email | no | Email de contacto. |
phone | no | Teléfono de contacto, hasta 20 caracteres. |
El status de la respuesta es el estado del NIF, un eje distinto del provisioning_status que sigue su preparación. paid_until es un dato informativo: el final del periodo por el que el NIF se pagó por última vez. No decide ningún cobro, y vale null cuando no se cobró, en un trial por ejemplo. No existe un campo de entrada country_aeat_zone: envías un country de texto libre, y la zona se deriva del postal_code.
El alta valida la forma del perfil y el formato fiscal del tax_id, nada más. Que el NIF pueda después emitir depende de otras condiciones, como su identificación censal, su serie por defecto y su certificado de VeriFactu. La aptitud de emisión las lee.
El NIF nuevo entra en el ámbito de la clave que lo dio de alta, así que puedes trabajar con él enseguida. Cuando esa clave no puede admitirlo, el alta se hace igualmente y la clave conserva exactamente el ámbito que tenía. Ocurre cuando la clave está publicada en un navegador, cuando uno de sus scopes no está disponible en el NIF nuevo o cuando la persona que emitió la clave no alcanza el NIF nuevo con el nivel que la clave necesita. GET /v1/me lista en scope lo que alcanza una clave: para alcanzar el NIF nuevo, emite una clave que lo nombre.
Qué puede responder el gate
El gate es el de los NIF adicionales, y juzga en este orden: quién paga, el plan, el tope y las plazas. Estas son las respuestas que puedes encontrar, todas antes de cualquier cobro:
| Respuesta | Por qué |
|---|---|
403 forbidden_action | La clave no alcanza la empresa titular de la cuenta, que es la que paga, o la persona que la emitió no es titular ni administrador de la cuenta con la sección user_management disponible. |
403 billing_managed_by_provider | Otra cuenta paga la facturación de esta, así que no puede añadir NIF por sí sola: consulta las cuentas que paga su proveedor. |
402 additional_nif_plan_required | La cuenta no tiene un plan vigente. |
403 additional_nif_not_in_plan | El plan no admite NIF adicionales: solo empresario y enterprise los admiten, trial incluido. |
422 business_rule_violation con el subcódigo additional_nif_limit_reached | La cuenta superaría su tope de NIF adicionales activos. |
402 payment_method_required | Modo producción con suscripción de pago y sin método de pago. error.details.payment_setup_url lleva a donde configurarlo. |
402 additional_nif_charge_failed | Se rechazó la compra de las plazas que faltan (la API v1 y el MCP las compran). |
NIF duplicado
Un tax_id que ya está en tu cuenta, activo o inactivo, responde 409 con resource_already_exists, y error.details.existing_resource_id apunta al NIF que lo tiene:
{
"error": {
"type": "conflict_error",
"code": "resource_already_exists",
"subcode": "managed_company_tax_id_already_exists",
"message": "Ya existe una empresa con ese NIF/CIF/NIE en la cuenta.",
"param": "tax_id",
"details": {
"existing_resource_id": "01931b3e-7c4a-7f2e-9a8b-4d6e7f8a9b0c"
},
"doc_url": "https://docs.factuarea.com/guides/errors#resource_already_exists",
"request_id": "req_01J8Y3M2Q4CF0000000000MCT1"
}
}El subcódigo conserva el nombre que siempre tuvo. Un NIF archivado ya no retiene su identificador fiscal: puedes dar de alta el mismo tax_id otra vez, como un NIF nuevo con un id nuevo que no hereda ningún paid_until.
Un NIF que pertenece a otra cuenta
Un tax_id que ya pertenece a otra cuenta no se da de alta dos veces. La respuesta es 422 business_rule_violation con el subcódigo nif_already_claimed_by_another_account y param tax_id, y no nombra a la otra cuenta ni nada suyo. La cuenta que tiene el NIF lo cede con un traspaso de NIF, y tú lo aceptas.
{
"error": {
"type": "invalid_request_error",
"code": "business_rule_violation",
"subcode": "nif_already_claimed_by_another_account",
"message": "Este NIF ya pertenece a otra cuenta. Para traerlo a la tuya, pide a la cuenta que lo tiene un traspaso de NIF y acéptalo; un NIF no puede estar en dos cuentas a la vez.",
"param": "tax_id",
"doc_url": "https://docs.factuarea.com/guides/errors#business_rule_violation",
"request_id": "req_01J8Y3M2Q4CF0000000000NAC1"
}
}Aprovisionamiento
El alta es atómica: si no se puede ocupar ni comprar su plaza no crea nada, así que nunca queda un NIF a medio abrir. El 201 ya describe un NIF active. Justo después, en segundo plano, creamos su serie de documentos por defecto y su configuración fiscal mínima, y has_default_series de la aptitud de emisión pasa a true cuando termina. Dos endpoints exponen el estado de aprovisionamiento: uno para consultarlo y otro para reconciliarlo.
| Operación | Endpoint | Scope |
|---|---|---|
| Consultar el estado de creación | GET /v1/accounts/{account}/companies/{company}/creation-status | companies:read |
| Verificar (reconciliar) la creación | POST /v1/accounts/{account}/companies/{company}/verify-creation | companies:write |
Estados de aprovisionamiento
provisioning_status recorre un ciclo corto y en un solo sentido:
| Estado | Significado |
|---|---|
pending | El NIF se dio de alta y su aprovisionamiento no ha empezado. |
awaiting_payment | El NIF adicional espera a que se le cobre. payment_setup_url apunta a donde el titular de la cuenta añade un método de pago. |
provisioning | El cobro está resuelto, o no hacía falta, y el NIF se está preparando. |
active | El aprovisionamiento terminó. El NIF es operativo. |
failed | El aprovisionamiento no pudo completarse, y failed_reason dice por qué. Es terminal. |
Un NIF sin estado de aprovisionamiento guardado se lee como active. Ningún alta nueva deja un NIF en awaiting_payment: solo puede mostrarlo uno que ya estaba esperando su pago, y verificar la creación lo resuelve.
Las claves de pruebas llevan el NIF directamente a active, y no interviene ningún pago.
Qué cuesta añadir un NIF
Un NIF adicional ocupa una plaza contratada de la cuenta, y darlo de alta o reactivarlo no cobra: toma una plaza libre. Solo comprar plazas cobra, prorrateado por lo que queda del periodo, en la suscripción additional-nifs de la cuenta. Cuando no queda ninguna plaza libre, la aplicación web responde 422 contracted_seats_exhausted, y la API v1 y el MCP compran las que faltan en la propia llamada (compra automática). Desactivar un NIF libera su plaza sin bajar la factura: para pagar menos reduces las plazas. La API no guarda el importe: consulta la vista previa o lee unit_amount en gestoria_seats en vez de fijarlo a mano. NIF adicionales explica el precio y los planes, y la completan la regla del trial y qué pasa con los NIF extra cuando cambia tu plan.
Consultar el estado de creación
GET /v1/accounts/{account}/companies/{company}/creation-status devuelve el provisioning_status actual y sus marcas de tiempo. Requiere el scope companies:read.
curl https://api.factuarea.com/v1/accounts/$ACCOUNT_ID/companies/$COMPANY_ID/creation-status \
-H "Authorization: Bearer $FACTUAREA_KEY"Respuesta (200):
{
"data": {
"object": "company_creation_status",
"id": "01931b3e-7c4a-7f2e-9a8b-4d6e7f8a9b0c",
"provisioning_status": "active",
"payment_setup_url": null,
"failed_reason": null,
"started_at": "2026-01-15T09:30:00+00:00",
"completed_at": "2026-01-15T09:31:00+00:00"
}
}payment_setup_url está presente solo mientras el estado es awaiting_payment y para una clave de producción que alcanza la empresa titular, y vale null en los demás casos. failed_reason está presente solo cuando el estado es failed.
Verificar la creación
POST /v1/accounts/{account}/companies/{company}/verify-creation reconcilia un NIF con la suscripción del titular de la cuenta y lo hace avanzar cuando puede. No lleva cuerpo y es idempotente. Requiere el scope companies:write.
curl -X POST \
https://api.factuarea.com/v1/accounts/$ACCOUNT_ID/companies/$COMPANY_ID/verify-creation \
-H "Authorization: Bearer $FACTUAREA_KEY"Solo actúa sobre un NIF en awaiting_payment:
- Cuando el titular ya tiene método de pago, el NIF se cobra como NIF adicional y pasa a
active. - Mientras el titular aún no tiene ninguno, la llamada no hace nada y responde sin error: el NIF sigue en
awaiting_payment. - En cualquier otro estado la llamada no hace nada, así que es segura de repetir.
Nunca responde 402: un cobro que falla deja el aprovisionamiento en failed, con su motivo. Devuelve el mismo recurso que la consulta, así que lees el provisioning_status resultante en la propia respuesta. Cobra al titular de la cuenta, así que la clave debe alcanzar la empresa titular (403 forbidden_action en caso contrario).
El estado de un NIF
Aparte del aprovisionamiento, cada NIF tiene un status en la cuenta. Es el campo status del NIF y recorre tres estados:
| Estado | Significado |
|---|---|
active | El NIF es operativo. |
inactive | El NIF está desactivado: no opera, pero sus datos están intactos y se puede reactivar. |
archived | El NIF ya no acepta operaciones. Es terminal, aunque la empresa y su historial se conservan. |
Las transiciones son active ↔ inactive (desactivar y reactivar), y active → archived o inactive → archived (archivar). Dos campos más describen el estado:
paid_until. Dato informativo del NIF: el final del periodo por el que se pagó por última vez. No decide ningún cobro, porque reactivar toma una plaza libre o compra una, sea cual sea la fecha. Valenullcuando el NIF no tiene ningún periodo pagado que informar.suspension_reason. Por qué el sistema suspendió un NIFinactive:payer_blockedcuando la cuenta que paga una cuenta gestionada tiene la facturación bloqueada, ymanagement_endedcuando la gestión terminó antes de que nadie asumiera el pago. Valenullcuando el sistema no lo suspendió, por ejemplo porque lo desactivó la propia cuenta.
La cuenta conserva uno. Una cuenta tiene siempre al menos un NIF active. Desactivar o archivar la empresa titular, o el último NIF activo, necesita un sucesor: otro NIF activo de la cuenta pasa a titular en la misma operación. Si no hay ninguno, la respuesta es 422 business_rule_violation con el subcódigo account_must_keep_one_nif y no cambia nada.
Desactivar un NIF
POST /v1/accounts/{account}/companies/{company}/deactivate pasa un NIF active a inactive. Deja de operar y conserva todos sus datos, de forma reversible. No cobra nunca y no responde 402: el NIF adicional libera su plaza, y las plazas contratadas y la factura siguen igual, así que puedes reactivarlo en esa plaza libre. Para pagar menos, reduce las plazas. Requiere el scope companies:write.
curl -X POST \
https://api.factuarea.com/v1/accounts/$ACCOUNT_ID/companies/$COMPANY_ID/deactivate \
-H "Authorization: Bearer $FACTUAREA_KEY"Devuelve el NIF actualizado con status: "inactive".
Reactivar un NIF
POST /v1/accounts/{account}/companies/{company}/activate devuelve un NIF inactive a active, y exige una Idempotency-Key. El NIF reactivado vuelve a ser un NIF adicional, así que pasa por el mismo gate que un alta y ocupa una plaza contratada libre sin cobro. Sin plaza libre, la aplicación web responde 422 contracted_seats_exhausted, y la API v1 y el MCP compran la plaza que falta primero: solo si la compra se completa el NIF pasa a active. Uno en trial, uno de una cuenta enterprise facturada por contrato y uno de una cuenta de pruebas no se cobran. Requiere el scope companies:write.
curl -X POST \
https://api.factuarea.com/v1/accounts/$ACCOUNT_ID/companies/$COMPANY_ID/activate \
-H "Authorization: Bearer $FACTUAREA_KEY" \
-H "Idempotency-Key: $(uuidgen)"Devuelve el NIF actualizado con status: "active".
Reactivar NIF en lote
POST /v1/accounts/{account}/companies/activate reactiva varios NIF en una sola llamada. Ocupan las plazas libres y, en la API v1 y el MCP, las plazas que aún faltan para todo el lote se compran en una única compra conjunta: una factura para el lote. El cuerpo lleva company_ids, una lista de valores id (1–1000), y la llamada exige una Idempotency-Key. Requiere el scope companies:write.
curl -X POST https://api.factuarea.com/v1/accounts/$ACCOUNT_ID/companies/activate \
-H "Authorization: Bearer $FACTUAREA_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"company_ids": [
"01931b3e-7c4a-7f2e-9a8b-4d6e7f8a9b0c",
"01931b3e-8d5b-7a1f-9c2d-5e6f7a8b9c0d"
]
}'El lote es todo o nada. Cada NIF se valida antes de comprar nada: uno que no forma parte de tu cuenta responde 404 para todo el lote, y uno que no está inactive responde 422 business_rule_violation. El gate y el tope juzgan el lote entero. La respuesta es la lista de NIF reactivados ({ "data": [ … ] }).
Previsualizar el cargo
GET /v1/accounts/{account}/companies/seat-charge-preview devuelve las plazas que añadir o reactivar NIF adicionales ocuparía o compraría y lo que costaría, calculado a partir de la próxima factura del titular de la cuenta y sin cobrar nada. Primero se usan las plazas contratadas libres hoy. Úsalo para mostrar el importe prorrateado antes de un alta o de una reactivación. Requiere el scope companies:read. La ruta conserva su nombre original.
Tiene dos modos:
count(1–1000, por defecto 1) previsualiza el prorrateo conjunto de añadir esa cantidad de NIF.company_ids[]lleva valoresidconcretos y dimensiona la operación para esos NIF exactos. Cuando está presente, tiene prioridad sobrecount.
curl -G https://api.factuarea.com/v1/accounts/$ACCOUNT_ID/companies/seat-charge-preview \
-H "Authorization: Bearer $FACTUAREA_KEY" \
--data-urlencode "count=3"Respuesta (200):
{
"data": {
"object": "seat_charge_preview",
"amount": "7.50",
"tax_amount": "1.58",
"total": "9.08",
"tax_rate": 21,
"currency": "EUR",
"next_invoice_date": "2026-04-01T00:00:00Z",
"requires_payment_method": false,
"requires_active_plan": false,
"included_in_trial": false,
"already_covered": false,
"is_first_seat": false,
"recurring_quantity": 3,
"recurring_base_cents": 4500,
"recurring_total_cents": 5445
}
}amount es la base imponible del prorrateo, tax_amount el IVA y total (amount + tax_amount) lo que realmente se cobra, todo en euros como cadenas con dos decimales. tax_rate es el porcentaje de IVA, o null cuando no se pudo resolver. Los campos recurring_* proyectan la cuota mensual tras la operación: cuántos NIF adicionales se facturan, su base y lo mismo con IVA. Los dos campos _cents siguen en céntimos, como dicen sus nombres, y recurring_total_cents vale null cuando el IVA no se puede calcular.
Cuatro banderas mutuamente excluyentes explican un importe de 0, por orden de prioridad (already_covered sigue en la respuesta y vale siempre false: paid_until ya no cubre nada):
| Bandera | amount es 0 porque… |
|---|---|
included_in_seats | Las plazas contratadas libres cubren toda la operación, así que no se cobra nada y no hace falta método de pago. |
requires_active_plan | La cuenta no tiene un plan vigente, o su plan no admite NIF adicionales. |
included_in_trial | La cuenta está en su trial, y la operación no se cobra durante él. |
requires_payment_method | La cuenta tiene un plan de pago y no tiene método de pago, y debe añadir uno primero. |
is_first_seat es true cuando la operación crea la primera suscripción de NIF adicionales de la cuenta: el cargo es entonces un mes completo, y hoy pasa a ser el día de facturación mensual.
free_seats_used indica cuántas plazas contratadas libres ocuparía la operación y seats_to_buy cuántas tendría que comprar. included_in_seats vale true cuando las plazas libres lo cubren todo, y entonces zero_reason vale included_in_seats. seats es el bloque de plazas contratadas tras la operación, y cancels_pending_reduction vale true cuando la operación cancelaría una reducción pendiente. Estos campos son aditivos: el ejemplo de respuesta de arriba no los lista.
La vista previa es una lectura, así que nunca responde 402 y no juzga el plan ni el tope de las escrituras. Responde 403 billing_managed_by_provider cuando el proveedor paga la facturación de la cuenta, y 404 cuando un valor de company_ids[] no es un NIF de la cuenta. NIF adicionales explica cada campo.
Listar y consultar NIF
GET /v1/accounts/{account}/companies devuelve los NIF de tu cuenta que lee tu clave, con paginación por cursor. GET /v1/accounts/{account}/companies/{company} devuelve uno. Las dos requieren companies:read.
| Parámetro | Notas |
|---|---|
status | active, inactive o archived. Sin él, el listado devuelve los active e inactive, y status=archived es la forma de ver los archivados. |
tax_id | Coincidencia exacta con el identificador fiscal. Un NIF fuera del ámbito de tu clave devuelve una lista vacía, nunca un error. |
include | readiness añade la aptitud de emisión a cada NIF. Cualquier otro valor responde 422 invalid_param_value. |
limit | Entre 1 y 100, 25 por defecto. |
cursor | El id del último NIF de la página anterior. Este listado lleva un único cursor, no starting_after: consulta la paginación. |
curl "https://api.factuarea.com/v1/accounts/$ACCOUNT_ID/companies?status=inactive&limit=25" \
-H "Authorization: Bearer $FACTUAREA_KEY"Solo se devuelven los NIF de la cuenta del camino, y solo los que están dentro del ámbito de tu clave. Un NIF que no es uno de ellos responde 404: consulta el aislamiento.
Estadísticas por NIF
GET /v1/accounts/{account}/companies/stats devuelve una fila company_stats por cada NIF que lee tu clave, con los archivados ocultos: las facturas emitidas del periodo (invoices_count), lo que facturan (total_invoiced, una cadena con dos decimales) y la última factura emitida sea cual sea el periodo (last_invoice, o null). El periodo son date_from y date_to (YYYY-MM-DD, inclusivos y ambos opcionales): sin ellos es el año natural en curso. El listado no está paginado. Requiere companies:read.
curl "https://api.factuarea.com/v1/accounts/$ACCOUNT_ID/companies/stats?date_from=2026-01-01&date_to=2026-09-30" \
-H "Authorization: Bearer $FACTUAREA_KEY"{
"data": [
{
"object": "company_stats",
"company_id": "01931b3e-7c4a-7f2e-9a8b-4d6e7f8a9b0c",
"tax_id": "B12345674",
"name": "Talleres García",
"invoices_count": 3,
"total_invoiced": "363.00",
"last_invoice": {
"number": "F-2026-003",
"issued_on": "2026-09-20",
"total": "121.00"
}
}
],
"has_more": false,
"next_cursor": null
}¿Puede emitir este NIF?
GET /v1/accounts/{account}/companies/{company}/issuing-readiness responde si un NIF está listo para emitir facturas. Es una lectura neutra y fiscal: can_issue es el veredicto, blockers lista los motivos legibles por máquina cuando es false, y los demás campos son las señales con las que se compuso. Nunca mira la suscripción, el plan ni el precio, y nunca responde con un estado de pago requerido. Con include=readiness en el listado, cada NIF lleva el mismo objeto en readiness.
{
"data": {
"can_issue": false,
"blockers": [
"census_not_identified",
"no_default_series"
],
"census_status": "not_identified",
"has_default_series": false,
"fiscal_profile_complete": true,
"operable": true,
"missing_modules": [],
"checked_at": "2026-05-25T18:00:00+00:00"
}
}Ramifica según el código de cada bloqueo, como verifactu_certificate_missing cuando VeriFactu está activado y el NIF no tiene un certificado válido. Pueden aparecer motivos nuevos: trata uno desconocido como un bloqueo que no puedes resolver por la API. Cuentas y NIF describe los campos.
Actualizar un NIF
PATCH /v1/accounts/{account}/companies/{company} es una actualización parcial del perfil: name, business_name, address, city, postal_code, province, country, email y phone. Los campos omitidos conservan su valor, y "" vacía uno. name es siempre el nombre con que se conoce a la empresa: cambiar solo name cambia el nombre comercial si hay una razón social distinta y, si no, la razón social. Cambiar solo business_name cambia la razón social y conserva name, y "business_name": "" hace de name la razón social. country_aeat_zone se deriva del código postal, y el tax_id es inmutable: enviarlo responde 422. Solo se puede editar un NIF active (422 business_rule_violation en caso contrario). Editar no se factura y nunca responde 402. Requiere el scope companies:write.
curl -X PATCH \
https://api.factuarea.com/v1/accounts/$ACCOUNT_ID/companies/$COMPANY_ID \
-H "Authorization: Bearer $FACTUAREA_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Talleres García e Hijos SL" }'Archivar un NIF
DELETE /v1/accounts/{account}/companies/{company} archiva el NIF en lugar de borrarlo: su status pasa a archived, deja de aceptar operaciones, y la empresa y su historial se conservan. La respuesta es 204. Se puede archivar un NIF active o inactive, y archived es terminal. Archivar no cobra nunca y no responde 402. Requiere el scope companies:delete.
curl -X DELETE \
https://api.factuarea.com/v1/accounts/$ACCOUNT_ID/companies/$COMPANY_ID \
-H "Authorization: Bearer $FACTUAREA_KEY"Qué más hace archivar:
- Libera el identificador fiscal, como explicó el alta, y revoca los traspasos de NIF abiertos de ese NIF.
- Libera su plaza una sola vez. Un NIF adicional que aún estaba
activelibera la plaza que ocupaba, sin bajar la factura, y uno que ya estabainactiveno tiene plaza que liberar de nuevo. - Sigue siendo legible. Un NIF archivado sigue apareciendo en el listado con
status=archived, yGET /v1/accounts/{account}/companies/{company}aún lo devuelve. Un cambio por la cuenta (PATCH,activateoDELETE) responde404 resource_not_found, igual que un NIF que no es de la cuenta, y una operación sobre sus datos por/v1/companies/{company}/…responde403 company_inactive(resolución).
Archivar puede quedar bloqueado. Cuando el NIF aún tiene documentos fiscales abiertos, o es el último NIF activo de la cuenta y no tiene sucesor (account_must_keep_one_nif), la respuesta es 422 business_rule_violation y el NIF conserva su estado. Resuelve la causa y vuelve a archivar.
Scopes, capacidad y aislamiento
La cartera tiene sus propios scopes, y no necesitan ningún plan concreto. El plan solo importa dentro de la operación que añade un NIF, a través del gate del NIF adicional:
companies:readlista y consulta NIF, lee las estadísticas, la aptitud de emisión y el estado de creación, y previsualiza el cargo.companies:writeda de alta, actualiza, reactiva (uno o varios), desactiva y verifica la creación.companies:deletearchiva.
Ninguno de los tres se concede por OAuth: usa una API key.
Capacidad de cuenta. Toda escritura es una capacidad de la cuenta. La persona que emitió la clave debe ser titular o administrador de la cuenta con la sección user_management disponible, y si no la respuesta es 403 forbidden_action, antes de cobrar o cambiar nada. Una escritura que puede comprar plazas (alta, reactivación, lote y verificación) necesita además una clave que alcance la empresa titular, que es la que paga.
Nivel en el NIF. Una clave tiene view u operate en cada NIF que alcanza, como explican las claves acotadas. Con view, una escritura sobre ese NIF responde 403 company_read_only y no cambia nada, y sin acceso responde el mismo 404 que un NIF fuera de la cuenta.
Aislamiento. Un {company} que no existe, pertenece a otra cuenta, está fuera de lo que lee tu clave, pertenece al otro entorno o no es un identificador responde el mismo 404 resource_not_found, con param company, y nunca un 403: un 403 diría que el NIF existe. Un {account} que no es la cuenta de tu clave responde 404 account_not_found.
{
"error": {
"type": "not_found_error",
"code": "resource_not_found",
"message": "NIF no encontrado en la cuenta.",
"param": "company",
"doc_url": "https://docs.factuarea.com/guides/errors#resource_not_found",
"request_id": "req_01J8Y3M2Q4CF0000000000RNF1"
}
}Un NIF que alcanzas solo por una relación entre cuentas no es un NIF de tu cuenta. Editar, activar, desactivar, archivar o verificar un NIF cedido por tu propio {account} responde ese mismo 404, sin cambios y sin cobro. Sus datos se sirven por el eje de empresa, como explica alcanzar un NIF. Las cuentas gestionadas describen la lista cerrada de rutas en las que {account} puede nombrar una cuenta gestionada en lugar de la tuya.
Claves de pruebas. Una clave fact_test_ pertenece a tu cuenta real, así que lee tu cartera como una clave de producción. Toda escritura de la cartera sobre tu cuenta de producción responde 403 live_credential_required, sin escribir nada. Probar cuentas gestionadas cubre lo que puede hacer una clave de pruebas.
Identidad para el envío de documentos
Enviar un documento por email puede exigir que se acredite la identidad del remitente, y una cuenta nueva parte de un régimen más estricto. Un NIF toma las dos cosas de la empresa de la que hereda su confianza:
- La empresa titular de una cuenta no hereda de nadie.
- Cualquier otro NIF de una cuenta que no es gestionada, porque la cuenta lo compró, lo recibió por traspaso o lo dio de alta, hereda de la empresa titular de su propia cuenta.
- Los NIF de una cuenta gestionada heredan de la empresa titular de la cuenta del proveedor mientras dure la gestión, y de su propia empresa titular cuando termina.
- Un NIF que alcanzas por un acceso cedido no hereda nada de la cuenta receptora: su confianza sigue siendo la de la empresa titular de su propia cuenta.
422 sender_identity_not_verified significa que hay que corregir la identidad de la empresa de la que hereda el NIF, y un 429 corresponde a un presupuesto de envío distinto. Consulta enviar documentos y qué comparten los NIF de una cuenta.
Sigue la cartera con eventos
Los webhooks de cuenta publican lo que pasa con los NIF de la cuenta: account.nif_added cuando uno entra (registered cuando lo das de alta tú), account.nif_transferred con direction in o out cuando uno se mueve por traspaso, y account.nif_archived cuando archivas uno. El catálogo no tiene ningún evento para desactivar o reactivar un NIF.
Relacionado
la cuenta, su equipo, los grants por NIF y el traspaso de NIF.
el plan, las plazas contratadas, el trial y el tope cuando tu cuenta añade un NIF.
elige el NIF en cada petición con el segmento {company}.
claves que alcanzan solo una parte de la cuenta.
deja que otra cuenta alcance todos o algunos de tus NIF con view u operate.
aprovisiona cuentas para tus clientes por API.
recibe en un solo endpoint los eventos de tu cuenta y de sus NIF.