Validar sin emitir
POST /api/v1/ecf/validate recibe el mismo cuerpo que
POST /ecf y corre exactamente la misma
validación de forma y de reglas fiscales, matriz de obligatoriedad
incluida, y además comprueba el XML resultante contra el esquema (XSD) oficial
de la DGII. La diferencia es que ahí se detiene: no asigna un e-NCF real, no
firma, no persiste ni encola nada hacia la DGII.
Respuesta
Sección titulada «Respuesta»La respuesta es 200 siempre que NovaFE pueda evaluar el comprobante, y el
campo valid indica si pasa la validación. Un comprobante inválido no es
un error HTTP: el cuerpo trae todos sus problemas a la vez, no solo el
primero.
Uno válido incluye una vista previa de lo que NovaFE emitiría:
{ "valid": true, "message": "El comprobante es válido.", "errors": [], "warnings": [], "preview": { "type": 31, "typeName": "Factura de Crédito Fiscal Electrónica", "sampleEncf": "E310000000000", "issueDate": "10-01-2026", "sequenceExpiresOnEstimate": "31-12-2027", "montoGravadoTotal": 2000.0, "montoExento": 0, "totalItbis": 360.0, "montoImpuestoAdicional": 0, "montoTotal": 2360.0, "expectConditionalAcceptance": false }}Uno inválido devuelve valid: false, la lista en errors y preview: null:
{ "valid": false, "message": "El comprobante tiene 2 errores.", "errors": [ { "field": "Lines", "code": "NotEmptyValidator", "message": "..." }, { "field": null, "code": "Ecf.SomeRule", "message": "..." } ], "warnings": [], "preview": null}errors[].fieldindica el campo del cuerpo cuando el problema es de forma, y esnullcuando afecta a todo el comprobante.codees estable, para que tu código decida con él;messageestá listo para mostrar.- Un valor que cumple la forma pero no el esquema de la DGII (por ejemplo, un
texto más largo de lo que admite el campo) sale con el código
Ecf.XsdInvalid, y el mensaje nombra el elemento XML afectado. Cada violación es un error aparte.POST /ecfhace esta misma comprobación antes de asignar el e-NCF: si falla, responde400y no consume ningún número. warningsno impiden emitir. Por ejemplo,ConditionalAcceptanceExpectedavisa que los totales no cuadran dentro de la tolerancia de la DGII y que es probable que la acepte de forma condicional. También avisan los bloques informativos que no cuadran con las líneas: otra moneda (ForeignCurrencyConversionMismatch), subtotales (SubtotalGrossMismatch,SubtotalAmountMismatch) y paginación (PageBucketMismatch,PageAmountMismatch,PageSumMismatch). El comprobante sigue siendo válido y no se rechaza.
Siguen siendo errores HTTP los casos donde no hay nada que evaluar: un
cuerpo que no es JSON válido (400), una petición sin autenticar y un
contribuyente sin perfil fiscal configurado.