Skip to main content
Un sync bidireccional necesita cuatro cosas de una API: leer solo lo que cambió, saber qué se eliminó, una clave que tú controlas y una forma de escribir muchos registros a la vez. Sailer tiene las cuatro para contactos, organizaciones y negocios.

Lee lo que cambió

Lista con updated_since en el momento en que empezó tu ejecución anterior, y sort=updated_at:
updated_at cambia cada vez que algo del registro cambia — un campo estándar, un campo personalizado o sus etiquetas. La hora debe llevar zona horaria; 2026-09-30T00:00:00 sin zona devuelve 400. Sigue el cursor hasta el final:
El cursor queda anclado en el último registro que recibiste, así que un registro creado o editado mientras paginas nunca aparece dos veces ni se salta. Un registro editado a mitad del recorrido simplemente vuelve a aparecer más adelante en el mismo recorrido, con su updated_at nuevo. Filtra un listado con parámetros de query — repite uno para hacer O entre sus valores, combina distintos para hacer Y:
Para condiciones anidadas, rangos o filtros entre relaciones, usa POST /v1/contacts/search, que devuelve los mismos objetos.

Lee lo que se eliminó

Las eliminaciones tienen su propio feed, de la más antigua a la más reciente:
Lista registros eliminados por esta API, en la app de Sailer o por un CRM conectado. Requiere el scope de lectura del recurso, por ejemplo contacts:read. DELETE /v1/contacts/{id} (y lo mismo en organizaciones y negocios) saca un registro de todos los listados y búsquedas sin borrar nada: sus conversaciones e historial se conservan. Hacer upsert del mismo contacto, o un mensaje nuevo suyo, lo restaura, y vuelve a aparecer en tu próxima lectura con updated_since.

Usa tus propios ids

Define external_id con el id de tu sistema al crear o actualizar un registro. Es único por workspace y por recurso, vuelve en cada lectura y se puede usar como filtro:
POST /v1/contacts/upsert busca primero por external_id y después por phone:

Escribe en masa

POST /v1/contacts/batch hace upsert de hasta 100 contactos en una llamada. Cada ítem se escribe exactamente como en POST /v1/contacts/upsert, en orden, y recibe su propio resultado — un ítem que falla nunca deshace los demás:
La llamada responde 200 siempre que el lote en sí sea válido; lee el status de cada ítem. Envía un header Idempotency-Key para que un lote reenviado no se aplique dos veces.

Todo junto

  1. Anota la hora y lee los cambios con updated_since en el inicio de la ejecución anterior.
  2. Lee GET /v1/deleted-records con since en la misma hora y elimina esos registros de tu lado.
  3. Envía tus cambios con POST /v1/contacts/batch, por la clave external_id, con un Idempotency-Key.
  4. Guarda la hora del paso 1 como el inicio de esta ejecución.
Vigila X-RateLimit-Remaining en cada respuesta y baja el ritmo antes de llegar a cero.