factadesarrolladores API 0.1.0-esqueleto

Almacenamiento y retención

Facta no es el archivo fiscal de nadie: el documento firmado tiene que aterrizar en un destino de almacenamiento que la empresa controla. Esta guía cuenta las dos piezas que hacen eso cierto — el requisito de tener un destino conectado, y la copia temporal que existe mientras esa escritura se confirma.

Un destino conectado es un requisito, no un extra

Antes de reservar cualquier correlativo, el servidor comprueba que la empresa tiene al menos un destino de almacenamiento —Almacenamiento Facta, S3, R2, Supabase Storage, FTP/SFTP— conectado y verificado en los últimos 30 días. Sin eso, la petición se detiene con 422 no_storage_destination, y no gasta correlativo: corre antes que nada más, porque firmar un documento que no tiene dónde aterrizar lo dejaría sin ninguna copia salvo la de esa misma respuesta HTTP — y esa respuesta se pierde con el primer proceso que se cae.

Google Drive no cuenta como almacenamiento de la API (decisión de seguridad del 17-oct-2026): una empresa cuyo único destino es Drive se trata como una empresa sin destino. Para usar la API conecte Almacenamiento Facta u otro destino compatible (S3 y compatibles, Supabase Storage, FTP/SFTP). La ruta POST /v1/destinations/{id}/drive-token responde 403 drive_not_available_for_api.

Conecte el destino desde la app (vea el paso correspondiente en Empezar); no hay forma de resolver este error desde la API.

El área de retención: una copia de una hora

Cuando un documento se firma, una copia cifrada queda además en un área de retención propia de Facta, durante una hora. No es el destino real — es la red de seguridad para el tramo entre que el documento se firma y que su escritura al destino real se confirma.

GET /v1/dte/holding lista lo que hay ahí ahora mismo: evidencia de estado —dónde aterrizó, cuántos intentos, cuándo vence, cuántas veces se descargó—, nunca rutas de bucket ni el contenido en sí.

curlTerminal
curl "$FACTA_API_BASE_URL/v1/dte/holding?limit=50" \
  -H "X-Facta-Key: $FACTA_API_KEY"

Pasada la hora, la descarga sigue funcionando

GET /v1/dte/{codigoGeneracion}/file no deja de contestar cuando la hora de retención termina: el documento se rearma desde la reserva del correlativo, que guarda el JWS sellado de forma permanente. La retención de una hora es sobre la copia de emergencia, no sobre la capacidad de recuperar el documento — vea Descargar el JSON y el PDF para el detalle completo.

Qué guarda Almacenamiento Facta

Si su empresa lo tiene, Facta guarda el JSON y el PDF de cada emisión y, desde que existe el tipo invalidation, también el evento de una anulación. GET /v1/storage/status dice qué tipos acepta (supportedKinds: json, pdf e invalidation) y cuáles no (unsupportedKinds: hoy solo ticket). GET /v1/storage/copies lista los recibos, con una fila kind: invalidation por cada anulación.

Los eventos de retorno también quedan allí, en la carpeta eventos/ del documento, como eventos/<CODIGO-DEL-EVENTO>.json y .pdf.

Si prefiere sus propios destinos, avise de cada copia con POST /v1/storage/copies/{codigoGeneracion}/byos. Con capabilities.byosCopyReport en 2 o más acepta además { "kind": "invalidation", "secretId": "…", "jsonPath": "…" } para el evento de una anulación; vea Anular un documento sellado.

Lo que este cliente todavía no hace

Otras guías

Escriba para buscar Por ejemplo: idempotencia, contingencia, 422, emitir.

↑ ↓ moverse Enter abrir Esc cerrar