{"data":[{"familia":"sri","codigo":"sri-2","sriCodigo":"2","source":"sri","titulo":"El RUC del emisor no está activo","tipo":"ERROR","validacion":"AUTORIZACION","accion":"FINAL","reintentable":false,"reintentableTrasAccionExterna":true,"descripcionFicha":"RUC del emisor se encuentra NO ACTIVO.","motivoFicha":"Verificar que el número de RUC se encuentre en estado ACTIVO","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El SRI tiene el RUC del emisor suspendido o inactivo, así que no autoriza ningún comprobante suyo, aunque el XML esté perfecto.","causasFrecuentes":["El contribuyente suspendió o canceló su RUC (cese de actividades).","El SRI suspendió el RUC de oficio (por ejemplo, por no presentar declaraciones).","En pruebas (celcer) se usó un RUC inventado o de otra persona."],"comoSolucionarlo":["Revise el estado del RUC en el portal del SRI (Consulta de RUC) o en su agencia.","Reactive el RUC en el SRI. Reintentar antes no sirve: el SRI seguirá respondiendo 2.","Cuando el RUC esté ACTIVO, llame a POST /v1/comprobantes/{id}/reintentar (conserva número y clave de acceso)."],"solucion":"Revise el estado del RUC en el portal del SRI (Consulta de RUC) o en su agencia. Reactive el RUC en el SRI. Reintentar antes no sirve: el SRI seguirá respondiendo 2. Cuando el RUC esté ACTIVO, llame a POST /v1/comprobantes/{id}/reintentar (conserva número y clave de acceso).","ejemplos":[{"identificador":"2","mensaje":"RUC DEL EMISOR SE ENCUENTRA NO ACTIVO","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-2"},{"familia":"sri","codigo":"sri-10","sriCodigo":"10","source":"sri","titulo":"El establecimiento está clausurado","tipo":"ERROR","validacion":"AUTORIZACION","accion":"FINAL","reintentable":false,"reintentableTrasAccionExterna":true,"descripcionFicha":"Establecimiento del emisor se encuentra Clausurado.","motivoFicha":"No se autorizará comprobantes si el establecimiento emisor ha sido clausurado, automáticamente se habilitará el servicio una vez concluido la clausura.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El SRI clausuró el establecimiento (el `estab` de la serie, p.ej. 001) desde el que se emite. Mientras dure la clausura no autoriza comprobantes de ese establecimiento.","causasFrecuentes":["Sanción de clausura del SRI sobre ese local.","Se emite desde una serie (`estab`) de un establecimiento clausurado en lugar de otro abierto."],"comoSolucionarlo":["Confirme la clausura y su plazo con el SRI.","Si tiene otro establecimiento abierto, emita indicando su serie (`estab` y `ptoEmi` en el cuerpo de la emisión).","Al terminar la clausura el SRI habilita el servicio solo; entonces puede llamar a POST /v1/comprobantes/{id}/reintentar."],"solucion":"Confirme la clausura y su plazo con el SRI. Si tiene otro establecimiento abierto, emita indicando su serie (`estab` y `ptoEmi` en el cuerpo de la emisión). Al terminar la clausura el SRI habilita el servicio solo; entonces puede llamar a POST /v1/comprobantes/{id}/reintentar.","ejemplos":[{"identificador":"10","mensaje":"ESTABLECIMIENTO DEL EMISOR SE ENCUENTRA CLAUSURADO","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-10"},{"familia":"sri","codigo":"sri-26","sriCodigo":"26","source":"sri","titulo":"El comprobante es demasiado grande","tipo":"ERROR","validacion":"RECEPCION","accion":"CORREGIR","reintentable":true,"reintentableTrasAccionExterna":false,"descripcionFicha":"Tamaño máximo superado","motivoFicha":"Tamaño del archivo supera lo establecido","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El XML firmado supera el tamaño que acepta el web service de recepción del SRI.","causasFrecuentes":["Demasiados ítems en un solo comprobante.","Descripciones o campos adicionales (`infoAdicional`) muy largos.","Detalles adicionales repetidos en cada ítem."],"comoSolucionarlo":["Divida la venta en varios comprobantes (por ejemplo, una factura por cada N ítems).","Acorte `items[].descripcion` y los valores de `infoAdicional`.","Corrija y llame a POST /v1/comprobantes/{id}/reintentar con el comprobante corregido."],"solucion":"Divida la venta en varios comprobantes (por ejemplo, una factura por cada N ítems). Acorte `items[].descripcion` y los valores de `infoAdicional`. Corrija y llame a POST /v1/comprobantes/{id}/reintentar con el comprobante corregido.","ejemplos":[{"identificador":"26","mensaje":"TAMANO MAXIMO SUPERADO","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-26"},{"familia":"sri","codigo":"sri-27","sriCodigo":"27","source":"sri","titulo":"El tipo de contribuyente no puede emitir electrónicamente","tipo":"ERROR","validacion":"AUTORIZACION","accion":"FINAL","reintentable":false,"reintentableTrasAccionExterna":false,"descripcionFicha":"Clase no permitido","motivoFicha":"La clase del contribuyente no puede emitir comprobantes electrónicos.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"Según el registro del SRI, la clase de contribuyente del emisor no está habilitada para emitir comprobantes electrónicos.","causasFrecuentes":["Clase de contribuyente sin autorización para facturación electrónica.","Datos del catastro del SRI desactualizados."],"comoSolucionarlo":["Consulte con el SRI la clase de contribuyente del RUC y los requisitos para emitir electrónicamente.","Este rechazo no se corrige cambiando el comprobante: reintentar no sirve hasta que el SRI lo habilite."],"solucion":"Consulte con el SRI la clase de contribuyente del RUC y los requisitos para emitir electrónicamente. Este rechazo no se corrige cambiando el comprobante: reintentar no sirve hasta que el SRI lo habilite.","ejemplos":[{"identificador":"27","mensaje":"CLASE NO PERMITIDO","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-27"},{"familia":"sri","codigo":"sri-28","sriCodigo":"28","source":"sri","titulo":"Falta aceptar el acuerdo de medios electrónicos","tipo":"ERROR","validacion":"RECEPCION","accion":"FINAL","reintentable":false,"reintentableTrasAccionExterna":true,"descripcionFicha":"Acuerdo de medios electrónicos no aceptado","motivoFicha":"Siempre el contribuyente debe haber aceptado el acuerdo de medio electrónicos en el cual se establece que se acepta que lleguen las notificaciones al buzón del contribuyente.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El emisor no ha aceptado en el portal del SRI el acuerdo de medios electrónicos (notificaciones al buzón del contribuyente), que es requisito para emitir.","causasFrecuentes":["Cuenta nueva en SRI en línea que nunca aceptó el acuerdo.","Cambio de representante legal sin aceptar el acuerdo."],"comoSolucionarlo":["Ingrese a SRI en línea con el RUC del emisor y acepte el acuerdo de medios electrónicos.","Después llame a POST /v1/comprobantes/{id}/reintentar (no hace falta cambiar los datos del comprobante)."],"solucion":"Ingrese a SRI en línea con el RUC del emisor y acepte el acuerdo de medios electrónicos. Después llame a POST /v1/comprobantes/{id}/reintentar (no hace falta cambiar los datos del comprobante).","ejemplos":[{"identificador":"28","mensaje":"ACUERDO DE MEDIOS ELECTRONICOS NO ACEPTADO","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-28"},{"familia":"sri","codigo":"sri-34","sriCodigo":"34","source":"sri","titulo":"Tipo de comprobante no autorizado para el emisor","tipo":"ERROR","validacion":"EMISOR","accion":"FINAL","reintentable":false,"reintentableTrasAccionExterna":true,"descripcionFicha":"Comprobante no autorizado","motivoFicha":"Cuando el comprobante no ha sido autorizado como parte de la solicitud de emisión del contribuyente.","fuente":"Ficha técnica offline v2.34, §11 nota 3 (validaciones del emisor)","queSignifica":"El emisor no incluyó este tipo de comprobante (p.ej. liquidación de compra o guía de remisión) en su solicitud de emisión electrónica.","causasFrecuentes":["La solicitud de emisión electrónica cubre sólo facturas y se emite otro tipo."],"comoSolucionarlo":["Amplíe en SRI en línea la solicitud de emisión electrónica al tipo de comprobante que necesita.","Después llame a POST /v1/comprobantes/{id}/reintentar."],"solucion":"Amplíe en SRI en línea la solicitud de emisión electrónica al tipo de comprobante que necesita. Después llame a POST /v1/comprobantes/{id}/reintentar.","ejemplos":[{"identificador":"34","mensaje":"COMPROBANTE NO AUTORIZADO","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-34"},{"familia":"sri","codigo":"sri-35","sriCodigo":"35","source":"sri","titulo":"El XML no cumple el esquema del SRI","tipo":"ERROR","validacion":"RECEPCION","accion":"CORREGIR","reintentable":true,"reintentableTrasAccionExterna":false,"descripcionFicha":"Documento inválido","motivoFicha":"Cuando el XML no pasa validación de esquema.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El SRI validó el XML contra su XSD y encontró un error de estructura o de formato. `informacionAdicional` dice qué elemento falló.","causasFrecuentes":["Un valor con más caracteres o decimales de los permitidos (p.ej. `items[].descripcion` de más de 300 caracteres).","Un campo obligatorio para ese tipo de comprobante quedó vacío.","Caracteres de control o no válidos en textos (saltos de línea, tabulaciones)."],"comoSolucionarlo":["Lea `details.mensajes[].informacionAdicional`: nombra el elemento del XML que falló.","Corrija el campo equivalente del JSON (los nombres coinciden con los de la ficha) y pruebe antes con `POST /v1/comprobantes/validar`.","Llame a POST /v1/comprobantes/{id}/reintentar con el comprobante corregido (se conserva el secuencial).","El motor valida el XSD antes de enviar, así que un 35 suele indicar una regla del SRI más estricta que el XSD publicado: Si persiste, escriba a soporte con el `requestId` y el `id` del comprobante (nunca envíe el XML ni el .p12 por correo)."],"solucion":"Lea `details.mensajes[].informacionAdicional`: nombra el elemento del XML que falló. Corrija el campo equivalente del JSON (los nombres coinciden con los de la ficha) y pruebe antes con `POST /v1/comprobantes/validar`. Llame a POST /v1/comprobantes/{id}/reintentar con el comprobante corregido (se conserva el secuencial). El motor valida el XSD antes de enviar, así que un 35 suele indicar una regla del SRI más estricta que el XSD publicado: Si persiste, escriba a soporte con el `requestId` y el `id` del comprobante (nunca envíe el XML ni el .p12 por correo).","ejemplos":[{"identificador":"35","mensaje":"ARCHIVO NO CUMPLE ESTRUCTURA XML","informacionAdicional":"Se encontró el siguiente error en la estructura del comprobante: …","tipo":"ERROR","fuente":"observado en celcer"},{"identificador":"35","mensaje":"DOCUMENTO INVÁLIDO","informacionAdicional":"Se encontró el siguiente error en la estructura del comprobante: cvc-complex-type.2.4.a: Invalid content was found starting with element 'totalSinImpuestos'. One of '{fechaEmisionDocSustento}' is expected.","tipo":"ERROR","fuente":"ficha v2.34 §7 (ejemplo de recepción fallida)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-35"},{"familia":"sri","codigo":"sri-36","sriCodigo":"36","source":"sri","titulo":"Versión del esquema descontinuada","tipo":"ERROR","validacion":"RECEPCION","accion":"CORREGIR","reintentable":true,"reintentableTrasAccionExterna":false,"descripcionFicha":"Versión esquema descontinuada","motivoFicha":"Cuando la versión del esquema no es la correcta.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El atributo `version` del comprobante corresponde a un esquema que el SRI ya no acepta.","causasFrecuentes":["El SRI retiró una versión del esquema (cambio de ficha técnica).","Se forzó una versión antigua del comprobante."],"comoSolucionarlo":["Emita sin forzar `version`: el motor elige la versión vigente de la ficha.","Si el SRI acaba de descontinuar una versión, revise el changelog (`GET /v1/changelog`).","Reintente con POST /v1/comprobantes/{id}/reintentar. Si persiste, escriba a soporte con el `requestId` y el `id` del comprobante (nunca envíe el XML ni el .p12 por correo)."],"solucion":"Emita sin forzar `version`: el motor elige la versión vigente de la ficha. Si el SRI acaba de descontinuar una versión, revise el changelog (`GET /v1/changelog`). Reintente con POST /v1/comprobantes/{id}/reintentar. Si persiste, escriba a soporte con el `requestId` y el `id` del comprobante (nunca envíe el XML ni el .p12 por correo).","ejemplos":[{"identificador":"36","mensaje":"VERSION ESQUEMA DESCONTINUADA","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-36"},{"familia":"sri","codigo":"sri-37","sriCodigo":"37","source":"sri","titulo":"El RUC no tiene autorización para emitir electrónicamente","tipo":"ERROR","validacion":"AUTORIZACION","accion":"FINAL","reintentable":false,"reintentableTrasAccionExterna":true,"descripcionFicha":"RUC sin autorización de emisión","motivoFicha":"Cuando el RUC del emisor no cuenta con una solicitud de emisión de comprobantes electrónicos.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El emisor no ha solicitado (o no le aprobaron) la emisión de comprobantes electrónicos en el SRI, en el ambiente donde envía (pruebas o producción).","causasFrecuentes":["No se hizo la solicitud de emisión electrónica en SRI en línea.","Se solicitó para pruebas pero se emite en producción (o al revés)."],"comoSolucionarlo":["En SRI en línea, en Facturación Electrónica, solicite la emisión para el ambiente correspondiente (pruebas o producción).","Cuando esté aprobada, llame a POST /v1/comprobantes/{id}/reintentar."],"solucion":"En SRI en línea, en Facturación Electrónica, solicite la emisión para el ambiente correspondiente (pruebas o producción). Cuando esté aprobada, llame a POST /v1/comprobantes/{id}/reintentar.","ejemplos":[{"identificador":"37","mensaje":"RUC SIN AUTORIZACION DE EMISION","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-37"},{"familia":"sri","codigo":"sri-39","sriCodigo":"39","source":"sri","titulo":"La firma electrónica no es válida","tipo":"ERROR","validacion":"AUTORIZACION","accion":"CORREGIR","reintentable":true,"reintentableTrasAccionExterna":false,"descripcionFicha":"Firma inválida","motivoFicha":"Firma electrónica del emisor no es válida.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El SRI no acepta la firma XAdES del comprobante. Lo más común es que el certificado (.p12) estuviera vencido o revocado en la fecha de firma.","causasFrecuentes":["Certificado .p12 vencido: \"La fecha de firma no esta dentro del periodo de validez del certificado firmante\".","Certificado revocado por la entidad certificadora (OCSP).","Certificado de otra persona o empresa, o emitido por una entidad que el SRI no reconoce."],"comoSolucionarlo":["Revise `GET /v1/emisores/{ruc}/estado-configuracion` y `GET /v1/certificados/por-vencer`.","Suba un .p12 vigente con `POST /v1/emisores/{ruc}/certificados` (multipart `archivo` + `password`, o JSON `p12Base64` + `password`).","Llame a POST /v1/comprobantes/{id}/reintentar: el motor vuelve a firmar con el certificado nuevo y conserva el número."],"solucion":"Revise `GET /v1/emisores/{ruc}/estado-configuracion` y `GET /v1/certificados/por-vencer`. Suba un .p12 vigente con `POST /v1/emisores/{ruc}/certificados` (multipart `archivo` + `password`, o JSON `p12Base64` + `password`). Llame a POST /v1/comprobantes/{id}/reintentar: el motor vuelve a firmar con el certificado nuevo y conserva el número.","ejemplos":[{"identificador":"39","mensaje":"FIRMA INVALIDA","informacionAdicional":"La fecha de firma no esta dentro del periodo de validez del certificado firmante","tipo":"ERROR","fuente":"informacionAdicional observada en celcer con un certificado vencido"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-39"},{"familia":"sri","codigo":"sri-40","sriCodigo":"40","source":"sri","titulo":"El SRI no pudo leer el certificado de la firma","tipo":"ERROR","validacion":"AUTORIZACION","accion":"CORREGIR","reintentable":true,"reintentableTrasAccionExterna":false,"descripcionFicha":"Error en el certificado","motivoFicha":"No se encontró el certificado o no se puede convertir en certificad X509.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El certificado incluido en la firma no se encontró o no es un X.509 válido para el SRI.","causasFrecuentes":[".p12 dañado o exportado sin el certificado del firmante.","Certificado de una entidad no acreditada."],"comoSolucionarlo":["Vuelva a exportar el .p12 desde la entidad certificadora (con la clave privada y el certificado).","Súbalo con `POST /v1/emisores/{ruc}/certificados` y luego llame a POST /v1/comprobantes/{id}/reintentar."],"solucion":"Vuelva a exportar el .p12 desde la entidad certificadora (con la clave privada y el certificado). Súbalo con `POST /v1/emisores/{ruc}/certificados` y luego llame a POST /v1/comprobantes/{id}/reintentar.","ejemplos":[{"identificador":"40","mensaje":"ERROR EN EL CERTIFICADO","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-40"},{"familia":"sri","codigo":"sri-42","sriCodigo":"42","source":"sri","titulo":"Certificado de firma caducado o revocado","tipo":"ERROR","validacion":"EMISOR","accion":"CORREGIR","reintentable":true,"reintentableTrasAccionExterna":false,"descripcionFicha":"Certificado revocado","motivoFicha":"Certificado que ha superado su fecha de caducidad, y no ha sido renovado.","fuente":"Ficha técnica offline v2.34, §11 nota 3 (validaciones del emisor)","queSignifica":"El certificado de firma electrónica superó su fecha de caducidad y no se renovó.","causasFrecuentes":["La firma .p12 venció (duran 1, 2 o más años según la entidad)."],"comoSolucionarlo":["Renueve la firma con su entidad certificadora.","Súbala con `POST /v1/emisores/{ruc}/certificados`; el servicio avisa antes del vencimiento (webhook `certificado.por_vencer`).","Llame a POST /v1/comprobantes/{id}/reintentar."],"solucion":"Renueve la firma con su entidad certificadora. Súbala con `POST /v1/emisores/{ruc}/certificados`; el servicio avisa antes del vencimiento (webhook `certificado.por_vencer`). Llame a POST /v1/comprobantes/{id}/reintentar.","ejemplos":[{"identificador":"42","mensaje":"CERTIFICADO REVOCADO","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-42"},{"familia":"sri","codigo":"sri-43","sriCodigo":"43","source":"sri","titulo":"El SRI ya tiene este comprobante","tipo":"ERROR","validacion":"RECEPCION","accion":"CONSULTAR_AUTORIZACION","reintentable":false,"reintentableTrasAccionExterna":false,"descripcionFicha":"Clave acceso registrada","motivoFicha":"Cuando la clave de acceso ya se encuentra registrada en la base de datos.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"La clave de acceso ya fue recibida antes. No es un error del comprobante: el SRI ya lo tiene y hay que consultar su autorización, no reenviarlo con otro número.","causasFrecuentes":["Reenvío del mismo comprobante tras un timeout o una caída de red.","El comprobante ya se envió desde otro sistema con la misma clave."],"comoSolucionarlo":["No haga nada: el motor consulta la autorización automáticamente (respuesta `202` y luego el webhook `comprobante.autorizado`).","Consulte el estado con `GET /v1/comprobantes/{id}`. No emita otro comprobante con otro secuencial (ficha §11 nota 2)."],"solucion":"No haga nada: el motor consulta la autorización automáticamente (respuesta `202` y luego el webhook `comprobante.autorizado`). Consulte el estado con `GET /v1/comprobantes/{id}`. No emita otro comprobante con otro secuencial (ficha §11 nota 2).","ejemplos":[{"identificador":"43","mensaje":"CLAVE ACCESO REGISTRADA","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-43"},{"familia":"sri","codigo":"sri-45","sriCodigo":"45","source":"sri","titulo":"Ese número de comprobante ya existe en el SRI","tipo":"ERROR","validacion":"RECEPCION","accion":"CORREGIR","reintentable":false,"reintentableTrasAccionExterna":false,"descripcionFicha":"Secuencial registrado","motivoFicha":"Secuencial del comprobante ya se encuentra registrado en la base de datos","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El secuencial (p.ej. 001-001-000000045) ya lo usó otro comprobante del mismo emisor, tipo y serie. Casi siempre lo emitió el sistema de facturación anterior.","causasFrecuentes":["Migración desde otro sistema: el secuencial de producción no se configuró desde el último número que emitió el sistema anterior.","Dos sistemas emitiendo a la vez con la misma serie (`estab`-`ptoEmi`)."],"comoSolucionarlo":["Use una serie distinta para cada sistema, o confirme cuál fue el último número del sistema anterior.","Configure el siguiente número con `PUT /v1/emisores/{ruc}/secuenciales` (`estab`, `ptoEmi`, `tipo`, `ambiente`, `siguiente`) y emita un comprobante NUEVO.","Con `autoAvanzarSecuencial` el motor salta números solo (hasta `EMISION_MAX_SALTOS_SECUENCIAL`); si aun así recibe el 45, reintentar no sirve: configure el secuencial."],"solucion":"Use una serie distinta para cada sistema, o confirme cuál fue el último número del sistema anterior. Configure el siguiente número con `PUT /v1/emisores/{ruc}/secuenciales` (`estab`, `ptoEmi`, `tipo`, `ambiente`, `siguiente`) y emita un comprobante NUEVO. Con `autoAvanzarSecuencial` el motor salta números solo (hasta `EMISION_MAX_SALTOS_SECUENCIAL`); si aun así recibe el 45, reintentar no sirve: configure el secuencial.","ejemplos":[{"identificador":"45","mensaje":"SECUENCIAL REGISTRADO","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-45"},{"familia":"sri","codigo":"sri-46","sriCodigo":"46","source":"sri","titulo":"El RUC del emisor no existe","tipo":"ERROR","validacion":"AUTORIZACION","accion":"FINAL","reintentable":false,"reintentableTrasAccionExterna":false,"descripcionFicha":"RUC no existe","motivoFicha":"Cuando el RUC emisor no existe en el Registro Único de Contribuyentes.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El RUC con el que se emite no está en el Registro Único de Contribuyentes.","causasFrecuentes":["RUC mal escrito al crear el emisor.","En celcer se usa un RUC de prueba que no existe en el catastro."],"comoSolucionarlo":["Verifique el RUC del emisor (`GET /v1/emisores`). El RUC de un emisor no se puede editar: si está mal, cree el emisor correcto con `POST /v1/emisores` y desactive el erróneo con `PATCH /v1/emisores/{ruc}` y `{\"activo\": false}`.","Emita de nuevo desde el emisor correcto."],"solucion":"Verifique el RUC del emisor (`GET /v1/emisores`). El RUC de un emisor no se puede editar: si está mal, cree el emisor correcto con `POST /v1/emisores` y desactive el erróneo con `PATCH /v1/emisores/{ruc}` y `{\"activo\": false}`. Emita de nuevo desde el emisor correcto.","ejemplos":[{"identificador":"46","mensaje":"RUC NO EXISTE","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"},{"identificador":"46","mensaje":" RUC no existe ","tipo":"ERROR","fuente":"ficha v2.34 §7 (ejemplo de comprobante no autorizado)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-46"},{"familia":"sri","codigo":"sri-47","sriCodigo":"47","source":"sri","titulo":"Tipo de comprobante desconocido","tipo":"ERROR","validacion":"RECEPCION","accion":"CORREGIR","reintentable":true,"reintentableTrasAccionExterna":false,"descripcionFicha":"Tipo de comprobante no existe","motivoFicha":"Cuando envían en el tipo de comprobante uno que no exista en el catálogo de nuestros tipos de comprobantes.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El código de documento (`codDoc`) del XML no está en el catálogo del SRI.","causasFrecuentes":["Error de integración del sistema emisor (el motor sólo genera los 6 tipos de la ficha)."],"comoSolucionarlo":["Emita por las rutas de la API (`/v1/facturas`, `/v1/notas-credito`…) o con `tipo` válido en `POST /v1/comprobantes`.","Si persiste, escriba a soporte con el `requestId` y el `id` del comprobante (nunca envíe el XML ni el .p12 por correo)."],"solucion":"Emita por las rutas de la API (`/v1/facturas`, `/v1/notas-credito`…) o con `tipo` válido en `POST /v1/comprobantes`. Si persiste, escriba a soporte con el `requestId` y el `id` del comprobante (nunca envíe el XML ni el .p12 por correo).","ejemplos":[{"identificador":"47","mensaje":"TIPO DE COMPROBANTE NO EXISTE","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-47"},{"familia":"sri","codigo":"sri-48","sriCodigo":"48","source":"sri","titulo":"No existe esquema para ese comprobante","tipo":"ERROR","validacion":"RECEPCION","accion":"CORREGIR","reintentable":true,"reintentableTrasAccionExterna":false,"descripcionFicha":"Esquema XSD no existe","motivoFicha":"Cuando el esquema para el tipo de comprobante enviado no existe.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El SRI no tiene un XSD para la combinación de tipo y versión del comprobante enviado.","causasFrecuentes":["Versión del comprobante no publicada por el SRI.","Cambio de ficha técnica aún no aplicado en el servicio."],"comoSolucionarlo":["No fuerce `version` en la emisión.","Reintente con POST /v1/comprobantes/{id}/reintentar. Si persiste, escriba a soporte con el `requestId` y el `id` del comprobante (nunca envíe el XML ni el .p12 por correo)."],"solucion":"No fuerce `version` en la emisión. Reintente con POST /v1/comprobantes/{id}/reintentar. Si persiste, escriba a soporte con el `requestId` y el `id` del comprobante (nunca envíe el XML ni el .p12 por correo).","ejemplos":[{"identificador":"48","mensaje":"ESQUEMA XSD NO EXISTE","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-48"},{"familia":"sri","codigo":"sri-49","sriCodigo":"49","source":"sri","titulo":"El SRI recibió el envío vacío","tipo":"ERROR","validacion":"RECEPCION","accion":"REINTENTAR","reintentable":true,"reintentableTrasAccionExterna":false,"descripcionFicha":"Argumentos que envían al WS nulos","motivoFicha":"Cuando se consume el WS con argumentos nulos.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El web service recibió la llamada sin el XML (argumento nulo). Suele ser un problema de transporte, no de datos.","causasFrecuentes":["Corte de red o proxy que vació el cuerpo de la petición SOAP.","Falla momentánea del SRI."],"comoSolucionarlo":["No haga nada: el motor reenvía el MISMO XML automáticamente con espera creciente.","Si el comprobante quedó DEVUELTA, llame a POST /v1/comprobantes/{id}/reintentar más tarde."],"solucion":"No haga nada: el motor reenvía el MISMO XML automáticamente con espera creciente. Si el comprobante quedó DEVUELTA, llame a POST /v1/comprobantes/{id}/reintentar más tarde.","ejemplos":[{"identificador":"49","mensaje":"ARGUMENTOS QUE ENVIAN AL WS NULOS","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"},{"identificador":"49","mensaje":"ARCHIVOS ENVIADOS NO CUMPLEN LAS ESPECIFICACIONES ESTABLECIDAS: EXTENSION, CODIFICACION","tipo":"ERROR","fuente":"observado en celcer (envío sin XML, estado RECIBIDA)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-49"},{"familia":"sri","codigo":"sri-50","sriCodigo":"50","source":"sri","titulo":"Error interno del SRI","tipo":"ERROR","validacion":"RECEPCION","accion":"REINTENTAR","reintentable":true,"reintentableTrasAccionExterna":false,"descripcionFicha":"Error interno general","motivoFicha":"Cuando ocurre un error inesperado en el servidor.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El SRI tuvo un error inesperado al procesar el envío. No es un problema del comprobante.","causasFrecuentes":["Caída o sobrecarga del SRI (frecuente a fin de mes)."],"comoSolucionarlo":["No haga nada: el motor reenvía el mismo XML automáticamente.","Si quedó DEVUELTA, llame a POST /v1/comprobantes/{id}/reintentar más tarde."],"solucion":"No haga nada: el motor reenvía el mismo XML automáticamente. Si quedó DEVUELTA, llame a POST /v1/comprobantes/{id}/reintentar más tarde.","ejemplos":[{"identificador":"50","mensaje":"ERROR INTERNO GENERAL","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-50"},{"familia":"sri","codigo":"sri-52","sriCodigo":"52","source":"sri","titulo":"Los totales no cuadran","tipo":"ERROR","validacion":"AUTORIZACION","accion":"CORREGIR","reintentable":true,"reintentableTrasAccionExterna":false,"descripcionFicha":"Error en diferencias","motivoFicha":"Cuando existe error en los cálculos del comprobante.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores) y nota 3","queSignifica":"El SRI recalculó el comprobante y sus totales (subtotales, impuestos o importe total) no coinciden con los declarados.","causasFrecuentes":["Totales calculados por el sistema cliente con otro redondeo (el motor los calcula solo: no envíe `totales`).","Descuentos (`items[].descuento`) mayores que el subtotal del ítem.","En retenciones, `baseImponible × porcentajeRetener` no da el valor retenido."],"comoSolucionarlo":["No envíe totales calculados por su sistema: la API calcula `totalSinImpuestos`, impuestos e `importeTotal` con redondeo half-up a 2 decimales.","Revise `items[].cantidad`, `items[].precioUnitario`, `items[].descuento` e `items[].iva`, y pruebe con `POST /v1/comprobantes/validar`.","Corrija y llame a POST /v1/comprobantes/{id}/reintentar."],"solucion":"No envíe totales calculados por su sistema: la API calcula `totalSinImpuestos`, impuestos e `importeTotal` con redondeo half-up a 2 decimales. Revise `items[].cantidad`, `items[].precioUnitario`, `items[].descuento` e `items[].iva`, y pruebe con `POST /v1/comprobantes/validar`. Corrija y llame a POST /v1/comprobantes/{id}/reintentar.","ejemplos":[{"identificador":"52","mensaje":"ERROR EN DIFERENCIAS","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-52"},{"familia":"sri","codigo":"sri-56","sriCodigo":"56","source":"sri","titulo":"El establecimiento está cerrado","tipo":"ERROR","validacion":"AUTORIZACION","accion":"FINAL","reintentable":false,"reintentableTrasAccionExterna":false,"descripcionFicha":"Establecimiento cerrado","motivoFicha":"Cuando el establecimiento desde el cual se genera el comprobante se encuentra cerrado.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El establecimiento (`estab`) de la serie figura cerrado en el RUC del emisor.","causasFrecuentes":["Se cerró el local en el RUC pero se sigue emitiendo con su serie.","Serie mal configurada (código de establecimiento equivocado)."],"comoSolucionarlo":["Verifique los establecimientos abiertos del RUC en el SRI.","Emita con la serie de un establecimiento abierto (`estab`/`ptoEmi`) o reabra el establecimiento en el SRI."],"solucion":"Verifique los establecimientos abiertos del RUC en el SRI. Emita con la serie de un establecimiento abierto (`estab`/`ptoEmi`) o reabra el establecimiento en el SRI.","ejemplos":[{"identificador":"56","mensaje":"ESTABLECIMIENTO CERRADO","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-56"},{"familia":"sri","codigo":"sri-57","sriCodigo":"57","source":"sri","titulo":"Autorización para emitir suspendida","tipo":"ERROR","validacion":"AUTORIZACION","accion":"FINAL","reintentable":false,"reintentableTrasAccionExterna":false,"descripcionFicha":"Autorización suspendida","motivoFicha":"Cuando la autorización para emisión de comprobantes electrónicos para el emisor se encuentra suspendida por procesos de control de la Administración Tributaria o el contribuyente no tenía la autorización para emitir comprobantes electrónicos a la fecha de emisión del comprobante","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El SRI suspendió la autorización de emisión electrónica del emisor, o el emisor no la tenía en la `fechaEmision` del comprobante.","causasFrecuentes":["Proceso de control del SRI.","`fechaEmision` anterior a la fecha en que el SRI aprobó la emisión electrónica."],"comoSolucionarlo":["Consulte con el SRI el motivo de la suspensión y regularícelo.","Si el problema es la fecha, emita con una `fechaEmision` posterior a la autorización."],"solucion":"Consulte con el SRI el motivo de la suspensión y regularícelo. Si el problema es la fecha, emita con una `fechaEmision` posterior a la autorización.","ejemplos":[{"identificador":"57","mensaje":"AUTORIZACION SUSPENDIDA","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-57"},{"familia":"sri","codigo":"sri-58","sriCodigo":"58","source":"sri","titulo":"La clave de acceso no coincide con el comprobante","tipo":"ERROR","validacion":"AUTORIZACION","accion":"CORREGIR","reintentable":true,"reintentableTrasAccionExterna":false,"descripcionFicha":"Error en la estructura de clave acceso","motivoFicha":"Cuando la clave de acceso tiene componentes diferentes a los del comprobante.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"Algún componente de la clave de acceso (fecha, tipo, RUC, ambiente, serie, secuencial) no coincide con los datos del XML.","causasFrecuentes":["Clave generada con otra fecha de emisión u otro ambiente que los del XML."],"comoSolucionarlo":["El motor genera la clave a partir del propio comprobante, así que este error no debería ocurrir.","Llame a POST /v1/comprobantes/{id}/reintentar. Si persiste, escriba a soporte con el `requestId` y el `id` del comprobante (nunca envíe el XML ni el .p12 por correo)."],"solucion":"El motor genera la clave a partir del propio comprobante, así que este error no debería ocurrir. Llame a POST /v1/comprobantes/{id}/reintentar. Si persiste, escriba a soporte con el `requestId` y el `id` del comprobante (nunca envíe el XML ni el .p12 por correo).","ejemplos":[{"identificador":"58","mensaje":"ERROR EN LA ESTRUCTURA DE CLAVE ACCESO","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-58"},{"familia":"sri","codigo":"sri-59","sriCodigo":"59","source":"sri","titulo":"Aviso: la identificación del comprador no existe","tipo":"ADVERTENCIA","validacion":null,"accion":null,"reintentable":false,"reintentableTrasAccionExterna":false,"descripcionFicha":"Identificación no existe","motivoFicha":"Cuando el número de la identificación del adquirente no existe.","fuente":"Ficha técnica offline v2.34, §11 (tabla de advertencias)","queSignifica":"Advertencia (no impide la autorización): el SRI no encontró la identificación del adquirente.","causasFrecuentes":["Identificación mal digitada.","Pasaporte o identificación del exterior que el SRI no conoce."],"comoSolucionarlo":["El comprobante igual se autoriza. Verifique `comprador.identificacion` para los próximos comprobantes."],"solucion":"El comprobante igual se autoriza. Verifique `comprador.identificacion` para los próximos comprobantes.","ejemplos":[{"identificador":"59","mensaje":"IDENTIFICACION NO EXISTE","tipo":"ADVERTENCIA","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-59"},{"familia":"sri","codigo":"sri-60","sriCodigo":"60","source":"sri","titulo":"Aviso: comprobante de pruebas","tipo":"ADVERTENCIA","validacion":null,"accion":null,"reintentable":false,"reintentableTrasAccionExterna":false,"descripcionFicha":"Ambiente ejecución.","motivoFicha":"Siempre que el comprobante sea emitido en ambiente de certificación o pruebas se enviará como parte de la autorización esta advertencia.","fuente":"Ficha técnica offline v2.34, §11 (tabla de advertencias)","queSignifica":"Advertencia informativa: el comprobante se procesó en el ambiente de pruebas del SRI y no tiene validez tributaria.","causasFrecuentes":["Emisión con una key `fk_test_` o con un emisor en `ambiente` 1."],"comoSolucionarlo":["Nada que corregir. Para producción: `POST /v1/emisores/{ruc}/activar-produccion` y una key `fk_live_`."],"solucion":"Nada que corregir. Para producción: `POST /v1/emisores/{ruc}/activar-produccion` y una key `fk_live_`.","ejemplos":[{"identificador":"60","mensaje":"ESTE PROCESO FUE REALIZADO EN EL AMBIENTE DE PRUEBAS","tipo":"ADVERTENCIA","fuente":"ficha v2.34 §7 (ejemplo de comprobante autorizado)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-60"},{"familia":"sri","codigo":"sri-62","sriCodigo":"62","source":"sri","titulo":"Aviso: identificación del comprador incorrecta","tipo":"ADVERTENCIA","validacion":null,"accion":null,"reintentable":false,"reintentableTrasAccionExterna":false,"descripcionFicha":"Identificación incorrecta","motivoFicha":"Cuando el número de la identificación del adquirente del comprobante está incorrecto. Por ejemplo, cédulas no pasan el dígito verificador.","fuente":"Ficha técnica offline v2.34, §11 (tabla de advertencias)","queSignifica":"Advertencia: la identificación del adquirente no es válida (por ejemplo, una cédula cuyo dígito verificador no cuadra).","causasFrecuentes":["Cédula o RUC con un dígito equivocado."],"comoSolucionarlo":["La API valida el dígito verificador de cédulas y RUC antes de emitir; revise `comprador.identificacion` y `comprador.tipoIdentificacion`."],"solucion":"La API valida el dígito verificador de cédulas y RUC antes de emitir; revise `comprador.identificacion` y `comprador.tipoIdentificacion`.","ejemplos":[{"identificador":"62","mensaje":"IDENTIFICACION INCORRECTA","tipo":"ADVERTENCIA","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-62"},{"familia":"sri","codigo":"sri-63","sriCodigo":"63","source":"sri","titulo":"El RUC está clausurado","tipo":"ERROR","validacion":"AUTORIZACION","accion":"FINAL","reintentable":false,"reintentableTrasAccionExterna":true,"descripcionFicha":"RUC clausurado","motivoFicha":"Cuando el RUC del emisor se encuentra clausurado por procesos de control de la Administración Tributaria.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El SRI clausuró al contribuyente emisor. Mientras dure la clausura no autoriza sus comprobantes.","causasFrecuentes":["Sanción de clausura por un proceso de control."],"comoSolucionarlo":["Regularice la situación con el SRI.","Cuando la clausura termine, llame a POST /v1/comprobantes/{id}/reintentar."],"solucion":"Regularice la situación con el SRI. Cuando la clausura termine, llame a POST /v1/comprobantes/{id}/reintentar.","ejemplos":[{"identificador":"63","mensaje":"RUC CLAUSURADO","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-63"},{"familia":"sri","codigo":"sri-64","sriCodigo":"64","source":"sri","titulo":"Código de documento sustento inválido","tipo":"ERROR","validacion":"EMISOR","accion":"CORREGIR","reintentable":true,"reintentableTrasAccionExterna":false,"descripcionFicha":"Código documento sustento","motivoFicha":"Cuando el código del documento sustento no existe en el catálogo de documentos que se tiene en la Administración.","fuente":"Ficha técnica offline v2.34, §11 nota 3 (validaciones del emisor)","queSignifica":"El código del documento que sustenta la retención o la nota (`codDocSustento`, `documentoModificado.codDoc`) no está en el catálogo del SRI.","causasFrecuentes":["Código escrito sin ceros a la izquierda (`1` en lugar de `01`).","Código de un catálogo antiguo."],"comoSolucionarlo":["Use los códigos de la tabla 4 de la ficha (`01` factura, `03` liquidación, `04` nota de crédito, `05` nota de débito…).","Corrija y llame a POST /v1/comprobantes/{id}/reintentar."],"solucion":"Use los códigos de la tabla 4 de la ficha (`01` factura, `03` liquidación, `04` nota de crédito, `05` nota de débito…). Corrija y llame a POST /v1/comprobantes/{id}/reintentar.","ejemplos":[{"identificador":"64","mensaje":"CODIGO DOCUMENTO SUSTENTO","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-64"},{"familia":"sri","codigo":"sri-65","sriCodigo":"65","source":"sri","titulo":"El comprobante se envió fuera de plazo","tipo":"ERROR","validacion":"EMISOR/RECEPCION","accion":"CORREGIR","reintentable":true,"reintentableTrasAccionExterna":false,"descripcionFicha":"Fecha de emisión extemporánea","motivoFicha":"Cuando el comprobante emitido no fue enviado de acuerdo con el tiempo del tipo de emisión en el cual fue realizado.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores) y nota 3","queSignifica":"La `fechaEmision` es demasiado antigua para el tipo de emisión: el comprobante debía enviarse al SRI antes.","causasFrecuentes":["Emisión con `fechaEmision` de varios días atrás.","Comprobante que quedó sin enviar (sin worker) mucho tiempo."],"comoSolucionarlo":["Emita con la fecha de hoy (sin `fechaEmision`: el motor usa la fecha de Ecuador).","Si fue un DEVUELTA, llame a POST /v1/comprobantes/{id}/reintentar enviando el comprobante con `fechaEmision` de hoy."],"solucion":"Emita con la fecha de hoy (sin `fechaEmision`: el motor usa la fecha de Ecuador). Si fue un DEVUELTA, llame a POST /v1/comprobantes/{id}/reintentar enviando el comprobante con `fechaEmision` de hoy.","ejemplos":[{"identificador":"65","mensaje":"FECHA DE EMISION EXTEMPORANEA","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-65"},{"familia":"sri","codigo":"sri-67","sriCodigo":"67","source":"sri","titulo":"Fecha con formato inválido","tipo":"ERROR","validacion":"RECEPCION","accion":"CORREGIR","reintentable":true,"reintentableTrasAccionExterna":false,"descripcionFicha":"Fecha inválida","motivoFicha":"Cuando existe errores en el formato de la fecha.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"Alguna fecha del XML no tiene el formato dd/mm/aaaa que exige la ficha o no es una fecha real.","causasFrecuentes":["Fechas en otro formato en campos de texto libre que van al XML.","Fechas imposibles (31/02)."],"comoSolucionarlo":["En la API todas las fechas van como `YYYY-MM-DD` (`fechaEmision`, `documentoModificado.fechaEmision`, `fechaIniTransporte`…): el motor las convierte.","Corrija y llame a POST /v1/comprobantes/{id}/reintentar."],"solucion":"En la API todas las fechas van como `YYYY-MM-DD` (`fechaEmision`, `documentoModificado.fechaEmision`, `fechaIniTransporte`…): el motor las convierte. Corrija y llame a POST /v1/comprobantes/{id}/reintentar.","ejemplos":[{"identificador":"67","mensaje":"FECHA INVALIDA","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-67"},{"familia":"sri","codigo":"sri-68","sriCodigo":"68","source":"sri","titulo":"Aviso: el documento relacionado no es electrónico","tipo":"ADVERTENCIA","validacion":null,"accion":null,"reintentable":false,"reintentableTrasAccionExterna":false,"descripcionFicha":"Documento sustento","motivoFicha":"Cuando el comprobante relacionado no existe como electrónico.","fuente":"Ficha técnica offline v2.34, §11 (tabla de advertencias)","queSignifica":"Advertencia: el documento que se modifica o sustenta (factura de una nota de crédito, documento de una retención) no existe como comprobante electrónico en el SRI.","causasFrecuentes":["El documento original fue físico (preimpreso).","Número o fecha del documento original mal digitados."],"comoSolucionarlo":["Verifique `documentoModificado.numero` y `documentoModificado.fechaEmision` (o `docsSustento[].numDocSustento`)."],"solucion":"Verifique `documentoModificado.numero` y `documentoModificado.fechaEmision` (o `docsSustento[].numDocSustento`).","ejemplos":[{"identificador":"68","mensaje":"DOCUMENTO SUSTENTO","tipo":"ADVERTENCIA","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-68"},{"familia":"sri","codigo":"sri-69","sriCodigo":"69","source":"sri","titulo":"La identificación del comprador no existe","tipo":"ERROR","validacion":"EMISOR","accion":"CORREGIR","reintentable":true,"reintentableTrasAccionExterna":false,"descripcionFicha":"Identificación del receptor","motivoFicha":"Cuando la identificación asociada al adquirente no existe. En general cuando el RUC del adquirente no existe en el Registro Único de Contribuyentes.","fuente":"Ficha técnica offline v2.34, §11 nota 3 (validaciones del emisor)","queSignifica":"La identificación del receptor (comprador, proveedor, sujeto retenido o destinatario) no existe; por lo general, el RUC no está en el Registro Único de Contribuyentes.","causasFrecuentes":["RUC del cliente mal digitado.","Se usó `tipoIdentificacion: \"ruc\"` con una cédula (o al revés)."],"comoSolucionarlo":["Verifique el RUC del cliente en el portal del SRI.","Corrija `comprador.identificacion` y `comprador.tipoIdentificacion` (o los del `proveedor`, `sujetoRetenido` o destinatario).","Llame a POST /v1/comprobantes/{id}/reintentar."],"solucion":"Verifique el RUC del cliente en el portal del SRI. Corrija `comprador.identificacion` y `comprador.tipoIdentificacion` (o los del `proveedor`, `sujetoRetenido` o destinatario). Llame a POST /v1/comprobantes/{id}/reintentar.","ejemplos":[{"identificador":"69","mensaje":"IDENTIFICACION DEL RECEPTOR","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-69"},{"familia":"sri","codigo":"sri-70","sriCodigo":"70","source":"sri","titulo":"El SRI todavía está procesando el comprobante","tipo":"ERROR","validacion":"RECEPCION","accion":"CONSULTAR_AUTORIZACION","reintentable":false,"reintentableTrasAccionExterna":false,"descripcionFicha":"Clave de acceso en procesamiento","motivoFicha":"Cuando se desea enviar un comprobante que ha sido enviado anteriormente y el mismo no ha terminado su procesamiento.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El SRI ya recibió este comprobante y aún no termina de procesarlo. Hay que esperar su respuesta (hasta 24 horas según la ficha) sin reenviarlo ni emitirlo con otro número.","causasFrecuentes":["Alta carga del SRI.","Reenvío del mismo comprobante mientras el SRI lo procesaba."],"comoSolucionarlo":["Espere: el motor consulta la autorización automáticamente (respuesta `202`, luego el webhook `comprobante.autorizado` o `comprobante.no_autorizado`).","No emita otro comprobante con otro secuencial por la misma venta (ficha §11 nota 2).","Consulte el estado con `GET /v1/comprobantes/{id}?eventos=true`."],"solucion":"Espere: el motor consulta la autorización automáticamente (respuesta `202`, luego el webhook `comprobante.autorizado` o `comprobante.no_autorizado`). No emita otro comprobante con otro secuencial por la misma venta (ficha §11 nota 2). Consulte el estado con `GET /v1/comprobantes/{id}?eventos=true`.","ejemplos":[{"identificador":"70","mensaje":"CLAVE DE ACCESO EN PROCESAMIENTO","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-70"},{"familia":"sri","codigo":"sri-80","sriCodigo":"80","source":"sri","titulo":"Clave de acceso mal formada en la consulta","tipo":"ERROR","validacion":"AUTORIZACION","accion":"CORREGIR","reintentable":true,"reintentableTrasAccionExterna":false,"descripcionFicha":"Error en la estructura de clave acceso","motivoFicha":"Cuando se ejecuta la consulta de autorización por clave de acceso y el valor de este parámetro supera los 49 dígitos, tiene caracteres alfanuméricos o cuando el tag (claveAccesoComprobante) está vacío","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"Se consultó la autorización con una clave que no tiene exactamente 49 dígitos.","causasFrecuentes":["Clave copiada con espacios, guiones o letras."],"comoSolucionarlo":["Use la `claveAcceso` de 49 dígitos que devuelve la API (o el `id` del comprobante) en `GET /v1/comprobantes/{id}`."],"solucion":"Use la `claveAcceso` de 49 dígitos que devuelve la API (o el `id` del comprobante) en `GET /v1/comprobantes/{id}`.","ejemplos":[{"identificador":"80","mensaje":"ERROR EN LA ESTRUCTURA DE LA CLAVE DE ACCESO","informacionAdicional":"Error al consultar la clave acceso. Error longitud clave acceso no valida.","tipo":"ERROR","fuente":"observado en celcer"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-80"},{"familia":"sri","codigo":"sri-82","sriCodigo":"82","source":"sri","titulo":"La fecha de inicio del transporte es anterior a la guía","tipo":"ERROR","validacion":"RECEPCION","accion":"CORREGIR","reintentable":true,"reintentableTrasAccionExterna":false,"descripcionFicha":"Error en la fecha de inicio de transporte","motivoFicha":"Cuando la fecha de inicio de transporte es menor a la fecha de emisión de la guía de remisión.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"En una guía de remisión, `fechaIniTransporte` no puede ser anterior a la fecha de emisión de la guía.","causasFrecuentes":["Guía emitida después de iniciar el traslado.","`fechaIniTransporte` de un día anterior por error."],"comoSolucionarlo":["Envíe `fechaIniTransporte` igual o posterior a `fechaEmision` (y `fechaFinTransporte` posterior a ambas).","Corrija y llame a POST /v1/comprobantes/{id}/reintentar."],"solucion":"Envíe `fechaIniTransporte` igual o posterior a `fechaEmision` (y `fechaFinTransporte` posterior a ambas). Corrija y llame a POST /v1/comprobantes/{id}/reintentar.","ejemplos":[{"identificador":"82","mensaje":"ERROR EN LA FECHA DE INICIO DE TRANSPORTE","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-82"},{"familia":"sri","codigo":"sri-92","sriCodigo":"92","source":"sri","titulo":"Monto de devolución del IVA no autorizado","tipo":"ERROR","validacion":"RECEPCION","accion":"CORREGIR","reintentable":true,"reintentableTrasAccionExterna":false,"descripcionFicha":"Error al validar monto de devolución del IVA.","motivoFicha":"Cuando el valor registrado en el campo de devolución del IVA, en facturas y notas de débito, no corresponde al que fue autorizado por el servicio web DIG.","fuente":"Ficha técnica offline v2.34, §11 (tabla de errores)","queSignifica":"El valor de devolución del IVA (beneficio a personas adultas mayores o con discapacidad) no coincide con el que autorizó el servicio web DIG del SRI.","causasFrecuentes":["Se envió un valor de devolución del IVA calculado por el sistema y no el autorizado por el DIG."],"comoSolucionarlo":["Esta API todavía no soporta la devolución automática del IVA (ficha §12-13): emita sin ese campo.","Si persiste, escriba a soporte con el `requestId` y el `id` del comprobante (nunca envíe el XML ni el .p12 por correo)."],"solucion":"Esta API todavía no soporta la devolución automática del IVA (ficha §12-13): emita sin ese campo. Si persiste, escriba a soporte con el `requestId` y el `id` del comprobante (nunca envíe el XML ni el .p12 por correo).","ejemplos":[{"identificador":"92","mensaje":"ERROR AL VALIDAR MONTO DE DEVOLUCION DEL IVA","tipo":"ERROR","fuente":"derivado de la ficha (formato de celcer: mayúsculas sin tildes)"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-92"},{"familia":"sri","codigo":"sri-99","sriCodigo":"99","source":"sri","titulo":"La consulta de validez no tiene datos","tipo":"ERROR","validacion":"CONSULTA","accion":"FINAL","reintentable":false,"reintentableTrasAccionExterna":false,"descripcionFicha":"Error al consultar datos del servicio web","motivoFicha":"Si el comprobante consultado se encuentra fuera del rango de fechas permitido por el SRI; si el comprobante no se encuentra en las bases de datos del SRI","fuente":"Ficha técnica offline v2.34, §8.2.3 (consulta de validez)","queSignifica":"El servicio de consulta de validez del SRI no encontró el comprobante, o su fecha de emisión está fuera del rango que permite consultar.","causasFrecuentes":["Comprobante muy antiguo.","Clave de acceso que el SRI nunca autorizó."],"comoSolucionarlo":["Verifique la clave de acceso.","Al anular con `\"verificarSri\": true` (`POST /v1/comprobantes/{id}/anular`), este código impide confirmar el estado en el SRI: revise el comprobante en el portal del SRI."],"solucion":"Verifique la clave de acceso. Al anular con `\"verificarSri\": true` (`POST /v1/comprobantes/{id}/anular`), este código impide confirmar el estado en el SRI: revise el comprobante en el portal del SRI.","ejemplos":[{"identificador":"99","mensaje":"ERROR AL CONSULTAR DATOS DEL SERVICIO WEB","informacionAdicional":"No es posible validar la clave de acceso ya que la fecha de emisión está fuera del rango permitido.","tipo":"ERROR","fuente":"ficha v2.34 §8.2.3"},{"identificador":"99","mensaje":"ERROR AL CONSULTAR DATOS DEL SERVICIO WEB","informacionAdicional":"No existen datos para los parámetros ingresados","tipo":"ERROR","fuente":"ficha v2.34 §8.2.3"}],"docUrl":"https://api.devfact.fonles.com/v1/errores/sri-99"},{"familia":"propio","codigo":"ACTIVACION_PRODUCCION_REQUERIDA","titulo":"Use activar-produccion","source":"validacion","modulo":"api","http":409,"mensaje":"Para pasar a producción use POST /v1/emisores/{ruc}/activar-produccion","causa":"Un PATCH con {\"ambiente\": 2} no pasa el emisor a producción.","solucion":"Use POST /v1/emisores/{ruc}/activar-produccion (revisa el checklist y los secuenciales).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/ACTIVACION_PRODUCCION_REQUERIDA"},{"familia":"propio","codigo":"ANULACION_NO_CONFIRMADA","titulo":"El SRI no confirma la anulación","source":"sri","modulo":"engine","http":409,"mensaje":"El SRI no reporta el comprobante como ANULADO; anúlelo primero en el portal del SRI","causa":"Con \"verificarSri\": true, el SRI sigue reportando el comprobante como AUTORIZADO.","solucion":"Anúlelo en el portal del SRI (y, si aplica, espere la aceptación del receptor) y repita POST /v1/comprobantes/{id}/anular.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/ANULACION_NO_CONFIRMADA"},{"familia":"propio","codigo":"ANULACION_NO_PERMITIDA","titulo":"La anulación no procede","source":"motor","modulo":"engine","http":409,"mensaje":"La anulación no procede según las reglas del SRI","causa":"Fuera de plazo (después del día 7 del mes siguiente) o factura a consumidor final (no se anula desde 2026).","solucion":"Emita una nota de crédito (POST /v1/notas-credito) identificando al comprador.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/ANULACION_NO_PERMITIDA"},{"familia":"propio","codigo":"API_KEY_INVALIDA","titulo":"API key inválida","source":"auth","modulo":"engine","http":401,"mensaje":"API key inválida","causa":"El token no existe, está mal copiado o no tiene el formato fk_test_…/fk_live_….","solucion":"Envíe Authorization: Bearer <api key> con el token completo que recibió al crearla (se muestra una sola vez). ¿Sin cuenta? Cree un sandbox con POST /v1/sandbox.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/API_KEY_INVALIDA"},{"familia":"propio","codigo":"API_KEY_NO_ENCONTRADA","titulo":"API key no encontrada","source":"motor","modulo":"engine","http":404,"mensaje":"API key no encontrada","causa":"El id de la API key no existe en esta cuenta.","solucion":"Liste las keys con GET /v1/api-keys.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/API_KEY_NO_ENCONTRADA"},{"familia":"propio","codigo":"API_KEY_REVOCADA","titulo":"API key revocada","source":"auth","modulo":"engine","http":401,"mensaje":"La API key fue revocada","causa":"La key se revocó (DELETE /v1/api-keys/{id}, reclamo del sandbox o baja de la cuenta).","solucion":"Use otra key vigente o cree una nueva con POST /v1/api-keys.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/API_KEY_REVOCADA"},{"familia":"propio","codigo":"APROBACION_NO_ENCONTRADA","titulo":"Aprobación no encontrada","source":"validacion","modulo":"engine","http":404,"mensaje":"Aprobación no encontrada","causa":"El id no corresponde a una aprobación de esta cuenta.","solucion":"Use el id que devolvió la emisión retenida (aprobacion.id).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/APROBACION_NO_ENCONTRADA"},{"familia":"propio","codigo":"APROBACION_RECHAZADA","titulo":"Una persona rechazó esta emisión","source":"validacion","modulo":"engine","http":409,"mensaje":"Una persona rechazó esta emisión; no se reintenta sola","causa":"Las reglas de aprobación de la cuenta retuvieron esta misma emisión (mismo contenido e Idempotency-Key) y alguien la rechazó en el panel.","solucion":"Pregunte a quien administra la cuenta por qué se rechazó. Para emitir algo distinto, cambie los datos o use otra Idempotency-Key.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/APROBACION_RECHAZADA"},{"familia":"propio","codigo":"APROBACION_REQUERIDA","titulo":"La emisión espera la aprobación de una persona","source":"auth","modulo":"api","http":403,"mensaje":"Las reglas de aprobación de la cuenta retienen esta emisión hasta que una persona la apruebe; todavía no se emitió nada.","causa":"Un agente (key fk_agent_… o token OAuth) pidió emitir en producción y se cumplió una regla de aprobación de la cuenta: producción siempre (por defecto), monto mayor al límite, un tipo que exige aprobación, un destinatario nuevo o demasiadas emisiones por hora. También responde 403 con este código si un agente intenta corregir un comprobante de producción o reenviarlo a un correo nuevo.","solucion":"Pida a quien administra la cuenta que la apruebe en el panel (aprobacion.url) y consulte GET /v1/aprobaciones/{id} o espere el webhook aprobacion.aprobada. Las reglas se cambian en el panel o con PUT /v1/aprobaciones/politica (API key admin).","reintentable":false,"advertencia":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/APROBACION_REQUERIDA"},{"familia":"propio","codigo":"APROBACION_YA_DECIDIDA","titulo":"La aprobación ya se decidió","source":"validacion","modulo":"engine","http":409,"mensaje":"La aprobación ya está decidida","causa":"Otra persona ya la aprobó o rechazó, falló al emitirse, o venció (APROBACION_TTL_HORAS).","solucion":"Consulte su estado; si venció, el agente debe pedir la emisión de nuevo.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/APROBACION_YA_DECIDIDA"},{"familia":"propio","codigo":"BD_ERROR","titulo":"Error de base de datos","source":"motor","modulo":"engine","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"La base de datos devolvió un error inesperado. Si es transitorio (bloqueo, conexión) la API responde 503 con Retry-After.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/BD_ERROR"},{"familia":"propio","codigo":"BD_NO_DISPONIBLE","titulo":"Base de datos no disponible","source":"motor","modulo":"api","http":503,"mensaje":"Base de datos ocupada; reintente en unos segundos","causa":"La base de datos está ocupada o no responde (transitorio).","solucion":"Reintente tras Retry-After con la misma Idempotency-Key.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/BD_NO_DISPONIBLE"},{"familia":"propio","codigo":"CERTIFICADO_NO_DISPONIBLE","titulo":"No hay firma utilizable","source":"motor","modulo":"engine","http":422,"mensaje":"El emisor no tiene un certificado de firma activo; súbalo antes de emitir","causa":"El emisor no tiene un .p12 activo y vigente con el que firmar.","solucion":"Suba la firma con POST /v1/emisores/{ruc}/certificados y emita de nuevo.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/CERTIFICADO_NO_DISPONIBLE"},{"familia":"propio","codigo":"CERTIFICADO_NO_ENCONTRADO","titulo":"Certificado no encontrado","source":"motor","modulo":"engine","http":404,"mensaje":"Certificado no encontrado","causa":"El id del certificado no existe para ese emisor.","solucion":"Liste los certificados con GET /v1/emisores/{ruc}/certificados.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/CERTIFICADO_NO_ENCONTRADO"},{"familia":"propio","codigo":"CERTIFICADO_VENCIDO","titulo":"La firma del emisor venció","source":"motor","modulo":"engine","http":422,"mensaje":"El certificado de firma del emisor venció el …; suba uno vigente","causa":"El .p12 activo del emisor ya venció; el SRI rechazaría la firma (error 39).","solucion":"Renueve la firma, súbala con POST /v1/emisores/{ruc}/certificados y emita de nuevo (o reintente los comprobantes atascados).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/CERTIFICADO_VENCIDO"},{"familia":"propio","codigo":"CERT_DEMASIADO_GRANDE","titulo":"Archivo .p12 demasiado grande","source":"validacion","modulo":"engine","http":413,"mensaje":"El .p12 supera … KiB","causa":"El archivo supera API_MAX_P12_BYTES (64 KiB por defecto); un .p12 real ocupa pocos KiB.","solucion":"Verifique que subió el .p12 correcto (no un PDF ni un ZIP).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/CERT_DEMASIADO_GRANDE"},{"familia":"propio","codigo":"CERT_DESTROYED","titulo":"Certificado destruido","source":"motor","modulo":"signer","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"El certificado se destruyó de la memoria antes de firmar (concurrencia con un reemplazo).","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/CERT_DESTROYED"},{"familia":"propio","codigo":"CERT_ENTIDAD_NO_RECONOCIDA","titulo":"Aviso: entidad certificadora no reconocida","source":"validacion","modulo":"signer","http":null,"advertencia":true,"mensaje":"El emisor del certificado no es una entidad acreditada conocida","causa":"La entidad que emitió el certificado no está en la lista de entidades acreditadas que conoce el servicio.","solucion":"Verifique que la firma la emitió una entidad acreditada por ARCOTEL; si ya hay firma activa, confirme con \"confirmar\": true.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/CERT_ENTIDAD_NO_RECONOCIDA"},{"familia":"propio","codigo":"CERT_EXPIRED","titulo":"Certificado vencido","source":"validacion","modulo":"signer","http":422,"mensaje":"El certificado venció el …","causa":"La fecha actual es posterior a la fecha de vencimiento (notAfter) del certificado.","solucion":"Renueve la firma con su entidad certificadora y suba el .p12 nuevo.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/CERT_EXPIRED"},{"familia":"propio","codigo":"CERT_EXPIRING_SOON","titulo":"Aviso: el certificado vence pronto","source":"validacion","modulo":"signer","http":null,"advertencia":true,"mensaje":"El certificado vence en menos de 30 días","causa":"Advertencia de la subida del certificado: vence en menos de 30 días.","solucion":"Renueve la firma a tiempo; el servicio avisa con el webhook certificado.por_vencer (30, 15, 7 y 1 día antes).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/CERT_EXPIRING_SOON"},{"familia":"propio","codigo":"CERT_KEY_USAGE","titulo":"El certificado no sirve para firmar","source":"validacion","modulo":"signer","http":422,"mensaje":"El uso de clave del certificado no permite firma digital","causa":"El keyUsage del certificado no incluye digitalSignature / nonRepudiation.","solucion":"Use una firma electrónica emitida para firmar documentos.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/CERT_KEY_USAGE"},{"familia":"propio","codigo":"CERT_NOT_YET_VALID","titulo":"Certificado todavía no vigente","source":"validacion","modulo":"signer","http":422,"mensaje":"El certificado aún no es válido","causa":"La fecha de inicio de vigencia (notBefore) es futura.","solucion":"Espere a la fecha de inicio de vigencia o revise la hora del equipo que generó la firma.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/CERT_NOT_YET_VALID"},{"familia":"propio","codigo":"CERT_NO_VALIDO","titulo":"Certificado no válido para el emisor","source":"validacion","modulo":"engine","http":422,"mensaje":"El certificado no es válido para firmar comprobantes de este emisor","causa":"El certificado tiene problemas de severidad error (details.problemas: vigencia, RUC, uso de clave…).","solucion":"Revise details.problemas y suba el .p12 correcto del emisor.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/CERT_NO_VALIDO"},{"familia":"propio","codigo":"CERT_REEMPLAZO_REQUIERE_CONFIRMACION","titulo":"Confirme el reemplazo de la firma","source":"motor","modulo":"engine","http":409,"mensaje":"El certificado nuevo es de una entidad no reconocida y reemplazaría al activo","causa":"El .p12 nuevo lo emitió una entidad que el servicio no reconoce y hay una firma activa que se destruiría.","solucion":"Si está seguro, repita la subida con \"confirmar\": true.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/CERT_REEMPLAZO_REQUIERE_CONFIRMACION"},{"familia":"propio","codigo":"CERT_REVOCADO","titulo":"Certificado revocado en el servicio","source":"motor","modulo":"engine","http":409,"mensaje":"Este certificado fue revocado en el motor y no puede volver a usarse; suba uno nuevo","causa":"El certificado se revocó (reemplazo, baja o revocación manual) y su material se destruyó.","solucion":"Suba un .p12 nuevo con POST /v1/emisores/{ruc}/certificados.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/CERT_REVOCADO"},{"familia":"propio","codigo":"CERT_RUC_MISMATCH","titulo":"El certificado es de otro RUC","source":"validacion","modulo":"signer","http":422,"mensaje":"El certificado no corresponde al RUC del emisor","causa":"El certificado identifica a otra persona o empresa que el RUC del emisor.","solucion":"Suba la firma del emisor (o del representante legal de la sociedad).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/CERT_RUC_MISMATCH"},{"familia":"propio","codigo":"CERT_RUC_NOT_FOUND","titulo":"Aviso: el certificado no trae el RUC de la sociedad","source":"validacion","modulo":"signer","http":null,"advertencia":true,"mensaje":"El certificado no contiene el RUC de la sociedad","causa":"Firma del representante legal sin el RUC de la empresa. Suele ser válida para el SRI.","solucion":"Si el SRI la rechaza (error 39), pida a la entidad certificadora una firma con el RUC de la sociedad.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/CERT_RUC_NOT_FOUND"},{"familia":"propio","codigo":"CLAVE_ACCESO_INVALIDA","titulo":"Clave de acceso inválida","source":"validacion","modulo":"core","http":422,"mensaje":"La clave de acceso debe tener 49 dígitos y un dígito verificador módulo 11 correcto","causa":"La clave no tiene 49 dígitos o su dígito verificador no cuadra.","solucion":"Copie la claveAcceso completa (49 dígitos) que devolvió la API.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/CLAVE_ACCESO_INVALIDA"},{"familia":"propio","codigo":"CLAVE_ACCESO_PARAMETRO_INVALIDO","titulo":"Parámetro de la clave de acceso inválido","source":"validacion","modulo":"core","http":422,"mensaje":"El módulo 11 sólo admite dígitos","causa":"Un componente de la clave de acceso no es numérico.","solucion":"Revise los datos del emisor y la serie. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/CLAVE_ACCESO_PARAMETRO_INVALIDO"},{"familia":"propio","codigo":"CODIGO_ERROR_NO_ENCONTRADO","titulo":"Código de error desconocido","source":"validacion","modulo":"api","http":404,"mensaje":"No existe el código de error …","causa":"GET /v1/errores/{codigo} con un código que no está en el catálogo.","solucion":"Liste los códigos con GET /v1/errores (los del SRI van como sri-<número>, p.ej. sri-45).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/CODIGO_ERROR_NO_ENCONTRADO"},{"familia":"propio","codigo":"COMPROBANTE_DEVUELTO","titulo":"El SRI devolvió el comprobante","source":"sri","modulo":"api","http":422,"mensaje":"El SRI devolvió el comprobante: <código> <mensaje>","causa":"La recepción del SRI rechazó el comprobante (estado DEVUELTA). Los motivos están en details.mensajes[], cada uno con su sriCodigo, titulo, solucion y docUrl.","solucion":"Siga details.accion y details.sugerencia: con CORREGIR_DATOS corrija y llame a POST /v1/comprobantes/{id}/reintentar (conserva el secuencial); con CONFIGURAR_SECUENCIAL (error 45) configure el secuencial y emita uno nuevo.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/COMPROBANTE_DEVUELTO"},{"familia":"propio","codigo":"COMPROBANTE_EN_PROCESO","titulo":"Comprobante en proceso","source":"motor","modulo":"engine","http":409,"mensaje":"El comprobante se está procesando en este momento; consulte su estado en unos segundos","causa":"Otro proceso (API o worker) está trabajando el comprobante.","solucion":"Espere unos segundos y consulte GET /v1/comprobantes/{id}, o reciba el webhook.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/COMPROBANTE_EN_PROCESO"},{"familia":"propio","codigo":"COMPROBANTE_INVALIDO","titulo":"Comprobante inválido","source":"validacion","modulo":"engine","http":422,"mensaje":"Comprobante inválido: <campo>: <problema>","causa":"El JSON del comprobante no cumple las reglas de la ficha (campos obligatorios, catálogos, montos, identificaciones…). No se consumió número.","solucion":"Corrija los campos de details.issues[] (path, code, message) y repita; pruebe antes con POST /v1/comprobantes/validar.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/COMPROBANTE_INVALIDO"},{"familia":"propio","codigo":"COMPROBANTE_NO_AUTORIZADO","titulo":"El SRI no autorizó el comprobante","source":"sri","modulo":"api","http":422,"mensaje":"El SRI no autorizó el comprobante: <código> <mensaje>","causa":"La autorización del SRI rechazó el comprobante (NO AUTORIZADO). Los motivos están en details.mensajes[].","solucion":"Siga details.accion y details.sugerencia; con REGULARIZAR_EN_SRI el problema es administrativo (RUC, establecimiento) y reintentar no sirve hasta regularizarlo.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/COMPROBANTE_NO_AUTORIZADO"},{"familia":"propio","codigo":"COMPROBANTE_NO_AUTORIZADO_AUN","titulo":"El comprobante aún no está autorizado","source":"motor","modulo":"api","http":409,"mensaje":"El comprobante está …; el XML autorizado y el RIDE sólo existen cuando el SRI lo autoriza","causa":"Se pidió el XML o el RIDE de un comprobante que no está AUTORIZADO.","solucion":"Espere el webhook comprobante.autorizado o consulte GET /v1/comprobantes/{id}; para revisar antes use /vista-previa.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/COMPROBANTE_NO_AUTORIZADO_AUN"},{"familia":"propio","codigo":"COMPROBANTE_NO_ENCONTRADO","titulo":"Comprobante no encontrado","source":"motor","modulo":"engine","http":404,"mensaje":"Comprobante no encontrado","causa":"El id o la clave de acceso no existen en esta cuenta.","solucion":"Busque el comprobante con GET /v1/comprobantes?claveAcceso=… o ?numero=….","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/COMPROBANTE_NO_ENCONTRADO"},{"familia":"propio","codigo":"COMPROBANTE_NO_SOPORTADO","titulo":"Comprobante no soportado","source":"validacion","modulo":"core","http":422,"mensaje":"Tipo o versión de comprobante no soportado","causa":"El tipo o la variante del comprobante no está soportado (ver la tabla \"Soportado / no soportado\" de la guía).","solucion":"Use uno de los 6 tipos soportados (factura, notaCredito, notaDebito, retencion, guiaRemision, liquidacionCompra).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/COMPROBANTE_NO_SOPORTADO"},{"familia":"propio","codigo":"CONFIG_INVALIDA","titulo":"Configuración del servidor inválida","source":"motor","modulo":"engine","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"Una variable de entorno del servicio falta o tiene un valor inválido (el mensaje de arranque nombra la variable, nunca su valor).","solucion":"Problema del operador del servicio: revise las variables de entorno (docs/OPERACION.md). Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/CONFIG_INVALIDA"},{"familia":"propio","codigo":"CONFIRMACION_INVALIDA","titulo":"La confirmación no corresponde al comprobante","source":"validacion","modulo":"engine","http":422,"mensaje":"La confirmación no corresponde a este comprobante: prepárelo de nuevo y emita exactamente lo preparado","causa":"El token de confirmación (fkconf_…) se firmó para otro contenido: cambió el comprobante, el emisor, la serie o el ambiente entre preparar y emitir, o el token está mal copiado.","solucion":"Prepare de nuevo el comprobante (herramienta preparar_comprobante del MCP) y emita con el token nuevo, sin cambiar nada.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/CONFIRMACION_INVALIDA"},{"familia":"propio","codigo":"CONFIRMACION_VENCIDA","titulo":"La confirmación venció","source":"validacion","modulo":"engine","http":422,"mensaje":"La confirmación venció (dura 15 minutos): vuelva a preparar el comprobante","causa":"Pasaron más de 15 minutos entre preparar y emitir.","solucion":"Prepare de nuevo el comprobante y emita con el token nuevo.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/CONFIRMACION_VENCIDA"},{"familia":"propio","codigo":"CONTENT_TYPE_NO_SOPORTADO","titulo":"Content-Type no soportado","source":"validacion","modulo":"api","http":415,"mensaje":"Use Content-Type: application/json","causa":"El cuerpo llegó con un Content-Type que la ruta no admite.","solucion":"Envíe Content-Type: application/json (o multipart/form-data en la subida del .p12).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/CONTENT_TYPE_NO_SOPORTADO"},{"familia":"propio","codigo":"CONTEXTO_INVALIDO","titulo":"Contexto de emisión inválido","source":"validacion","modulo":"core","http":422,"mensaje":"<campo>: <problema>","causa":"Un dato del emisor o de la serie no es válido para generar el comprobante.","solucion":"Revise los datos del emisor (GET /v1/emisores/{ruc}) y de la serie.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/CONTEXTO_INVALIDO"},{"familia":"propio","codigo":"CUERPO_DEMASIADO_GRANDE","titulo":"Cuerpo demasiado grande","source":"validacion","modulo":"api","http":413,"mensaje":"El cuerpo supera el máximo de … para este endpoint","causa":"El cuerpo supera el máximo de la ruta (2 MiB por comprobante, 64 KiB en administración).","solucion":"Divida el comprobante o reduzca el logo.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/CUERPO_DEMASIADO_GRANDE"},{"familia":"propio","codigo":"CUERPO_INVALIDO","titulo":"Cuerpo inválido","source":"validacion","modulo":"api","http":400,"mensaje":"Se esperaba un cuerpo JSON (Content-Type: application/json)","causa":"Falta el cuerpo o no es un objeto JSON.","solucion":"Envíe un objeto JSON con Content-Type: application/json.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/CUERPO_INVALIDO"},{"familia":"propio","codigo":"CUOTA_SANDBOX_AGOTADA","titulo":"Cuota del sandbox agotada","source":"motor","modulo":"engine","http":403,"mensaje":"El sandbox ya emitió sus … comprobantes","causa":"Una cuenta sin verificar tiene un máximo de comprobantes (500 por defecto). No se consumió número.","solucion":"Reclame el sandbox (POST /v1/sandbox/reclamar) y verifique el correo, o cree otro sandbox.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/CUOTA_SANDBOX_AGOTADA"},{"familia":"propio","codigo":"DATOS_INVALIDOS","titulo":"Datos inválidos","source":"validacion","modulo":"engine","http":422,"mensaje":"Datos inválidos: <campo>: <problema>","causa":"Algún campo del cuerpo falta, sobra o tiene un valor no permitido.","solucion":"Corrija los campos que indica details.issues[] (path, code, message) y repita la petición.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/DATOS_INVALIDOS"},{"familia":"propio","codigo":"EMAIL_YA_REGISTRADO","titulo":"El correo ya tiene una cuenta","source":"validacion","modulo":"engine","http":409,"mensaje":"Este correo ya pertenece a otra cuenta verificada","causa":"Se verificó un sandbox reclamado con un correo que ya es de otra cuenta verificada (cada correo identifica a una sola cuenta). Sólo se informa después de demostrar que el correo es suyo.","solucion":"Siga usando la cuenta que ya tiene (sus API keys) o, si es un sandbox reclamado, cambie su correo con POST /v1/cuenta/email { \"email\": \"<otro correo>\" } usando la API key del sandbox y verifique el nuevo.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/EMAIL_YA_REGISTRADO"},{"familia":"propio","codigo":"EMISOR_DEMO_RESTRINGIDO","titulo":"El emisor demo sólo emite simulado","source":"motor","modulo":"engine","http":409,"mensaje":"El emisor demo no puede pasar a producción ni a celcer","causa":"El emisor demo (RUC ficticio, certificado sintético) sólo existe en el SRI simulado.","solucion":"Cree su propio emisor con POST /v1/emisores, suba su .p12 y use modoPruebas \"celcer\".","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/EMISOR_DEMO_RESTRINGIDO"},{"familia":"propio","codigo":"EMISOR_DUPLICADO","titulo":"El emisor ya existe","source":"motor","modulo":"engine","http":409,"mensaje":"Ya existe un emisor con RUC … en esta cuenta","causa":"Ya hay un emisor con ese RUC en la cuenta.","solucion":"Use el emisor existente (GET /v1/emisores/{ruc}) o modifíquelo con PATCH.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/EMISOR_DUPLICADO"},{"familia":"propio","codigo":"EMISOR_INACTIVO","titulo":"Emisor inactivo","source":"motor","modulo":"engine","http":409,"mensaje":"El emisor está inactivo","causa":"El emisor se desactivó y no puede emitir.","solucion":"Reactívelo con PATCH /v1/emisores/{ruc} y {\"activo\": true}.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/EMISOR_INACTIVO"},{"familia":"propio","codigo":"EMISOR_NO_ENCONTRADO","titulo":"Emisor no encontrado","source":"motor","modulo":"engine","http":404,"mensaje":"Emisor no encontrado","causa":"El RUC o id del emisor no existe en esta cuenta.","solucion":"Liste sus emisores con GET /v1/emisores y use su RUC en la ruta o en el campo \"emisor\".","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/EMISOR_NO_ENCONTRADO"},{"familia":"propio","codigo":"EMISOR_REQUERIDO","titulo":"Indique el emisor","source":"validacion","modulo":"api","http":422,"mensaje":"La cuenta tiene varios emisores: indique \"emisor\" (RUC)","causa":"La cuenta no tiene emisores activos, o tiene varios y la petición no dice cuál.","solucion":"Agregue \"emisor\": \"<RUC>\" al cuerpo, o cree uno con POST /v1/emisores.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/EMISOR_REQUERIDO"},{"familia":"propio","codigo":"EMISOR_RUC_INVALIDO","titulo":"RUC del emisor inválido (certificado)","source":"validacion","modulo":"signer","http":null,"expuestoComo":"CERT_NO_VALIDO","mensaje":"El RUC del emisor no es válido","causa":"Al validar el certificado, el RUC del emisor no tiene un formato válido.","solucion":"Revise el RUC del emisor.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/EMISOR_RUC_INVALIDO"},{"familia":"propio","codigo":"ENTORNO_NO_PERMITIDO","titulo":"Una key de pruebas no opera producción","source":"auth","modulo":"api","http":403,"mensaje":"Las API keys de prueba (fk_test_…) sólo operan en ambiente de pruebas (1)","causa":"Una key fk_test_ intentó tocar producción (ambiente 2), crear una key fk_live_, activar el proveedor externo de inteligencia (consentimiento de toda la cuenta) o configurar por primera vez el 2FA de una cuenta sin correo verificado.","solucion":"Use una key fk_live_ de la misma cuenta (en las altas de la plataforma, la entrega el operador).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/ENTORNO_NO_PERMITIDO"},{"familia":"propio","codigo":"ENTRADA_INVALIDA","titulo":"Entrada del comprobante inválida","source":"validacion","modulo":"core","http":422,"expuestoComo":"COMPROBANTE_INVALIDO","mensaje":"Entrada inválida: N problema(s)","causa":"El comprobante no pasa la validación de entrada del núcleo.","solucion":"Corrija los campos de details.issues[].","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/ENTRADA_INVALIDA"},{"familia":"propio","codigo":"ERROR_INTERNO","titulo":"Error interno","source":"motor","modulo":"engine","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"Error inesperado del servicio (bug). El detalle queda en los logs con el requestId, nunca datos del comprobante.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/ERROR_INTERNO"},{"familia":"propio","codigo":"ESTABLECIMIENTO_DUPLICADO","titulo":"El establecimiento ya existe","source":"motor","modulo":"engine","http":409,"mensaje":"El establecimiento … ya existe para este emisor","causa":"Ya hay un establecimiento con ese código.","solucion":"Use el existente o modifíquelo con PATCH /v1/emisores/{ruc}/establecimientos/{codigo}.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/ESTABLECIMIENTO_DUPLICADO"},{"familia":"propio","codigo":"ESTABLECIMIENTO_INACTIVO","titulo":"Establecimiento inactivo","source":"motor","modulo":"engine","http":409,"mensaje":"El establecimiento … está inactivo","causa":"La serie elegida pertenece a un establecimiento desactivado.","solucion":"Reactívelo con PATCH /v1/emisores/{ruc}/establecimientos/{codigo} o emita con otro \"estab\".","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/ESTABLECIMIENTO_INACTIVO"},{"familia":"propio","codigo":"ESTABLECIMIENTO_NO_ENCONTRADO","titulo":"Establecimiento no encontrado","source":"motor","modulo":"engine","http":404,"mensaje":"No existe el establecimiento …","causa":"El código de establecimiento (estab) no existe para el emisor.","solucion":"Créelo con POST /v1/emisores/{ruc}/establecimientos o use uno de GET /v1/emisores/{ruc}/establecimientos.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/ESTABLECIMIENTO_NO_ENCONTRADO"},{"familia":"propio","codigo":"FECHA_INVALIDA","titulo":"Fecha inválida","source":"validacion","modulo":"core","http":422,"mensaje":"Fecha inválida","causa":"Una fecha no tiene el formato YYYY-MM-DD o no existe.","solucion":"Envíe las fechas como YYYY-MM-DD (fecha local de Ecuador).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/FECHA_INVALIDA"},{"familia":"propio","codigo":"FIRMA_INVALIDA","titulo":"La firma generada no se pudo verificar","source":"motor","modulo":"engine","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"La firma XAdES recién generada no superó la verificación local (no debería ocurrir).","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/FIRMA_INVALIDA"},{"familia":"propio","codigo":"IDEMPOTENCY_CONFLICT","titulo":"Idempotency-Key reutilizada con otro contenido","source":"validacion","modulo":"engine","http":409,"mensaje":"La Idempotency-Key ya se usó con otro contenido","causa":"La misma Idempotency-Key se envió antes (en los últimos 7 días) con un cuerpo distinto.","solucion":"Use una Idempotency-Key nueva para cada comprobante distinto; repita la misma sólo para reintentar la misma petición.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/IDEMPOTENCY_CONFLICT"},{"familia":"propio","codigo":"IDEMPOTENCY_KEY_INVALIDA","titulo":"Idempotency-Key inválida","source":"validacion","modulo":"api","http":400,"mensaje":"Idempotency-Key debe tener de 1 a 255 caracteres ASCII imprimibles, sin espacios","causa":"La cabecera Idempotency-Key está vacía, es demasiado larga o tiene caracteres no permitidos.","solucion":"Use un identificador ASCII sin espacios (p.ej. el id del pedido).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/IDEMPOTENCY_KEY_INVALIDA"},{"familia":"propio","codigo":"INFO_ADICIONAL_EXCEDE_MAXIMO","titulo":"Demasiados campos adicionales","source":"validacion","modulo":"core","http":422,"mensaje":"La información adicional admite hasta 15 campos","causa":"infoAdicional supera los 15 campos de la ficha (el campo \"RUC Proveedor\" cuenta dentro del máximo).","solucion":"Reduzca infoAdicional a 14 campos (el servicio agrega \"RUC Proveedor\").","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/INFO_ADICIONAL_EXCEDE_MAXIMO"},{"familia":"propio","codigo":"INTELIGENCIA_DESHABILITADA","titulo":"Inteligencia deshabilitada","source":"motor","modulo":"engine","http":503,"mensaje":"Las sugerencias de inteligencia no están habilitadas en este servicio","causa":"El operador deshabilitó POST /v1/inteligencia/* (INTELIGENCIA_HABILITADA=false). La emisión y la validación no se ven afectadas: con ?revisar=true responden sin sugerencias.","solucion":"Emita normalmente con la tarifa que corresponda; consulte al operador si necesita las sugerencias.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/INTELIGENCIA_DESHABILITADA"},{"familia":"propio","codigo":"JSON_INVALIDO","titulo":"JSON inválido","source":"validacion","modulo":"api","http":400,"mensaje":"El cuerpo no es JSON válido","causa":"El cuerpo no se puede interpretar como JSON (comillas, comas finales…).","solucion":"Valide el JSON antes de enviarlo; los montos van como texto (\"10.50\").","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/JSON_INVALIDO"},{"familia":"propio","codigo":"LIMITE_ALCANZADO","titulo":"Cupo de la cuenta alcanzado","source":"motor","modulo":"engine","http":409,"mensaje":"La cuenta ya tiene … activos; desactive los que no use antes de crear otro","causa":"Se alcanzó un máximo de la cuenta (API keys activas, endpoints de webhook, emisores de un sandbox…).","solucion":"Revoque o desactive los que no use (details.maximo indica el cupo) y repita.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/LIMITE_ALCANZADO"},{"familia":"propio","codigo":"LIMITE_ANUAL_ALCANZADO","titulo":"Tope anual del plan alcanzado","source":"motor","modulo":"engine","http":403,"mensaje":"Esta cuenta ya usó sus 50 comprobantes de producción de este año: cambie de plan para seguir emitiendo","causa":"El plan de la cuenta (por ejemplo, Gratis) incluye un número fijo de comprobantes de producción por año calendario de Ecuador (del 1 de enero al 31 de diciembre). Cuentan los creados en el año que no fueron rechazados (DEVUELTA o NO AUTORIZADO no cuentan), desde que se fijó el tope si fue a mitad de año. Las pruebas (simulado y celcer) nunca cuentan.","solucion":"Contrate un plan con más comprobantes desde el panel (Facturación) o espere al 1 de enero siguiente. details.limite, details.usados y details.reiniciaEl dicen cuánto lleva y cuándo se reinicia. No se consumió ningún secuencial.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/LIMITE_ANUAL_ALCANZADO"},{"familia":"propio","codigo":"LIMITE_EXCEDIDO","titulo":"Demasiadas peticiones","source":"motor","modulo":"api","http":429,"mensaje":"Límite de N peticiones por minuto excedido para esta API key","causa":"Se superó el rate limit por key, por cuenta, de sandboxes por IP o de intentos de autenticación fallidos.","solucion":"Espere los segundos de Retry-After y reintente; reparta la carga en el tiempo.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/LIMITE_EXCEDIDO"},{"familia":"propio","codigo":"LIMITE_MENSUAL_ALCANZADO","titulo":"Tope mensual del plan alcanzado","source":"motor","modulo":"engine","http":403,"mensaje":"Esta cuenta ya usó sus 50 comprobantes de producción de este mes: cambie de plan para seguir emitiendo","causa":"El plan de la cuenta (por ejemplo, Gratis) incluye un número fijo de comprobantes de producción por mes calendario de Ecuador. Cuentan los creados en el mes que no fueron rechazados (DEVUELTA o NO AUTORIZADO no cuentan). Las pruebas (simulado y celcer) nunca cuentan.","solucion":"Contrate un plan con más comprobantes desde el panel (Facturación) o espere al primer día del mes siguiente. details.limite, details.usados y details.reiniciaEl dicen cuánto lleva y cuándo se reinicia. No se consumió ningún secuencial.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/LIMITE_MENSUAL_ALCANZADO"},{"familia":"propio","codigo":"MAIL_ATTACHMENT_TOO_LARGE","titulo":"Adjuntos demasiado grandes","source":"validacion","modulo":"mail","http":413,"mensaje":"El correo supera el tamaño máximo","causa":"El RIDE + XML superan el máximo del proveedor (40 MB en Resend).","solucion":"Reduzca el logo del emisor o el tamaño del comprobante.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/MAIL_ATTACHMENT_TOO_LARGE"},{"familia":"propio","codigo":"MAIL_AUTH","titulo":"Credenciales del correo rechazadas","source":"motor","modulo":"mail","http":502,"mensaje":"El proveedor de correo falló; intente más tarde","causa":"API key de Resend inválida, dominio no verificado o credenciales SMTP incorrectas (configuración del servicio).","solucion":"Problema del operador del servicio. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/MAIL_AUTH"},{"familia":"propio","codigo":"MAIL_IDEMPOTENCY_CONFLICT","titulo":"Conflicto de idempotencia del correo","source":"motor","modulo":"mail","http":409,"mensaje":"El correo ya se está enviando o se envió con otro contenido","causa":"El proveedor recibió el mismo envío con la misma clave de idempotencia.","solucion":"Espere y consulte el estado del correo en GET /v1/comprobantes/{id}.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/MAIL_IDEMPOTENCY_CONFLICT"},{"familia":"propio","codigo":"MAIL_INVALID_RECIPIENT","titulo":"Destinatario de correo inválido","source":"validacion","modulo":"mail","http":422,"mensaje":"Dirección de correo inválida","causa":"Dirección mal escrita, demasiados destinatarios o rechazada por el servidor.","solucion":"Corrija comprador.email o la lista \"emails\" (details.campo indica cuál).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/MAIL_INVALID_RECIPIENT"},{"familia":"propio","codigo":"MAIL_INVALID_REQUEST","titulo":"Correo inválido","source":"validacion","modulo":"mail","http":422,"mensaje":"El correo no es válido","causa":"Algún dato del correo (cabeceras, asunto, adjuntos) no es válido.","solucion":"Revise details.campo.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/MAIL_INVALID_REQUEST"},{"familia":"propio","codigo":"MAIL_PROVIDER_ERROR","titulo":"Falló el proveedor de correo","source":"motor","modulo":"mail","http":502,"mensaje":"El proveedor de correo falló; intente más tarde","causa":"El proveedor de correo respondió 5xx, timeout o error de red.","solucion":"Reintente más tarde; el worker reintenta los correos de los comprobantes.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/MAIL_PROVIDER_ERROR"},{"familia":"propio","codigo":"MAIL_RATE_LIMITED","titulo":"El proveedor de correo limitó el envío","source":"motor","modulo":"mail","http":429,"mensaje":"El proveedor de correo limitó el envío; intente más tarde","causa":"Se superó el límite de envíos del proveedor de correo.","solucion":"Reintente tras Retry-After; los correos de los comprobantes los reintenta el worker solo.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/MAIL_RATE_LIMITED"},{"familia":"propio","codigo":"MAIL_WEBHOOK_CONFIG","titulo":"Webhook de Resend sin configurar","source":"motor","modulo":"mail","http":null,"expuestoComo":"SERVICIO_NO_CONFIGURADO","mensaje":"El webhook de Resend no está configurado","causa":"Falta o es inválido RESEND_WEBHOOK_SECRET.","solucion":"Configure RESEND_WEBHOOK_SECRET (operador).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/MAIL_WEBHOOK_CONFIG"},{"familia":"propio","codigo":"MAIL_WEBHOOK_INVALID_PAYLOAD","titulo":"Evento de Resend no reconocido","source":"validacion","modulo":"mail","http":422,"mensaje":"El webhook no es un evento reconocible","causa":"Firma válida pero cuerpo que no es un evento de Resend.","solucion":"Revise la configuración del webhook en Resend.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/MAIL_WEBHOOK_INVALID_PAYLOAD"},{"familia":"propio","codigo":"MAIL_WEBHOOK_INVALID_SIGNATURE","titulo":"Firma del webhook de Resend inválida","source":"auth","modulo":"mail","http":401,"mensaje":"Firma de webhook inválida","causa":"La petición a POST /v1/webhooks/resend no trae una firma Svix válida o está fuera de tiempo.","solucion":"Configure en Resend el mismo secreto whsec_… que RESEND_WEBHOOK_SECRET.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/MAIL_WEBHOOK_INVALID_SIGNATURE"},{"familia":"propio","codigo":"MCP_REQUIERE_OAUTH","titulo":"El servidor MCP no acepta API keys","source":"auth","modulo":"api","http":401,"mensaje":"El servidor MCP no acepta API keys: conecte la aplicación con OAuth (el cliente MCP lo hace solo)","causa":"Se configuró una API key (fk_test_… o fk_live_…) en el cliente MCP. Una key en la configuración de un agente es una credencial permanente; el MCP sólo usa tokens OAuth de corta vida.","solucion":"Quite la cabecera Authorization de la configuración y agregue el servidor por su URL (…/mcp): el cliente abrirá la pantalla de autorización de DevFact.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/MCP_REQUIERE_OAUTH"},{"familia":"propio","codigo":"METODO_NO_PERMITIDO","titulo":"Método no permitido","source":"validacion","modulo":"api","http":405,"mensaje":"Método no permitido","causa":"La ruta existe pero no admite ese método HTTP.","solucion":"Use el método documentado en openapi.yaml.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/METODO_NO_PERMITIDO"},{"familia":"propio","codigo":"MIGRACION_ALTERADA","titulo":"Migración de base de datos alterada","source":"motor","modulo":"engine","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"Una migración ya aplicada cambió de contenido (checksum distinto).","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/MIGRACION_ALTERADA"},{"familia":"propio","codigo":"MIGRACION_FALLIDA","titulo":"Falló una migración de base de datos","source":"motor","modulo":"engine","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"Una migración no se pudo aplicar.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/MIGRACION_FALLIDA"},{"familia":"propio","codigo":"MIGRACION_INVALIDA","titulo":"Migración de base de datos inválida","source":"motor","modulo":"engine","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"Un archivo de migración no cumple el formato admitido.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/MIGRACION_INVALIDA"},{"familia":"propio","codigo":"MONTO_INVALIDO","titulo":"Monto inválido","source":"validacion","modulo":"core","http":422,"mensaje":"El valor tiene más de N decimales","causa":"Un monto no es un decimal válido o tiene demasiados decimales.","solucion":"Envíe los montos como texto decimal (\"10.50\"), nunca como número de coma flotante.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/MONTO_INVALIDO"},{"familia":"propio","codigo":"MULTIPART_INVALIDO","titulo":"multipart/form-data inválido","source":"validacion","modulo":"api","http":400,"mensaje":"El cuerpo multipart/form-data está mal formado","causa":"La subida del .p12 por multipart está mal formada.","solucion":"Use curl -F \"archivo=@firma.p12\" -F \"password=…\" o el JSON con p12Base64.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/MULTIPART_INVALIDO"},{"familia":"propio","codigo":"NO_AUTENTICADO","titulo":"Falta la API key","source":"auth","modulo":"api","http":401,"mensaje":"Falta la cabecera Authorization: Bearer <api key>","causa":"La petición no trae Authorization o no tiene la forma \"Bearer <api key>\".","solucion":"Envíe Authorization: Bearer fk_test_… (¿sin cuenta? POST /v1/sandbox le da una key en un segundo).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/NO_AUTENTICADO"},{"familia":"propio","codigo":"OAUTH_CIMD_INVALIDO","titulo":"Documento de metadatos del cliente OAuth inválido","source":"auth","modulo":"engine","http":400,"mensaje":"Documento de metadatos del cliente (client_id URL) inválido: client_id del documento distinto de la URL","causa":"El client_id es una URL https (Client ID Metadata Document) y el servidor no pudo usar el documento. details.motivo dice por qué: URL_INVALIDA (la URL no cumple el draft: https, con path, sin query, fragmento, credenciales ni segmentos . o ..), DESTINO_BLOQUEADO (el host resuelve a una IP privada, loopback, link-local o reservada, o es un nombre local), TIMEOUT, RED u OCUPADO (no respondió a tiempo o hay demasiadas descargas en curso), ESTADO_HTTP (no respondió 200), REDIRECCION (el servidor no sigue redirecciones), CONTENT_TYPE (no es application/json), DEMASIADO_GRANDE (más de OAUTH_CIMD_MAX_BYTES), JSON_INVALIDO, CLIENT_ID_DISTINTO (el client_id del documento no es exactamente la URL) o METADATOS_INVALIDOS (falta client_name o redirect_uris, redirect_uris no https/loopback, client_secret presente o token_endpoint_auth_method distinto de none). En /oauth/token responde 401 invalid_client; nunca se redirige al cliente.","solucion":"Publique en la URL exacta del client_id (sin redirecciones, con Content-Type: application/json y menos de 5 KB) un JSON con \"client_id\" igual a esa URL, \"client_name\", \"redirect_uris\" https o loopback y \"token_endpoint_auth_method\": \"none\" (cliente público con PKCE). Si el problema fue de red, reintente.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/OAUTH_CIMD_INVALIDO"},{"familia":"propio","codigo":"OAUTH_CLIENTE_INVALIDO","titulo":"Cliente OAuth inválido","source":"auth","modulo":"engine","http":400,"mensaje":"client_id inexistente: registre el cliente con POST /oauth/register","causa":"El client_id no existe (nunca se registró, está mal escrito o se purgó tras no usarse), o es una URL https y el operador deshabilitó los Client ID Metadata Documents (OAUTH_CIMD_HABILITADO=false). En /oauth/token responde 401 invalid_client.","solucion":"Registre la app con POST /oauth/register y use el client_id (fkc_…) que devuelve, o use como client_id la URL https de su documento de metadatos (Client ID Metadata Document).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/OAUTH_CLIENTE_INVALIDO"},{"familia":"propio","codigo":"OAUTH_CONCESION_NO_ENCONTRADA","titulo":"Concesión OAuth no encontrada","source":"validacion","modulo":"engine","http":404,"mensaje":"Concesión OAuth no encontrada","causa":"La concesión no existe o es de otra cuenta.","solucion":"Liste las concesiones vigentes con GET /v1/platform/tenants/{id}/oauth/concesiones.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/OAUTH_CONCESION_NO_ENCONTRADA"},{"familia":"propio","codigo":"OAUTH_CREDENCIAL_NO_PERMITIDA","titulo":"Operación no permitida con un token OAuth","source":"auth","modulo":"api","http":403,"mensaje":"Esta operación exige una API key: un access token OAuth no crea API keys ni administra el 2FA o el correo de la cuenta","causa":"Un access token OAuth (fk_oat_…) intentó crear una API key (que sería una credencial permanente) o cambiar la verificación en dos pasos o el correo de la cuenta.","solucion":"Haga esa operación con una API key admin de la cuenta (o desde el panel).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/OAUTH_CREDENCIAL_NO_PERMITIDA"},{"familia":"propio","codigo":"OAUTH_GRANT_INVALIDO","titulo":"Código o refresh token inválido","source":"auth","modulo":"engine","http":400,"mensaje":"El código o el refresh token no es válido, venció, ya se usó o fue revocado","causa":"invalid_grant: el código venció (60 s), ya se usó (si se presenta dos veces se revoca la concesión emitida con él), su redirect_uri o client_id no coinciden, o el code_verifier no corresponde al code_challenge; o el refresh token venció, fue revocado o ya se había usado (rotación: reusarlo revoca toda la concesión).","solucion":"Inicie de nuevo la autorización (GET /oauth/authorize). Guarde siempre el refresh_token NUEVO de cada respuesta: el anterior deja de servir.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/OAUTH_GRANT_INVALIDO"},{"familia":"propio","codigo":"OAUTH_REDIRECT_URI_INVALIDA","titulo":"redirect_uri no registrada","source":"auth","modulo":"engine","http":400,"mensaje":"redirect_uri no coincide con ninguna de las registradas por el cliente","causa":"Falta redirect_uri o no coincide exactamente con una registrada (en loopback http://127.0.0.1 o localhost sólo puede cambiar el puerto). Por seguridad el servidor no redirige al cliente.","solucion":"Use exactamente una de las redirect_uris del registro, o registre el cliente de nuevo con la URI correcta.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/OAUTH_REDIRECT_URI_INVALIDA"},{"familia":"propio","codigo":"OAUTH_REGISTRO_INVALIDO","titulo":"Registro de cliente OAuth inválido","source":"validacion","modulo":"engine","http":400,"mensaje":"redirect_uris[0]: debe ser https:// o loopback http://127.0.0.1, http://localhost o http://[::1] (RFC 8252)","causa":"POST /oauth/register con metadatos inválidos: redirect_uris ausentes o no https/loopback (error invalid_redirect_uri), client_name ausente, o un cliente confidencial (token_endpoint_auth_method distinto de none), grant_types o response_types no admitidos (invalid_client_metadata).","solucion":"Registre un cliente público: client_name, redirect_uris https o loopback y token_endpoint_auth_method \"none\" (use PKCE).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/OAUTH_REGISTRO_INVALIDO"},{"familia":"propio","codigo":"OAUTH_SCOPE_INVALIDO","titulo":"Scope OAuth inválido","source":"validacion","modulo":"engine","http":400,"mensaje":"scope inválido: los valores admitidos son emitir, consultar, admin y offline_access (separados por espacios)","causa":"El scope trae valores desconocidos, no incluye ningún permiso de la API (emitir, consultar o admin) o, al refrescar, pide más de lo concedido.","solucion":"Pida sólo emitir, consultar, admin y offline_access (este último para recibir refresh token); al refrescar, sólo puede reducir el scope.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/OAUTH_SCOPE_INVALIDO"},{"familia":"propio","codigo":"OAUTH_SOLICITUD_INVALIDA","titulo":"Solicitud OAuth inválida","source":"validacion","modulo":"engine","http":400,"mensaje":"code_challenge es obligatorio (PKCE)","causa":"Falta un parámetro o es inválido: response_type distinto de code, PKCE ausente o con método distinto de S256, resource distinto de la URL de la API, state demasiado largo, sujeto o entorno inválidos. details.error lleva el código del RFC (invalid_request, unsupported_response_type, invalid_target).","solucion":"Envíe response_type=code, code_challenge (S256 del code_verifier) y code_challenge_method=S256; resource, si lo envía, debe ser la URL de la API.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/OAUTH_SOLICITUD_INVALIDA"},{"familia":"propio","codigo":"OAUTH_TOKEN_INVALIDO","titulo":"Access token OAuth inválido","source":"auth","modulo":"engine","http":401,"mensaje":"Access token OAuth inválido","causa":"El Bearer fk_oat_… no existe o está mal copiado.","solucion":"Obtenga un access token con POST /oauth/token (o renueve el suyo con el refresh token).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/OAUTH_TOKEN_INVALIDO"},{"familia":"propio","codigo":"OAUTH_TOKEN_REVOCADO","titulo":"Access token OAuth revocado","source":"auth","modulo":"engine","http":401,"mensaje":"El access token OAuth fue revocado","causa":"Se revocó el token o su concesión: el usuario quitó el acceso a la app, la app lo revocó (POST /oauth/revoke), se reusó un refresh token o un código, o la cuenta se dio de baja.","solucion":"Pida de nuevo la autorización del usuario (GET /oauth/authorize).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/OAUTH_TOKEN_REVOCADO"},{"familia":"propio","codigo":"OAUTH_TOKEN_VENCIDO","titulo":"Access token OAuth vencido","source":"auth","modulo":"engine","http":401,"mensaje":"El access token OAuth venció: renuévelo con el refresh token (POST /oauth/token)","causa":"Los access tokens duran 1 hora (OAUTH_ACCESS_TTL_S); la concesión tiene además un tope absoluto (OAUTH_CONCESION_MAX_DIAS).","solucion":"POST /oauth/token con grant_type=refresh_token; si la concesión llegó a su tope, autorice de nuevo.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/OAUTH_TOKEN_VENCIDO"},{"familia":"propio","codigo":"OPERACION_NO_PERMITIDA","titulo":"Operación no permitida en este estado","source":"motor","modulo":"engine","http":409,"mensaje":"La operación no aplica al estado actual del comprobante","causa":"Por ejemplo, reintentar con datos corregidos un comprobante en curso o ya autorizado.","solucion":"Consulte el estado con GET /v1/comprobantes/{id} y espere su estado final antes de operar.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/OPERACION_NO_PERMITIDA"},{"familia":"propio","codigo":"P12_INVALID","titulo":"Archivo .p12 inválido","source":"validacion","modulo":"signer","http":422,"mensaje":"El archivo no es un certificado .p12 válido","causa":"El archivo no es un PKCS#12 legible (dañado, otro formato o base64 mal codificado).","solucion":"Exporte de nuevo el .p12 desde la entidad certificadora; en JSON, envíelo completo en p12Base64.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/P12_INVALID"},{"familia":"propio","codigo":"P12_NO_MATCHING_CERT","titulo":"El .p12 no tiene el certificado de la clave","source":"validacion","modulo":"signer","http":422,"mensaje":"Ningún certificado del .p12 corresponde a la clave privada","causa":"El archivo trae una clave privada sin su certificado, o certificados ambiguos.","solucion":"Exporte de nuevo el .p12 desde la entidad certificadora.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/P12_NO_MATCHING_CERT"},{"familia":"propio","codigo":"P12_NO_PRIVATE_KEY","titulo":"El .p12 no tiene clave privada","source":"validacion","modulo":"signer","http":422,"mensaje":"El archivo .p12 no contiene una clave privada","causa":"Se exportó sólo el certificado público (por ejemplo un .cer).","solucion":"Exporte el .p12 con la clave privada incluida.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/P12_NO_PRIVATE_KEY"},{"familia":"propio","codigo":"P12_UNSUPPORTED_KEY","titulo":"Tipo de clave no soportado","source":"validacion","modulo":"signer","http":422,"mensaje":"La clave privada del .p12 no es RSA; el SRI exige RSA de 2048 bits","causa":"La clave no es RSA o tiene menos de 2048 bits (ficha §6.8).","solucion":"Use una firma electrónica de una entidad acreditada (RSA 2048).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/P12_UNSUPPORTED_KEY"},{"familia":"propio","codigo":"P12_WRONG_PASSWORD","titulo":"Contraseña del .p12 incorrecta","source":"validacion","modulo":"signer","http":422,"mensaje":"La contraseña del certificado .p12 es incorrecta","causa":"La contraseña no abre el archivo .p12.","solucion":"Repita la subida con la contraseña correcta (campo password). Respete mayúsculas y espacios.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/P12_WRONG_PASSWORD"},{"familia":"propio","codigo":"PARAMETRO_INVALIDO","titulo":"Parámetro inválido","source":"validacion","modulo":"api","http":400,"mensaje":"<parámetro> inválido","causa":"Un parámetro de la query o de la ruta no es válido (fechas, límites, cursor…).","solucion":"Revise details.issues y los parámetros documentados de la ruta.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/PARAMETRO_INVALIDO"},{"familia":"propio","codigo":"PAYLOAD_PURGADO","titulo":"Los datos del comprobante ya se eliminaron","source":"motor","modulo":"engine","http":410,"mensaje":"Los datos del comprobante ya se eliminaron (retención)","causa":"Por la política de zero data retention el XML y los datos del comprador se borran pasado retencionPayloadHoras (24 h por defecto).","solucion":"Guarde el XML autorizado al emitir (respuesta o webhook). Para reintentar un DEVUELTA purgado, envíe el comprobante completo en \"input\".","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/PAYLOAD_PURGADO"},{"familia":"propio","codigo":"PRODUCCION_REQUISITOS_PENDIENTES","titulo":"Faltan requisitos para producción","source":"motor","modulo":"engine","http":409,"mensaje":"No se puede activar producción: …","causa":"Falta algún requisito del checklist (firma vigente, comprobante autorizado en celcer, secuenciales confirmados…).","solucion":"Revise details.faltantes y GET /v1/emisores/{ruc}/estado-configuracion; complete lo indicado y repita.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/PRODUCCION_REQUISITOS_PENDIENTES"},{"familia":"propio","codigo":"PUNTO_EMISION_DUPLICADO","titulo":"El punto de emisión ya existe","source":"motor","modulo":"engine","http":409,"mensaje":"El punto de emisión … ya existe en este establecimiento","causa":"Ya hay un punto de emisión con ese código en el establecimiento.","solucion":"Use el existente.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/PUNTO_EMISION_DUPLICADO"},{"familia":"propio","codigo":"PUNTO_EMISION_INACTIVO","titulo":"Punto de emisión inactivo","source":"motor","modulo":"engine","http":409,"mensaje":"El punto de emisión … está inactivo","causa":"El punto de emisión elegido está desactivado.","solucion":"Reactívelo o emita con otro \"ptoEmi\".","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/PUNTO_EMISION_INACTIVO"},{"familia":"propio","codigo":"PUNTO_EMISION_NO_ENCONTRADO","titulo":"Punto de emisión no encontrado","source":"motor","modulo":"engine","http":404,"mensaje":"No existe el punto de emisión …","causa":"El código de punto de emisión (ptoEmi) no existe en ese establecimiento.","solucion":"Créelo con POST /v1/emisores/{ruc}/establecimientos/{estab}/puntos-emision.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/PUNTO_EMISION_NO_ENCONTRADO"},{"familia":"propio","codigo":"REGISTRO_DESHABILITADO","titulo":"Registro autoservicio deshabilitado","source":"motor","modulo":"engine","http":503,"mensaje":"El registro autoservicio está deshabilitado en este servidor","causa":"El operador desactivó POST /v1/registro (REGISTRO_HABILITADO=false) o el servidor no tiene remitente de correo (MAIL_FROM) para enviar la verificación.","solucion":"Use el sandbox sin cuenta (POST /v1/sandbox) o pida una cuenta al operador de la plataforma.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/REGISTRO_DESHABILITADO"},{"familia":"propio","codigo":"RIDE_CLAVE_ACCESO_INVALIDA","titulo":"Clave de acceso inválida en el RIDE","source":"motor","modulo":"ride","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"La clave de acceso no tiene 49 dígitos o no coincide con el comprobante.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/RIDE_CLAVE_ACCESO_INVALIDA"},{"familia":"propio","codigo":"RIDE_COMPROBANTE_NO_SOPORTADO","titulo":"Comprobante sin RIDE","source":"motor","modulo":"ride","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"La raíz del comprobante no es uno de los 6 soportados.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/RIDE_COMPROBANTE_NO_SOPORTADO"},{"familia":"propio","codigo":"RIDE_DATOS_INCOMPLETOS","titulo":"Datos incompletos para el RIDE","source":"motor","modulo":"ride","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"Falta un dato obligatorio del RIDE (RUC, clave de acceso, autorización…).","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/RIDE_DATOS_INCOMPLETOS"},{"familia":"propio","codigo":"RIDE_DATOS_INCONSISTENTES","titulo":"Datos de autorización inconsistentes","source":"motor","modulo":"ride","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"La autorización contradice al comprobante (número o ambiente).","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/RIDE_DATOS_INCONSISTENTES"},{"familia":"propio","codigo":"RIDE_LOGO_INVALIDO","titulo":"Logo inválido","source":"validacion","modulo":"ride","http":500,"mensaje":"El logo debe ser PNG o JPEG legible","causa":"El logo del emisor no es un PNG/JPEG legible o excede 256 KiB.","solucion":"Suba otro logo con PATCH /v1/emisores/{ruc} y logoBase64 (PNG o JPEG, máximo 256 KiB).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/RIDE_LOGO_INVALIDO"},{"familia":"propio","codigo":"RIDE_NO_AUTORIZADO","titulo":"RIDE de un comprobante no autorizado","source":"motor","modulo":"ride","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"Se pidió el RIDE de un comprobante que no está AUTORIZADO.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/RIDE_NO_AUTORIZADO"},{"familia":"propio","codigo":"RIDE_OPCION_INVALIDA","titulo":"Opción del RIDE inválida","source":"validacion","modulo":"ride","http":500,"mensaje":"colorPrimario debe ser un color hexadecimal #RGB o #RRGGBB","causa":"Una opción de presentación del emisor (p.ej. colorPrimario) no es válida.","solucion":"Corrija colorPrimario con PATCH /v1/emisores/{ruc} (formato #RRGGBB).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/RIDE_OPCION_INVALIDA"},{"familia":"propio","codigo":"RIDE_RENDER_FALLIDO","titulo":"Falló la generación del PDF","source":"motor","modulo":"ride","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"Falla inesperada al generar el PDF del RIDE.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/RIDE_RENDER_FALLIDO"},{"familia":"propio","codigo":"RIDE_XML_INVALIDO","titulo":"XML del RIDE inválido","source":"motor","modulo":"ride","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"El XML autorizado no está bien formado o no tiene la estructura esperada.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/RIDE_XML_INVALIDO"},{"familia":"propio","codigo":"RUC_INVALIDO","titulo":"RUC inválido","source":"validacion","modulo":"engine","http":422,"mensaje":"El RUC del emisor no es válido (13 dígitos, termina en 001, dígito verificador correcto)","causa":"El RUC no tiene 13 dígitos, no termina en 001 o su dígito verificador no cuadra.","solucion":"Verifique el RUC (13 dígitos, termina en 001) y repita la petición.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/RUC_INVALIDO"},{"familia":"propio","codigo":"RUC_RESERVADO_DEMO","titulo":"RUC reservado para el emisor demo","source":"validacion","modulo":"engine","http":422,"mensaje":"El RUC 3099999992001 es el del emisor demo del sandbox (ficticio): registre el RUC de su empresa","causa":"Se intentó registrar como emisor propio el RUC ficticio del emisor demo.","solucion":"Registre el RUC real de su empresa.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/RUC_RESERVADO_DEMO"},{"familia":"propio","codigo":"RUC_YA_EN_PRODUCCION","titulo":"Ese RUC ya emite en producción desde otra cuenta","source":"motor","modulo":"engine","http":409,"mensaje":"Otro emisor activo con el mismo RUC ya está en producción","causa":"Dos cuentas no pueden emitir en producción con el mismo RUC (se pisarían los secuenciales).","solucion":"Desactive el emisor en la otra cuenta o contacte a soporte para unificar las cuentas.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/RUC_YA_EN_PRODUCCION"},{"familia":"propio","codigo":"RUTA_NO_ENCONTRADA","titulo":"Ruta no encontrada","source":"validacion","modulo":"api","http":404,"mensaje":"No existe GET /v1/…","causa":"La combinación de método y ruta no existe.","solucion":"Revise la ruta en el contrato (GET /openapi.yaml, sin autenticación) o en la bienvenida (GET /v1); si hay una ruta parecida, details.sugerencia la nombra.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/RUTA_NO_ENCONTRADA"},{"familia":"propio","codigo":"SANDBOX_DESHABILITADO","titulo":"Sandbox sin cuenta deshabilitado","source":"motor","modulo":"engine","http":503,"mensaje":"El sandbox sin cuenta está deshabilitado en este servidor","causa":"El operador desactivó POST /v1/sandbox (SANDBOX_HABILITADO=false).","solucion":"Pida una cuenta al operador de la plataforma.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/SANDBOX_DESHABILITADO"},{"familia":"propio","codigo":"SANDBOX_NO_ENCONTRADO","titulo":"Sandbox no encontrado","source":"auth","modulo":"engine","http":404,"mensaje":"Token de reclamo inválido, ya usado o sandbox vencido","causa":"El token de reclamo no existe, ya se usó o el sandbox venció (7 días) y se borró.","solucion":"Cree un sandbox nuevo con POST /v1/sandbox.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/SANDBOX_NO_ENCONTRADO"},{"familia":"propio","codigo":"SANDBOX_RESTRINGIDO","titulo":"No disponible en una cuenta sin verificar","source":"auth","modulo":"engine","http":403,"mensaje":"Una cuenta sin verificar sólo emite en el SRI simulado: reclame el sandbox y verifique el correo","causa":"Un sandbox anónimo o reclamado sin verificar no puede usar celcer, producción, keys live ni correo real.","solucion":"Reclame el sandbox con POST /v1/sandbox/reclamar y verifique el correo de la cuenta.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/SANDBOX_RESTRINGIDO"},{"familia":"propio","codigo":"SCOPE_INSUFICIENTE","titulo":"La API key no tiene permiso","source":"auth","modulo":"api","http":403,"mensaje":"La API key no tiene el permiso \"…\"","causa":"La key no tiene el scope que exige la ruta (details.requerido): emitir, consultar o admin.","solucion":"Use una key con ese scope o cree una con POST /v1/api-keys y \"scopes\".","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/SCOPE_INSUFICIENTE"},{"familia":"propio","codigo":"SECUENCIAL_AGOTADO","titulo":"Secuenciales agotados","source":"motor","modulo":"engine","http":409,"mensaje":"La serie … agotó los secuenciales (máximo 999999999)","causa":"La serie llegó al secuencial máximo que admite la ficha (9 dígitos).","solucion":"Cree un nuevo punto de emisión (POST …/puntos-emision) y emita desde esa serie.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/SECUENCIAL_AGOTADO"},{"familia":"propio","codigo":"SECUENCIAL_FUERA_DE_RANGO","titulo":"Secuencial fuera de rango","source":"validacion","modulo":"engine","http":422,"mensaje":"El secuencial debe estar entre 1 y 999999999","causa":"El número indicado en \"siguiente\" no está entre 1 y 999999999.","solucion":"Indique un \"siguiente\" entre 1 y 999999999 en PUT /v1/emisores/{ruc}/secuenciales.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/SECUENCIAL_FUERA_DE_RANGO"},{"familia":"propio","codigo":"SECUENCIAL_NO_CONFIRMADO","titulo":"Falta confirmar el secuencial de producción","source":"motor","modulo":"engine","http":409,"mensaje":"Nadie confirmó desde qué número sigue esta serie en producción","causa":"En producción cada tipo de comprobante de cada punto debe confirmar desde qué número sigue (evita el error 45 del SRI al migrar).","solucion":"Confirme el siguiente número con PUT /v1/emisores/{ruc}/secuenciales y \"ambiente\": 2 (o en activar-produccion con \"secuenciales\").","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/SECUENCIAL_NO_CONFIRMADO"},{"familia":"propio","codigo":"SECUENCIAL_RETROCEDE","titulo":"El secuencial retrocede","source":"motor","modulo":"engine","http":409,"mensaje":"El siguiente secuencial es menor o igual que el último emitido","causa":"Se intentó fijar un \"siguiente\" por debajo de lo ya emitido en la serie (repetiría números).","solucion":"Use un número mayor que details.maxEmitido o, si está seguro, repita con \"forzar\": true.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/SECUENCIAL_RETROCEDE"},{"familia":"propio","codigo":"SEGUNDO_FACTOR_BLOQUEADO","titulo":"Verificación en dos pasos bloqueada","source":"auth","modulo":"engine","http":429,"mensaje":"Demasiados códigos erróneos seguidos: espere antes de reintentar","causa":"Se enviaron varios códigos erróneos seguidos (5 por defecto) y la verificación de la cuenta quedó bloqueada unos minutos (15 por defecto) contra la fuerza bruta.","solucion":"Espere los segundos de Retry-After (details.reintentarEnS) y reintente con el código actual de su app.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/SEGUNDO_FACTOR_BLOQUEADO"},{"familia":"propio","codigo":"SEGUNDO_FACTOR_INVALIDO","titulo":"Código de verificación en dos pasos incorrecto","source":"auth","modulo":"engine","http":403,"mensaje":"Código de verificación en dos pasos incorrecto, vencido o ya usado","causa":"El código no coincide con el de su app (ventana de ±30 s), ya se usó (cada código vale una sola vez) o el código de recuperación no existe o ya se gastó. Con details.campo = codigoCorreo, el que no coincide es el código de confirmación enviado al correo (5 erróneos anulan la configuración pendiente).","solucion":"Espere el código siguiente de su app (cambia cada 30 s) y reintente; revise que la hora del teléfono sea automática. Sin el teléfono, use uno de sus códigos de recuperación. Si falló codigoCorreo, use el último correo recibido o vuelva a configurar (POST /v1/cuenta/2fa/configurar).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/SEGUNDO_FACTOR_INVALIDO"},{"familia":"propio","codigo":"SEGUNDO_FACTOR_REQUERIDO","titulo":"Hace falta la verificación en dos pasos","source":"auth","modulo":"engine","http":403,"mensaje":"La operación exige la verificación en dos pasos: 2FA activo y el código actual en la cabecera Fk-Otp","causa":"Crear una API key de producción (fk_live_) en una cuenta autoservicio, o en una que activó 2FA, exige un código TOTP vigente; la cuenta no tiene 2FA activo o la petición no trajo el código. En la primera activación del 2FA (details.campo = codigoCorreo) falta el código de confirmación enviado al correo verificado de la cuenta.","solucion":"Si details.segundoFactorActivo es false: POST /v1/cuenta/2fa/configurar, cargue el secreto en su app de autenticación y POST /v1/cuenta/2fa/activar con el primer código y el código que le llegó al correo de la cuenta (\"codigoCorreo\"). Luego repita la petición con la cabecera Fk-Otp: <código de 6 dígitos>.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/SEGUNDO_FACTOR_REQUERIDO"},{"familia":"propio","codigo":"SERIE_NO_ENCONTRADA","titulo":"Serie no encontrada","source":"motor","modulo":"engine","http":404,"mensaje":"No existe la serie (punto de emisión, tipo de comprobante y ambiente)","causa":"No hay secuencia para esa combinación de establecimiento, punto de emisión, tipo y ambiente.","solucion":"Revise las series con GET /v1/emisores/{ruc}/secuenciales.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/SERIE_NO_ENCONTRADA"},{"familia":"propio","codigo":"SERIE_OCUPADA","titulo":"Serie ocupada","source":"motor","modulo":"engine","http":503,"mensaje":"La serie … tiene demasiadas emisiones en curso; reintente en unos segundos","causa":"Demasiadas emisiones simultáneas esperan turno en la misma serie. No se consumió ningún número.","solucion":"Reintente tras Retry-After con la misma Idempotency-Key, o reparta la carga entre varios puntos de emisión.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/SERIE_OCUPADA"},{"familia":"propio","codigo":"SERVICIO_NO_CONFIGURADO","titulo":"Servicio no configurado","source":"motor","modulo":"api","http":503,"mensaje":"Los endpoints de plataforma están deshabilitados (falta PLATFORM_ADMIN_TOKEN)","causa":"Falta una variable de configuración del servicio para esa ruta (PLATFORM_ADMIN_TOKEN, RESEND_WEBHOOK_SECRET).","solucion":"Problema del operador: configure la variable indicada.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/SERVICIO_NO_CONFIGURADO"},{"familia":"propio","codigo":"SIGNATURE_FAILED","titulo":"Falló la firma","source":"motor","modulo":"signer","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"Falló la operación criptográfica de firma.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/SIGNATURE_FAILED"},{"familia":"propio","codigo":"SIGNATURE_SELF_CHECK_FAILED","titulo":"La firma no superó la verificación","source":"motor","modulo":"signer","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"La firma recién generada no superó la verificación local.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":true,"expuestoComo":"FIRMA_INVALIDA","docUrl":"https://api.devfact.fonles.com/v1/errores/SIGNATURE_SELF_CHECK_FAILED"},{"familia":"propio","codigo":"SIN_CERTIFICADO_ACTIVO","titulo":"El emisor no tiene firma activa","source":"motor","modulo":"engine","http":422,"mensaje":"El emisor no tiene un certificado de firma activo","causa":"No hay un .p12 activo para el emisor.","solucion":"Suba la firma con POST /v1/emisores/{ruc}/certificados (multipart archivo + password, o JSON p12Base64 + password).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/SIN_CERTIFICADO_ACTIVO"},{"familia":"propio","codigo":"SRI_AMBIENTE_NO_COINCIDE","titulo":"Ambiente del comprobante distinto del cliente SRI","source":"motor","modulo":"sri","http":422,"mensaje":"El ambiente del comprobante no coincide con el del cliente","causa":"Un comprobante de pruebas iría a producción o al revés (salvaguarda: nunca ocurre por la API).","solucion":"Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/SRI_AMBIENTE_NO_COINCIDE"},{"familia":"propio","codigo":"SRI_AUTORIZACION_INCOMPLETA","titulo":"Autorización incompleta","source":"sri","modulo":"sri","http":422,"mensaje":"Sólo se construye el XML autorizado de un comprobante AUTORIZADO","causa":"La respuesta de autorización no es AUTORIZADO o no trae el comprobante.","solucion":"Consulte el estado del comprobante (GET /v1/comprobantes/{id}).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/SRI_AUTORIZACION_INCOMPLETA"},{"familia":"propio","codigo":"SRI_CLAVE_ACCESO_INVALIDA","titulo":"Clave de acceso inválida para el SRI","source":"validacion","modulo":"sri","http":422,"mensaje":"La clave de acceso debe tener 49 dígitos","causa":"La clave enviada a consultar no tiene 49 dígitos.","solucion":"Use la claveAcceso de 49 dígitos que devolvió la API.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/SRI_CLAVE_ACCESO_INVALIDA"},{"familia":"propio","codigo":"SRI_CONFIGURACION_INVALIDA","titulo":"Configuración del cliente SRI inválida","source":"motor","modulo":"sri","http":422,"mensaje":"Opción de configuración del cliente SRI inválida","causa":"Timeouts o endpoints del SRI mal configurados (operador).","solucion":"Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/SRI_CONFIGURACION_INVALIDA"},{"familia":"propio","codigo":"SRI_HTML_RESPONSE","titulo":"El SRI respondió una página HTML","source":"sri","modulo":"sri","http":502,"mensaje":"El SRI no respondió correctamente; intente más tarde","causa":"Página de mantenimiento, redirección o error del balanceador del SRI.","solucion":"Reintente tras Retry-After.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/SRI_HTML_RESPONSE"},{"familia":"propio","codigo":"SRI_HTTP_4XX","titulo":"El SRI respondió un error 4xx","source":"sri","modulo":"sri","http":502,"mensaje":"El SRI no respondió correctamente; intente más tarde","causa":"El SRI devolvió HTTP 4xx sin SOAP Fault (endpoint mal configurado o bloqueo).","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/SRI_HTTP_4XX"},{"familia":"propio","codigo":"SRI_HTTP_5XX","titulo":"El SRI respondió un error 5xx","source":"sri","modulo":"sri","http":502,"mensaje":"El SRI no respondió correctamente; intente más tarde","causa":"El SRI devolvió HTTP 5xx (caída o mantenimiento).","solucion":"Reintente tras Retry-After.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/SRI_HTTP_5XX"},{"familia":"propio","codigo":"SRI_NETWORK","titulo":"Error de red con el SRI","source":"sri","modulo":"sri","http":502,"mensaje":"El SRI no respondió correctamente; intente más tarde","causa":"DNS, conexión rechazada, TLS o socket cerrado (celcer da ECONNRESET desde algunas redes).","solucion":"Reintente tras Retry-After.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/SRI_NETWORK"},{"familia":"propio","codigo":"SRI_NO_DISPONIBLE","titulo":"El SRI no está disponible","source":"sri","modulo":"engine","http":503,"mensaje":"No se pudo consultar el estado en el SRI; intente más tarde","causa":"El web service del SRI no respondió (caída, mantenimiento o timeout).","solucion":"Reintente tras Retry-After. Las emisiones no se pierden: el worker sigue intentando.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/SRI_NO_DISPONIBLE"},{"familia":"propio","codigo":"SRI_SOAP_FAULT","titulo":"SOAP Fault del SRI","source":"sri","modulo":"sri","http":502,"mensaje":"El SRI no respondió correctamente; intente más tarde","causa":"El web service devolvió un soap:Fault.","solucion":"Reintente más tarde.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/SRI_SOAP_FAULT"},{"familia":"propio","codigo":"SRI_TIMEOUT","titulo":"El SRI no respondió a tiempo","source":"sri","modulo":"sri","http":502,"mensaje":"El SRI no respondió correctamente; intente más tarde","causa":"Sin respuesta del SRI dentro del timeout. En una emisión el worker sigue intentando (respuesta 202).","solucion":"Reintente tras Retry-After; no emita otro comprobante por la misma venta.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/SRI_TIMEOUT"},{"familia":"propio","codigo":"SRI_UNPARSEABLE","titulo":"Respuesta del SRI ilegible","source":"sri","modulo":"sri","http":502,"mensaje":"El SRI no respondió correctamente; intente más tarde","causa":"Cuerpo vacío, XML mal formado o estructura inesperada.","solucion":"Reintente más tarde.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/SRI_UNPARSEABLE"},{"familia":"propio","codigo":"SRI_XML_VACIO","titulo":"XML vacío","source":"validacion","modulo":"sri","http":422,"mensaje":"El XML firmado está vacío","causa":"Se intentó enviar al SRI un XML vacío.","solucion":"Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/SRI_XML_VACIO"},{"familia":"propio","codigo":"TENANT_DADO_DE_BAJA","titulo":"Cuenta dada de baja","source":"motor","modulo":"engine","http":409,"mensaje":"La cuenta fue dada de baja (irreversible): no se puede reactivar","causa":"Se intentó reactivar una cuenta dada de baja definitiva. Sus claves, certificados y datos retenidos ya se destruyeron, y la purga de metadatos la borrará al cumplirse el plazo.","solucion":"Cree una cuenta nueva para el cliente.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/TENANT_DADO_DE_BAJA"},{"familia":"propio","codigo":"TENANT_DUPLICADO","titulo":"Ya existe una cuenta con ese nombre","source":"motor","modulo":"engine","http":409,"mensaje":"Ya existe un cliente llamado \"…\"; si de verdad es otro, use permitirDuplicado","causa":"Alta de un cliente con el nombre de otro existente (evita duplicados por doble clic).","solucion":"Use la cuenta existente (details.tenantId) o, si es otro cliente, repita con \"permitirDuplicado\": true.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/TENANT_DUPLICADO"},{"familia":"propio","codigo":"TENANT_INACTIVO","titulo":"Cuenta desactivada","source":"auth","modulo":"engine","http":403,"mensaje":"La cuenta está desactivada","causa":"El operador de la plataforma desactivó la cuenta (o la dio de baja).","solucion":"Contacte al operador de la plataforma para reactivar la cuenta.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/TENANT_INACTIVO"},{"familia":"propio","codigo":"TENANT_NO_ENCONTRADO","titulo":"Cuenta no encontrada","source":"motor","modulo":"engine","http":404,"mensaje":"Tenant no encontrado","causa":"El id de la cuenta (tenant) no existe.","solucion":"Busque el id con GET /v1/platform/tenants?nombre=… (operador de la plataforma).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/TENANT_NO_ENCONTRADO"},{"familia":"propio","codigo":"TIPO_NO_COINCIDE","titulo":"El tipo de comprobante no coincide","source":"validacion","modulo":"engine","http":422,"mensaje":"El comprobante es … y el input corregido es …","causa":"Al reintentar, el comprobante corregido es de otro tipo que el original.","solucion":"Envíe en \"input\" un comprobante del mismo tipo; para otro tipo emita uno nuevo.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/TIPO_NO_COINCIDE"},{"familia":"propio","codigo":"TOKEN_PLATAFORMA_INVALIDO","titulo":"Token de plataforma inválido","source":"auth","modulo":"api","http":401,"mensaje":"Token de plataforma inválido","causa":"El token de /v1/platform no coincide con PLATFORM_ADMIN_TOKEN.","solucion":"Use el PLATFORM_ADMIN_TOKEN del operador.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/TOKEN_PLATAFORMA_INVALIDO"},{"familia":"propio","codigo":"VAULT_AAD_MISMATCH","titulo":"Contexto de cifrado distinto","source":"motor","modulo":"vault","http":null,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"El contexto (AAD) no corresponde al objeto sellado.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"expuestoComo":"VAULT_ERROR","docUrl":"https://api.devfact.fonles.com/v1/errores/VAULT_AAD_MISMATCH"},{"familia":"propio","codigo":"VAULT_CONFIG","titulo":"Configuración del vault inválida","source":"motor","modulo":"vault","http":null,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"Claves maestras o kid activo mal configurados.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"expuestoComo":"VAULT_ERROR","docUrl":"https://api.devfact.fonles.com/v1/errores/VAULT_CONFIG"},{"familia":"propio","codigo":"VAULT_DECRYPT_FAILED","titulo":"No se pudo descifrar un secreto","source":"motor","modulo":"vault","http":null,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"Clave incorrecta o datos alterados.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":true,"expuestoComo":"VAULT_ERROR","docUrl":"https://api.devfact.fonles.com/v1/errores/VAULT_DECRYPT_FAILED"},{"familia":"propio","codigo":"VAULT_ERROR","titulo":"Error del almacén de secretos","source":"motor","modulo":"engine","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"Falló el cifrado o descifrado de un secreto (certificado, webhook) en el vault o en el KMS.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/VAULT_ERROR"},{"familia":"propio","codigo":"VAULT_FORMAT","titulo":"Formato de secreto sellado inválido","source":"motor","modulo":"vault","http":null,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"El blob sellado no respeta el formato binario.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"expuestoComo":"VAULT_ERROR","docUrl":"https://api.devfact.fonles.com/v1/errores/VAULT_FORMAT"},{"familia":"propio","codigo":"VAULT_INVALID_INPUT","titulo":"Entrada del vault inválida","source":"motor","modulo":"vault","http":null,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"Argumentos inválidos al sellar o abrir un secreto.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"expuestoComo":"VAULT_ERROR","docUrl":"https://api.devfact.fonles.com/v1/errores/VAULT_INVALID_INPUT"},{"familia":"propio","codigo":"VAULT_PROVIDER_ERROR","titulo":"Falló el proveedor de claves","source":"motor","modulo":"vault","http":null,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"El KMS falló (red, permisos, clave deshabilitada).","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":true,"expuestoComo":"VAULT_ERROR","docUrl":"https://api.devfact.fonles.com/v1/errores/VAULT_PROVIDER_ERROR"},{"familia":"propio","codigo":"VAULT_PROVIDER_UNAVAILABLE","titulo":"Proveedor de claves no disponible","source":"motor","modulo":"vault","http":null,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"El proveedor de claves (p.ej. AWS KMS) no está disponible en el servidor.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":true,"expuestoComo":"VAULT_ERROR","docUrl":"https://api.devfact.fonles.com/v1/errores/VAULT_PROVIDER_UNAVAILABLE"},{"familia":"propio","codigo":"VAULT_UNKNOWN_KID","titulo":"Clave maestra desconocida","source":"motor","modulo":"vault","http":null,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"Ningún proveedor conoce la clave (kid) con la que se cifró el secreto.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"expuestoComo":"VAULT_ERROR","docUrl":"https://api.devfact.fonles.com/v1/errores/VAULT_UNKNOWN_KID"},{"familia":"propio","codigo":"VERIFICACION_INVALIDA","titulo":"Verificación del correo inválida","source":"auth","modulo":"engine","http":400,"mensaje":"El enlace o el código de verificación no es válido, venció, ya se usó o se agotaron los intentos","causa":"El token del enlace o el código de 6 dígitos no corresponde a una verificación viva: vence a los 30 minutos, sirve una sola vez, pedir otra anula la anterior y 5 códigos erróneos la anulan.","solucion":"Pida otra verificación con POST /v1/registro (mismo correo) —o, para un sandbox reclamado, POST /v1/cuenta/email con la API key del sandbox— y use el código o el enlace del correo más reciente.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/VERIFICACION_INVALIDA"},{"familia":"propio","codigo":"VERSION_DESCONOCIDA","titulo":"Versión de la API desconocida","source":"validacion","modulo":"api","http":400,"mensaje":"La versión de la API … no existe","causa":"La cabecera Fk-Version no tiene la forma YYYY-MM-DD o no es una versión publicada.","solucion":"Use una de details.versionesSoportadas (GET /v1/changelog) o quite la cabecera para usar la versión fijada en su API key.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/VERSION_DESCONOCIDA"},{"familia":"propio","codigo":"WEBHOOK_ENDPOINT_NO_ENCONTRADO","titulo":"Endpoint de webhook no encontrado","source":"motor","modulo":"engine","http":404,"mensaje":"Endpoint de webhook no encontrado","causa":"El id del endpoint no existe en esta cuenta.","solucion":"Liste los endpoints con GET /v1/webhooks.","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/WEBHOOK_ENDPOINT_NO_ENCONTRADO"},{"familia":"propio","codigo":"WEBHOOK_URL_INVALIDA","titulo":"URL de webhook inválida","source":"validacion","modulo":"engine","http":422,"mensaje":"URL de webhook inválida: …","causa":"La URL no es https, apunta a una IP privada/local (protección SSRF) o está mal formada.","solucion":"Use una URL https pública de su servidor; para pruebas locales use un túnel (ngrok, cloudflared).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/WEBHOOK_URL_INVALIDA"},{"familia":"propio","codigo":"XML_ALREADY_SIGNED","titulo":"El XML ya está firmado","source":"motor","modulo":"signer","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"Se intentó firmar un XML que ya tiene firma.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/XML_ALREADY_SIGNED"},{"familia":"propio","codigo":"XML_EXCEDE_TAMANO","titulo":"Comprobante demasiado grande","source":"validacion","modulo":"core","http":413,"mensaje":"El comprobante ocupa N bytes y el SRI admite hasta …; divídalo en varios","causa":"El XML supera el tamaño máximo que admite el SRI (error 26 del SRI).","solucion":"Divida la venta en varios comprobantes o acorte descripciones.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/XML_EXCEDE_TAMANO"},{"familia":"propio","codigo":"XML_INVALIDO","titulo":"XML inválido","source":"validacion","modulo":"core","http":422,"mensaje":"El XML no puede contener DOCTYPE","causa":"Un XML recibido o generado no es válido (DOCTYPE, mal formado).","solucion":"Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/XML_INVALIDO"},{"familia":"propio","codigo":"XML_MALFORMED","titulo":"XML mal formado al firmar","source":"motor","modulo":"signer","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"El XML a firmar no está bien formado.","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/XML_MALFORMED"},{"familia":"propio","codigo":"XML_UNSUPPORTED","titulo":"XML no soportado por el firmador","source":"motor","modulo":"signer","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"El XML usa algo que el firmador no soporta (namespaces, DOCTYPE, raíz desconocida).","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/XML_UNSUPPORTED"},{"familia":"propio","codigo":"XSD_INVALIDO","titulo":"El XML no cumple el XSD oficial","source":"validacion","modulo":"engine","http":422,"mensaje":"El comprobante generado no cumple el XSD oficial del SRI","causa":"El XML generado a partir de los datos no pasa el esquema oficial (p.ej. un texto demasiado largo).","solucion":"Revise details.issues y la longitud de los textos (descripciones, infoAdicional); pruebe con POST /v1/comprobantes/validar.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/XSD_INVALIDO"},{"familia":"propio","codigo":"XSD_LOCAL","titulo":"El XML generado no cumplió el XSD (antes de enviar)","source":"validacion","modulo":"engine","http":null,"mensaje":"El XML generado no cumple el XSD oficial; reintente con datos corregidos","causa":"Mensaje del motor en un comprobante DEVUELTA sin llegar al SRI: al regenerar el XML (p.ej. en un reintento) no pasó el XSD.","solucion":"Llame a POST /v1/comprobantes/{id}/reintentar con el comprobante corregido; valide antes con POST /v1/comprobantes/validar.","reintentable":true,"docUrl":"https://api.devfact.fonles.com/v1/errores/XSD_LOCAL"},{"familia":"propio","codigo":"XSD_NO_DISPONIBLE","titulo":"Esquema XSD no disponible","source":"motor","modulo":"core","http":500,"mensaje":"Error interno; si persiste, contacte a soporte con el requestId","causa":"El servidor no encuentra el XSD oficial (instalación incompleta).","solucion":"Reintente más tarde. Si persiste, contacte a soporte con el requestId (nunca envíe el .p12, contraseñas ni XML por correo).","reintentable":false,"docUrl":"https://api.devfact.fonles.com/v1/errores/XSD_NO_DISPONIBLE"}],"total":220,"indice":"https://api.devfact.fonles.com/v1/errores/"}