#Exportar datos
Clarisfy puede copiar cada CFDI y cada documento del SAT a almacenamiento que tú controlas, en cuanto se descarga. Es un espejo, no una mudanza: la plataforma conserva su propia copia porque la necesita para parsear, conciliar y generar tus reportes.
La copia corre fuera de banda. Si tu bucket se llena, si rotas una llave o si revocas un permiso, tus descargas del SAT siguen funcionando igual: sólo deja de llegar la copia, y el destino queda marcado con el motivo.
#Alcance de un destino
fiscal_entity_id | Qué copia |
|---|---|
null (omitido) | Todos los RFCs de la organización, presentes y futuros |
fe_… | Sólo ese RFC |
Un RFC puede estar conectado a varias organizaciones. Un destino sólo recibe documentos de los RFCs que tu organización tiene conectados y activos: si desconectas un RFC, deja de copiarse de inmediato.
#Proveedores y sus campos
Los campos marcados como secretos se cifran al guardarse y la API nunca los devuelve, ni enmascarados. Los demás se devuelven en config para que puedas ver qué quedó configurado.
| Proveedor | Campos | Secretos |
|---|---|---|
s3 | bucket*, region, endpoint_url, prefix | access_key, secret_key |
azure_blob | prefix | sas_url* |
google_drive | root_folder_id | client_id, client_secret, refresh_token* |
onedrive | drive_id, folder_path | client_id, client_secret, refresh_token* |
* Requerido.
s3 cubre más que AWS. Cualquier servicio que hable la API de S3 funciona con este proveedor: AWS S3, Google Cloud Storage (por su endpoint XML), Cloudflare R2, Backblaze B2, Wasabi, DigitalOcean Spaces y MinIO. Para AWS deja endpoint_url vacío; para el resto, apúntalo a su endpoint.
Para azure_blob pide un SAS de contenedor, no la llave de la cuenta. La llave de cuenta daría a Clarisfy control total y permanente de todo el almacenamiento, incluido borrar. Un SAS está limitado al contenedor, a los permisos que marques (necesita escritura) y a la fecha que elijas. Como expira, cuando eso pase el destino se detiene con ese motivo: genera un SAS nuevo y configura el destino otra vez.
#Lista tus destinos
/storage-connectors#Ejemplo
{
"connectors": [
{
"id": "stc_01jtvm3qbwfr8at3kbq72yaeb1",
"provider": "s3",
"display_name": "Bucket de archivo",
"fiscal_entity_id": null,
"rfc": null,
"config": { "bucket": "mi-empresa-fiscal", "region": "us-east-1", "prefix": "clarisfy" },
"connector_status": "active",
"last_success_at": "2026-08-19T04:12:08+00:00",
"last_error_at": null,
"last_error": null,
"counts": { "copied": 1842, "pending": 3, "failed": 0, "skipped": 1 },
"created_at": "2026-08-18T22:40:00+00:00"
}
]
}#Campos
| Campo | Tipo | Descripción |
|---|---|---|
connector_status | string | active, paused (lo pausaste tú) o error (lo detuvimos nosotros). |
last_error | string | null | Motivo del último fallo, redactado para mostrarse tal cual. |
counts.copied | integer | Objetos ya escritos en tu destino. |
counts.pending | integer | En cola. |
counts.failed | integer | Fallaron y se reintentarán. |
counts.skipped | integer | Se dieron por perdidos; no se reintentan solos. |
config | object | Ajustes no secretos, tal como se configuraron. |
#Configura un destino
/storage-connectorsAntes de guardar nada, Clarisfy escribe y borra un archivo de prueba en tu destino. Si no puede escribir, responde 422 con el motivo y no queda nada configurado. La razón es concreta: dar permiso de lectura sin escritura es una configuración común, y un destino así se vería sano y no copiaría nada — te enterarías meses después, con el archivo vacío.
#Cuerpo de la petición
| Campo | Tipo | Descripción |
|---|---|---|
provider | string | Requerido. s3, azure_blob, google_drive u onedrive. |
display_name | string | Requerido. Nombre para identificarlo (2–120 caracteres). |
fiscal_entity_id | string | null | Opcional. TypeID fe_… para limitarlo a un RFC. |
settings | object | Requerido. Campos del proveedor, planos. Ver la tabla de arriba. |
curl https://api.clarisfy.com/v1/storage-connectors \
-H "Authorization: Bearer clf_live_secret_9K3mZ1pQ7rTx8vB4nH6dLwYe" \
-H "Content-Type: application/json" \
-d '{
"provider": "s3",
"display_name": "Bucket de archivo",
"settings": {
"bucket": "mi-empresa-fiscal",
"region": "us-east-1",
"prefix": "clarisfy",
"access_key": "AKIAEXAMPLE",
"secret_key": "…"
}
}'#Errores
| Código | Cuándo |
|---|---|
409 | Ya tienes un destino de ese proveedor para el mismo alcance. Edítalo o retíralo. |
422 | Falta un campo requerido, o tu destino rechazó la escritura de prueba. El mensaje dice qué revisar y no se guardó nada. |
#Cómo se nombran los objetos
Cada objeto se escribe con la misma llave que usa Clarisfy internamente, debajo del prefix que configuraste. La llave empieza con el RFC, así que cada contribuyente queda en su propia carpeta:
clarisfy/ABC010101AAA/cfdi/2026/08/3f1c…-uuid.xml
clarisfy/ABC010101AAA/constancias/2026/08/csf.pdfEn google_drive y onedrive esa llave se convierte en carpetas reales, y el identificador que se registra es el que asigna el proveedor, no la ruta.
#Renombra, pausa o reactiva
/storage-connectors/{connector_id}| Campo | Tipo | Descripción |
|---|---|---|
display_name | string | Opcional. Nuevo nombre. |
connector_status | string | Opcional. paused deja de copiar sin perder la configuración; active reanuda. |
Las credenciales no se editan aquí. Para cambiar una, crea un destino nuevo: así la escritura de prueba vuelve a correr y una edición silenciosa no rompe un espejo que ya funcionaba.
#Prueba la conexión
/storage-connectors/{connector_id}/testEscribe y borra un archivo de prueba, y guarda el resultado en el destino. Responde 204 si funciona y 422 con el motivo si no.
Una prueba exitosa reactiva un destino que estaba en error, así que es la forma de recuperarlo después de arreglar tu almacenamiento, sin volver a capturar credenciales.
#Copia el histórico
/storage-connectors/{connector_id}/backfillEncola todo lo que Clarisfy ya tiene almacenado de los RFCs que cubre el destino: los XML de tus CFDIs y los PDFs del SAT.
Es explícito y no automático al crear el destino a propósito. Una organización con años de histórico convertiría un solo clic en decenas de miles de copias y un costo de egreso que nadie esperaba.
{ "queued": 18420 }Repetirlo es seguro: lo que ya está copiado o ya está en cola no se duplica, así que queued sólo cuenta lo que se agregó en esta llamada.
#Retira un destino
/storage-connectors/{connector_id}Dejamos de copiar y se borran las credenciales. Lo que ya se copió permanece en tu almacenamiento: retirar el destino no borra nada de tu lado.
#Qué pasa cuando algo falla
Los fallos se clasifican en dos, y la diferencia importa:
- Transitorios (tiempo de espera agotado, error 5xx del proveedor, límite de tasa): el objeto se queda en cola y se reintenta. El destino sigue
active. - Definitivos (llave inválida, bucket inexistente, sin permiso de escritura, cuota llena, permiso OAuth revocado): el destino pasa a
errorcon el motivo y deja de acumular trabajo pendiente. Arréglalo y usaPOST …/testpara reactivarlo; luegoPOST …/backfillrecupera lo que se quedó atrás.
Reintentar para siempre un error definitivo sólo llenaría la cola y retrasaría el momento en que te enteras.