Todas as receitas usam métodos do perfil público. Elas não criam pedidos, alteram registros nem enviam mensagens.
Sincronizar catálogo por páginas
Esta é uma leitura paginada, não um feed de alterações: não há filtro de data de atualização nem snapshot consistente neste contrato. Mudanças de catálogo durante a leitura podem deslocar os offsets; faça upsert pela chave estável e reconcilie periodicamente.
- Chame
products.listcomlimit:60eoffset:0. - Processe
result.itemsporcodigoouid, conforme a chave estável definida para sua integração. - Se
result.next_cursornão fornull, converta-o em número e envie como próximooffset. - Encerre quando
next_cursorfornull. - Não use
totalcomo cursor e não presuma que preço ou estoque sejam sempre preenchidos.
let offset = 0;
for (;;) {
const page = await sysled.call("products.list", { limit: 60, offset });
await saveProducts(page.items);
if (page.next_cursor == null) break;
const nextOffset = Number(page.next_cursor);
if (!Number.isSafeInteger(nextOffset) || nextOffset <= offset) {
throw new Error("Cursor de catálogo inválido ou sem progresso");
}
offset = nextOffset;
}
disponivel é a decisão pronta de compra na revisão documentada. estoque, reservado e disponivel_qtd têm significados diferentes.
Paginar mensagens de uma conversa autorizada
Esta receita exige messages.list da revisão 8319cf51 no backend. Mantenha um token com o escopo exato e vinculado à empresa correta; obtenha o conversation_id por um fluxo autorizado.
- Faça a primeira chamada com
conversation_idelimit:50, sembefore. - Processe somente os campos necessários de
result.messages, deduplicando poridna mesma empresa/conversa.totalé o tamanho do lote;total_counté a contagem do histórico não excluído, não um cursor. - Quando
hasMore:true, exijanext_cursorcomo string não vazia e envie seu valor exatamente embeforeda próxima chamada, mantendo empresa econversation_id. Não converta esse cursor em número nem o decodifique/reconstrua. - Encerre com
hasMore:falseenext_cursor:null. Interrompa em cursor repetido, campos ausentes/incoerentes ou no limite de páginas definido para sua integração; não reinicie indefinidamente em caso de erro. - Trate
400 BAD_REQUESTcomo entrada/cursor inválido e404 NOT_FOUNDcomo conversa inacessível ou âncora ausente desse histórico. Não reutilize cursores entre empresas ou conversas.
O cursor legado por UUID continua aceito, mas prefira sempre o next_cursor retornado. Novas mensagens e exclusões podem ocorrer durante a leitura: não há promessa de snapshot consistente. Limite a coleta ao necessário, aplique prazo de retenção e não registre conteúdo, URLs de mídia ou cursores em logs/tickets. delivered_at e read_at podem ser nulos; ausência de timestamp não comprova entrega nem leitura.
Consultar tarefas pendentes
Use tasks.list com completed:false, página iniciada em 1 e limite até 100. Se filtrar por owner_type, envie também owner_id. O total documentado é o tamanho do lote, não necessariamente o total global; pare quando a página retornar menos itens que o limite.
Consultar funil e etapas
pipelines.listretorna os funis acessíveis.- Escolha um
idda resposta. stages.listcom essepipeline_idretorna as etapas.- Em
pipelines.get, tratefound:falsecomo ausência normal, ainda que o HTTP seja 200.
Calcular frete sem criar pedido
Envie CEP de oito dígitos e itens identificados por sku ou codigo:
{
"cep": "01001000",
"itens": [{ "sku": "DEMO-01", "qtd": 2 }]
}
shop.frete.calcular pode consultar geocodificação e manter cache técnico do CEP. O resultado é cotação: não cria pedido, não reserva estoque e não altera regra comercial.
Validar desconto
shop.desconto.validar calcula cupom e automáticos para os itens informados. Preço enviado pelo cliente é ignorado. Trate a resposta como estimativa e recalcule no fluxo comercial autorizado antes de concluir a venda.
Minimizar dados pessoais
leads.list e messages.list podem retornar dados pessoais, conteúdo e mídia. Use filtros, limite pequeno, retenção curta e acesso restrito. Não copie respostas integrais para logs ou tickets de suporte.