Todos los error codes
Referencia completa de cada error code de la API pública, agrupado por bounded context, con su estado HTTP y type.
Esta es la referencia canónica de todos los code de error que puede devolver la API pública, agrupados por el bounded context que los emite. Cada code es estable entre versiones; el message es solo para mostrar. El total y la agrupación se generan del catálogo en vivo.
Cuenta
| Code | Type | HTTP | Descripción |
|---|---|---|---|
access_level_raise_forbidden | invalid_request_error | 422 | Se intentó subir el nivel de acceso sobre una cuenta gestionada cuyo titular ya la reclamó. Desde la reclamación solo el titular puede subir ese nivel; el proveedor solo puede bajarlo. |
account_not_found | not_found_error | 404 | No se pudo resolver la cuenta asociada a la clave, lo que suele significar que la clave ya no apunta a una empresa viva. |
administrator_key_not_grantable | invalid_request_error | 422 | Una de las secciones de grants es una llave del Administrador (gestión de usuarios, plan y suscripción, API y desarrolladores o certificado digital) y esas secciones no se conceden a un miembro. |
api_key_already_revoked | invalid_request_error | 422 | La clave ya estaba revocada, y una clave revocada no admite más operaciones: la revocación es terminal. |
api_key_not_found | not_found_error | 404 | El identificador no corresponde a ninguna API key de la empresa autenticada. |
enterprise_contract_transition_required | invalid_request_error | 422 | La cuenta gestionada tiene un contrato enterprise y, al terminar la gestión, su pago pasaría al titular sin que Factuarea haya fijado todavía el plan con el que continúa. Nunca se crea una suscripción sin precio, así que no se ha cambiado nada. |
external_advisor_already_assigned | invalid_request_error | 422 | La cuenta ya tiene un asesor externo marcado: solo puede haber uno por cuenta. |
grant_company_not_in_account | invalid_request_error | 422 | El NIF del grant no es un NIF real de la cuenta o queda fuera del ámbito de NIF de la credencial. La respuesta es la misma en los dos casos, sin revelar cuál. |
grants_only_for_member | invalid_request_error | 422 | Solo un miembro con rol member puede tener permisos por NIF (grants). El titular (owner) y los administradores (admin) alcanzan todos los NIF de la cuenta, así que un grant sobre ellos no significaría nada. |
import_file_invalid | invalid_request_error | 422 | Uno de los ficheros de la importación no se puede leer con el formato de la plantilla: no es un CSV legible, su cabecera no aparece en las 20 primeras líneas, le falta una columna obligatoria o tiene una línea rota. param indica qué fichero falla (accounts_file o customers_file) y el mensaje, la columna o la línea. No se ha escrito nada. |
import_file_too_large | invalid_request_error | 413 | Uno de los ficheros de la importación supera los 5 MB. El tamaño se comprueba antes de leer ninguna fila, así que no se ha procesado ni escrito nada. param indica qué fichero falla (accounts_file o customers_file). |
import_in_progress | conflict_error | 409 | Ya hay una importación masiva de esta cuenta proveedora en curso. Las importaciones de una misma cuenta se aplican de una en una para no crear cuentas, cargos ni NIF por duplicado, así que esta no se ha aplicado ni ha escrito nada. |
import_row_limit_exceeded | invalid_request_error | 422 | Uno de los ficheros de la importación trae más filas de las que admite una importación: 100 en el fichero de cuentas (accounts_file) y 1.000 en el de clientes (customers_file). Las filas se cuentan antes de leerlas, así que no se ha procesado ni escrito nada. param indica qué fichero falla. |
invitation_expired | invalid_request_error | 422 | La invitación existe y es de esta empresa, pero su ventana de aceptación ya se cerró, así que quien la recibió no puede canjearla. |
invitation_not_found | not_found_error | 404 | El identificador no corresponde a ninguna invitación pendiente de la empresa autenticada: puede haberse cancelado, haberse aceptado ya o pertenecer a otra empresa. |
live_credential_required | authorization_error | 403 | Una clave de pruebas intentó modificar una cuenta de producción. Solo ocurre en las operaciones que cambian la cuenta —miembros, invitaciones, titularidad, traspasos de NIF, cartera de NIF, claves y asientos—: una clave de pruebas no puede alterar datos reales. |
managed_account_external_ref_in_other_environment | conflict_error | 409 | La referencia externa ya la usa una cuenta gestionada del otro entorno (real o de pruebas). La referencia es única entre los dos entornos, y la respuesta no nombra esa cuenta porque este entorno no la lista. No se ha escrito nada. |
managed_account_not_claimable | invalid_request_error | 422 | La cuenta gestionada es de pruebas, y una cuenta de pruebas nunca se reclama: no tiene vale de reclamación que emitir ni que reemitir. |
managed_account_plan_not_self_serve | invalid_request_error | 422 | Se pidió el plan enterprise para una cuenta gestionada. Una cuenta gestionada se crea o se cambia en emprendedor o empresario; enterprise solo lo asigna Factuarea por contrato. |
managed_account_provider_in_trial | invalid_request_error | 422 | La cuenta proveedora está en periodo de prueba y pidió una cuenta gestionada real, que se cobra. Durante la prueba solo se pueden crear cuentas gestionadas de pruebas. |
managed_accounts_limit_reached | invalid_request_error | 422 | La cuenta proveedora ya tiene tantas cuentas gestionadas reales con la gestión vigente como admite su tope. Las cuentas gestionadas de pruebas no cuentan para ese tope. |
member_is_last_owner | invalid_request_error | 422 | La operación dejaría el NIF sin ninguna persona que lo administre: el miembro que se da de baja, o que se degrada a un rol sin administración, es el último con rol owner o admin en ese NIF. |
member_not_found | not_found_error | 404 | El identificador no corresponde a ningún miembro del equipo de la cuenta: o esa persona nunca perteneció a la empresa autenticada, o es de otra. La superficie de cuenta responde igual en ambos casos. |
module_not_grantable | invalid_request_error | 422 | Una de las secciones de grants no se puede conceder: no es una sección exclusiva de administradores (un miembro ya accede a ella con permisos normales) o la empresa no la tiene por su plan. |
nif_transfer_expired | invalid_request_error | 422 | El traspaso de NIF se emitió de verdad, pero su plazo de validez venció. A diferencia de un traspaso no reconocido, esta respuesta solo le llega a quien ya tenía uno real, así que no revela nada nuevo. |
nif_transfer_invalid | invalid_request_error | 422 | El traspaso de NIF presentado no autoriza nada: su secreto está mal copiado, truncado, ya consumido o nunca se emitió. Todos esos casos responden igual a propósito, para que la operación no sirva para sondear qué traspasos existen. |
owner_transfer_forbidden | authorization_error | 403 | Quien hace la petición no está autorizado a transferir la titularidad de la cuenta: o no es el titular actual, o el destinatario propuesto no puede recibirla. Es cuestión de permiso, no de payload mal formado. |
permissions_not_applicable_to_administrator | invalid_request_error | 422 | El miembro es owner o admin de la cuenta: tiene todos los permisos de su plan y no admite restricciones ni concesiones de secciones. |
permissions_not_applicable_to_employee | invalid_request_error | 422 | La persona es un empleado del portal del empleado: su acceso lo gobierna el portal y no la matriz de secciones, así que no admite restricciones ni concesiones. |
plan_limit_exceeded | payment_required_error | 402 | Se alcanzó un límite de recursos del plan de la empresa. |
privileged_scope_required | authorization_error | 403 | La operación exige el privilegio de proveedor de cuentas (accounts:read o accounts:write) y no se cumple: o la cuenta de la clave no lo tiene concedido, o la persona que emitió la clave ya no es propietaria ni administradora de la cuenta. Las dos causas responden igual. |
provisioning_account_claimed | conflict_error | 409 | El titular ya reclamó esta cuenta gestionada y la administra por su cuenta: ya no se puede reclamar otra vez, reemitir su vale de reclamación ni volver a provisionarla con la misma referencia externa. |
relation_already_exists | invalid_request_error | 422 | Ya hay un acceso pendiente o vigente entre estas dos cuentas, y solo puede haber uno abierto por cada pareja de cuentas. |
relation_company_not_in_grantor | invalid_request_error | 422 | La lista de NIF del acceso no es válida: o nombra un NIF que no pertenece a la cuenta que cede el acceso, o viene vacía. El error señala el campo company_ids y no dice cuál de los NIF falla. |
relation_invitation_expired | invalid_request_error | 422 | La invitación de acceso existe y sigue pendiente, pero su plazo de aceptación venció, así que ya no se puede aceptar. |
relation_invitation_invalid | invalid_request_error | 422 | La invitación de acceso presentada no sirve: su secreto no existe, ya se usó, se revocó o va dirigida a otra cuenta. Todos esos casos responden igual a propósito, para que la operación no sirva para sondear invitaciones ajenas. |
relation_self_grant_not_allowed | invalid_request_error | 422 | La cuenta indicada no puede recibir el acceso: o es la misma cuenta que lo cede, o el identificador no corresponde a una cuenta válida. Los dos casos responden igual. |
relation_transition_not_allowed | invalid_request_error | 422 | El acceso entre cuentas está en un estado que no admite el cambio pedido: por ejemplo, aceptar uno que ya está vigente o reenviar la invitación de uno que ya terminó. |
sender_identity_not_verified | invalid_request_error | 422 | La empresa emisora todavía no ha acreditado su identidad, y sin eso no puede escribir a destinatarios externos desde el dominio remitente compartido. No es un cupo agotado ni un problema de permisos: la credencial tiene el scope, y esperar no lo resuelve. |
Autenticación
| Code | Type | HTTP | Descripción |
|---|---|---|---|
api_key_expired | authentication_error | 401 | La clave pasó su fecha de caducidad. |
api_key_revoked | authentication_error | 401 | La clave fue revocada, y una clave revocada no vuelve a autenticar nunca: revocar es justamente la forma de cortar una credencial filtrada. |
invalid_api_key | authentication_error | 401 | La clave no corresponde a ninguna clave activa. Puede estar mal copiada, truncada, o pertenecer a otro entorno: las claves de prueba y las de producción no son intercambiables. |
ip_not_allowed | authentication_error | 401 | La clave restringe las direcciones que acepta, y la petición llegó desde una que no está en esa lista. |
missing_api_key | authentication_error | 401 | La petición no lleva credenciales: ni cabecera Authorization ni X-API-Key. |
origin_not_allowed | authentication_error | 401 | La petición viene de un origen de navegador que la clave no acepta. |
too_many_auth_failures | authentication_error | 429 | Llegaron demasiados intentos fallidos de autenticación desde la misma dirección, así que queda bloqueada temporalmente para frenar los intentos de adivinar credenciales. |
Autorización
| Code | Type | HTTP | Descripción |
|---|---|---|---|
addon_not_active | authorization_error | 403 | La funcionalidad pertenece a un add-on que ahora mismo no está activo para la empresa. |
company_read_only | authorization_error | 403 | Quien emitió la credencial tiene acceso de solo lectura (nivel view) a la empresa efectiva: su rol en la cuenta le permite ver ese NIF, no escribir en él. El nivel efectivo es el menor entre el guardado en la credencial y el que la persona tiene hoy. |
emitter_capability_restricted | authorization_error | 403 | La persona que emitió la credencial tiene retirada, en la empresa efectiva, la sección o la acción que exige la operación. Es la misma restricción por módulo que el administrador de la empresa le puso en la aplicación web, y se aplica aunque su nivel de acceso al NIF sea operate. |
feature_not_available_in_plan | authorization_error | 403 | La funcionalidad no está incluida en el plan de la empresa. |
forbidden_action | authorization_error | 403 | La acción se rechaza aunque el scope sea el correcto. Los motivos habituales son: tu credencial llega al NIF por una relación entre cuentas (acceso cedido a tu cuenta, o cuenta gestionada) y la operación pertenece a la cuenta dueña del NIF —el registro de peticiones, los eventos, los webhook endpoints, la facturación de la cuenta, el uso de automatizaciones y las escrituras de credenciales de cobro conectadas nunca están disponibles por una relación—; el NIF es de una cuenta gestionada cuyo titular ya la paga, así que su proveedor puede consultarlo y editar sus datos pero ya no activarlo, desactivarlo ni archivarlo; la persona que emitió la credencial no es owner ni admin de la cuenta, o la credencial no alcanza todos los NIF de la cuenta; o el recurso pertenece a un catálogo compartido, o el cambio va por otro endpoint. |
insufficient_scope | authorization_error | 403 | La clave autentica correctamente pero no lleva el scope que exige esta operación. Los scopes se conceden al emitir la clave y no se amplían en tiempo de llamada. |
max_api_keys_exceeded | authorization_error | 422 | La empresa alcanzó el número de API keys que permite su plan. |
max_webhook_endpoints_exceeded | authorization_error | 422 | La empresa alcanzó el número de endpoints de webhook que permite su nivel de add-on. |
module_not_available_in_sandbox | authorization_error | 403 | El recurso pertenece a un módulo vetado en modo test. La sandbox nunca toca AEAT, bancos ni cobros reales, así que esos módulos quedan fuera a propósito. |
portfolio_max_api_keys_exceeded | authorization_error | 422 | La cuenta ya tiene el máximo de credenciales ACTIVAS que admite una cartera. El tope rige cuando la cuenta tiene dos o más NIF reales y se cuenta sobre todas las credenciales activas de la cuenta, no por NIF, así que dar de alta otro NIF para acuñarle su credencial tampoco deja crear ésta. |
scope_not_allowed_by_plan | authorization_error | 422 | Uno de los scopes pedidos pertenece a un módulo que el plan no incluye, así que la clave nacería con un permiso que nunca podría ejercer. |
scope_not_allowed_in_sandbox | authorization_error | 422 | Una clave de prueba no puede nacer con scopes de módulos vetados en sandbox. |
Automatizaciones
| Code | Type | HTTP | Descripción |
|---|---|---|---|
automation_action_order_invalid | invalid_request_error | 422 | La posición de un paso dentro de la secuencia no es un número entero, o es negativa. Esa posición es la que fija el orden en que se ejecutan las acciones. |
automation_action_parameter_missing | invalid_request_error | 422 | No ha llegado un parámetro que la acción declara obligatorio. Se rechaza aquí, en vez de rellenarlo con un valor por defecto dentro del adaptador, para que el ensayo prediga la ejecución real. |
automation_action_parameter_unknown | invalid_request_error | 422 | Una clave de parámetro no pertenece al esquema de la acción. Aceptarla guardaría una configuración que ningún adaptador lee, y la creerías activa hasta que la regla se disparase e hiciera otra cosa. |
automation_action_parameter_value_invalid | invalid_request_error | 422 | Un parámetro de la acción lleva un valor fuera del conjunto que admite su esquema. |
automation_action_parameters_invalid | invalid_request_error | 422 | Los parámetros de una acción no se sostienen como conjunto: un valor no es serializable, una clave no es texto, han llegado juntos dos parámetros excluyentes, o una pareja que exige uno de los dos ha llegado sin ninguno. |
automation_action_type_invalid | invalid_request_error | 422 | Uno de los pasos declara un tipo de acción sin adaptador detrás, así que en esa posición no se ejecutaría nada. |
automation_active_rules_limit_exceeded | payment_required_error | 402 | La empresa ya tiene activas todas las automatizaciones que permite su plan. |
automation_chain_depth_exceeded | invalid_request_error | 422 | Una automatización disparó a otra hasta agotar el margen de encadenamiento, así que la ejecución se detiene antes de encolar ningún paso. Esperar no lo arregla: el mismo evento volvería a recorrer la misma cadena. |
automation_condition_combinator_invalid | invalid_request_error | 422 | Una rama de la condición declara un combinador lógico fuera del conjunto admitido, así que la rama no se puede leer como un «y» ni como un «o». |
automation_condition_depth_exceeded | invalid_request_error | 422 | La condición anida más niveles de los que recorre el evaluador, así que la regla no se puede evaluar entera. |
automation_condition_expression_invalid | invalid_request_error | 422 | La forma del árbol de condiciones no se sostiene: un nodo mal formado, un operador que recibe un valor de la clase equivocada, una ruta de campo que no es un camino con puntos, o un árbol que pasa del límite de profundidad o de nodos. |
automation_condition_field_not_evaluable | invalid_request_error | 422 | La condición lee un campo que el disparador no publica como evaluable. La lista de campos admitidos nunca resuelve una ruta desconocida con un valor por defecto, porque un campo resuelto en silencio es justo el agujero que el sandbox existe para cerrar. |
automation_condition_operator_invalid | invalid_request_error | 422 | Una comparación de la condición nombra un operador fuera del conjunto admitido. |
automation_condition_operator_not_applicable | invalid_request_error | 422 | El operador no aplica al tipo del campo que compara: preguntar si un texto es mayor que otro no es una comparación que el evaluador pueda hacer. |
automation_condition_operator_unsupported | invalid_request_error | 422 | El evaluador no implementa ese operador, así que se detiene en vez de responder «falso»: un «falso» en silencio haría indistinguible «la condición no se cumple» de «no se puede evaluar». |
automation_condition_payload_field_missing | invalid_request_error | 422 | La clave que lee la condición no viene en el payload del evento, que no es lo mismo que venir presente con valor nulo. Algunos eventos llevan un payload reducido: un borrado, por ejemplo, puede conservar solo el identificador. |
automation_condition_payload_type_mismatch | invalid_request_error | 422 | El valor del evento contradice el tipo que el disparador declara para ese campo, y el evaluador no convierte tipos: una comparación por conversión daría un veredicto correcto por accidente y ocultaría que el payload cambió de forma. |
automation_dry_run_event_type_mismatch | invalid_request_error | 422 | El ensayo se ha pedido con un tipo de evento distinto del disparador de la automatización que se ensaya, y una regla solo recibe eventos de su propio disparador. La predicción describiría una entrega que nunca va a ocurrir. |
automation_event_company_unresolvable | invalid_request_error | 422 | El evento llegó al motor sin una empresa resoluble, y el motor se detiene en vez de suponer una: escribir una ejecución bajo una empresa sustituida rompería el aislamiento entre empresas. |
automation_event_payload_not_resolvable | invalid_request_error | 422 | No se ha podido recuperar el contenido del evento, así que no hay payload que congelar en la ejecución. Ocurre cuando el recurso que hay detrás del evento ya no se puede leer en el momento de la entrega. |
automation_monthly_budget_exhausted | payment_required_error | 402 | La empresa agotó las ejecuciones de automatización que su plan incluye para el periodo en curso, así que la ejecución se detiene antes de encolar ningún paso. A diferencia de un límite de ritmo, esperar unos segundos no cambia nada: lo agotado es el presupuesto del ciclo. |
automation_portfolio_scope_forbids_action | invalid_request_error | 422 | Una de las acciones de la automatización actúa sobre datos de una sola empresa, y en alcance de cartera cada ejecución tiene por sujeto a un NIF distinto de la cartera. Sólo se admiten las acciones que avisan a la titular de la cuenta o que no tocan ninguna entidad. |
automation_portfolio_scope_not_available | authorization_error | 403 | La empresa no puede crear automatizaciones sobre su cartera: o no tiene concedido el módulo de gestoría, o no es la titular de su cuenta. La cartera la representa la titular, así que un NIF adicional de la cuenta nunca tiene cartera propia. |
automation_rate_limit_exceeded | rate_limit_error | 429 | La empresa superó las ejecuciones de automatización que su plan admite dentro de la ventana del limitador. El trabajo sí es admisible; sencillamente llegó demasiado rápido. |
automation_replay_not_allowed | invalid_request_error | 422 | La ejecución existe y es tuya, pero relanzarla no procede: aún no ha terminado, terminó bien y su efecto ya se produjo, su desenlace volvería a tomar exactamente la misma rama, o no consta el motivo por el que acabó. |
automation_rule_actions_empty | invalid_request_error | 422 | La automatización no declara ninguna acción, así que no habría nada que ejecutar cuando saltara su disparador. |
automation_rule_actions_limit_exceeded | invalid_request_error | 422 | La regla contiene más de 50 acciones. Un solo evento disparador se multiplicaría en demasiados pasos, jobs en cola y posibles efectos externos. |
automation_rule_already_deleted | invalid_request_error | 422 | La automatización ya estaba dada de baja. El borrado es lógico y no devuelve éxito en silencio la segunda vez, para que dos bajas distintas no se confundan entre sí. |
automation_rule_company_mismatch | invalid_request_error | 422 | La automatización que iba a materializarse no pertenece a la empresa del evento, así que la ejecución no se crea: congelar el snapshot de un evento —cliente, importes, identificador fiscal— en filas de otra empresa no se permite nunca. |
automation_rule_name_invalid | invalid_request_error | 422 | El nombre está vacío o supera el límite de longitud. El nombre es lo que identifica la automatización en los listados y en el histórico de sus ejecuciones. |
automation_rule_not_found | not_found_error | 404 | No existe ninguna automatización con ese identificador para la empresa autenticada. Una regla de otra empresa responde exactamente igual, así que la respuesta nunca revela si existe en otro sitio. |
automation_rule_scope_immutable | invalid_request_error | 422 | La petición intenta cambiar el alcance de una automatización que ya existe. El alcance se fija al crearla porque determina de qué empresas observa los eventos, y cambiarlo reinterpretaría todas sus ejecuciones anteriores. |
automation_rule_scope_invalid | invalid_request_error | 422 | El alcance enviado no pertenece al catálogo de la automatización. Sólo existen dos: la empresa que la crea y la cartera de su cuenta (sus otros NIF y los que otra cuenta le cede con nivel de operación). |
automation_rule_status_transition_invalid | invalid_request_error | 422 | La automatización no puede pasar de su estado actual al que pides: activar, pausar y dar de baja aceptan cada uno sus propios estados de origen. |
automation_rule_uuid_invalid | invalid_request_error | 422 | El identificador no es un UUID v7 válido. Las automatizaciones direccionan sus recursos por el id que devuelve la API, nunca por un número interno. |
automation_rule_version_not_found | not_found_error | 404 | La automatización existe, pero no tiene ninguna versión con ese número: cada guardado publica una versión nueva y la numeración nunca reutiliza un valor. |
automation_rule_version_number_invalid | invalid_request_error | 422 | El número de versión es menor que 1. Las versiones se numeran desde uno hacia arriba, en el orden en que se publicaron. |
automation_rule_version_snapshot_not_found | not_found_error | 404 | La ejecución apunta a una versión de la automatización cuya definición congelada no está guardada, así que no hay definición que ejecutar: una ejecución corre siempre la versión con la que empezó, nunca la regla viva. |
automation_run_not_found | not_found_error | 404 | No existe ninguna ejecución de automatización con ese identificador para la empresa autenticada. Una ejecución de otra empresa responde exactamente igual, así que la respuesta nunca revela si existe en otro sitio. |
automation_run_status_transition_invalid | invalid_request_error | 422 | La ejecución no puede pasar de su estado actual al solicitado: el ciclo de vida de una ejecución solo admite las transiciones que declara su estado. |
automation_run_step_not_found | not_found_error | 404 | La ejecución existe y es tuya, pero no tiene ningún paso en ese índice. Una ejecución materializa todos sus pasos al arrancar y el número no cambia después. |
automation_run_uuid_invalid | invalid_request_error | 422 | El identificador de la ejecución no es un UUID v7 válido. |
automation_step_index_invalid | invalid_request_error | 422 | El índice de un paso no puede ser negativo: ninguna ejecución direcciona un paso así. |
automation_step_status_transition_invalid | invalid_request_error | 422 | El paso no puede pasar de su estado actual al solicitado. Es lo que impide reclamar dos veces un paso ya terminado, y esa guarda es la que hace que un relanzamiento produzca cada efecto una sola vez. |
automation_step_subject_company_mismatch | invalid_request_error | 422 | El elemento sobre el que iba a actuar la acción no pertenece a la empresa de la ejecución, o no se ha podido determinar a qué empresa pertenece. En los dos casos el paso aborta antes de invocar el adaptador, así que no se produce ningún efecto. |
automation_subject_company_ownership_not_verified | invalid_request_error | 422 | Al preparar la ejecución no se pudo demostrar que la empresa del evento siga en la cartera de la cuenta de quien creó la automatización, alcanzable con nivel de operación y activa. Puede que el NIF se archivara, se desactivara o se traspasara a otra cuenta, que la relación que lo cedía se revocara, terminara o bajara a solo consulta, o que la ejecución llegara con datos cruzados. |
automation_trigger_not_found | not_found_error | 404 | El disparador no está en el catálogo que tu empresa puede ver. Un nombre que no existe y un disparador real cuyo módulo tu empresa no tiene concedido responden igual, así que la respuesta nunca confirma cuál de los dos casos es. |
automation_trigger_payload_contract_unknown | invalid_request_error | 422 | El disparador no publica contrato de campos evaluables, así que no hay catálogo contra el que resolver una condición. |
automation_trigger_type_invalid | invalid_request_error | 422 | La escritura lleva un disparador que no está en el catálogo disponible para tu empresa, así que la regla no recibiría ningún evento. |
Facturación
| Code | Type | HTTP | Descripción |
|---|---|---|---|
customer_offer_benefit_invalid | invalid_request_error | 422 | Las condiciones de la oferta no son válidas. Revisa los campos indicados. |
customer_offer_billing_state_conflict | conflict_error | 409 | El estado de facturación ha cambiado o necesita revisión. Consulta la operación antes de continuar. |
customer_offer_catalog_unavailable | service_unavailable_error | 503 | El catálogo de cobro no está configurado o no puede verificarse; no es una restricción del plan del cliente. |
customer_offer_collection_not_restorable | invalid_request_error | 422 | La compra no puede cobrarse o restaurar su saldo de forma segura. No se deja deuda para otra factura. |
customer_offer_combination_invalid | invalid_request_error | 422 | Los días extra sólo se combinan con un descuento o precio de plan permanente. |
customer_offer_discount_conflict | conflict_error | 409 | Esta compra ya tiene una oferta o un descuento vigente para el mismo concepto. No se acumulan automáticamente. |
customer_offer_forbidden | authorization_error | 403 | La operación no cumple las condiciones o permisos vigentes. |
customer_offer_gateway_unavailable | service_unavailable_error | 503 | El proveedor de pagos no está disponible. Comprueba esta operación antes de reintentar. |
customer_offer_idempotency_conflict | idempotency_error | 409 | Este intento ya corresponde a otras condiciones. Conserva la operación y comprueba su estado. |
customer_offer_invalid_terms | invalid_request_error | 422 | Las condiciones de la oferta no son válidas. Revisa los campos indicados. |
customer_offer_legacy_outcome_unknown | conflict_error | 409 | Una operación anterior de facturación sigue pendiente de comprobación. |
customer_offer_negotiated_price_invalid | invalid_request_error | 422 | Revisa el precio neto, producto, intervalo y número de ciclos acordados. |
customer_offer_not_eligible | invalid_request_error | 422 | Esta oferta no es compatible con la empresa, producto o estado actual. |
customer_offer_operation_in_progress | conflict_error | 409 | Ya hay una operación en curso para este concepto. Comprueba su estado antes de continuar. |
customer_offer_payment_method_required | payment_required_error | 402 | Esta compra necesita un método de pago. Añádelo y actualiza las condiciones antes de confirmar. |
customer_offer_phase_incompatible | conflict_error | 409 | La suscripción tiene un cambio programado incompatible. No se ha sustituido. |
customer_offer_price_mapping_conflict | conflict_error | 409 | El estado de facturación ha cambiado o necesita revisión. Consulta la operación antes de continuar. |
customer_offer_purchase_failed | payment_required_error | 402 | El pago ha fallado y se ha verificado que esta compra no se ha aplicado. Consulta la operación antes de volver a intentarlo. |
customer_offer_quote_changed | conflict_error | 409 | Las condiciones han cambiado. Actualiza la cotización antes de confirmar. |
customer_offer_quote_expired | conflict_error | 409 | La cotización ha vencido. Actualízala y revisa las condiciones. |
customer_offer_quote_unavailable | service_unavailable_error | 503 | No se puede verificar el importe. La confirmación queda bloqueada. |
customer_offer_state_conflict | conflict_error | 409 | El estado de facturación ha cambiado o necesita revisión. Consulta la operación antes de continuar. |
customer_offer_trial_baseline_changed | conflict_error | 409 | La prueba ha cambiado. Actualiza la cotización para ver la fecha vigente. |
customer_offer_trial_limit_exceeded | invalid_request_error | 422 | La ampliación superaría el máximo de 180 días de prueba. |
customer_offer_trial_not_eligible | invalid_request_error | 422 | Sólo puedes ampliar una prueba activa del plan acordado. Una prueba vencida no se reinicia. |
customer_offer_unavailable | invalid_request_error | 422 | La oferta no está disponible, ha vencido o ha agotado sus canjes. |
Empresas
| Code | Type | HTTP | Descripción |
|---|---|---|---|
additional_nif_charge_failed | payment_required_error | 402 | El cobro inmediato del NIF adicional fue rechazado: la tarjeta se denegó, necesita autenticación, o el proveedor de pago estaba inaccesible. Si no se cobra, el NIF no se añade ni se activa y no queda ningún cargo. |
additional_nif_not_in_plan | authorization_error | 403 | La cuenta tiene un plan vigente, pero ese plan no incluye NIF adicionales: solo Empresario y Enterprise (también en prueba) los admiten. No se ha cobrado nada ni se ha escrito ningún cambio. |
additional_nif_plan_required | payment_required_error | 402 | La cuenta no tiene un plan vigente, así que no hay suscripción sobre la que cobrar el NIF adicional. No se ha cobrado nada ni se ha escrito ningún cambio. |
billing_managed_by_provider | authorization_error | 403 | La facturación de esta cuenta la paga otra cuenta, así que esta no puede contratar por su cuenta un NIF adicional. No se ha cobrado nada ni se ha escrito ningún cambio. |
company_inactive | authorization_error | 403 | La empresa que nombra el segmento {company} de la ruta está dentro del ámbito de la credencial, pero está desactivada y no se puede operar hasta que vuelva a estar activa. |
payment_method_required | payment_required_error | 402 | Añadir o activar un NIF adicional cobra su cuota de inmediato, y la cuenta opera en modo real sin método de pago configurado. No se ha cobrado nada ni se ha escrito ningún cambio. |
Contactos
| Code | Type | HTTP | Descripción |
|---|---|---|---|
alternative_id_type_invalid | invalid_request_error | 422 | El tipo de identificador alternativo queda fuera del catálogo nif_iva, passport, country_id, residence_certificate, other_document, not_registered. |
bank_account_usage_required | invalid_request_error | 422 | La cuenta bancaria no declara para qué sirve: ni collection ni payment, y tampoco marca un uso predeterminado del que deducirlo. Una cuenta sin propósito no puede usarse en cobros ni en pagos. |
cannot_have_both_tax_id_and_alternative_id | invalid_request_error | 422 | El cliente envía tax_id y un identificador alternativo a la vez. La identidad fiscal es una: el identificador alternativo existe precisamente para partes sin NIF español. |
census_requires_tax_id | invalid_request_error | 422 | La verificación censal contrasta el par nombre + NIF contra la AEAT, y falta uno de los dos. |
client_has_documents | invalid_request_error | 422 | El cliente está referenciado por documentos emitidos. Borrarlo dejaría facturas, presupuestos o albaranes sin la parte a la que se emitieron, y los registros fiscales tienen que seguir siendo trazables. |
client_import_too_large | invalid_request_error | 422 | El CSV supera el límite de filas que admite la importación síncrona, ya que el fichero entero se procesa dentro de la propia petición. |
client_not_found | not_found_error | 404 | El identificador no resuelve a ningún cliente de la empresa autenticada. |
client_requires_tax_identity | invalid_request_error | 422 | El cliente no tiene identidad fiscal: ni tax_id ni identificador alternativo, y no se puede emitir una factura a una parte sin identificar. |
contact_not_found | not_found_error | 404 | El identificador no resuelve a ningún contacto comercial de la empresa autenticada. |
direct_debit_requires_default_bank_account | invalid_request_error | 422 | Se eligió domiciliación bancaria como método de pago, pero el cliente no tiene cuenta bancaria por defecto a la que cargar. |
import_not_found | invalid_request_error | 404 | La importación de contactos o su reporte no está disponible en la empresa autenticada. |
mapping_header_not_found | invalid_request_error | 422 | Una columna del mapeo de la importación no existe en las cabeceras del fichero subido. |
supplier_has_documents | invalid_request_error | 422 | El proveedor está referenciado por gastos registrados, y borrarlo dejaría esos gastos sin su emisor. |
supplier_not_found | not_found_error | 404 | El identificador no resuelve a ningún proveedor de la empresa autenticada. |
tax_id_already_exists | conflict_error | 409 | Otro cliente de la empresa ya tiene ese NIF, y el NIF identifica a la parte sin ambigüedad dentro de una empresa. |
Albaranes
| Code | Type | HTTP | Descripción |
|---|---|---|---|
delivery_note_cannot_be_sent | invalid_request_error | 422 | El albarán ya está facturado o cancelado: entregarlo ahora le daría al cliente un documento superado. |
delivery_note_not_found | not_found_error | 404 | El identificador no resuelve a ningún albarán de la empresa autenticada. |
delivery_note_section_not_editable_in_status | invalid_request_error | 422 | La sección logística —transportista, vehículo, conductor— está congelada porque el albarán ya está entregado, facturado o cancelado. |
driver_tax_id_requires_name | invalid_request_error | 422 | Se envió el NIF del conductor sin su nombre, y un identificador sin nombre no identifica a nadie en el documento de entrega. |
signature_payload_too_large | invalid_request_error | 422 | La imagen de la firma supera el tamaño admitido para el campo. |
Empleados
| Code | Type | HTTP | Descripción |
|---|---|---|---|
employee_batch_billing_state_conflict | conflict_error | 409 | La facturación necesita revisión antes de continuar con esta operación. |
employee_batch_forbidden | authorization_error | 403 | Ya no tienes permiso para esta operación. Comprueba el estado antes de empezar otra. |
employee_batch_idempotency_conflict | idempotency_error | 409 | Esta solicitud corresponde a otros datos. Revisa la operación antes de preparar un lote nuevo. |
employee_batch_quote_changed | conflict_error | 409 | Las condiciones han cambiado. Actualiza la cotización y acepta el nuevo importe. |
employee_batch_quote_expired | conflict_error | 409 | La cotización ha vencido. Actualízala y revisa el importe. |
employee_batch_quote_unavailable | service_unavailable_error | 503 | No se puede obtener un importe fiable. Inténtalo de nuevo sin iniciar otro pago. |
employee_batch_state_conflict | conflict_error | 409 | Esta acción ya no está disponible. Consulta el estado actual de la operación. |
employee_inactive | invalid_request_error | 422 | El empleado está dado de baja: es de solo lectura y no admite operaciones nuevas, como fichar la entrada, asignarle un horario o una política de ausencias, aprobarle una ausencia que pasa de su fecha de baja o invitarle al portal. No se ha escrito nada. |
employee_not_found | not_found_error | 404 | El empleado no existe o no es accesible en esta empresa. |
employee_seat_charge_failed | payment_required_error | 402 | El cobro inmediato del prorrateo del asiento de empleado fue rechazado: la tarjeta se denegó, necesita autenticación, o el proveedor de pago estaba inaccesible. El empleado no se activa si el asiento no se cobra. |
employee_seat_mutation_outcome_unknown | conflict_error | 409 | Una operación anterior de empleados sigue pendiente de comprobación. No repitas el cargo. |
employee_seat_operation_in_progress | conflict_error | 409 | Hay una operación de plazas en curso. Recupérala antes de iniciar otra. |
employee_seat_payment_method_required | payment_required_error | 402 | Dar de alta o reactivar un empleado cobra un asiento de inmediato, y la empresa opera en modo real sin método de pago configurado. |
employee_seat_phase_incompatible | conflict_error | 409 | La suscripción tiene condiciones programadas que no pueden conservarse mediante esta modificación de plazas. |
employee_seats_not_in_plan | authorization_error | 403 | El plan de la cuenta no incluye el control horario (el módulo control_horario, por plan o por una concesión manual), así que no se pueden comprar plazas de empleado. No se ha cobrado nada ni se ha escrito ningún cambio; bajar o mantener las plazas contratadas sigue permitido. |
invalid_hire_date | invalid_request_error | 422 | La fecha de alta del empleado quedaría después de su fecha de baja: al corregir hire_date con una fecha posterior a la baja ya registrada, o al dar de baja con una termination_date anterior al alta. El empleado no se modifica. |
Events
| Code | Type | HTTP | Descripción |
|---|---|---|---|
event_not_found | not_found_error | 404 | El identificador no corresponde a ningún evento de la empresa autenticada, o el evento fue purgado por la política de retención de 30 días. |
Exportaciones
| Code | Type | HTTP | Descripción |
|---|---|---|---|
export_budget_exceeded | rate_limit_error | 429 | Se ha agotado el presupuesto horario de TRABAJO DE EMPAQUETADO de la empresa. No es un límite de peticiones: cuenta documentos empaquetados y artefactos generados contra el disco y el pool de render que comparten todos los inquilinos, así que ni repartir las llamadas ni usar otra credencial cambian nada. El subcode dice cuál de los dos ejes se agotó: export_documents_budget (el contenido empaquetado) o export_artifacts_budget (el número de ficheros generados). |
export_byte_cap_exceeded | invalid_request_error | 413 | La descarga empaquetada supera el tope de BYTES de ese tipo de artefacto. No cuenta documentos sino peso, así que un lote pequeño de documentos muy pesados —con plantilla ilustrada o adjuntos— también lo alcanza. El subcode dice en qué momento se rechazó: before_writing, cuando el peso estimado ya lo superaba y NO se llegó a escribir nada, o while_writing, cuando el peso real lo superó durante el empaquetado y el fichero parcial se descartó. |
export_document_cap_exceeded | invalid_request_error | 413 | La descarga empaquetada pide MÁS DOCUMENTOS de los que admite ese tipo de artefacto. No es un límite de peticiones ni un problema de permisos: es el tamaño de lo que se pide en una sola llamada, y el mismo tope rige en la aplicación web y en la API, de modo que partir el trabajo entre superficies no lo esquiva. |
Empresas gestionadas
| Code | Type | HTTP | Descripción |
|---|---|---|---|
gestoria_seat_preview_unavailable | service_unavailable_error | 503 | No se pudo verificar el importe del cargo de empresas gestionadas; no es una operación gratuita por contrato. |
Idempotency
| Code | Type | HTTP | Descripción |
|---|---|---|---|
idempotency_key_in_use | idempotency_error | 409 | Hay otra petición con la misma Idempotency-Key todavía en curso, y aún no se conoce su resultado. |
idempotency_key_invalid | invalid_request_error | 400 | La Idempotency-Key no encaja con el formato admitido: entre 1 y 255 caracteres ASCII imprimibles. |
idempotency_key_required | invalid_request_error | 422 | La petición llegó sin cabecera Idempotency-Key y esta operación entrega un efecto que no se puede deshacer —un correo enviado, un fichero generado, un cargo—, así que su ventana de transición ya cerró para el entorno de esta credencial. |
idempotency_key_reused | idempotency_error | 422 | Esa Idempotency-Key ya se usó con un payload distinto. La clave identifica una operación concreta, así que reutilizarla para otra vaciaría de sentido el replay. Un external_id ya emitido que se reenvía con otro tipo o total en POST /v1/companies/{company}/invoices no devuelve este error, sino el 409 unattended_replay_mismatch. |
Integraciones
| Code | Type | HTTP | Descripción |
|---|---|---|---|
charge_rule_invalid | invalid_request_error | 422 | La regla no es coherente: la condición, el resultado, el motivo de no facturación, el concepto o el IVA no encajan entre sí o no son válidos. El campo conflictivo se indica en param. |
charge_rule_limit_reached | invalid_request_error | 422 | La cuenta de Stripe ya tiene el número máximo de reglas de tratamiento de cobros. |
charge_rule_not_found | not_found_error | 404 | La regla de tratamiento de cobros no existe en la cuenta de Stripe indicada o no pertenece a tu empresa. |
connect_return_domain_already_exists | conflict_error | 409 | El host que intentas dar de alta ya es uno de los dominios de retorno de tu cuenta. Se compara normalizado (minúsculas, sin puerto ni ruta), así que App.Ejemplo.com y app.ejemplo.com son el mismo dominio. |
connect_return_domain_limit_reached | invalid_request_error | 422 | Tu cuenta ya tiene el número máximo de dominios de retorno que admite, y no se ha guardado el nuevo. El tope es por cuenta y cuenta todos los dominios dados de alta. |
connect_return_domain_not_found | not_found_error | 404 | El dominio de retorno que indicas en la ruta no existe en tu cuenta, o pertenece a otra: las dos respuestas son idénticas a propósito para no revelar los dominios de otras cuentas. |
connect_return_url_not_allowed | invalid_request_error | 422 | El host de la return_url no figura entre los dominios de retorno de la cuenta de la clave con la que inicias la conexión de Stripe. Solo se aceptan direcciones https cuyo host (exacto, sin comodines) esté dado de alta en esa cuenta, para que nadie pueda llevar a la persona a un sitio que no controlas. |
invalid_connection_method | invalid_request_error | 422 | El método de conexión indicado no existe para este proveedor. |
platform_account_subscriptions_owned_by_billing | invalid_request_error | 422 | La cuenta de Stripe conectada es la de la propia plataforma: las cuotas de suscripción de Factuarea las factura Facturación directamente, así que esa cuenta no admite la autofacturación de suscripciones (subscription_autoinvoicing_enabled). |
shopify_api_version_expired | api_error | 500 | La versión de la API de administración con la que hablamos con la tienda ya no está soportada. Shopify no devuelve un error cuando eso pasa: sirve la versión estable más antigua con código 200, así que la avería aparece como campos que dejan de estar en la respuesta. |
shopify_credentials_rejected | invalid_request_error | 422 | La tienda ha contestado y ha rechazado el token de acceso, o no había ninguno que usar. En Shopify el token nace de la autorización de la app y el comerciante puede revocarla desde su panel en cualquier momento, así que un token que funcionaba ayer puede no valer hoy sin que nadie haya tocado la configuración. |
shopify_store_unreachable | api_error | 502 | La tienda no ha contestado: se agotó el tiempo de espera, falló el transporte, Shopify devolvió un error propio o se agotó el presupuesto de coste de consulta de la API de administración. Lo que falla está aguas arriba y no en la credencial. |
store_already_connected | invalid_request_error | 422 | Esa tienda ya está conectada a tu empresa con el mismo proveedor. El par proveedor + tienda remota es único por empresa, así que conectarla dos veces dejaría dos tiendas ingiriendo los mismos pedidos y facturándolos por duplicado. |
store_external_id_mismatch | invalid_request_error | 422 | El identificador remoto que envías no corresponde a ninguna tienda que tu empresa haya autorizado para esa integración. En los proveedores que firman sus avisos con el secreto de la aplicación —Shopify—, ese identificador decide a qué empresa se factura cada venta, así que sólo se admite el de una tienda que haya pasado por la autorización. |
store_not_found | not_found_error | 404 | El identificador no corresponde a ninguna tienda conectada de la empresa autenticada. Una tienda de otra empresa responde exactamente igual, de modo que la respuesta nunca revela si existe en otro sitio. |
store_url_not_allowed | invalid_request_error | 422 | La dirección base de la tienda no es un destino de salida autorizado para tu empresa. Releer pedidos desde la tienda abriría una conexión hacia un host que nadie ha aprobado. |
stripe_account_linked_elsewhere | conflict_error | 409 | Esa cuenta de Stripe ya está vinculada y activa en otra empresa de Factuarea. Una cuenta de Stripe activa solo puede pertenecer a una empresa. |
stripe_oauth_exchange_failed | invalid_request_error | 422 | Stripe no ha confirmado la autorización de la cuenta: el código de autorización ha caducado, ya se usó o fue denegado. |
woocommerce_credentials_rejected | invalid_request_error | 422 | La tienda ha contestado y ha rechazado la credencial, o la credencial no podía usarse: falta la clave, falta el secreto o la dirección base no es https. La autenticación viaja en la cabecera sobre HTTPS, así que una tienda publicada en texto claro entregaría las dos piezas en el primer salto y por eso se rechaza antes de salir. |
woocommerce_rest_route_missing | invalid_request_error | 422 | La tienda ha contestado, pero su API REST no está publicada: WordPress ha devuelto que la ruta no existe. Lo habitual es que los enlaces permanentes estén en modo simple, de modo que /wp-json/ no se sirve. La credencial puede ser perfectamente correcta. |
woocommerce_store_unreachable | api_error | 502 | La tienda no ha contestado: se agotó el tiempo de espera, falló el transporte o su alojamiento devolvió un error propio. Lo que falla está aguas arriba, en la instalación del comerciante, y no en la plataforma ni en la credencial. |
Facturas
| Code | Type | HTTP | Descripción |
|---|---|---|---|
amount_reconciliation_failed | invalid_request_error | 422 | Los importes con IVA incluido no se pueden repartir en líneas que sumen exactamente lo cobrado, así que no se ha emitido nada antes que alterar el total. Lo causa, por ejemplo, una retención o un recargo de equivalencia que mueven el total más que una diferencia de redondeo. |
corrective_client_change_requires_substitution | invalid_request_error | 422 | La rectificativa va a nombre de un cliente distinto del de la factura original (p. ej. por un error en los datos del cliente): solo puede ser una sustitución, porque por diferencias el importe quedaría a nombre de quien no recibió la factura. |
corrective_full_cancellation_with_lines | invalid_request_error | 422 | Anular la factura entera por diferencias (correction_type total, full en la API, con correction_nature: I) no admite líneas: la rectificativa copia en negativo todas las de la original. |
corrective_invoice_inanulable | invalid_request_error | 422 | La factura es a su vez una rectificativa, y las rectificativas nunca se anulan: la cadena de corrección tiene que seguir siendo auditable de punta a punta. |
corrective_substitution_negative_amount | invalid_request_error | 422 | En una rectificativa por sustitución (correction_nature: S, o full con lines sin naturaleza) cada línea lleva el importe FINAL de la factura correcta, así que ninguna cantidad puede ser negativa (art. 15.5 RD 1619/2012; VERI*FACTU no admite base negativa en una sustitución). El precio unitario nunca es negativo: el signo va en la cantidad. |
corrective_substitution_requires_full | invalid_request_error | 422 | Una rectificativa por sustitución (correction_nature: S) sustituye la factura entera; no hay sustitución parcial. |
exemption_cause_contradicts_taxed_lines | invalid_request_error | 422 | La factura lleva una causa de exención de cabecera que declara la operación sin IVA (exención, no sujeción o inversión del sujeto pasivo) y alguna línea de operación tiene un IVA mayor que cero. |
export_limit_exceeded | invalid_request_error | 422 | La selección filtrada supera el tope de 5.000 facturas de la exportación, así que el fichero se rechaza de entrada en lugar de truncarse en silencio. |
face_submission_attempt_conflict | conflict_error | 409 | Otra petición modificó el intento de envío a FACe (reserva o conciliación) mientras actuabas sobre él. |
face_submission_completion_failed | api_error | 500 | FACe respondió al envío pero la plataforma no pudo guardar el resultado localmente. |
face_submission_rejected | invalid_request_error | 422 | FACe analizó el envío y lo rechazó con su propio código de error (por ejemplo un código DIR3 erróneo, una firma no válida o un duplicado). A diferencia de una transmisión incierta, FACe no registró la factura. |
face_transmission_uncertain | conflict_error | 409 | La factura se envió a FACe pero se desconoce el resultado, así que FACe puede haberla registrado o no. |
facturae_artifact_unavailable | api_error | 500 | El archivo Facturae conservado para ese envío no se puede leer del almacenamiento porque falta o está dañado. El fallo es nuestro. |
facturae_operation_forbidden | authorization_error | 403 | El actor no puede realizar esa operación de Facturae; details.reason indica si se trata de los permisos del actor, de la autoridad del emisor, del acceso a la factura o del derecho a enviarla. |
invalid_correction_nature | invalid_request_error | 422 | correction_nature solo acepta I (por diferencias: la rectificativa lleva el importe de la rectificación, con su signo) o S (sustitución: lleva la factura tal y como queda, con las líneas finales). |
invalid_correction_reason | invalid_request_error | 422 | El motivo de rectificación queda fuera de la lista fiscal cerrada (error_fundado, concurso, incobrable, error_importe, error_cliente, devolucion, descuento, otras), que mapea a los códigos AEAT R1 a R4. |
invalid_delivery_channel | invalid_request_error | 422 | El canal de envío queda fuera del catálogo, que solo tiene dos valores: email (se registra solo cuando el servidor de correo acepta el mensaje) y manual (un envío que hiciste por tus propios medios). |
invalid_facturae_structured_data | invalid_request_error | 422 | Los datos estructurados necesarios para construir el archivo Facturae no son válidos: un valor es incorrecto, los totales no cuadran con las líneas o el XML generado no cumple el esquema. |
invalid_invoice_business_data | invalid_request_error | 422 | Los datos comerciales de la factura (referencias de línea, centros administrativos o sus roles) contienen un valor no válido. |
invalid_invoice_id | invalid_request_error | 400 | La referencia de factura recibida no es un identificador válido; suele significar que se coló un valor interno donde la API espera el id público. |
invalid_invoice_number | invalid_request_error | 422 | El número de factura no sigue el formato de numeración de su serie (por defecto SERIE-AAAA-NNN; las rectificativas llevan el número correlativo de su propia serie, p. ej. R-2026-001). |
invalid_invoice_payment_terms | invalid_request_error | 422 | El calendario de pago de la factura incumple una regla, por ejemplo plazos que no suman el total, fechas no válidas o falta la cuenta bancaria contractual. |
invalid_invoice_status | invalid_request_error | 422 | El valor enviado como estado de factura queda fuera del catálogo del ciclo de vida documental (draft, scheduled, issued, overdue, cancelled, annulled). Antes de la versión de API 2026-10-01 issued se publica como sent, y allí donde la API lee un estado de entrada (los filtros de estado, el cambio de estado masivo) sent se toma como issued. paid es un valor válido para leer y para filtrar, pero no para escribir: registra un cobro en su lugar. |
invalid_invoice_uuid | invalid_request_error | 400 | El identificador de factura de la ruta o del payload no es un UUID válido. |
invalid_payment_method | invalid_request_error | 422 | El método de pago queda fuera de la allowlist cerrada: bank_transfer, cash, credit_card, sepa_direct_debit, paypal, bizum, other. |
invoice_administrative_precondition_required | invalid_request_error | 428 | El cambio del routing administrativo no indicó sobre qué versión se basa. |
invoice_administrative_version_conflict | conflict_error | 409 | El routing administrativo de la factura (sus centros administrativos) cambió después de leerla. |
invoice_already_annulled | invalid_request_error | 422 | La factura ya estaba anulada. La anulación es terminal y, con VeriFactu activo, su registro de anulación ya llegó a la AEAT. |
invoice_already_paid | invalid_request_error | 422 | La factura ya está cobrada. paid es un estado terminal y contablemente cerrado: el IVA repercutido ya se ha declarado, o se declarará en el período. |
invoice_already_rectified_in_full | invalid_request_error | 422 | La factura ya está anulada por completo (una rectificativa total por diferencias), y entonces no admite ninguna rectificativa más; o está sustituida por completo, y entonces no admite otra rectificación total. |
invoice_already_sent | invalid_request_error | 422 | La factura ya fue emitida: tiene número definitivo de serie y, con VeriFactu activo, su alta en la AEAT. La emisión no ocurre dos veces. |
invoice_cannot_assign_number | invalid_request_error | 422 | Se pidió número definitivo para una factura que no es borrador, o que ya lo tiene. La numeración de serie es monótona y los números no se reasignan. |
invoice_cannot_be_marked_as_sent | invalid_request_error | 422 | La marca de envío registra que una factura emitida llegó al cliente, así que solo aplica a facturas issued u overdue. Un borrador o una factura programada todavía no son la factura fiscal, y una cancelada o anulada ya no lo es. |
invoice_cannot_be_sent | invalid_request_error | 422 | La factura está anulada o cancelada: ya no representa una operación válida, así que su PDF no se entrega al destinatario. |
invoice_due_date_not_last_instalment | invalid_request_error | 422 | La factura tiene plazos de pago y su vencimiento (due_on) falta o no es la fecha del último plazo, que es cuando vence la factura. |
invoice_invalid_status_transition | invalid_request_error | 422 | El estado destino no es alcanzable desde el actual. El ciclo de vida documental es dirigido: draft pasa a scheduled, issued o cancelled, scheduled vuelve a draft o avanza a issued, issued pasa a overdue o annulled, overdue a annulled, y cancelled y annulled son terminales. El ciclo es el mismo en todas las versiones de API; antes de 2026-10-01 el estado issued se publica como sent. Estar cobrada no es un paso de ese ciclo: se lee del ledger de cobros. |
invoice_not_cancellable_in_current_state | invalid_request_error | 422 | Cancelar retira un borrador que todavía no es fiscalmente vinculante, así que solo aplica mientras la factura está en draft. |
invoice_not_correctable_in_current_state | invalid_request_error | 422 | Una rectificativa solo se emite contra una factura ya emitida, esté cobrada o no: issued u overdue (una factura emitida se publica como sent antes de la versión de API 2026-10-01). Un borrador, una factura programada, una cancelada o una anulada no tienen nada que rectificar. |
invoice_not_deletable_in_current_state | invalid_request_error | 422 | Solo se borran las facturas en draft y cancelled. Una factura numerada nunca desaparece: la serie correlativa debe seguir siendo auditable. |
invoice_not_editable_in_current_state | invalid_request_error | 422 | Solo un borrador admite edición. Una vez emitida, la factura es inmutable y su contenido queda congelado junto con su registro fiscal. |
invoice_not_eligible_for_action | invalid_request_error | 422 | La acción solicitada no aplica a esta factura: su tipo o su estado actual la dejan fuera del alcance de la operación. |
invoice_not_found | not_found_error | 404 | El identificador no resuelve a ninguna factura de la empresa autenticada. Las facturas de otra empresa responden exactamente igual. |
invoice_not_modifiable_in_current_state | invalid_request_error | 422 | El campo que intentas cambiar está congelado para el estado actual — por ejemplo el régimen fiscal de una factura anulada. |
invoice_not_paid | invalid_request_error | 422 | Se pidió un justificante de pago de una factura sin cobro registrado, así que no hay nada que certificar. |
invoice_not_reschedulable_in_current_state | invalid_request_error | 422 | Reprogramar mueve la fecha de emisión de una factura que está esperando en scheduled, y esta factura no está esperando. |
invoice_not_schedulable_in_current_state | invalid_request_error | 422 | Solo un borrador se puede programar: la programación reserva un momento futuro de emisión sin consumir todavía número de serie. |
invoice_not_unschedulable_in_current_state | invalid_request_error | 422 | Desprogramar devuelve la factura de scheduled a draft, así que solo aplica mientras sigue esperando a emitirse. |
invoice_not_unsendable_in_current_state | invalid_request_error | 422 | Deshacer la marca de envío solo aplica a una factura emitida (issued u overdue; publicada como sent antes de la versión de API 2026-10-01) sin cobros vigentes: limpia sent_at y sent_via y conserva su estado fiscal. |
invoice_payment_terms_precondition_required | invalid_request_error | 428 | El cambio del calendario de pago no indicó sobre qué versión se basa. |
invoice_payment_terms_version_conflict | conflict_error | 409 | El calendario de pago de la factura cambió después de leerla. |
invoice_requires_at_least_one_line | invalid_request_error | 422 | La factura no lleva ninguna línea de operación, así que no tiene base imponible y no se puede emitir. Ocurre cuando no envías líneas y cuando todas las que envías son de suplido: un suplido es una cantidad pagada por cuenta del cliente (art. 78.Tres.3 LIVA), no una operación tuya. |
invoice_type_change_not_allowed | invalid_request_error | 422 | Solo un borrador alterna entre factura completa (F1) y simplificada (F2). Una rectificativa, una sustitutiva (F3) o una rectificativa de simplificada (R5) conservan su tipo, y una simplificada sin cliente no pasa a completa sin indicar antes el destinatario. |
invoice_without_retained_presentation | invalid_request_error | 422 | Una factura del trimestre no tiene presentación documental retenida (es anterior a la captura o nunca se inicializó), así que no puede incluirse en el paquete trimestral. Aparece como error_code en los failures del manifiesto del ZIP trimestral, donde la factura queda fuera, y como subcódigo de una violación de regla de negocio en el correo trimestral. |
invoice_year_required_for_ambiguous_number | invalid_request_error | 422 | Ese número de factura corresponde a más de una factura, así que por sí solo no identifica ninguna. Se repite por dos motivos independientes: el ejercicio (las series reciclan la numeración cada año) y la serie (dos series de tu empresa emiten cada una su propio F-2026-001). |
line_total_checksum_mismatch | invalid_request_error | 422 | El line_total declarado no coincide con el que calcula Factuarea para esa línea (cantidad × precio − descuento + IVA − retención + recargo) y la desviación supera el céntimo de tolerancia. El importe que se factura y se declara a la AEAT es siempre el calculado aquí, así que la discrepancia significa que tu sistema y la factura emitida no cuadrarían. |
line_type_invalid | invalid_request_error | 422 | El tipo de línea queda fuera del catálogo cerrado NORMAL / SUPLIDO. Una factura emitida sólo distingue dos naturalezas: lo que vendes tú, que forma base imponible y lleva IVA, y el suplido, que es dinero adelantado en nombre y por cuenta del cliente y por eso queda fuera de la base (art. 78.Tres.3 LIVA). |
no_invoices_in_period | invalid_request_error | 422 | La operación trimestral no encontró facturas en el período pedido, así que no hay nada que empaquetar ni enviar. |
operation_date_after_issue_date | invalid_request_error | 422 | operation_on es posterior a issued_on. Una fecha de operación posterior a la de expedición solo es válida en pagos anticipados (clave de régimen 14 o 15). |
pack_return_invalid | invalid_request_error | 422 | La devolución de un componente de pack en una factura rectificativa incumple las reglas de devolución. El pack no está en la factura que se rectifica, el producto no es uno de sus componentes, la cantidad no es negativa, el precio difiere del precio repartido original o se devuelven más unidades de las vendidas. |
payment_method_invalid | invalid_request_error | 422 | La misma allowlist cerrada que invalid_payment_method, reportada cuando el valor se rechaza al leer el campo de método de pago del payload. |
rectified_invoice_inanulable | invalid_request_error | 422 | Esta factura ya tiene una rectificativa total (correction_type: full), que devolvió su importe y su mercancía. Anularla ahora los devolvería por segunda vez. Una rectificativa parcial no bloquea: la factura sigue viva y su anulación es legítima. |
reminder_not_applicable | invalid_request_error | 422 | El recordatorio de pago no procede: la factura no está en issued ni overdue (una factura emitida se publica como sent antes de la versión de API 2026-10-01), no hay email de destinatario, falta el enlace público o está desactivado, o ya salió otro recordatorio en las últimas 24 horas. |
scheduled_for_in_past | invalid_request_error | 422 | scheduled_for no es estrictamente futuro, así que no hay ninguna espera que reservar. |
simplified_invoice_cannot_be_substituted | invalid_request_error | 422 | Una de las facturas de la lista de sustitución no se puede sustituir: no es simplificada, está cancelada o anulada, pertenece a otra empresa, o ya tiene sustitutiva. |
simplified_invoice_not_allowed | invalid_request_error | 422 | La operación no es elegible para factura simplificada: supera los 3.000 €, o es una entrega intracomunitaria, una exportación, una operación con inversión del sujeto pasivo, o el cliente necesita factura completa para deducir el IVA. |
simplified_invoices_disabled | invalid_request_error | 422 | La empresa no tiene habilitadas las facturas simplificadas, así que no se puede crear una factura de tipo F2. |
simplified_limit_exceeded | invalid_request_error | 422 | Las líneas llevarían la factura simplificada (F2) por encima del tope legal absoluto de 3.000 € IVA incluido. |
suplido_line_cannot_carry_taxes | invalid_request_error | 422 | La línea de suplido lleva carga propia: tipo de IVA, retención, recargo de equivalencia, descuento, clave de régimen, causa de exención o producto/pack. Un suplido no es una operación del emisor, así que repercutir un impuesto sobre él sería tributar por una entrega que no has hecho, y ligarlo a un producto movería un stock que nunca has vendido. |
suplido_not_allowed_in_simplified_invoice | invalid_request_error | 422 | La factura es simplificada (F2) y una simplificada no identifica al destinatario. Sin destinatario identificado no hay a quién acreditar el pago por cuenta ajena, así que el importe no admite el tratamiento de suplido en este tipo de factura. |
suplido_requires_source_invoice_reference | invalid_request_error | 422 | La línea de suplido no informa source_invoice_reference, el número del justificante que el tercero expidió a nombre del cliente. Sin ese justificante el pago no se acredita como hecho por cuenta ajena y Hacienda lo trataría como base imponible propia del emisor, con su IVA repercutido. |
tax_rate_mismatch | invalid_request_error | 422 | La línea elige un impuesto por id (tax_rate_id, retention_rate_id o surcharge_rate_id) y lo contradice: declara un tax_rate, retention_rate o surcharge_rate distinto del de ese impuesto, o el impuesto es de otra clase que su campo (por ejemplo, una retención en surcharge_rate_id). El IVA elegido califica además la línea (régimen, calificación AEAT y causa de exención), así que los dos datos deben coincidir. |
unattended_replay_mismatch | idempotency_error | 409 | Ya se emitió una factura con ese external_id con otro tipo u otro total, así que la petición no puede tratarse como un reenvío de la misma venta. Se responde con 409, code y subcode unattended_replay_mismatch y param=external_id: el external_id identifica UNA operación y no caduca. No es idempotency_key_reused, el 422 de una Idempotency-Key reutilizada con otro payload. |
MCP
| Code | Type | HTTP | Descripción |
|---|---|---|---|
mcp_guardrail_violation | invalid_request_error | 422 | La llamada infringe una regla fiscal declarada y se ha rechazado LOCALMENTE, antes de ejecutar nada: no se ha creado, modificado ni borrado ningún documento. Es el único código del catálogo que ninguna ruta de la API v1 puede emitir — quien lo recibe está hablando por MCP. El subcode dice cuál de los nueve guardrails se ha infringido, y los datos del error traen guardrail_uri (el resource que explica la regla) y rule_id (la regla concreta, con la forma BR-XXX-NNN). |
Notificaciones
| Code | Type | HTTP | Descripción |
|---|---|---|---|
notification_not_found | not_found_error | 404 | El identificador no corresponde a ninguna notificación de la empresa autenticada, o la notificación quedó fuera de la ventana de retención. |
Pagos
| Code | Type | HTTP | Descripción |
|---|---|---|---|
invalid_payment_date | invalid_request_error | 422 | La fecha de pago no puede ser posterior a hoy. Una fecha anterior a la emisión sí se admite: se registra como cobro o pago anticipado. |
payment_already_reversed | invalid_request_error | 422 | El cobro ya está anulado, y su rastro no se pisa con una segunda anulación: el motivo, el instante y el autor del primero son el registro contable de por qué la factura dejó de estar cobrada. |
payment_reversal_invalid | invalid_request_error | 422 | La nota de la anulación supera los 500 caracteres admitidos. |
payment_reversal_reason_invalid | invalid_request_error | 422 | El motivo de la anulación no pertenece al catálogo cerrado: solo se admiten devolución de adeudo SEPA, disputa o retrocesión de tarjeta, error de imputación, efecto impagado y error de registro. |
payout_reconciliation_amount_mismatch | invalid_request_error | 422 | El importe confirmado no coincide con el neto de la liquidación, así que la conciliación cerraría con una diferencia que nadie justifica. |
receipt_not_available | invalid_request_error | 422 | No hay justificante que emitir porque el documento no tiene ningún cobro registrado detrás. |
reversal_reason_reserved | invalid_request_error | 422 | El motivo issued_in_error está reservado a la anulación de una factura expedida por error; no sirve para revertir un cobro suelto. |
stripe_payout_already_reconciled | invalid_request_error | 422 | La liquidación ya estaba conciliada, y la conciliación es terminal: repetirla contabilizaría dos veces el apunte bancario. |
stripe_payout_not_found | not_found_error | 404 | El identificador no resuelve a ninguna liquidación de la empresa autenticada. |
| Code | Type | HTTP | Descripción |
|---|---|---|---|
invalid_pdf_artifact_fingerprint | invalid_request_error | 422 | La huella del artefacto PDF no es válida. |
invalid_pdf_template_configuration | invalid_request_error | 422 | Un valor de la configuración de la plantilla incumple una regla del modelo de plantilla; param indica la ruta del campo afectado. |
pdf_artifact_not_found | not_found_error | 404 | El artefacto PDF no existe en esta empresa, o era una vista previa que ha caducado. |
pdf_artifact_not_ready | service_unavailable_error | 503 | El PDF todavía se está preparando. |
pdf_commercial_identity_not_found | not_found_error | 404 | La identidad comercial no existe en esta empresa. |
pdf_commercial_identity_required | invalid_request_error | 422 | El modo de marca de la plantilla (logotipo o imagen) necesita una identidad comercial y la empresa no tiene ninguna por defecto. |
pdf_commercial_identity_unavailable | invalid_request_error | 422 | La identidad comercial existe pero está archivada o no es compatible con esta operación. |
pdf_engine_profile_unavailable | api_error | 500 | El perfil de generación PDF no está disponible. |
pdf_engine_unreachable | service_unavailable_error | 503 | El motor de generación PDF no ha respondido (caído, reiniciándose o en mitad de un despliegue). Es transitorio: la misma petición sale bien cuando el motor vuelve, y no se ha creado ni cambiado nada. |
pdf_image_resource_unavailable | api_error | 500 | El recurso de imagen del PDF no está disponible. |
pdf_legal_source_changed | conflict_error | 409 | La fuente jurídica actual ya no coincide con la presentación retenida. |
pdf_library_association_coverage_incomplete | api_error | 500 | La plataforma no pudo comprobar todos los valores por defecto, series o recurrencias que usan la plantilla, así que no se puede garantizar el impacto de la operación. El fallo es nuestro. |
pdf_library_impact_conflict | conflict_error | 409 | Los valores por defecto, series o recurrencias afectados por la operación cambiaron después de revisar su impacto. |
pdf_main_template_required | conflict_error | 409 | La empresa ya trabaja con la biblioteca de plantillas PDF, donde el diseño (pdf_template) y el color de acento (accent_color) de la personalización se aplican a su plantilla principal, y no tiene ninguna plantilla principal a la que aplicarlos. |
pdf_original_corrupt | api_error | 500 | No se puede verificar la integridad del PDF original. |
pdf_original_layout_unavailable | api_error | 500 | El diseño con el que se generó el PDF original ya no está disponible en esta versión de Factuarea. |
pdf_original_unavailable | api_error | 500 | El PDF original no está disponible. |
pdf_payload_resource_unavailable | api_error | 500 | Los recursos necesarios para preparar el PDF no están disponibles. |
pdf_presentation_conflict | conflict_error | 409 | La presentación cambió después de leerla, así que el expected_version enviado está desfasado. |
pdf_presentation_context_changed | conflict_error | 409 | Los datos con los que se construyó la vista previa (documento, empresa o contexto de plantilla) cambiaron después de generarla. |
pdf_presentation_etag_mismatch | conflict_error | 412 | El ETag enviado en If-Match ya no coincide con la presentación guardada, que se modificó después de leerla. |
pdf_presentation_invalid | invalid_request_error | 422 | La presentación no cumple una regla de contenido o de campo. |
pdf_presentation_not_found | not_found_error | 404 | La presentación documental no existe en esta empresa o no pertenece al documento consultado. |
pdf_presentation_not_ready | invalid_request_error | 422 | La presentación revisionada aún no está disponible para esta empresa: su activación está pendiente. |
pdf_presentation_precondition_required | invalid_request_error | 428 | El cambio de la presentación no indicó sobre qué versión se basa. |
pdf_signature_personal_data_forgotten | not_found_error | 410 | Los datos personales de la firma de esta presentación se han eliminado. |
pdf_template_access_denied | authorization_error | 403 | La credencial o el usuario no tiene permiso para realizar esta operación en la biblioteca de plantillas PDF. |
pdf_template_archived | invalid_request_error | 422 | La plantilla PDF está archivada y una plantilla archivada no se puede asignar ni editar. |
pdf_template_asset_conflict | conflict_error | 409 | Ya existe un activo de plantilla con ese identificador, por lo que la subida lo sobrescribiría. |
pdf_template_asset_not_found | not_found_error | 404 | El activo de la plantilla (logotipo, imagen o fuente) no existe en esta empresa o fue eliminado. |
pdf_template_default_replacement_required | invalid_request_error | 422 | Archivar la plantilla dejaría valores por defecto o asociaciones sin plantilla y no se indicó ningún reemplazo. |
pdf_template_not_found | not_found_error | 404 | La plantilla PDF no existe en esta empresa. |
pdf_template_precondition_failed | conflict_error | 412 | El ETag enviado en If-Match ya no coincide con la plantilla guardada, que se modificó después de leerla. |
pdf_template_precondition_required | invalid_request_error | 428 | Modificar la plantilla exige indicar la versión en la que se basa y no se envió ninguna. |
pdf_template_version_conflict | conflict_error | 409 | La plantilla se modificó después de leerla, así que el expected_version enviado está desfasado. |
preparation_required | conflict_error | 409 | Hay que preparar el PDF de esta presentación antes de solicitarlo. |
Tarifas
| Code | Type | HTTP | Descripción |
|---|---|---|---|
duplicate_price_list_name | invalid_request_error | 422 | Otra tarifa de la empresa ya usa ese nombre, que debe ser único dentro del tenant. |
inactive_price_list | invalid_request_error | 422 | La tarifa está inactiva y solo puede consultarse para explicar documentos históricos, no seleccionarse para una operación nueva. |
invalid_price_list_item | invalid_request_error | 422 | La entrada de tarifa tiene un destino, importe o unidad incompatible, o duplica el mismo producto, variante y presentación dentro de la tarifa. |
price_list_in_use | invalid_request_error | 422 | La tarifa está asignada a clientes o borradores y eliminarla dejaría esas referencias sin origen de precio. |
price_list_item_not_found | not_found_error | 404 | El artículo indicado no existe en la tarifa: ya se retiró o el identificador no es de esta tarifa. |
price_list_not_found | not_found_error | 404 | El identificador no resuelve a ninguna tarifa de la empresa autenticada. |
Productos
| Code | Type | HTTP | Descripción |
|---|---|---|---|
duplicate_pack_component | invalid_request_error | 422 | El mismo producto, variante, presentación o configuración aparece más de una vez en el pack. |
duplicate_promotion_item | invalid_request_error | 422 | El mismo artículo aparece más de una vez en la oferta y cada artículo solo puede tener una regla de precio. |
gross_weight_not_allowed | invalid_request_error | 422 | Este artículo no admite peso bruto de transporte: los servicios no pesan, los productos y variantes con unidad base de masa (KGM, GRM) ya pesan su cantidad, y una presentación de medida variable se pesa en cada línea. |
invalid_gross_weight | invalid_request_error | 422 | El peso bruto de transporte no es un número, es cero o negativo, tiene más de 4 decimales o supera el techo de su columna. En una línea de mercancía de un documento de control, también cuando la cantidad por el peso por unidad da un peso de línea que redondea a 0 kg o supera ese techo. |
invalid_pack_component | invalid_request_error | 422 | Un componente no puede formar parte de un pack, por ejemplo un producto que se vende por peso real, cuyo importe solo se conoce en la báscula. |
invalid_pack_image | invalid_request_error | 422 | El archivo subido no es una imagen de pack utilizable: no es un JPG, PNG, WebP o GIF, supera el tamaño máximo o no se ha podido leer. |
invalid_pack_pricing | invalid_request_error | 422 | El precio del pack no es válido para su modo: falta el valor, está fuera de rango, lleva más de dos decimales o el descuento iguala o supera el precio de los productos por separado. |
invalid_pack_status_transition | invalid_request_error | 422 | El cambio de estado pedido no está permitido desde el estado actual del pack, por ejemplo activar un pack sin canales de venta o restaurar uno con la composición bloqueada. |
invalid_promotion | invalid_request_error | 422 | Un campo de la oferta incumple alguna de sus reglas: el nombre, el texto que ve la web, las fechas, la zona horaria, los canales o la lista de artículos. |
invalid_promotion_item | invalid_request_error | 422 | Un artículo de la oferta no es válido: su destino, su modo, su base o su valor incumple una regla. |
pack_composition_too_small | invalid_request_error | 422 | Un pack necesita al menos dos componentes, o un solo producto contado con cantidad de 2 o más. |
pack_group_not_contiguous | invalid_request_error | 422 | Las líneas de un mismo pack no van seguidas en el documento. Hay otra línea entre ellas. |
pack_image_limit_reached | invalid_request_error | 422 | El pack ya tiene el máximo de 5 imágenes. |
pack_in_use | invalid_request_error | 422 | El pack está referenciado por documentos emitidos, así que borrarlo rompería su composición. |
pack_line_locked | invalid_request_error | 422 | Una línea que pertenece a un grupo de pack no puede cambiar su producto, cantidad, precio unitario ni descuento. |
pack_lines_must_be_expanded | invalid_request_error | 422 | Las líneas de un pack no se pueden construir a mano. El servidor reparte el precio entre los componentes del pack y fija él mismo los datos del grupo. |
pack_not_found | not_found_error | 404 | El identificador no resuelve a ningún pack de la empresa autenticada. |
pack_not_sellable | invalid_request_error | 422 | El pack no se puede añadir a un documento: está archivado, inactivo, fuera de su vigencia o uno de sus componentes está inactivo. |
pack_price_allocation_impossible | invalid_request_error | 422 | El precio del pack no se puede repartir entre sus componentes porque no tienen precio por separado. |
pack_price_unreachable | invalid_request_error | 422 | El precio con IVA pedido no se puede alcanzar exactamente porque el IVA se redondea línea a línea. |
pack_print_mode_not_allowed | invalid_request_error | 422 | Solo existe el modo de impresión full_breakdown: cada producto del pack se imprime como una línea normal, con el nombre del pack. |
pack_snapshot_invalid | invalid_request_error | 422 | La fotografía del pack enviada con la línea del documento no lleva firma, está alterada o está mal formada. |
product_in_use | invalid_request_error | 422 | El producto está referenciado por documentos emitidos o por otras entradas del catálogo, y eliminarlo dejaría esas referencias colgando. |
product_not_found | not_found_error | 404 | El identificador no resuelve a ningún producto de la empresa autenticada. |
promotion_not_found | not_found_error | 404 | El identificador no corresponde a ninguna oferta de la empresa autenticada. |
promotion_read_only | invalid_request_error | 422 | La oferta ya ha terminado o se ha cancelado, así que es de solo lectura y no admite más cambios. |
promotion_started | invalid_request_error | 422 | La oferta ya ha empezado y forma parte del historial de precios. Una oferta empezada solo admite cambiar su fin y no se puede borrar. |
sku_already_exists | conflict_error | 409 | Otro producto de la empresa ya usa ese SKU, y el SKU identifica al artículo sin ambigüedad dentro del catálogo. |
slug_already_exists | conflict_error | 409 | El slug ya lo usa, como actual o anterior, otro producto o pack de la empresa. |
Facturas proforma
| Code | Type | HTTP | Descripción |
|---|---|---|---|
invalid_expiry_date | invalid_request_error | 422 | La fecha de vencimiento es anterior a la de emisión, o la supera en más de 365 días. |
invalid_proforma_id | invalid_request_error | 400 | La referencia de proforma recibida no es un identificador válido, normalmente porque un valor interno sustituyó al id público. |
invalid_proforma_number | invalid_request_error | 422 | El número de proforma no sigue el formato canónico de numeración de su serie. |
invalid_proforma_status | invalid_request_error | 422 | El valor enviado como estado queda fuera del catálogo draft, accepted, rejected, expired, invoiced, cancelled. |
invalid_proforma_uuid | invalid_request_error | 400 | El identificador de proforma de la ruta o del payload no es un UUID válido. |
proforma_already_accepted | invalid_request_error | 422 | El cliente ya aceptó la proforma, y la aceptación se registra una sola vez. |
proforma_already_rejected | invalid_request_error | 422 | La proforma ya está marcada como rechazada. |
proforma_cannot_be_accepted | invalid_request_error | 422 | La aceptación no procede desde el estado actual: una proforma facturada, cancelada o expirada ya no la admite. |
proforma_cannot_be_rejected | invalid_request_error | 422 | El rechazo no procede desde el estado actual: una vez facturada, cancelada o expirada, la proforma está cerrada. |
proforma_cannot_be_sent | invalid_request_error | 422 | El envío por email no aplica a una proforma en estado terminal: no hay oferta viva que entregar. |
proforma_invalid_status_transition | invalid_request_error | 422 | El estado destino no es alcanzable desde el actual: un borrador se acepta, se cancela o expira; una proforma aceptada se factura, se rechaza o expira; facturada, cancelada y expirada son terminales. |
proforma_not_convertible_in_current_state | invalid_request_error | 422 | Convertir en factura exige que el cliente haya aceptado la proforma; desde cualquier otro estado no hay acuerdo que facturar. |
proforma_not_deletable_in_current_state | invalid_request_error | 422 | Solo se borra una proforma en borrador. Una vez aceptada, rechazada o facturada forma parte del rastro comercial. |
proforma_not_draft | invalid_request_error | 422 | La operación solo tiene sentido mientras la proforma es un borrador, y esta ya ha avanzado. |
proforma_not_editable_in_current_state | invalid_request_error | 422 | Solo una proforma en borrador admite edición. Una vez aceptada, rechazada, expirada, facturada o cancelada, su contenido queda fijado. |
proforma_not_found | not_found_error | 404 | El identificador no resuelve a ninguna proforma de la empresa autenticada. |
proforma_requires_at_least_one_line | invalid_request_error | 422 | La proforma no lleva líneas, así que no hay importe que poner delante del cliente. |
public_link_expires_at_exceeds_max_days | invalid_request_error | 422 | La caducidad pedida para el enlace público supera la ventana máxima que permite tu plan para documentos compartidos. |
Gastos
| Code | Type | HTTP | Descripción |
|---|---|---|---|
attachment_invalid_filename | invalid_request_error | 422 | El nombre del fichero no es utilizable: está vacío, lleva componentes de ruta, o supera los 200 caracteres. |
attachment_mime_not_allowed | invalid_request_error | 422 | El tipo de fichero queda fuera del conjunto admitido: PDF, PNG, JPEG, XML y HTML. |
attachment_missing | not_found_error | 404 | El gasto existe pero no tiene fichero adjunto, así que no hay nada que descargar. |
attachment_too_large | invalid_request_error | 422 | El fichero supera el tamaño máximo permitido para un adjunto de documento. |
cannot_attach_to_cancelled_purchase_invoice | invalid_request_error | 422 | La factura está cancelada, y adjuntar documentos a un registro cancelado alteraría documentación ya cerrada. |
invalid_purchase_invoice_id | invalid_request_error | 400 | La referencia de gasto recibida no es un identificador válido, normalmente porque un valor interno sustituyó al id público. |
invalid_purchase_invoice_number | invalid_request_error | 422 | El número de factura está vacío o no encaja con el formato admitido. En una factura de compra el número es el que imprimió el proveedor, no uno que genere Factuarea. |
invalid_purchase_invoice_uuid | invalid_request_error | 400 | El identificador de gasto de la ruta o del payload no es un UUID válido. |
operation_regime_invalid | invalid_request_error | 422 | El régimen de operación queda fuera del catálogo general, intracomunitaria, importacion_exportacion, isp. |
purchase_invoice_already_exists | conflict_error | 409 | Ese proveedor ya tiene registrada una factura de compra con el mismo número. El par proveedor + número identifica el documento sin ambigüedad y evita contabilizar dos veces el mismo gasto. |
purchase_invoice_not_deletable_in_current_state | invalid_request_error | 422 | Solo se borran los gastos en borrador o cancelados. Uno pendiente o pagado forma parte del libro de gastos. |
purchase_invoice_not_draft | invalid_request_error | 422 | La operación solo aplica mientras el gasto es un borrador, y este ya está registrado. |
purchase_invoice_not_editable_in_current_state | invalid_request_error | 422 | Solo se edita un gasto en borrador. Una vez registrado como pendiente, pagado o cancelado, su contenido respalda un apunte contable. |
purchase_invoice_not_found | not_found_error | 404 | El identificador no resuelve a ningún gasto de la empresa autenticada. |
purchase_invoice_requires_at_least_one_line | invalid_request_error | 422 | El gasto no lleva líneas, así que no hay importe ni IVA soportado que registrar. |
Escáner de gastos
| Code | Type | HTTP | Descripción |
|---|---|---|---|
duplicate_override_reason_required | invalid_request_error | 422 | No se ha indicado un motivo válido para continuar pese al duplicado. |
duplicate_resolution_required | invalid_request_error | 422 | Existe una posible duplicidad que requiere revisión. |
invalid_inbound_signature | authentication_error | 401 | No se ha podido autenticar la firma del correo entrante. |
invalid_purchase_scan_transition | invalid_request_error | 422 | El estado actual del escaneo no permite esta transición. |
module_upgrade_required | authorization_error | 403 | El plan actual no incluye la capacidad solicitada de OCR. |
ocr_company_daily_quota_exceeded | rate_limit_error | 429 | La empresa ha agotado su cuota diaria de OCR. |
ocr_company_quota_exceeded | rate_limit_error | 429 | La empresa ha agotado su cuota mensual de OCR. |
purchase_scan_already_converted | conflict_error | 409 | El escaneo ya está vinculado a un gasto. |
purchase_scan_not_found | not_found_error | 404 | El escaneo no existe o no pertenece a la empresa activa. |
purchase_scan_retry_not_allowed | invalid_request_error | 422 | El escaneo no admite otro intento en su estado actual. |
purchase_scan_review_incomplete | invalid_request_error | 422 | Faltan datos obligatorios o los importes revisados no cuadran. |
purchase_scan_source_unavailable | invalid_request_error | 422 | El original del escaneo fue purgado o ya no está disponible en el almacenamiento seguro. |
scan_batch_too_large | invalid_request_error | 413 | El lote supera el tamaño total permitido. |
scan_decompression_limit_exceeded | invalid_request_error | 413 | El archivo supera el límite seguro al descomprimirse. |
scan_file_too_large | invalid_request_error | 413 | Un archivo supera el máximo de 20 MiB. |
scan_page_limit_exceeded | invalid_request_error | 413 | El documento supera el límite de páginas configurado. |
scan_pixel_limit_exceeded | invalid_request_error | 413 | La resolución del documento supera el límite de procesamiento seguro. |
scan_storage_unavailable | service_unavailable_error | 503 | El almacenamiento seguro del original no está disponible. |
scanner_admin_required | authorization_error | 403 | La acción requiere permisos de administración del escáner. |
stale_scan_version | conflict_error | 409 | El escaneo ha cambiado desde la última lectura. |
unsafe_scan_file | invalid_request_error | 422 | El original no ha superado la inspección de seguridad. |
unsupported_purchase_currency | invalid_request_error | 422 | La divisa del documento no está admitida para la conversión. |
unsupported_purchase_document_type | invalid_request_error | 422 | El original es un albarán, pedido, presupuesto, proforma u otro documento que no acredita un gasto fiscal. |
unsupported_scan_format | invalid_request_error | 422 | El formato real del archivo no es compatible. |
validation_failed | invalid_request_error | 422 | Los datos del escaneo no cumplen las restricciones indicadas. |
Presupuestos
| Code | Type | HTTP | Descripción |
|---|---|---|---|
quote_already_accepted | invalid_request_error | 422 | El presupuesto ya estaba aprobado, y la aprobación se registra una sola vez. |
quote_already_rejected | invalid_request_error | 422 | El presupuesto ya está marcado como rechazado. |
quote_cannot_be_sent | invalid_request_error | 422 | El presupuesto está rechazado, convertido, caducado o cancelado: ya no es una oferta viva que entregar. |
quote_expired | invalid_request_error | 422 | El presupuesto pasó su fecha de validez, así que las condiciones ofrecidas ya no vinculan y no se puede aprobar ni convertir tal cual. |
quote_not_found | not_found_error | 404 | El identificador no resuelve a ningún presupuesto de la empresa autenticada. |
Límite de tasa
| Code | Type | HTTP | Descripción |
|---|---|---|---|
account_probation_limit_exceeded | rate_limit_error | 429 | La empresa está dentro de su PERIODO DE CONFIANZA de cuenta nueva, y el techo que ha rechazado esta llamada lo pone la EDAD DE LA CUENTA, no su plan. Una cuenta recién creada arranca con un margen reducido que se ensancha solo según madura. |
company_monthly_quota_exceeded | rate_limit_error | 429 | La empresa agotó el volumen mensual que su plan concede al conjunto de sus claves. |
company_rate_limit_exceeded | rate_limit_error | 429 | La empresa superó el ritmo por minuto que su plan concede al conjunto de sus claves, no el de una clave suelta. |
email_delivery_circuit_open | rate_limit_error | 429 | El envío de correo está CORTADO temporalmente, por una incidencia del proveedor o por un problema de entrega de esta empresa. No es un cupo: es un corte de seguridad para no seguir quemando reputación de envío mientras la entrega falla. |
email_recipient_budget_exceeded | rate_limit_error | 429 | Se ha agotado el presupuesto de DESTINATARIOS DISTINTOS de la empresa en la ventana. No es un límite de peticiones: cuenta buzones alcanzados, así que ni repartir el envío en más llamadas ni usar otra credencial cambian nada. |
import_row_quota_exceeded | rate_limit_error | 429 | Las nuevas filas de importación superarían la cuota mensual de filas del plan. |
monthly_quota_exceeded | rate_limit_error | 429 | La empresa agotó la cuota mensual de llamadas que incluye su plan. |
pdf_generation_budget_exceeded | rate_limit_error | 429 | Se ha agotado el presupuesto horario de TRABAJO DE RENDER de PDF. No es un límite de peticiones: cuenta renders contra el pool de Chrome que comparten todos los inquilinos, así que ni repartir las llamadas ni usar otra credencial cambian nada. El subcode dice cuál de los dos cupos se agotó: company_budget (el de la empresa entera) o document_budget (el de este documento suelto, mientras los demás siguen generando). |
portfolio_monthly_quota_exceeded | rate_limit_error | 429 | La cuota MENSUAL de la cartera se ha agotado. Se cuenta sobre la cuenta entera —todos sus NIF en conjunto—, así que el consumo de un NIF agota el de todos. |
portfolio_rate_limit_exceeded | rate_limit_error | 429 | El techo por minuto que se ha alcanzado es el de la CARTERA —una cuenta con dos o más NIF reales, donde se suman las peticiones de todas sus credenciales sobre cualquier NIF que alcancen—, no el de esta credencial ni el de esta empresa. Por eso ni repartir el tráfico entre credenciales ni dar de alta otro NIF en la cuenta cambian nada: todo sigue contando en el mismo cubo. |
rate_limit_exceeded | rate_limit_error | 429 | La clave envió más peticiones de las que permite su ritmo en la ventana actual. |
upload_in_flight_budget_exceeded | rate_limit_error | 429 | La empresa tiene demasiados bytes atravesando a la vez el disco temporal (importaciones tabulares y sus previsualizaciones, UBL, OCR y restauración de copia). Es un presupuesto de bytes EN VUELO, no de espacio ocupado: no consume cubo de peticiones ni aparece en las cabeceras de límite. |
Facturas recurrentes
| Code | Type | HTTP | Descripción |
|---|---|---|---|
invalid_frequency_interval | invalid_request_error | 422 | El intervalo es menor que 1, así que la recurrencia nunca avanzaría a una siguiente ejecución. |
invalid_frequency_type | invalid_request_error | 422 | La frecuencia queda fuera del catálogo daily, weekly, biweekly, monthly, bimonthly, quarterly, semiannual, annual, custom. |
invalid_holiday_handling | invalid_request_error | 422 | La política de festivos queda fuera del catálogo skip, before, after, same. |
invalid_recurring_invoice_id | invalid_request_error | 400 | La referencia de recurrencia recibida no es un identificador válido, normalmente porque un valor interno sustituyó al id público. |
invalid_recurring_invoice_uuid | invalid_request_error | 400 | El identificador de recurrencia de la ruta o del payload no es un UUID válido. |
invalid_recurring_payment_terms_template | invalid_request_error | 422 | La plantilla de calendario de pago de la recurrencia, que se aplica a cada factura que genera, no es válida. |
invalid_recurring_presentation_policy | invalid_request_error | 422 | La política de presentación de la recurrencia, que define cómo se presentan las facturas que genera, tiene un valor no válido. |
recurring_already_active | invalid_request_error | 422 | La recurrencia ya está en marcha, así que no hay nada que activar. Código legacy conservado por compatibilidad: los endpoints actuales reportan esto como recurring_invoice_already_active. |
recurring_invoice_already_active | invalid_request_error | 422 | La recurrencia ya está en marcha. |
recurring_invoice_already_cancelled | invalid_request_error | 422 | La recurrencia ya estaba cancelada, y la cancelación es terminal. |
recurring_invoice_already_paused | invalid_request_error | 422 | La recurrencia ya está pausada, así que pausarla otra vez no cambia nada. |
recurring_invoice_cancelled_cannot_resume | invalid_request_error | 422 | Una recurrencia cancelada no se reanuda: la cancelación la cierra definitivamente, a diferencia de la pausa. |
recurring_invoice_cannot_run | invalid_request_error | 422 | La recurrencia no puede generar una factura ahora mismo: no está en marcha, su ciclo terminó, o le faltan datos que la factura necesita. error.message indica el motivo concreto. |
recurring_invoice_completed_cannot_resume | invalid_request_error | 422 | Una recurrencia completada no se reanuda ni se activa: ya agotó sus ocurrencias o pasó su fecha de fin, así que no le queda ninguna generación pendiente. |
recurring_invoice_has_generated_invoices | invalid_request_error | 422 | La recurrencia ya generó facturas, y esas facturas dependen de ella para su trazabilidad. |
recurring_invoice_not_found | not_found_error | 404 | El identificador no resuelve a ninguna recurrencia de la empresa autenticada. |
recurring_invoice_requires_at_least_one_line | invalid_request_error | 422 | La recurrencia no lleva líneas, así que cada factura generada saldría vacía. |
recurring_not_active | invalid_request_error | 422 | La operación necesita una recurrencia en marcha y esta está pausada, completada o cancelada. Código legacy conservado por compatibilidad con integraciones antiguas. |
recurring_presentation_activation_changed | conflict_error | 409 | La empresa cambió de activación del sistema de presentación dos veces seguidas mientras se generaba la factura recurrente. La generación se detuvo sin escribir nada. |
recurring_presentation_policy_precondition_required | invalid_request_error | 428 | El cambio de la política de presentación no indicó sobre qué versión se basa. |
recurring_presentation_policy_version_conflict | conflict_error | 409 | La política de presentación de la recurrencia cambió después de leerla. |
recurring_presentation_unavailable | invalid_request_error | 422 | Cuando se ejecutó una generación de la recurrencia, la presentación que tiene configurada no estaba disponible, así que no se pudo generar la factura. details.reason indica qué faltaba. |
Request
| Code | Type | HTTP | Descripción |
|---|---|---|---|
business_rule_violation | invalid_request_error | 422 | Una invariante del dominio rechazó la operación. Este código indica la familia; error.subcode nombra la regla concreta y error.message la explica. |
conflicting_pagination_params | invalid_request_error | 422 | starting_after y ending_before viajaron en la misma petición. Recorren la colección en sentidos opuestos, así que solo puede aplicarse uno. |
external_id_already_exists | conflict_error | 409 | El external_id con el que concilias contra tu sistema ya está asignado a otro objeto del mismo tipo en esta empresa. |
invalid_param_format | invalid_request_error | 422 | Un form request legacy rechazó la forma de un valor. Los endpoints migrados reportan lo mismo como parameter_invalid_format o parameter_invalid_integer. |
invalid_param_value | invalid_request_error | 422 | Un form request legacy rechazó el valor de un campo. Los endpoints migrados reportan lo mismo como parameter_invalid_enum o parameter_invalid_range. |
invalid_status_transition | invalid_request_error | 422 | El estado solicitado no es alcanzable desde el estado en el que está ahora mismo el documento. |
length_required | invalid_request_error | 411 | Llegó una petición con body en codificación chunked, sin declarar su tamaño. La API necesita conocer la longitud por adelantado para rechazar payloads excesivos antes de cargarlos en memoria. |
metadata_too_many_keys | invalid_request_error | 422 | El objeto metadata supera el límite de 50 claves por recurso. |
metadata_value_too_long | invalid_request_error | 422 | Un valor de metadata supera los 500 caracteres una vez serializado a texto. |
method_not_allowed | invalid_request_error | 405 | La ruta existe pero no acepta el verbo HTTP utilizado. |
missing_required_param | invalid_request_error | 422 | Un form request legacy detectó que faltaba un campo obligatorio. Los endpoints ya migrados a los parsers canónicos reportan lo mismo como parameter_missing. También lo devuelve una línea de factura, presupuesto, proforma, albarán o factura recurrente sin tax_rate cuando ni el producto tiene impuesto asignado ni tu empresa tiene un IVA por defecto para ese tipo de documento: error.param es lines.N.tax_rate y error.line_index es la posición (base 0) de esa línea. También lo devuelve POST /v1/companies/{company}/invoices cuando pides el envío por correo (options.send_automatically) y no hay destinatario posible —sin cliente, o con un cliente sin email, y sin options.send_to—: error.param es options.send_to y no se crea ninguna factura. |
parameter_invalid | invalid_request_error | 422 | Un value object construido a partir del payload rechazó el valor recibido. error.subcode dice cuál: código de impuesto, código de país, tipo impositivo, etc. |
parameter_invalid_boolean | invalid_request_error | 400 | Un parámetro que debe ser booleano recibió un valor fuera de las representaciones aceptadas (true/false, 1/0). |
parameter_invalid_cursor | invalid_request_error | 400 | El cursor starting_after o ending_before no es un UUID válido, así que no puede apuntar a ninguna fila de la colección. |
parameter_invalid_empty | invalid_request_error | 400 | Un parámetro llegó con el valor vacío: un filtro in sin elementos, una comparación sin nada tras el operador, o un filtro de igualdad con la cadena vacía. |
parameter_invalid_enum | invalid_request_error | 400 | El valor queda fuera del conjunto cerrado que acepta el parámetro. En los listados cubre además un operador de filtro distinto de eq, gte, lte, gt, lt, in o contains, y sale como código principal (400). En las operaciones que validan un formulario o un parámetro de consulta con reglas (por ejemplo format en los PDF de factura) llega como entrada de error.errors[], con su allowed_values, dentro de un 422 invalid_param_value. |
parameter_invalid_format | invalid_request_error | 400 | El valor tiene el tipo correcto pero no la forma que exige el parámetro: una fecha, un patrón de identificador o una cabecera como Factuarea-Version. |
parameter_invalid_integer | invalid_request_error | 400 | Un parámetro que debe ser un número entero recibió algo que no se puede interpretar como tal, por ejemplo limit=abc. |
parameter_invalid_iso8601 | invalid_request_error | 400 | Un filtro de rango (gte, lte, gt, lt) recibió un valor que no es numérico ni una fecha ISO 8601. |
parameter_invalid_range | invalid_request_error | 400 | Un parámetro numérico quedó fuera de sus límites. El caso habitual es limit, que debe estar entre 1 y 100. |
parameter_invalid_string | invalid_request_error | 400 | Un parámetro que debe ser texto recibió un array, un objeto o un valor que no se puede leer como cadena. |
parameter_invalid_url | invalid_request_error | 400 | Un campo que debe contener una URL absoluta recibió un valor que no lo es, normalmente por faltarle el esquema o el host. |
parameter_invalid_uuid | invalid_request_error | 400 | Un campo de identificador recibió un valor que no es un UUID válido. Todo id de recurso en v1 es un UUID. |
parameter_invalid_value | invalid_request_error | 422 | El valor es sintácticamente correcto pero no admisible para este recurso: fuera del catálogo canónico del campo, o incoherente con el resto del payload. |
parameter_missing | invalid_request_error | 400 | El endpoint exige un parámetro que la petición no llevaba. error.param dice cuál. |
parameter_unknown | invalid_request_error | 400 | La petición lleva un parámetro que el endpoint no acepta: un filtro fuera de su allowlist, un campo de sort no ordenable, el page de paginación por offset —v1 pagina por cursor— o una cabecera retirada de la v1. |
payload_too_large | invalid_request_error | 413 | El body de la petición supera el tamaño admitido: 1 MB con carácter general, 6 MB en los endpoints que aceptan ficheros. |
profile_not_found | not_found_error | 404 | El segmento {company} de la ruta nombra una empresa que no existe o que no está en el ámbito de NIFs de la credencial. Ambos casos responden igual para que la API nunca revele empresas de otras cuentas. |
resource_already_exists | conflict_error | 409 | Crear el objeto duplicaría uno que ya existe bajo una clave única — NIF, SKU, external id. error.details.existing_resource_id apunta al objeto que ya ocupa ese valor. |
resource_conflict | conflict_error | 409 | La operación chocó con el estado actual del recurso y no aplica ningún código de conflicto más específico. |
resource_immutable | invalid_request_error | 422 | El objeto está cerrado a cambios para esta operación: su estado o su registro contable impiden modificarlo. |
resource_locked | conflict_error | 409 | Otra operación retiene el recurso hasta terminar: las escrituras concurrentes sobre el mismo objeto se serializan en lugar de entrelazarse. En POST /v1/companies/{company}/invoices con external_id, otra petición con el MISMO external_id sigue en curso y no terminó tras esperarla 20 segundos. |
resource_not_deletable | invalid_request_error | 422 | El objeto existe, pero su estado o sus dependientes bloquean el borrado. En los borrados masivos este es el código por fila de cada entrada que no se pudo eliminar. |
resource_not_found | not_found_error | 404 | El identificador no resuelve a nada visible para la empresa autenticada. Los objetos de otra empresa responden exactamente igual, a propósito. |
route_not_found | not_found_error | 404 | La ruta no corresponde a ningún endpoint de v1. Suele ser una errata, un prefijo /v1 ausente, una ruta de otra área de la API o la forma plana de una ruta que la ventana de ruptura trasladó al segmento de empresa o de cuenta; en ese último caso error.subcode vale legacy_route_moved. |
unknown_filter | invalid_request_error | 422 | Un listado recibió un filtro que no conoce. Los parsers canónicos de v1 reportan esto como parameter_unknown; este código sobrevive para los endpoints aún sin migrar. |
unsupported_api_version | invalid_request_error | 400 | La cabecera Factuarea-Version está bien formada pero nombra una versión fuera del conjunto soportado. |
unsupported_media_type | invalid_request_error | 415 | Una petición con body declaró un Content-Type distinto de application/json. |
Series
| Code | Type | HTTP | Descripción |
|---|---|---|---|
cannot_archive_last_default_series | invalid_request_error | 422 | La serie es la única activa de su tipo de documento. Archivarla dejaría a la empresa sin numeración disponible y congelaría ese tipo de documento. |
document_type_required_for_ambiguous_code | invalid_request_error | 422 | Ese código de serie existe para más de un tipo de documento, así que por sí solo no identifica una única serie. |
invalid_series_code | invalid_request_error | 422 | El código de la serie está vacío, es demasiado largo, o lleva caracteres que no corresponden a un prefijo fiscal. |
invalid_series_name | invalid_request_error | 422 | El nombre de la serie está vacío o supera la longitud permitida. |
invalid_series_number | invalid_request_error | 422 | El número inicial no es válido: no es un entero positivo, o queda en el último número ya emitido o por debajo, lo que reemitiría números ya consumidos. |
invalid_series_template_assignment | invalid_request_error | 422 | La asignación de plantilla PDF enviada para la serie es incoherente: la selección o su versión no son válidas. |
invalid_series_uuid | invalid_request_error | 400 | El identificador de serie de la ruta o del payload no es un UUID válido. |
invalid_series_year | invalid_request_error | 422 | El ejercicio no es un año de cuatro cifras válido para una serie de numeración. |
monthly_requires_month_segmented_format | invalid_request_error | 422 | El contador se reinicia cada mes pero la máscara de numeración no segrega por mes, así que dos meses arrancarían en el mismo correlativo y producirían números duplicados dentro del año. |
series_already_archived | invalid_request_error | 422 | La serie ya estaba archivada, y el archivado no se repite: una segunda llamada indica que el cliente ha perdido el estado real. |
series_code_immutable_with_documents | invalid_request_error | 422 | Cambiar el prefijo de una serie que ya emitió documentos reescribiría retroactivamente su identificador fiscal, mientras los clientes y la AEAT tienen el número original. |
series_default_kind_change | invalid_request_error | 422 | La serie es la predeterminada de su propósito (invoice_kind): la serie por defecto lo es por empresa, tipo y propósito, así que cambiarle el propósito dejaría ese propósito sin serie predeterminada. |
series_format_immutable_with_documents | invalid_request_error | 422 | La máscara de numeración de una serie se puede cambiar hasta la primera emisión: después, el PDF y el registro de la AEAT de los documentos ya emitidos llevan el número con el formato original. |
series_has_documents | invalid_request_error | 422 | La serie ya numeró documentos, así que no se puede eliminar: la secuencia correlativa tiene que seguir siendo auditable. |
series_immutable | invalid_request_error | 405 | Una serie no se elimina por la API: conserva los documentos que numeró y su código no se libera. PUT y DELETE no son operaciones sobre una serie. |
series_initial_number_creates_gap | invalid_request_error | 422 | El número inicial salta más allá del siguiente correlativo natural habiendo documentos del año en curso, y ese hueco en la secuencia no es admisible para la AEAT. |
series_invoice_kind_invalid | invalid_request_error | 422 | El propósito de la serie queda fuera del catálogo complete, simplified, corrective, simplified_corrective, o se ha indicado en una serie que no es de facturas. |
series_invoice_kind_locked | invalid_request_error | 422 | El propósito de la serie (invoice_kind) se fija al crearla y deja de ser editable en cuanto tiene alguna factura: cambiarlo mezclaría tipos de factura en una misma numeración correlativa. |
series_invoice_kind_mismatch | invalid_request_error | 422 | Las series de facturas tienen un propósito fijo (invoice_kind): complete para facturas completas, simplified para simplificadas, corrective para rectificativas y simplified_corrective para rectificativas de simplificadas. Una factura solo se numera en una serie de su mismo propósito (arts. 6.1.a, 7.1.a y 15 del RD 1619/2012), y la serie indicada es de otro. |
series_locked_by_verifactu | invalid_request_error | 422 | Al menos una factura de la serie tiene un registro de facturación aceptado por la AEAT, lo que congela el prefijo, el año y la base de numeración de la serie. |
series_not_found | not_found_error | 404 | El identificador no resuelve a ninguna serie de numeración de la empresa autenticada. |
series_template_access_denied | authorization_error | 403 | La credencial o el usuario no tiene permiso para cambiar la plantilla PDF de esta serie. |
series_template_incompatible | invalid_request_error | 422 | La plantilla no admite el tipo de documento, el propósito (invoice_kind) o el formato de numeración de la serie. |
series_template_precondition_failed | conflict_error | 412 | El ETag enviado en If-Match ya no coincide con el recurso de plantilla de la serie, que cambió después de leerlo. |
series_template_precondition_required | invalid_request_error | 428 | El cambio de la plantilla de la serie no indicó la versión o la precondición del recurso en que se basa. |
series_template_unavailable | invalid_request_error | 422 | La plantilla está archivada o no es seleccionable para esta empresa, así que no puede asignarse a la serie. |
series_template_version_conflict | conflict_error | 409 | La asignación de plantilla PDF de la serie cambió después de leerla. |
series_type_invalid | invalid_request_error | 422 | El tipo de documento de la serie queda fuera del catálogo invoice, quote, delivery_note, proforma, purchase_invoice, recurring_invoice. |
series_year_locked | invalid_request_error | 422 | La serie ya emitió documentos en su año vigente. Mover el año dejaría esos documentos apuntando a un ejercicio vacío mientras su base imponible está en otro. |
Servidor
| Code | Type | HTTP | Descripción |
|---|---|---|---|
dependency_unavailable | service_unavailable_error | 503 | Un servicio externo del que depende la operación no respondió a tiempo. |
face_transmission_failed | api_error | 502 | La plataforma FACe —el punto de entrada de las administraciones públicas— estaba inaccesible o respondió con un fallo. El problema está aguas arriba, no en tu petición. |
facturae_signing_failed | api_error | 500 | No se pudo producir la firma XAdES del fichero Facturae, normalmente porque el certificado de firma no es utilizable en ese momento. |
internal_error | api_error | 500 | Algo se rompió en nuestro lado al procesar la petición. La condición no la provoca tu payload. |
maintenance | service_unavailable_error | 503 | La plataforma está en ventana de mantenimiento y las escrituras se retienen a propósito. |
pdf_generation_failed | service_unavailable_error | 503 | El servicio de renderizado no pudo producir el PDF. El documento y sus datos están intactos: lo que falló es el archivo. |
register_sealing_failed | api_error | 500 | El sellado criptográfico del registro no se completó, así que el cierre quedó sin firmar en lugar de sellado con una firma rota. |
send_failed | api_error | 500 | El documento no se entregó por email: el proveedor de correo rechazó el mensaje o estaba inaccesible. |
service_unavailable | service_unavailable_error | 503 | El servicio, o una dependencia que necesita, no puede responder temporalmente. |
Almacenamiento
| Code | Type | HTTP | Descripción |
|---|---|---|---|
storage_quota_exceeded | payment_required_error | 402 | La cuenta ha alcanzado su uso máximo. |
Integraciones de tareas
| Code | Type | HTTP | Descripción |
|---|---|---|---|
forge_account_link_rejected | invalid_request_error | 422 | Solo se pueden vincular cuentas personales de GitHub. GitLab y Gitea no usan cuentas vinculadas: se conectan con el token de acceso de la integración del proyecto. |
forge_account_not_linked | invalid_request_error | 422 | La operación actúa en tu nombre en la forja —por ejemplo, para listar tus repositorios de GitHub— y todavía no has vinculado tu cuenta de esa forja a tu usuario. |
forge_credentials_rejected | invalid_request_error | 422 | La instancia de GitLab o Gitea rechaza la dirección o la credencial indicadas. El subcode dice el motivo: not_a_forge_instance, redirected, repository_not_found, insufficient_permissions o unauthorized. |
forge_oauth_state_invalid | invalid_request_error | 422 | La vinculación con la forja no se ha podido completar: el estado de la autorización ha caducado, ya se usó, no es válido o pertenece a otro usuario o empresa. |
forge_repository_access_denied | authorization_error | 403 | Tu cuenta de GitHub vinculada no permite conectar ese repositorio, o el repositorio no existe; la respuesta es la misma en ambos casos para no revelar repositorios ajenos. |
forge_repository_bound_elsewhere | conflict_error | 409 | El repositorio ya está conectado a otro proyecto activo de la empresa. Un repositorio alimenta un único proyecto, para que cada issue o pull request acabe en una sola tarea. |
forge_secret_rotation_not_supported | invalid_request_error | 422 | Esta integración no tiene un secreto de webhook propio que rotar: las de GitHub firman con el secreto de la GitHub App, y la rotación solo existe en las integraciones de GitLab y Gitea. |
forge_token_required | invalid_request_error | 422 | Se cambia la URL de la instancia de la forja sin aportar un token nuevo. El token guardado nunca se envía a una dirección distinta de aquella para la que se dio, para que no acabe en un servidor ajeno. |
forge_webhook_signature_invalid | authentication_error | 401 | La entrega de webhook de la forja no se ha podido autenticar: la firma no coincide con el secreto de la integración, o la integración no existe. No se ha procesado ningún evento. |
forge_workflow_rule_column_invalid | invalid_request_error | 422 | La columna de destino de la regla no pertenece al proyecto de la integración; una columna inexistente, de otro proyecto o de otra empresa responden igual. |
forge_workflow_rule_not_found | not_found_error | 404 | La regla que mueve tareas de columna ante un evento de la forja (por ejemplo, al fusionar una pull request) no existe o es de otra empresa; los dos casos responden igual. |
github_app_not_configured | invalid_request_error | 422 | La integración con GitHub no está disponible en este servidor porque su administrador no ha configurado la GitHub App. No es un problema de tu cuenta ni de tus permisos. |
import_credentials_rejected | invalid_request_error | 422 | El sistema de origen de la importación ha rechazado las credenciales aportadas con una respuesta de no autorizado o prohibido. No se ha importado nada. |
import_run_already_active | conflict_error | 409 | Ya hay una importación en curso desde el mismo origen hacia el mismo destino. Dos importaciones simultáneas crearían tareas duplicadas, así que la segunda no se lanza. |
integration_destination_not_allowed | invalid_request_error | 422 | La política de salida de la empresa no permite conectar con esa dirección: por seguridad, los destinos privados o internos se bloquean salvo que la empresa los haya autorizado. El error no repite la URL rechazada. |
project_integration_already_connected | conflict_error | 409 | El proyecto ya tiene una integración de ese tipo, o ya está conectado a otro repositorio. Cada proyecto admite una sola integración por tipo, para que los eventos no se dupliquen. |
project_integration_not_found | not_found_error | 404 | La integración del proyecto no existe o es de otra empresa; los dos casos responden igual. Las integraciones de forjas y chats solo se gestionan desde la aplicación web, no desde la API v1. |
task_import_run_not_found | not_found_error | 404 | La importación indicada no existe o es de otra empresa; los dos casos responden igual. Cada importación tiene su propio identificador, distinto del del proyecto de destino. |
Tareas
| Code | Type | HTTP | Descripción |
|---|---|---|---|
bulk_task_selection_too_large | invalid_request_error | 422 | La operación masiva incluye más tareas de las que admite un solo lote (200 por defecto; el mensaje dice el tope vigente). No es un límite de peticiones ni del plan: acota lo que se procesa de una vez. |
column_has_tasks | conflict_error | 409 | La columna que intentas borrar todavía tiene tareas y la petición no dice adónde llevarlas. Para no dejar tareas sin sitio en el tablero, el borrado se rechaza y no se ha modificado nada. |
column_slug_in_use | conflict_error | 409 | Otra columna del mismo proyecto ya tiene un nombre equivalente. Se compara el identificador que se deriva del nombre, así que dos nombres que solo difieren en mayúsculas o signos chocan igual. |
column_slug_reserved | invalid_request_error | 422 | El nombre de la columna se traduce al identificador planned o archived, reservados para los estados de las tareas que están fuera del tablero. Una columna así sería indistinguible de esos estados. |
invalid_custom_field_definition | invalid_request_error | 422 | La definición del campo personalizado no es válida: nombre fuera de 1 a 60 caracteres, tipo desconocido, campo obligatorio sin valor por defecto, opciones en un tipo que no las admite, cambio de tipo tras crearlo, quitar una opción que usan tareas, o una reordenación incompleta. error.param señala el dato concreto. |
invalid_custom_field_value | invalid_request_error | 422 | El valor no encaja con el tipo del campo personalizado —por ejemplo, texto en un campo numérico u opción que no está en la lista— o el campo no pertenece al proyecto de la tarea. |
invalid_move_target_column | invalid_request_error | 422 | La columna indicada para recibir las tareas no sirve de destino: no existe, es de otro proyecto o es la misma columna que se está borrando. El borrado no se ha hecho. |
invalid_task_key | invalid_request_error | 422 | La clave de tarea no tiene la forma CLAVE-N —clave del proyecto, guion y número, como WEB-42— o el número de tarea no es un entero positivo. |
invalid_task_reference | invalid_request_error | 422 | Una tarea referenciada en el cuerpo de la petición no existe o es de otra empresa; los dos casos responden igual. error.param indica qué campo contenía la referencia. |
invalid_task_schedule | invalid_request_error | 422 | Las fechas de la tarea no son coherentes: la fecha de inicio es posterior a la fecha límite, o una de las dos no existe en el calendario (por ejemplo, un 30 de febrero). |
invalid_task_status | invalid_request_error | 422 | El destino de la tarea no es válido: el estado no existe, la transición no está permitida, se envían a la vez columna y estado, la columna no es del proyecto de la tarea, o se pide columna para una tarea planificada o archivada. Una tarea en el tablero siempre tiene columna y una fuera de él nunca la tiene. |
invalid_time_entry_period | invalid_request_error | 422 | El periodo de la entrada de tiempo no es válido: el fin es anterior al inicio, dura más de 24 horas, el inicio está más de un día en el futuro, una fecha no es válida, se intenta quitar el fin de una entrada cerrada o se cambian las horas de una entrada que sigue en marcha. |
limit_exceeded | payment_required_error | 402 | La empresa ha alcanzado el límite de facturas o de documentos anuales de su plan; el mensaje dice cuál. En la API v1 lo emite la facturación de horas (POST /v1/companies/{company}/projects/{project}/time-invoices), que lo comprueba antes de crear nada: no se ha generado el borrador de factura ni se ha marcado ninguna hora como facturada. |
linked_entity_not_found | not_found_error | 404 | La entidad que se quiere vincular no existe, es de otra empresa o pertenece a un módulo que la empresa no tiene contratado; los tres casos responden igual. Ocurre al vincular (POST /v1/companies/{company}/tasks/{task}/entity-links) y también al crear una tarea con entity_link en POST /v1/companies/{company}/tasks: en ese caso la tarea NO se crea. |
project_archived | invalid_request_error | 422 | El proyecto está archivado y no admite tareas nuevas ni que se muevan tareas hacia él. Archivar congela el proyecto sin borrarlo. |
project_column_not_found | not_found_error | 404 | La columna no existe, pertenece a otro proyecto o es de otra empresa; los tres casos responden igual. Una columna solo se direcciona dentro del proyecto que la contiene. |
project_has_no_columns | invalid_request_error | 422 | Se pide colocar la tarea en el tablero, pero el proyecto no tiene ninguna columna en la que ponerla. Una tarea activa siempre vive en una columna. |
project_key_in_use | conflict_error | 409 | La clave corta ya la usa otro proyecto de la empresa, o sigue reservada como clave anterior de un proyecto que la cambió. La clave da nombre a las tareas (WEB-42), así que no puede repetirse dentro de la empresa. |
project_not_found | not_found_error | 404 | No existe ningún proyecto con ese identificador o esa clave en la empresa autenticada. Un proyecto de otra empresa responde exactamente igual, así que la respuesta nunca revela si existe en otro sitio. |
required_custom_field_missing | invalid_request_error | 422 | Falta el valor de un campo personalizado que el proyecto declara obligatorio; el mensaje nombra el campo. Un campo obligatorio no puede quedar vacío. |
task_already_in_project | invalid_request_error | 422 | Se pide trasladar la tarea al proyecto en el que ya está, así que no hay traslado que hacer. |
task_assignee_not_member | invalid_request_error | 422 | El usuario indicado como asignado no es miembro de la empresa. Un usuario inexistente, de otra empresa o sin membresía responden igual, para no revelar cuentas ajenas. |
task_attachment_not_found | not_found_error | 404 | El adjunto no existe, pertenece a otra tarea o es de otra empresa; los tres casos responden igual. Un adjunto borrado deja de poder consultarse y descargarse. |
task_attachment_rejected | invalid_request_error | 422 | El fichero no se admite como adjunto: está vacío, supera los 10 MB, o su tipo real —detectado por su contenido (magic bytes), no por la extensión ni por la cabecera— no está permitido. También se rechaza una surface distinta de description o comment. |
task_calendar_feed_not_found | not_found_error | 404 | El feed de calendario (iCal) no existe, está revocado, es de otra empresa o es el feed personal de otro usuario; todos los casos responden igual. Solo lo emite la aplicación web al rotar o revocar feeds, no la API v1. |
task_column_capacity_exceeded | conflict_error | 409 | El ámbito del tablero —la columna, o el estado planificado o archivado— ha agotado el rango de posiciones con que se ordenan sus tareas. No es un límite del plan ni de permisos, sino el tope técnico de ordenación de ese ámbito. |
task_comment_not_editable | invalid_request_error | 422 | El comentario no se puede editar: solo su autor puede modificarlo, y los comentarios importados o traídos por una integración son inmutables para conservar lo que dijo el origen. |
task_comment_not_found | not_found_error | 404 | El comentario no existe, pertenece a otra tarea o es de otra empresa; los tres casos responden igual. Un comentario solo se direcciona bajo la tarea en la que se escribió. |
task_custom_field_not_found | not_found_error | 404 | El campo personalizado no existe, pertenece a otro proyecto o es de otra empresa; los tres casos responden igual. Cada proyecto define sus propios campos. |
task_description_too_large | invalid_request_error | 422 | La descripción supera el máximo de 100.000 caracteres, contados sobre el Markdown enviado antes de sanearlo. El tope no depende del plan: protege el editor y el almacenamiento. |
task_entity_link_not_found | not_found_error | 404 | El vínculo entre la tarea y un documento, contacto, producto o empleado no existe, pertenece a otra tarea o es de otra empresa; los tres casos responden igual. |
task_external_link_not_found | not_found_error | 404 | El enlace externo no existe, pertenece a otra tarea o es de otra empresa. También responde así un enlace que mantiene una integración (una issue o una pull request de la forja) cuando se intenta gestionar como si fuera un enlace manual. |
task_label_name_in_use | conflict_error | 409 | Ya existe en la empresa una etiqueta con ese nombre; la comparación no distingue mayúsculas de minúsculas. Las etiquetas se comparten entre todos los proyectos de la empresa. |
task_label_not_found | not_found_error | 404 | No existe ninguna etiqueta con ese identificador en la empresa autenticada; una etiqueta de otra empresa responde igual. Las etiquetas son de la empresa, no de un proyecto concreto. |
task_not_found | not_found_error | 404 | No existe ninguna tarea con ese identificador o esa clave en la empresa autenticada. Una tarea de otra empresa —o, en el portal del empleado, una que no tiene asignada— responde exactamente igual. |
task_relation_cycle | invalid_request_error | 422 | La relación cerraría un ciclo de subtareas o de bloqueos: la tarea destino ya depende, directa o indirectamente, de la de origen, y ninguna de las dos podría completarse primero. |
task_relation_exists | conflict_error | 409 | Entre estas dos tareas ya hay una relación del mismo tipo, en cualquiera de las dos direcciones. Repetirla no añadiría información, así que no se crea una segunda. |
task_relation_not_found | not_found_error | 404 | No existe ninguna relación con ese identificador entre tareas de la empresa autenticada; una relación de otra empresa, o una ya borrada, responde igual. |
task_self_relation | invalid_request_error | 422 | La tarea de origen y la de destino son la misma, y una tarea no puede relacionarse consigo misma. |
task_time_entry_invoiced | invalid_request_error | 422 | La entrada de tiempo ya está incluida en una factura. Mientras siga vinculada no se edita ni se vuelve a facturar, para que la factura y las horas no se contradigan. |
task_time_entry_not_found | not_found_error | 404 | La entrada de tiempo no existe, pertenece a otra tarea o es de otra empresa; los tres casos responden igual. |
task_time_not_invoiceable | invalid_request_error | 422 | No se pueden facturar las horas pedidas y el mensaje nombra el motivo: el proyecto no tiene cliente de facturación o ese cliente ya no admite facturas, falta tarifa por hora o producto con precio, una entrada no es facturable, está en marcha o es de otro proyecto, no hay entradas facturables, o la selección es ambigua. |
task_timer_already_running | conflict_error | 409 | Ya tienes un temporizador en marcha en esta empresa. Cada usuario puede tener como máximo uno a la vez por empresa, para que el tiempo registrado no se solape entre tareas. |
task_timer_not_running | invalid_request_error | 422 | Se pide parar el temporizador, pero no tienes ninguno en marcha en esta empresa; puede que ya se parara desde otra sesión o dispositivo. |
task_upload_link_expired | invalid_request_error | 410 | El enlace de subida ya no sirve. El subcode dice por qué: expired, porque el enlace caducó (vive 30 minutos desde que se creó), o consumed, porque ya se usó una vez y cada enlace admite un único envío. |
task_upload_link_not_found | not_found_error | 404 | El enlace de subida no es válido: el token está mal formado o no corresponde a ningún enlace, casi siempre porque se copió incompleto. Un enlace caducado o ya usado responde en cambio con task_upload_link_expired. |
Informes fiscales
| Code | Type | HTTP | Descripción |
|---|---|---|---|
insufficient_data_for_report | invalid_request_error | 422 | El período no tiene datos que declarar, o a una factura del período le falta un campo obligatorio para este modelo, típicamente el NIF del cliente. |
invalid_period | invalid_request_error | 422 | El período no identifica una declaración: el año queda fuera del rango admitido, o falta el trimestre o está fuera del rango 1 a 4 en un modelo trimestral. |
report_format_invalid | invalid_request_error | 422 | El formato queda fuera del catálogo txt_aeat, pdf, excel. |
tax_report_not_found | not_found_error | 404 | El identificador no resuelve a ninguna declaración de la empresa autenticada. |
tax_report_type_invalid | invalid_request_error | 422 | El tipo de declaración queda fuera del catálogo modelo_303, modelo_347, modelo_130. |
unsupported_format | invalid_request_error | 422 | El formato pedido no está disponible para este modelo: no toda declaración produce todas las salidas. |
Impuestos
| Code | Type | HTTP | Descripción |
|---|---|---|---|
duplicate_tax_default_for_document_type | invalid_request_error | 422 | Ya hay otro impuesto del mismo tipo marcado como default para ese tipo de documento, y el par (tipo de impuesto, tipo de documento) admite un único default. |
global_tax_read_only | authorization_error | 403 | El impuesto pertenece al catálogo de Factuarea, que es de solo lectura para las empresas: solo puedes modificar o eliminar los impuestos que creó tu propia empresa. |
indirect_tax_regime_invalid | invalid_request_error | 422 | El régimen indirecto queda fuera del catálogo iva, igic, ipsi. |
invalid_aeat_code | invalid_request_error | 422 | El código de operación AEAT queda fuera del catálogo cerrado S1, S2, S3, E1-E6, N1, N2 que usan VeriFactu y el SII. |
invalid_country_aeat_zone | invalid_request_error | 422 | La zona territorial AEAT queda fuera del catálogo peninsula, canarias, ceuta, melilla. |
invalid_country_code | invalid_request_error | 422 | El código de país no tiene exactamente dos caracteres, así que no es un código ISO 3166-1 alfa-2 válido. |
invalid_customer_visible_label | invalid_request_error | 422 | La etiqueta que se muestra al cliente en el documento supera la longitud permitida. |
invalid_description | invalid_request_error | 422 | La descripción supera la longitud máxima permitida para el campo. |
invalid_document_type | invalid_request_error | 422 | El tipo de documento queda fuera del catálogo: invoice, quote, delivery_note, proforma, purchase_invoice, recurring_invoice. |
invalid_rate_for_tax_regime | invalid_request_error | 422 | El tipo no pertenece a la rejilla legal de su régimen: el IGIC admite 0, 3, 5, 7, 9,5, 15 y 20 %; el IPSI admite 0, 0,5, 1, 2, 4, 8 y 10 %. |
invalid_tax_code | invalid_request_error | 422 | El código del impuesto está vacío o supera los 50 caracteres. |
invalid_tax_name | invalid_request_error | 422 | El nombre del impuesto está vacío o supera los 255 caracteres. |
invalid_tax_rate | invalid_request_error | 422 | El tipo impositivo queda fuera del rango permitido para su clase: IVA 0-27 %, retención 0-47 %, recargo de equivalencia 0-10 %, otros 0-100 %. |
invalid_tax_type_filter | invalid_request_error | 422 | El filtro type del listado por tipo lleva un valor fuera del enum vat, retention, surcharge, other. |
invalid_validity_window | invalid_request_error | 422 | La ventana de vigencia está invertida: valid_until es anterior a valid_from. |
system_tax_immutable | invalid_request_error | 422 | El impuesto pertenece al catálogo canónico AEAT que trae el producto. Su tipo, su código y su nombre son fijos para que todas las empresas compartan la misma referencia fiscal. |
system_tax_immutable_field | invalid_request_error | 422 | La actualización toca un campo congelado en un impuesto del sistema; error.param dice cuál. |
system_tax_undeletable | invalid_request_error | 422 | Los impuestos del sistema forman parte del catálogo fiscal compartido y no se eliminan: borrarlos rompería los documentos que los referencian. |
tax_applies_to_invalid | invalid_request_error | 422 | El ámbito del impuesto queda fuera del catálogo sale, purchase, both. |
tax_code_already_exists | conflict_error | 409 | Otro impuesto del catálogo ya usa ese código, y el código identifica al impuesto sin ambigüedad. |
tax_default_axis_disabled | invalid_request_error | 422 | El impuesto no puede fijarse como predeterminado porque su tipo (IVA, retención o recargo) está desactivado en la empresa para el documento pedido, o en todos los documentos a los que se aplicaría si no indicas ninguno. |
tax_id_required | invalid_request_error | 422 | La operación necesita el número de identificación fiscal (NIF, CIF o NIE) de la parte implicada y el registro no lo tiene. |
tax_in_use | invalid_request_error | 422 | El impuesto está referenciado por documentos, productos o proveedores. Eliminarlo dejaría documentos históricos sin su referencia fiscal. |
tax_inactive_cannot_be_default | invalid_request_error | 422 | Un impuesto desactivado no puede quedar como default, ni global ni por tipo de documento: sería un default oculto que ningún formulario puede elegir. |
tax_not_defaultable_for_document | invalid_request_error | 422 | El impuesto no puede ser el predeterminado de ese documento: es de tipo other, su ámbito (applies_to) no cubre el documento o el documento es recurring_invoice, que hereda de factura. |
tax_not_found | not_found_error | 404 | El identificador no corresponde a ningún impuesto del catálogo accesible para esta empresa. |
tax_type_invalid | invalid_request_error | 422 | El tipo de impuesto queda fuera del catálogo vat, retention, surcharge, other. |
Control horario
| Code | Type | HTTP | Descripción |
|---|---|---|---|
clocking_outside_employment_period | invalid_request_error | 422 | El instante del fichaje cae antes de la fecha de alta del empleado o después de su fecha de baja, así que no se ha escrito nada en el registro horario. El día de alta y el día de baja sí admiten fichaje. Al aprobar una corrección se vuelve a comprobar el periodo de alta vigente, y una aprobación rechazada deja la solicitud pendiente. |
Documentos de control
| Code | Type | HTTP | Descripción |
|---|---|---|---|
delivery_note_cancelled | invalid_request_error | 422 | Uno de los albaranes enviados para prerrellenar el documento de control está anulado, y un albarán anulado no puede ser origen de un envío. No se ha creado nada. |
invalid_cargo_measure | invalid_request_error | 422 | La magnitud declarada de un envío no es válida: su type no es weight ni other, falta el peso o el valor o no es mayor que cero, o la unidad libre no tiene entre 1 y 30 caracteres. |
invalid_transport_tax_id | invalid_request_error | 422 | La identificación fiscal de una parte no es válida: un NIF, NIE o CIF español con el carácter de control erróneo, o un identificador extranjero fuera de 2 a 20 caracteres alfanuméricos. |
invalid_vehicle_plate | invalid_request_error | 422 | Una matrícula no encaja en un formato español (actual, provincial antigua, remolque R, especial E o histórica H; las españolas no llevan vocales) ni en una extranjera de 2 a 12 caracteres alfanuméricos con su país. |
transport_date_in_past | invalid_request_error | 422 | Un documento de control se emite antes de iniciar el transporte, y una de las fechas de transporte es anterior a hoy (Europe/Madrid). El borrador admite cualquier fecha; la emisión no. |
transport_document_cannot_be_cancelled | invalid_request_error | 422 | Solo se puede anular un documento de control emitido y en curso; un borrador se borra, y uno cerrado, anulado o sustituido no se anula. |
transport_document_cannot_be_closed | invalid_request_error | 422 | Solo se puede cerrar un documento de control emitido; este es un borrador o ya está cerrado, anulado o sustituido. |
transport_document_cannot_be_deleted | invalid_request_error | 422 | Solo se puede borrar un borrador: un documento de control emitido se conserva como prueba durante todo su plazo de conservación. |
transport_document_cannot_be_edited | invalid_request_error | 422 | Solo un documento de control en borrador se puede editar; este ya está emitido, cerrado, anulado o sustituido. |
transport_document_cannot_be_modified | invalid_request_error | 422 | Solo se puede modificar un documento de control emitido, y la modificación debe dejarlo con todos los datos obligatorios y al menos un envío. |
transport_document_cannot_be_reopened | invalid_request_error | 422 | Solo se puede reabrir un documento de control cerrado a mano, y solo antes de su plazo de cierre automático; tras un cierre automático queda cerrado. |
transport_document_cannot_be_superseded | invalid_request_error | 422 | Solo se puede marcar como sustituido por el documento del transportista un documento de control emitido y en curso. |
transport_document_file_unavailable | not_found_error | 410 | Los PDF de este documento de control se purgaron al terminar su plazo de conservación (un año tras cerrarlo, anularlo o sustituirlo, y solo porque la cuenta está cerrada). El documento y sus datos se conservan. |
transport_document_no_changes | invalid_request_error | 422 | La modificación trae exactamente los mismos datos que la versión vigente, así que no hay versión nueva que publicar. |
transport_document_not_found | not_found_error | 404 | El identificador no resuelve a ningún documento de control de la empresa autenticada, o el token público no existe. |
transport_document_not_issuable | invalid_request_error | 422 | El documento no se puede emitir: no es un borrador o le faltan datos obligatorios del art. 6 de la Orden FOM/2861/2012 (partes, NIF, domicilio del cargador, envíos con origen, destino, mercancía y magnitud, matrícula de la tractora o fecha de transporte). |
transport_document_not_sendable | invalid_request_error | 422 | No se puede enviar el documento por email: no está emitido ni cerrado, no hay destinatario (sin to y el contacto transportista sin email) o to, cc y bcc suman más de 5 direcciones. |
transport_document_parties_immutable | invalid_request_error | 422 | Tras emitir, el cargador contractual y el transportista efectivo quedan fijados: la norma no permite cambiarlos en una modificación. |
transport_document_pdf_too_large | invalid_request_error | 422 | El PDF de la versión superaría los 5 MB (5.000.000 bytes) que permite la normativa por la cantidad de datos del documento: envíos, líneas de mercancía, descripciones u observaciones. No se ha guardado nada. |
transport_document_version_limit_reached | invalid_request_error | 422 | Un documento de control admite como máximo 50 versiones y la última se reserva para anularlo o sustituirlo, así que ya no admite más modificaciones. No se ha guardado nada. |
transport_document_version_not_found | not_found_error | 404 | El documento de control existe, pero no tiene la versión pedida en version: sus versiones van de la 1 a la vigente (current_version). |
transport_outside_spain | invalid_request_error | 422 | El documento de control solo cubre transporte interior, y un envío sale o llega fuera de España. El transporte internacional se documenta con la carta de porte CMR. |
VeriFactu
| Code | Type | HTTP | Descripción |
|---|---|---|---|
alta_record_not_found | not_found_error | 404 | La factura no tiene registro de alta, así que la operación que depende de él no tiene sobre qué trabajar. |
anulacion_record_already_exists | conflict_error | 409 | La factura ya tiene un registro de anulación en la cadena, y la anulación se declara una sola vez. |
certificate_expired | invalid_request_error | 422 | El certificado está fuera de su ventana de validez: ha caducado, o todavía no es válido. |
certificate_nif_mismatch | invalid_request_error | 422 | El NIF del titular del certificado no coincide con el de la empresa. Los registros AEAT se firman en nombre de la empresa, así que ambos deben ser el mismo. |
certificate_not_found | not_found_error | 404 | La empresa no tiene ningún certificado FNMT que corresponda al identificador, o no tiene ninguno subido. |
certificate_too_large | invalid_request_error | 422 | El fichero supera el límite de 100 KB, cuando un certificado FNMT real pesa unos pocos kilobytes. |
chain_position_conflict | conflict_error | 409 | Dos registros de la misma empresa intentaron tomar a la vez la misma posición de la cadena de huellas y los reintentos automáticos no resolvieron la colisión. |
clock_drift_exceeded | invalid_request_error | 422 | El reloj del servidor se desvió del NTP por encima del margen permitido. La marca de tiempo de generación entra en la huella AEAT, así que un reloj desincronizado produciría registros que la AEAT rechaza. |
declaracion_already_exists | conflict_error | 409 | La empresa ya tiene presentada la declaración responsable del SIF de ese período. |
declaracion_not_found | not_found_error | 404 | La empresa no tiene presentada la declaración responsable del SIF del período solicitado. |
event_already_processed | invalid_request_error | 422 | Ese evento del SIF ya está registrado en la cadena de eventos, y cada evento se procesa exactamente una vez. |
invalid_certificate_format | invalid_request_error | 422 | El fichero no es un contenedor PKCS#12: sus primeros bytes no corresponden a la estructura ASN.1 que exige el formato, diga lo que diga la extensión. |
invalid_certificate_password | invalid_request_error | 422 | La contraseña no abre el fichero del certificado. |
invalid_representation | invalid_request_error | 422 | La representación incumple una regla: falta el anexo I firmado o el justificante del apoderamiento, el documento no es un PDF válido o supera los 5 MB, signer_name, power_of_attorney_reference o el motivo de la revocación (reason, de 3 a 500 caracteres) no respetan su longitud, valid_until es anterior a granted_on o la supera en más de 5 años, o la representación ya está revocada (o no hay ninguna vigente que revocar). |
max_retries_exceeded | invalid_request_error | 422 | Solo aplica a los EVENTOS del modo NO VERI*FACTU (POST /v1/companies/{company}/verifactu/events/{id}/retry): el evento agotó su tope de intentos de transmisión. Los registros de facturación NO tienen tope de reintentos —el art. 16.4 de la Orden HAC/1177/2024 exige reintentar al menos una vez por hora mientras dure la incidencia—, así que ningún reintento de un registro devuelve ya este código. |
mode_switch_blocked_until_year_end | invalid_request_error | 422 | El modo VeriFactu se activó en este ejercicio y ya se emitió al menos un registro de facturación. Dar marcha atrás degradaría la integridad de una cadena ya declarada a la AEAT. |
record_already_accepted | invalid_request_error | 422 | La AEAT ya aceptó el registro. La aceptación es terminal y su contenido queda congelado como parte de la cadena de huellas. |
record_immutable | invalid_request_error | 422 | El registro pertenece a un ledger de solo-adición: una vez escrito, su contenido fiscal queda cerrado a modificaciones y a borrado. |
record_not_rejected | invalid_request_error | 422 | Solo se puede subsanar un registro de alta que la AEAT aceptó (o aceptó con errores) o rechazó. Este registro está en otro estado —pendiente de remitir, enviado sin respuesta o en error técnico—, que cubre el reintento y no la subsanación. |
record_not_subsanable | invalid_request_error | 422 | El registro no admite subsanación: no es un registro de alta, no es el ÚLTIMO alta de su factura (otra subsanación posterior lo sustituye), la factura está anulada, es un rechazado cuya alta corregida ya espera reenviarse, o no tiene factura de origen desde la que regenerar sus datos. |
representation_required | invalid_request_error | 422 | El modo de remisión pide a Factuarea que remita tus registros a la AEAT en tu nombre, y la empresa no tiene una representación vigente —ni revocada ni caducada— del tipo que ese modo necesita (el anexo I firmado para social_collaborator, el apoderamiento inscrito para power_of_attorney). |
requires_annulment | invalid_request_error | 422 | El contenido regenerado cambia un campo que entra en la huella —NIF del emisor, serie y número, fecha de expedición, tipo de factura, cuota o importe total— y la cadena no se puede reescribir. |
signing_certificate_unavailable | invalid_request_error | 422 | La empresa tiene VeriFactu activado en modo NO VERI*FACTU, donde cada registro de facturación se firma (Orden HAC/1177/2024, arts. 6.c y 14), y no hay con qué firmarlo. error.param dice QUÉ falta, y es estable: certificate = el certificado de la empresa falta, está caducado o revocado, lleva el NIF de otra empresa o su archivo .p12 no se puede leer (dañado, o con una contraseña guardada que ya no es válida); representation = en los modos de remisión por tercero, la representación que habilita a Factuarea a firmar en nombre de la empresa no está activa; system_certificate = el certificado de Factuarea no está disponible o no se puede leer. Sin firma no existe registro válido, y una factura emitida o anulada no puede quedar sin el suyo, así que la operación se rechaza antes de ejecutarse. |
sii_excluded | invalid_request_error | 422 | La empresa está registrada en el SII, y los obligados al SII quedan excluidos del reglamento VeriFactu. |
social_collaborator_unavailable | invalid_request_error | 422 | El acuerdo de colaboración social con la AEAT aún no está en vigor en esta instancia, así que no se puede elegir el modo social_collaborator. |
system_certificate_unavailable | api_error | 500 | El certificado de Factuarea que remite los registros en los modos de tercero falta, ha caducado o ha sido revocado. Es un problema nuestro, no de tu petición. |
verifactu_already_submitted | invalid_request_error | 422 | La factura ya tiene su registro de alta. Existe exactamente un alta por factura, así que una segunda rompería la idempotencia de la cadena. |
verifactu_mode_invalid | invalid_request_error | 422 | El modo queda fuera del catálogo verifactu / no_verifactu. |
verifactu_not_eligible | invalid_request_error | 422 | La factura no se puede registrar ahora mismo en la AEAT: la empresa no está en modo VeriFactu, no tiene certificado activo, o el certificado está revocado o emitido para otro NIF. Al emitir o anular, el mismo código con el subcódigo signing_certificate_unavailable indica que la empresa, con VeriFactu activado en modo NO VERI*FACTU, no tiene con qué firmar el registro (error.param: certificate, representation o system_certificate, según lo que falte), y con otros error.param que un dato de la factura no cabe en el registro de alta (lee error.param y error.message). |
verifactu_record_not_found | not_found_error | 404 | El identificador no corresponde a ningún registro de facturación de la empresa autenticada. |
verifactu_transmission_failed | invalid_request_error | 422 | El envío del registro a la AEAT no llegó a completarse: el endpoint estaba inaccesible o respondió con una incidencia. |
Webhooks
| Code | Type | HTTP | Descripción |
|---|---|---|---|
account_webhook_endpoint_limit_reached | invalid_request_error | 422 | La cuenta alcanzó el número de endpoints de webhook de cuenta que permite su tramo en ese entorno. El tope se cuenta por cuenta y por entorno (live o test) e incluye los endpoints desactivados: solo se libera una plaza al borrar un endpoint. |
addon_required | payment_required_error | 402 | Crear endpoints de webhook exige un plan que los incluya: en los de empresa, el add-on Developer API de la empresa; en los de cuenta, el plan del pagador de la cuenta. Aquí falta esa contratación: el nivel gratuito permite cero endpoints. |
api_version_invalid_format | invalid_request_error | 422 | La versión de payload del endpoint no es una fecha YYYY-MM-DD. |
api_version_unsupported | invalid_request_error | 422 | La versión de payload está bien formada pero no está entre las que sirve la plataforma. |
custom_header_blocklisted | invalid_request_error | 422 | Una de las cabeceras personalizadas está reservada: la gestiona la capa HTTP (host, content-type, content-length, user-agent), la envía Factuarea como parte del contrato firmado (factuarea-*), o pertenece al proxy (x-forwarded-*). |
custom_header_value_too_long | invalid_request_error | 422 | El valor de una cabecera personalizada supera los 1024 caracteres. |
invalid_url_target | invalid_request_error | 422 | El host de destino no es una dirección públicamente alcanzable, así que no entregamos ahí: se rechazan los rangos privados (RFC 1918), loopback, link-local, CGNAT (100.64.0.0/10), ULA IPv6 (fc00::/7) y multicast. Pese a lo que dice el mensaje, la restricción aplica en todos los entornos, no solo en producción. |
replay_delivery_not_retryable | invalid_request_error | 422 | Solo se reenvían las entregas fallidas. Una entrega que llegó bien, o una todavía en curso, no tiene nada que reenviar. |
replay_event_expired | invalid_request_error | 422 | El evento que respalda la entrega fue purgado por la política de retención de 30 días, así que ya no queda payload que reenviar. |
timeout_seconds_out_of_range | invalid_request_error | 422 | timeout_seconds queda fuera del rango de 1 a 30 segundos. |
too_many_custom_headers | invalid_request_error | 422 | El endpoint declara más de 20 cabeceras personalizadas. |
webhook_delivery_not_found | not_found_error | 404 | El identificador no corresponde a ningún intento de entrega, o la entrega queda fuera de la ventana de retención del histórico. |
webhook_endpoint_degraded | invalid_request_error | 422 | El endpoint está degradado tras fallos repetidos de entrega, así que los pings de prueba se rechazan mientras siga en ese estado. |
webhook_endpoint_not_found | not_found_error | 404 | El identificador no resuelve a ningún endpoint de webhook de la empresa autenticada. |
webhook_secret_recently_rotated | invalid_request_error | 422 | El secreto de firma se rotó hace menos de cinco minutos. La ventana de gracia permite que tu receptor acepte ambos secretos durante el cambio; rotar otra vez dentro de ella invalidaría firmas todavía en vuelo. Se responde como un 422 business_rule_violation con error.subcode webhook_secret_recently_rotated; no es un límite de peticiones y no consume ningún cubo de rate limit. |