Paquete de evidencias
El paquete de evidencias es un único ZIP para seguridad, cumplimiento o tu auditor. Lleva cada decisión de la política en un rango de fechas, quién aprobó qué y cuándo, quién cambió las reglas y los cambios de acceso que Burnbound registra. Un manifiesto guarda el SHA-256 de cada fichero, y el SHA-256 del manifiesto queda en la auditoría, así que cualquiera puede comprobar después que nadie ha tocado el paquete.
Sale de la auditoría, que solo se añade. Te ayuda a documentar controles; no es una certificación.
¿Quién puede descargarlo?
Solo un owner o un admin con sesión en el panel, en Team o Business.
- En el panel. Informe mensual en la barra lateral (
/app/informe), bloque Paquete de evidencias: elige el primer y el último día y descárgalo. El resto de roles ve una línea que dice que solo owners y admins pueden descargarlo. - Por la API.
GET /v1/reports/evidence.zip?from=YYYY-MM-DD&to=YYYY-MM-DDcon la sesión de un owner o admin. Una clave de org o de agente recibe403.
El fichero se llama burnbound-evidence-<from>-to-<to>.zip. El README.md de dentro va en el idioma de quien lo exporta, inglés o español.
¿Qué fechas cubre?
| Regla | Qué pasa |
|---|---|
| Días | from y to son días en UTC, ambos incluidos. Hacen falta los dos, y el inicio tiene que ser anterior o igual al final. |
| Duración | 366 días como mucho. |
| Retención del plan | El inicio se mueve al momento más antiguo que guarda la retención de auditoría de tu plan: 365 días antes del exporte en Team, toda en Business. El README lo dice, y window.effective.from del manifiesto da el instante exacto. |
| De uno en uno | Un exporte a la vez por organización. Un segundo mientras corre el primero se rechaza; el cerrojo se suelta solo a los 15 minutos como mucho. |
| Aprobaciones | Una aprobación pedida en la ventana se sigue hasta el momento del exporte, así que su estado final es el de hoy. |
Errores de la API:
| Respuesta | Por qué |
|---|---|
400 invalid_range |
Falta un día, no es válido o el inicio va después del final. |
400 range_too_long |
Más de 366 días. |
403 plan_limit_reached |
Plan Free, con limit: "reports". |
503 export_busy |
Hay otro exporte de la organización en curso. |
503 report_unavailable |
El almacén falló antes de empezar la descarga. Vuelve a intentarlo. |
¿Qué lleva el paquete?
| Fichero | Qué contiene |
|---|---|
decisions.csv |
Cada decisión de la política sobre un pago x402 o MPP, una autorización de tarjeta o una acción, como un reembolso. |
approvals.csv |
Una fila por aprobación humana pedida en la ventana. |
policy-changes.csv |
Cada cambio de una política, una regla o los ajustes del webhook de decisión. |
access.csv |
Lo que Burnbound registra sobre quién puede actuar por la organización. |
README.md |
La organización, la ventana, quién lo generó, qué lleva cada fichero y qué controles ayuda a documentar. |
manifest.json |
La organización, la ventana pedida y la usada, el plan, las filas y el SHA-256 de cada uno de los demás ficheros. |
Los CSV van en UTF-8 con marca de orden de bytes. decisions.csv y policy-changes.csv van del más antiguo al más reciente; approvals.csv, en el orden en que se cerraron las aprobaciones y después las aún abiertas; access.csv lleva las filas de auditoría, luego las de claves y luego las de miembros, cada bloque del más antiguo al más reciente. Una celda de texto que empieza por =, +, -, @, un tabulador o un retorno de carro lleva una ' delante, para que la hoja de cálculo la muestre y nunca la ejecute. Todo sale de la auditoría ya redactada, de los registros de pagos y de los de claves y miembros: ni secretos, y de una clave solo su id, su prefijo y su etiqueta.
¿Qué columnas tiene decisions.csv?
Una fila por evento de decisión: payment.authorized, payment.denied, payment.step_up_required, los eventos card.authorization.* y action.executed o action.failed.
createdAt,eventId,typeydecision:allow,deny,step_upo, en tarjetas y acciones,released,captured,refunded,executed,failed.- Quién:
agentId,agentName,personId,personEmail,teamId,teamName,costCenter. La persona, el subequipo y el centro de coste son los sellados en el pago al reservarlo. Una decisión sin pago, como una denegación, muestra los del agente el día del exporte. - Qué:
intentId,method,host,payTo(o el comercio de la tarjeta),amountUsd,currency,originalAmountMinor(unidades menores de la moneda original),asset,network. - Por qué:
codes(los códigos del motivo, separados por espacios),matchedRules(ruleId:outcomede cada regla que casó) ypolicyVersion.
¿Qué columnas tiene approvals.csv?
approvalId,requestedAt,agentId,agentName,intentId,amountUsd,host.reason(por qué se pidió,thresholdsi no se dice otra cosa),policyVersion,matchedRules.decision(approvedodenied),decidedByUserId,decidedByEmail,decidedAt,secondsToDecision,note.finalStatus:denied,expired,consumed(la usó el pago),approved(y aún sin usar) opending.closedAtes cuándo se denegó, caducó o se usó.
¿Qué columnas tiene policy-changes.csv?
createdAt, eventId, type, actor, actorUserId, actorEmail, agentId, agentName, scope (org o agent:<id>), ruleId, previousVersion, newVersion y change: el evento redactado en JSON.
Entran las reglas creadas, cambiadas o borradas, los límites, los hosts, las redes, la política base y sus ajustes, las reglas de ámbito, los hosts añadidos desde el catálogo, las reglas añadidas desde el chat y el webhook de decisión creado, cambiado, borrado o con su secreto de firma rotado. Las llamadas y las pruebas del webhook no cambian nada y se quedan fuera.
¿Qué columnas tiene access.csv?
createdAt, eventId, source, type, actorUserId, actorEmail, subjectUserId, subjectEmail, agentId, agentName, teamId, teamName, details (JSON).
source dice de dónde sale cada fila:
source |
Filas |
|---|---|
audit |
Presupuestos por persona, una persona pasada a viewer, a mano o al bajar de plan (member.role_demoted), pertenencia a subequipos, agentes asignados a personas, cambios de plan, conectores de wallet y cada exporte de evidencias. |
key_record |
Claves de org y de agente creadas o revocadas (org_api_key.created, agent_key.revoked…), de los registros de claves: details lleva el id de la clave, su prefijo y su etiqueta. |
member_record |
member.joined: las personas que entraron en la ventana y siguen en la organización, de los registros de miembros, con roleToday en details. |
¿Cómo compruebo que un paquete está intacto?
- Calcula el SHA-256 de cada fichero y compáralo con
filesenmanifest.json. - Calcula el SHA-256 de
manifest.jsony búscalo en el eventoreport.evidence_exportedde ese exporte, en el campomanifestSha256.
El panel hace el paso 2 por ti: después de la descarga enseña el SHA-256 del manifiesto y te dice si ya está en la auditoría. La tabla Exportes del mismo bloque lista cada paquete con su ventana, sus filas y el hash del manifiesto. Por la API, los mismos eventos están en GET /v1/audit?type=report.evidence_exported.
Desde un terminal (macOS; en Linux, sha256sum en vez de shasum -a 256):
unzip burnbound-evidence-2026-01-01-to-2026-06-30.zip -d evidencias
cd evidencias
jq -r '.files | to_entries[] | "\(.value.sha256) \(.key)"' manifest.json | shasum -a 256 -c
shasum -a 256 manifest.json
La primera orden escribe OK por cada fichero cuyo hash coincide. La segunda escribe el hash del manifiesto, que tiene que ser el manifestSha256 del evento.
Un manifest.json tiene esta forma (con los hashes recortados):
{
"evidenceFormat": 1,
"org": { "id": "…", "name": "Acme" },
"window": {
"requested": { "from": "2026-01-01", "to": "2026-06-30" },
"effective": {
"from": "2026-01-01T00:00:00.000Z",
"until": "2026-07-01T00:00:00.000Z"
},
"clippedToRetention": false,
"retentionDays": 365
},
"generatedAt": "2026-07-01T09:30:00.000Z",
"generatedBy": { "userId": "…", "email": "…", "role": "owner" },
"plan": "team",
"files": {
"README.md": { "rows": null, "bytes": 3120, "sha256": "…" },
"decisions.csv": { "rows": 1284, "bytes": 402113, "sha256": "…" },
"approvals.csv": { "rows": 58, "bytes": 14220, "sha256": "…" },
"policy-changes.csv": { "rows": 31, "bytes": 18904, "sha256": "…" },
"access.csv": { "rows": 17, "bytes": 5031, "sha256": "…" }
}
}
manifest.json va guardado en el ZIP sin comprimir, para que el panel lo pueda leer de la descarga. Un cambio de ficheros o de columnas sube evidenceFormat.
La auditoría solo se añade, así que el hash que quedó al exportar no se puede cambiar después. Una descarga que falla o se cancela no registra ningún evento.
¿Qué no cubre todavía?
access.csv no es una lista completa de quién tuvo acceso. Solo enseña lo que Burnbound registra hoy:
- Bajas. Las bajas de personas no se auditan, así que no salen.
- Invitaciones. Tampoco se auditan.
- Cambios de rol. No se auditan, salvo el paso a viewer.
- Altas. Salen de los registros de miembros: una persona que entró y ya se fue no aparece, y el rol es el de hoy, no el que tenía al entrar.
- Claves. Salen de los registros de claves: las de un agente borrado desde entonces no aparecen.
¿Qué controles ayuda a documentar?
El paquete te ayuda a enseñar a tu auditor cómo se controla el gasto de los agentes. No certifica nada: no es una opinión de auditoría, ni una certificación, ni una garantía de cumplimiento de ninguna norma o ley.
| Marco | Control | Ficheros |
|---|---|---|
| SOC 2 | CC6, acceso lógico | access.csv, y quién decidió en approvals.csv |
| SOC 2 | CC8, gestión de cambios | policy-changes.csv |
| ISO/IEC 27001:2022, anexo A | 5.15 control de acceso, 5.18 derechos de acceso | access.csv |
| ISO/IEC 27001:2022, anexo A | 8.15 registro de eventos | Los cuatro CSV y el manifiesto |
| Reglamento europeo de IA (AI Act) | Artículo 12, registro | decisions.csv y policy-changes.csv |
| Reglamento europeo de IA (AI Act) | Artículo 14, supervisión humana | approvals.csv, y las filas step_up de decisions.csv |
Para el exporte de gasto del día a día y el informe mensual, mira Conceptos.