Lee lo que cambió
Lista conupdated_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:
updated_at nuevo.
Filtra un listado con parámetros de query — repite uno para hacer O entre sus
valores, combina distintos para hacer Y:
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: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
Defineexternal_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:
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
- Anota la hora y lee los cambios con
updated_sinceen el inicio de la ejecución anterior. - Lee
GET /v1/deleted-recordsconsinceen la misma hora y elimina esos registros de tu lado. - Envía tus cambios con
POST /v1/contacts/batch, por la claveexternal_id, con unIdempotency-Key. - Guarda la hora del paso 1 como el inicio de esta ejecución.
X-RateLimit-Remaining en cada respuesta y baja el ritmo antes de llegar
a cero.