SAFTCheck
← Blog
2026-05-11 · 6 min de lectura

Cómo validar un SAF-T (PT) antes de enviarlo a la AT

Lista de comprobación previa al envío: codificación, BOM, NIF, ATCUD, fechas de la cabecera, rango de fechas por documento, totales de bloque, moneda y estado del documento — lo que la AT detecta en la entrada y cómo corregirlo antes del día 5.

Para qué prevalidar

El portal de la AT acepta tu fichero SAF-T. O lo rechaza con "ficheiro inválido". No hay término medio ni feedback útil. Si envías el día 5 a las 23:50 y el fichero rebota, tienes diez minutos para encontrar el bug y volver a exportar desde tu ERP. Es el peor momento para descubrir que la numeración de facturas se reinició, que el dígito de control del NIF está mal o que la codificación se ha estropeado.

La prevalidación cierra ese hueco. Subes el fichero a un validador que ejecuta el mismo XSD más las heurísticas que la AT aplica realmente en la entrada — codificación, BOM, NIF Mod-11, formato ATCUD, fechas de la cabecera, totales de documento, tipos de cambio, coherencia del estado del documento — y ves cada problema con número de línea antes que la AT.

Qué validar, por orden

  1. Codificación. La causa de rechazo silencioso más común. La AT exige Windows-1252; la mayoría de ERPs exportan UTF-8. Al parser XSD le da igual; al canal de entrada de la AT no. Ver la regla de codificación.
  2. BOM. Si tu ERP pone un byte-order-mark UTF-8 antes de <?xml ?>, la AT rechaza. Lo mismo con BOMs UTF-16.
  3. Esquema. El XSD valida la forma estructural: elementos obligatorios, tipos de atributo, valores de enumeración. Es lo primero que ejecuta la AT. schema 1.04_01 es la versión actual del SAF-T (PT) para la facturación mensual.
  4. NIF Mod-11. Cada TaxRegistrationNumber y CustomerTaxID / SupplierTaxID necesita un dígito de control portugués válido y un prefijo permitido. Ver la regla del NIF.
  5. Formato ATCUD. Ocho alfanuméricos en mayúsculas, guion, secuencia ≥ 1. Obligatorio desde 2023.
  6. Fechas de la cabecera. StartDate < EndDate, FiscalYear coincide con el año de StartDate, DateCreated >= EndDate, EndDate no en el futuro.
  7. Rango de fechas por documento. Cada fecha de Invoice, Payment, WorkDocument, StockMovement debe caer dentro de la ventana de la cabecera.
  8. Totales de bloque. SalesInvoices.NumberOfEntries coincide con el conteo de hijos; TotalDebit + TotalCredit coincide con la suma de GrossTotals, dentro de 0,01 €.
  9. Moneda. Los documentos en moneda extranjera necesitan CurrencyCode + CurrencyAmount + ExchangeRate > 0. La tasa ausente es invisible para el XSD; la AT rechaza en la entrada.
  10. Estado del documento. InvoiceStatus en {N, S, A, R, F}; InvoiceStatusDate >= InvoiceDate.

Qué NO detecta la prevalidación

Sé honesto contigo: un validador puede confirmar que el fichero está bien formado y es coherente. No puede garantizar que la AT lo acepte. Dos cosas que no ve:

  • Reglas de negocio del lado de la AT que cambian sin aviso. La AT a veces endurece reglas de entrada sin actualizar el XSD público. Los monitores de cambios de esquema y los avisos de la comunidad ayudan — pero nuevos patrones de rechazo a veces aparecen primero en envíos reales.
  • Restricciones a nivel de cuenta. Ventana de envío ya consumida, contribuyente en suspensión, registro de software certificado desalineado — ninguno de esos es un problema del fichero; son problemas del contribuyente.

Para la primera clase, los ciclos posteriores al rechazo siguen importando. Para la segunda, tu asesor o el soporte de la AT es el canal adecuado.

Flujo para el plazo del día 5

  1. Exporta el SAF-T mensual desde tu ERP un día antes — idealmente el día 3 del mes siguiente.
  2. Pásalo por un prevalidador. Corrige todos los errores reportados. Si dispara la regla de codificación, ejecuta el auto-fix y revalida.
  3. Vuelve a exportar solo cuando se reporte un problema estructural. Volver a prevalidar el mismo fichero roto dos veces da la misma respuesta.
  4. Envía a la AT cuando el validador esté limpio. Guarda el informe PDF en la carpeta del envío.

¿Listo?

Sube tu SAF-T XML y mira lo que la AT va a rechazar — antes de enviarlo. Validar ahora →

Otros artículos

Usamos una cookie de sesión para iniciar sesión, una cookie de idioma para la preferencia lingüística y Tawk.to para el widget de chat en vivo (que establece sus propias cookies al abrir el chat). Google Analytics (GA4) se carga solo después de que aceptes, con anonimización de IP; sin rastreadores publicitarios. Consulta nuestra Política de Privacidad.