Tomar una instantánea de un dataset
/v1/datasets/{id}/snapshotPara desarrolladores
Descripción
Toma una instantánea de un dataset (en el panel, Copiar a una lista): crea una lista nueva con los contactos que el dataset
tiene en ese momento, una fila por contacto. El dataset no cambia y sigue recibiendo
contactos; la lista queda fija, como cualquier otra, y registra de qué dataset salió en
source_dataset_id.
La instantánea es la importación de la lista nueva: queda en cola y la respuesta llega antes
de que se lean los contactos. El estado se consulta en la URL del header Location
(GET /v1/lists/{id}/imports/{import_id}), igual que al subir un
archivo. La lista guarda los contactos tal como estaban al leerlos: los que entren, se
corrijan o se quiten después no la cambian.
La lista nueva:
- Tiene todas las columnas que el dataset declara: primero la del campo por el que el dataset identifica a un contacto, que es obligatoria y única, y después las demás en el orden en que se declararon, con sus obligatorios. Una columna de un campo desactivado se incluye.
- Su canal es el del dataset.
- Los valores no se vuelven a validar contra las reglas de sus campos: ya las pasaron al
entrar al dataset. Una fila sin el identificador, o con un valor que no corresponde al tipo
de su columna, no pasa a la lista y se cuenta en
failed_row_count. - Un contacto que el dataset tiene en más de una fila aparece una sola vez, con su fila
actualizada más recientemente. Las demás se cuentan en
duplicated_row_count. - La supresión, el consentimiento y el cupo del plan no se aplican aquí: se aplican al enviar.
Autenticación
Authorizationbearer tokenheaderobligatorio- API key con los scopes
dataset:readylist:write. Formato:Bearer <API_KEY>. X-Instance-Slugstringheaderobligatorio- Identificador de su instancia. Ver Autenticación.
Request
Path params:
idintegerobligatorio- Identificador del dataset. Puede estar inactivo.
Body (application/json):
namestringobligatorio- Nombre de la lista nueva. No puede ser el de otra lista vigente.
descriptionstring- Descripción de la lista nueva.
Response
Location trae su URL (ver Headers).idintegersiempre presente- Identificador de la importación.
list_idintegersiempre presente- Lista a la que pertenece.
job_idstring (UUID) | null- Trabajo que ejecuta la importación; su estado se consulta en
GET /v1/jobs/{id}.nullmientras la lista no declara sus columnas. statusstring, enum: `awaiting_mapping | pending | processing | completed | failed`siempre presenteawaiting_mappingmientras la lista no declara sus columnas,pendingmientras espera su turno,processingmientras se lee el archivo, ycompletedofailedal terminar.file_namestring | null- Nombre que tenía el archivo al subirlo.
file_bytesinteger | null- Tamaño del archivo tal como se subió, en bytes.
encodingstring | null- Codificación del archivo: la detectada en sus primeras líneas hasta que se procesa, y después la que se decidió sobre el archivo completo (
utf-8,utf-16,utf-32,cp1252). delimiterstring | null- Separador de columnas: el indicado al subirlo o el detectado.
csv_row_countinteger | null- Filas leídas del archivo, sin contar la cabecera ni las filas en blanco. En una combinación, las leídas de las listas; en una instantánea, las del dataset.
nullhasta que se procesa. imported_row_countinteger | null- Filas que quedaron en la lista.
0si la importación falló. failed_row_countinteger | null- Filas descartadas por un valor inválido, un campo obligatorio vacío, columnas de más o caracteres que no corresponden a la codificación.
duplicated_row_countinteger | null- Filas descartadas por repetir el valor de una columna única. En una combinación, las de un contacto que ya estaba en una lista anterior; en una instantánea, las filas más antiguas de un contacto que el dataset tiene repetido.
has_rejectsbooleansiempre presente- Si hay un archivo con las filas descartadas para descargar (
GET /v1/lists/{id}/imports/{import_id}/rejects). error_messagestring | null- Por qué falló la importación, si falló (en inglés).
diagnosticsobject | null- Detalle de la importación, descrito abajo.
encoding, format- La codificación con que se leyó el archivo y su formato:
plain,gzip,zipo7z. No están en una combinación ni en una instantánea. source- En una instantánea:
dataset_id, el dataset leído, ysnapshot_at, el momento en que se leyó (UTC). reasons- Filas descartadas por motivo. Cada fila cuenta una vez, con el primer motivo que encontró:
invalid_character,extra_columns,required_missing,invalid_valueoduplicated. fields- Por
field_key, cuántas filas tenían ese campo vacío siendo obligatorio, inválido o repetido. Una fila con dos campos inválidos cuenta en los dos. repaired_rows / damaged_text_rows- Filas con texto dañado por una conversión de codificación anterior (
José): reparadas si la lista tienerepair_encoding, o detectadas y cargadas tal cual si no. error- Si la importación falló:
code, yfieldolinecuando el problema tiene un lugar en el archivo.
source_listsobject[] | null- En una combinación (
POST /v1/lists/merge), las listas que se combinaron, en orden. Cada una traelist_ideimport_id, que es la importación de la que salieron sus datos.nullen una importación de archivo o en una instantánea. identity_fieldstring | null- En una combinación o en una instantánea, el campo que identifica a un contacto:
EMAIL,PHONEoUNIQUECODE.nullen una importación de archivo. collision_policystring | null- En una combinación, cómo se resolvió un contacto que estaba en varias listas:
discard,fill,updateoreplace.nullen una importación de archivo o en una instantánea. delete_sourcesboolean | null- En una combinación, si las listas de origen se eliminan al terminar.
nullen una importación de archivo o en una instantánea. created_atstring (date-time)siempre presente- Cuándo se subió el archivo (ISO 8601, UTC).
started_atstring (date-time) | null- Cuándo empezó a leerse.
finished_atstring (date-time) | null- Cuándo terminó, haya completado o fallado.
- Mismos campos que
GET /v1/lists/{id}/imports/{import_id}. - La importación de la lista nueva nace en estado
pending.list_ides la lista nueva yjob_idel trabajo que toma la instantánea, que se consulta enGET /v1/jobs/{id}.
Errores
| Código | Cuándo |
|---|---|
| 403 | A la API key le falta dataset:read, list:write o los dos. |
| 404 | El dataset no existe o fue eliminado (dataset_not_found). |
| 409 | Ya existe una lista vigente con ese nombre (list_name_taken), o el dataset no declara la columna por la que identifica a un contacto (list_identity_field_missing). |
| 422 | El body no es válido: name falta o viene vacío, o hay un campo que no existe. |
| 503 | No se pudo dejar la instantánea en cola (service_unavailable). No queda nada creado: reintente. |
Detalle completo en Errores genéricos.
- Una instantánea que falla deja la lista nueva sin datos. Los códigos con que puede
fallar están en
GET /v1/lists/{id}/imports/{import_id}. Entre ellos,list_snapshot_too_large: un dataset de más de 15 millones de filas no admite una instantánea. - Una lista que salió de una instantánea solo recibe datos de su dataset: no acepta un
archivo ni un cambio de columnas, aunque su instantánea haya fallado (
409 list_is_snapshot). Para tener los contactos de nuevo, tome otra instantánea. - Un dataset sin contactos deja una lista con 0 filas.
csv_row_countes la cantidad de filas que tenía el dataset al leerlo:csv_row_count = imported_row_count + failed_row_count + duplicated_row_count. No hay archivo de rechazos: las filas que no pasaron siguen en el dataset, ydiagnosticslas cuenta por motivo y por campo.
curl -X POST "https://$API_HOST/v1/datasets/8/snapshot" \
-H "Authorization: Bearer $API_KEY" \
-H "X-Instance-Slug: $SLUG" \
-H "Content-Type: application/json" \
-d '{
"name": "Clientes al 16 de octubre"
}'
{
"id": 32,
"list_id": 13,
"job_id": "01a14495-5603-7f15-b6c2-1a2b3c4d5e6f",
"status": "pending",
"file_name": null,
"file_bytes": null,
"encoding": null,
"delimiter": null,
"csv_row_count": null,
"imported_row_count": null,
"failed_row_count": null,
"duplicated_row_count": null,
"has_rejects": false,
"error_message": null,
"diagnostics": null,
"source_lists": null,
"identity_field": "EMAIL",
"collision_policy": null,
"delete_sources": null,
"created_at": "2026-10-16T12:00:00Z",
"started_at": null,
"finished_at": null
}