Quién la puede ver
- En la web: Configuración → Auditoría. Solo la ven los usuarios con rol owner o admin; un member no tiene acceso.
- Por API, SDK o CLI: con una sesión de owner o admin, o con una API key que tenga el scope
read:audit-logs.
Qué se registra
Cada acción de esta lista deja exactamente una entrada, sin importar si se hizo desde la web, la API, el SDK, la CLI o un proceso automático.
En la web y en el CSV verás estas acciones con texto claro (“Timbró CFDI”, “Cambió el rol de un miembro”), no con el código. El código solo aparece en la API.
Algunas notas:
- Un CFDI timbrado genera una sola entrada
cfdi.stamped, aunque haya reintentos o el timbrado se confirme después de forma automática. cfdi.stamp_failedsolo se registra cuando la solicitud llegó al PAC y fue rechazada. Los rechazos previos (datos fiscales inválidos, límite del plan, organización cerrada) no dejan entrada.- Los intentos que fallan en el resto de las acciones no se registran, porque no cambiaron nada.
- No se registran inicios de sesión ni cambios de contraseña.
Qué guarda cada entrada
La bitácora nunca guarda contraseñas del CSD, API keys, secretos de webhooks, tokens ni el contenido de los XML.
De la URL de un webhook solo se guarda el dominio y el primer tramo de la ruta, por ejemplo
https://hooks.slack.com/services/…. Nunca el usuario, la contraseña, los parámetros (?token=...) ni el resto de la ruta, que es donde suelen ir las credenciales.
Si una entrada no se puede guardar en el momento (por ejemplo, por una falla breve de la base de datos), tu acción sigue adelante y la entrada se reintenta sola hasta guardarse, normalmente en uno o dos minutos. En ese caso metadata.recordedLate.occurredAt trae la hora en que ocurrió la acción, y la fecha de la entrada es la hora en que se guardó.
Inmutabilidad
Las entradas no se pueden modificar ni borrar. La base de datos rechaza cualquierUPDATE, DELETE o TRUNCATE sobre la bitácora, incluso desde la propia aplicación, y los usuarios normales no pueden insertar entradas inventadas ni leer las de otra organización.
Eliminar una organización nunca borra su historial de auditoría: la bitácora no depende de la organización para conservarse.
Integridad verificada
Además de bloquear los cambios, la bitácora deja evidencia si alguien los logra por un camino excepcional, como un acceso directo y privilegiado a la base de datos. Funciona como una cadena: cada entrada se sella con una huella (hash SHA-256) que se calcula a partir de su propio contenido y de la huella de la entrada anterior de tu organización. Si alguien cambia, borra o mete una entrada en medio, todas las huellas posteriores dejan de coincidir. Para comprobarlo, el panel de Configuración → Auditoría muestra el indicador Integridad verificada, que recorre la cadena completa. Si encuentra un problema, indica el número de la primera entrada afectada. También puedes hacerlo por API:valid es false, firstBrokenSeq es el número (seq) de la primera entrada alterada, borrada o insertada. Ver Verify Audit Log Integrity.
Retención
Las entradas se conservan 5 años.Exportar a CSV
Desde el panel con el botón Exportar CSV, o por API/SDK/CLI, con los mismos filtros que el listado. El archivo trae las fechas en hora de México y las acciones con su texto en español. Cada exportación se registra a su vez en la bitácora (audit_log.exported).
El límite es de 50,000 filas por archivo. Si tu filtro devuelve más, la API responde 422 con el código AUDIT_EXPORT_TOO_LARGE; acota el rango de fechas y vuelve a intentar.
Consultarla por API, SDK o CLI
Necesitas una API key con el scoperead:audit-logs (ver Create API Key). Con una API key, la organización se toma de la llave.
API
YYYY-MM-DD) se interpreta en hora de México: from empieza a las 00:00 y to incluye todo ese día.