Skip to main content
Um sync de mão dupla precisa de quatro coisas de uma API: ler só o que mudou, saber o que foi excluído, uma chave que você controla e um jeito de escrever muitos registros de uma vez. A Sailer tem as quatro para contatos, organizações e negócios.

Leia o que mudou

Liste com updated_since no momento em que sua execução anterior começou, e sort=updated_at:
updated_at muda sempre que algo no registro muda — um campo padrão, um campo personalizado ou as tags. O horário precisa ter fuso; 2026-09-30T00:00:00 sem fuso devolve 400. Siga o cursor até o fim:
O cursor fica ancorado no último registro que você recebeu, então um registro criado ou editado durante a paginação nunca aparece duas vezes nem é pulado. Um registro editado no meio do percurso simplesmente reaparece mais adiante no mesmo percurso, com o updated_at novo. Filtre uma listagem com parâmetros de query — repita um para fazer OU entre os valores, combine diferentes para fazer E:
Para condições aninhadas, intervalos ou filtros entre relacionamentos, use POST /v1/contacts/search, que devolve os mesmos objetos.

Leia o que foi excluído

Exclusões têm um feed próprio, das mais antigas para as mais novas:
Ele lista registros excluídos por esta API, pelo app da Sailer ou por um CRM conectado. Exige o escopo de leitura do recurso, por exemplo contacts:read. DELETE /v1/contacts/{id} (e o mesmo em organizações e negócios) tira um registro de todas as listagens e buscas sem apagar nada: conversas e histórico ficam guardados. Fazer upsert do mesmo contato, ou uma nova mensagem dele, o restaura, e ele volta a aparecer na sua próxima leitura com updated_since.

Use seus próprios ids

Defina external_id com o id do seu sistema ao criar ou atualizar um registro. Ele é único por workspace e por recurso, volta em toda leitura e pode ser usado como filtro:
POST /v1/contacts/upsert casa primeiro pelo external_id, depois pelo phone:

Escreva em massa

POST /v1/contacts/batch faz upsert de até 100 contatos numa chamada. Cada item é gravado exatamente como em POST /v1/contacts/upsert, em ordem, e recebe o próprio resultado — um item com falha nunca desfaz os outros:
A chamada responde 200 sempre que o lote em si é válido; leia o status de cada item. Envie um header Idempotency-Key para que um lote reenviado não seja aplicado duas vezes.

Juntando tudo

  1. Anote o horário e leia as mudanças com updated_since no início da execução anterior.
  2. Leia GET /v1/deleted-records com since no mesmo horário e remova esses registros do seu lado.
  3. Envie suas mudanças com POST /v1/contacts/batch, pela chave external_id, com um Idempotency-Key.
  4. Guarde o horário do passo 1 como o início desta execução.
Acompanhe X-RateLimit-Remaining em toda resposta e desacelere antes de chegar a zero.