Saltar al contenido principal

Agregar un contacto a un dataset

POST/v1/datasets/{id}/contacts

Para desarrolladores

Descripción​

Registra un contacto en un dataset. Es la vía para alimentar un dataset desde su propio sistema, contacto a contacto; la otra es un formulario de Fidelizador vinculado a ese dataset.

La respuesta es 202 Accepted, no 201 Created. El contacto se valida al recibirlo y se guarda después, así que puede tardar hasta un minuto en aparecer en GET /v1/datasets/{id}/records. No asuma que está disponible al recibir el 202. Si necesita confirmarlo, búsquelo en ese listado.

Cuatro reglas deciden qué se acepta:

  • Solo columnas que el dataset declara. Una clave que el dataset no declara se rechaza con 409, no se ignora. Así un error de su integración no pasa inadvertido.
  • Las columnas obligatorias no pueden faltar. Un contacto sin una columna que el dataset marca como obligatoria se rechaza con 409.
  • El identificador es obligatorio. Cada dataset reconoce a un contacto por uno de tres identificadores: correo, teléfono o código único. Se elige al crear el dataset. Sin ese valor, el contacto no se puede buscar, actualizar ni suprimir, y se duplicaría en cada reenvío.
  • Cada valor cumple las reglas de su campo. Son las mismas que aplica un formulario: opciones permitidas, largo, patrón y rango, según cómo esté configurado el campo en el catálogo (GET /v1/fields). El correo debe tener forma de correo, y el teléfono, formato internacional con + (+56912345678). Un valor que no las cumple se rechaza con 422.

Los demás datos pueden faltar: un contacto que solo trae el identificador es válido. Por ejemplo, en un dataset que identifica por correo, un contacto puede entrar sin teléfono, y el teléfono puede llegar después.

Qué ocurre cuando el contacto ya existe lo decide la política de colisión del dataset, configurada en el panel:

PolíticaQué hace con el contacto que ya estaba
DescartarEl contacto queda como estaba. No se guarda nada de lo enviado, ni siquiera los datos que le faltaban.
CompletarSe guardan solo los datos que el contacto no tenía. Los que ya tenían valor no cambian, aunque se envíen distintos.
ActualizarLos datos enviados reemplazan a los anteriores. Los no enviados se conservan.
ReemplazarEl contacto queda solo con los datos enviados. Todo lo demás se borra.

Actualizar y Reemplazar se diferencian en lo que pasa con los datos que no se envían. Si un contacto tenía doce campos y la llamada trae tres, Actualizar conserva los otros nueve y Reemplazar los borra.

Reenviar el mismo contacto no crea un duplicado: se reconoce por su identificador y se le aplica la política del dataset.

Antes de la primera carga, tenga en cuenta dos comportamientos:

  • Completar es el valor por defecto y no sobrescribe. Un dataset en Completar conserva lo guardado y solo escribe en los datos vacíos. Si su sistema debe ser la fuente de verdad, configure el dataset en Actualizar.
  • Un valor vacío equivale a no enviar la clave. {"PHONE": ""} no borra el teléfono guardado. Así, un dato que no recolectó no borra uno que ya tenía valor. No hay una forma de borrar un dato puntual por la API: la única es Reemplazar, que borra todo lo que no venga en la llamada. Desde el panel sí puede vaciar una columna de un contacto.

Autenticación​

Authorizationbearer tokenheaderobligatorio
API key con scope dataset:write. Formato: Bearer <API_KEY>.
X-Instance-Slugstringheaderobligatorio
Identificador de su instancia. Ver Autenticación.

Request​

Path params:

idintegerobligatorio
Identificador del dataset.

Body:

valuesobjectobligatorio
Valores del contacto, indexados por la field_key del campo (`GET /v1/fields`). Al menos una clave. Cada valor se guarda con el tipo de su campo.

Cómo se envía y cómo se guarda cada tipo de campo:

Tipo de campoSe puede enviar comoSe guarda como
Sí/notrue/false, o el texto true/false, 1/0, sí/no, verdadero/falsotrue / false
Selección múltipleUna lista (["NUNOA","PROVIDENCIA"]) o texto separado por comas ("NUNOA,PROVIDENCIA")Lista de opciones
NúmeroUn número (42) o texto que lo sea ("42")Número
FechaTexto YYYY-MM-DDTexto YYYY-MM-DD
Los demásTextoTexto

Un valor que no corresponde a su tipo se rechaza con 422, igual que uno que no cumple las reglas de su campo.

Response​

202 AcceptedSin cuerpo. El contacto pasó la validación y se guardará en breve.

Errores​

CódigocodeCuándo
404dataset_not_foundEl dataset no existe.
409dataset_column_not_declaredvalues trae una clave que el dataset no declara.
409dataset_required_column_missingFalta una columna que el dataset declara obligatoria.
409dataset_identity_value_missingFalta el identificador por el que el dataset reconoce a un contacto.
422validation_errorUno o más valores no cumplen las reglas o el tipo de su campo. errors trae un elemento por columna, con pointer /values/<field_key> y code field_value_invalid, y se informan todos a la vez.
503service_unavailableLa plataforma no pudo recibir el contacto en este momento. Reintente.

El catálogo completo está en Respuestas de error.

Notas
  • Los rechazos 409 y 422 se responden antes del 202. Por eso un 202 indica que el contacto pasó la validación, no solo que llegó.
  • El correo se guarda normalizado: [email protected] y [email protected] son el mismo contacto.
  • Un contacto guardado se puede quitar con DELETE /v1/datasets/{id}/contacts/{identifier}. Para corregirlo, edítelo en el panel o, si el dataset usa la política Actualizar, vuelva a enviarlo con los datos corregidos.
  • El mismo correo en dos datasets corresponde a dos contactos distintos. Cada dataset guarda sus contactos por separado.
Request
curl -X POST "https://cl1api.fidelizador.com/v1/datasets/7/contacts" \
-H "Authorization: Bearer <API_KEY>" \
-H "X-Instance-Slug: <slug>" \
-H "Content-Type: application/json" \
-d '{
"values": {
"EMAIL": "[email protected]",
"FIRST_NAME": "Ana",
"LAST_NAME": "Pérez"
}
}'
Response
{
"type": "https://docs.fidelizador.com/errors/unauthorized",
"title": "Unauthorized",
"status": 401,
"detail": "Authentication required.",
"code": "unauthorized",
"trace_id": "dbb56202f13e1c15473bc6044ede8539"
}