Growth Station

Playbook de integração para parceiros e agências

Um roteiro reutilizável para agências implantarem a API do GS Engage em vários clientes com o mesmo padrão de qualidade.

Playbook de integração para parceiros e agências

Um roteiro que você monta uma vez e reaproveita em cada novo cliente: mesma sequência, mesmos padrões, menos surpresas.

Você atende vários clientes e não quer reinventar a integração a cada projeto. A ideia desta página é essa: transformar a implantação da API do GS Engage em um processo repetível. O que muda de um cliente para outro é quase sempre só a chave de acesso; o resto do fluxo você padroniza.

Esta é a trilha da Camila, que cuida de operação e tecnologia para uma carteira de clientes. Se esse é o seu papel, o objetivo aqui é entregar rápido, sem retrabalho e sem sustos em produção.

Não existe ambiente de teste separado

Toda chamada à API é real e afeta os dados de produção do cliente — não há sandbox. Ao validar uma conta nova, comece sempre por operações de leitura (consultar dados) e avise o cliente antes de qualquer escrita (criar, editar ou remover).

O segredo de reaproveitar código entre clientes é isolar o que muda. Na prática, quase tudo é igual — a URL base, os caminhos, o formato dos dados. O que muda por cliente é a apiKey (a chave de acesso, com cerca de 40 caracteres, que autentica cada conta).

O que é a apiKey, em uma frase

A apiKey é a senha da conta na API. Ela vai no final do endereço (a URL), no formato ?apiKey=SUA_CHAVE — não em cabeçalho. Cada cliente tem a sua, gerada na plataforma em ConfiguraçõesConfigurações de API.

Pense na sua integração como um único código com a chave parametrizada por conta:

// Uma configuração por cliente — só a chave muda
const clientes = {
  "cliente-a": { apiKey: process.env.GSENGAGE_KEY_CLIENTE_A },
  "cliente-b": { apiKey: process.env.GSENGAGE_KEY_CLIENTE_B },
};

const BASE_URL = "https://api.gsengage.com/api/v1";

function url(cliente, caminho) {
  const { apiKey } = clientes[cliente];
  return `${BASE_URL}${caminho}?apiKey=${apiKey}`;
}

Com isso, o mesmo fluxo serve para qualquer cliente: você troca só a etiqueta da conta e as chaves ficam guardadas fora do código, em variáveis de ambiente.

A apiKey é uma senha — trate cada uma como tal

Como a chave viaja dentro da URL, ela aparece em logs de servidor, no histórico do navegador e em qualquer link compartilhado. Guarde cada chave em variável de ambiente ou cofre de senhas, uma por cliente. Nunca cole a URL completa (com a chave) em prints, tickets ou grupos. Se uma vazar, gere outra em Configurações de API — sem afetar os demais clientes.

Use este checklist a cada novo cliente. Ele fica salvo no seu navegador, então você pode marcar item por item durante a implantação.

Implantar a API em um novo cliente

0/11

A ordem abaixo evita retrabalho: você só cria leads depois de ter certeza que a chave funciona, e só liga webhooks depois que os leads já entram na Cadência.

graph LR
A["1. Autenticar<br/>(validar a apiKey)"] --> B["2. Criar leads"]
B --> C["3. Colocar na Cadência<br/>(iniciar prospecção)"]
C --> D["4. Registrar webhooks"]
D --> E["5. Validar ponta a ponta"]
1

Autenticar: confirme que a chave funciona

Antes de qualquer coisa, teste a apiKey do cliente com uma leitura leve e sem efeitos colaterais: listar os campos personalizados.

curl "https://api.gsengage.com/api/v1/custom-fields?apiKey=SUA_CHAVE"

Um 200 com uma lista (mesmo vazia, [], se o projeto ainda não tem campos) confirma que a chave está válida. Um 401 significa chave ausente ou inválida — gere outra em Configurações de API. Não existe GET /info nem GET /health: este é o teste de saúde recomendado.

2

Criar leads: leve o contato para a base

Um lead precisa de pelo menos um contato. Os contatos vão em três arrays — emails, phones e mobiles — e cada item tem value e label.

curl -X POST "https://api.gsengage.com/api/v1/leads?apiKey=SUA_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Maria Souza",
    "company": "Souza Consultoria",
    "emails": [{ "value": "maria@souza.com", "label": "Trabalho" }],
    "mobiles": [{ "value": "+5511999998888", "label": "WhatsApp" }]
  }'

A resposta traz o lead criado. Um lead criado via API entra marcado como Levantada de Mão e aparece no topo da fila de atividades do vendedor.

3

Colocar na Cadência: inicie a prospecção

Para já distribuir o lead a um vendedor, adicione-o direto a uma Cadência. Primeiro pegue o id da Cadência de destino.

curl "https://api.gsengage.com/api/v1/routines?apiKey=SUA_CHAVE"

Depois, adicione o lead à Cadência escolhida:

curl -X POST "https://api.gsengage.com/api/v1/routines/SEU_ROUTINE_ID/lead?apiKey=SUA_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{ "leadId": "ID_DO_LEAD" }'

Se a distribuição automática estiver ativa (ou se você informar um responsibleId), essa mesma chamada já inicia a prospecção. O contato que acabou de demonstrar interesse é atendido primeiro.

4

Registrar webhooks: receba avisos automáticos

Um webhook é um aviso que o GS Engage envia para um endereço seu quando algo acontece — por exemplo, quando uma prospecção é ganha. Ao criar o webhook, escolha só os eventos que interessam ao cliente.

curl -X POST "https://api.gsengage.com/api/v1/webhooks?apiKey=SUA_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Avisos de venda - Cliente A",
    "url": "https://sua-agencia.com/hooks/cliente-a",
    "events": ["prospection.won", "prospection.lost"]
  }'

A resposta traz um campo secret uma única vez. Copie e guarde na hora — ele não aparece de novo.

5

Validar ponta a ponta: prove que funciona

Feche o ciclo com um teste real e controlado: crie um lead de mentira (seu próprio e-mail), acompanhe ele entrar na Cadência e confirme que o webhook chegou no seu endereço com a assinatura correta. Só depois ligue o fluxo de verdade e mostre o resultado ao cliente.

Estes quatro padrões valem para todos os clientes. Adote-os uma vez no seu código e você elimina a maior parte dos problemas de produção.

Idempotência: não crie o mesmo lead duas vezesobrigatório

Se uma chamada falha por rede ou tempo esgotado, é tentador reenviar — e aí você corre o risco de criar o lead em duplicado. Antes de criar, confira se o contato já existe com GET /api/v1/leads?search=maria@souza.com (o parâmetro search filtra por nome, empresa, e-mail ou telefone). Guarde de que registro de origem veio cada lead para não reprocessar a mesma linha.

Retentativas com backoff exponencialobrigatório

Falhas temporárias acontecem. Ao receber 429 (limite atingido) ou um erro de rede, espere e tente de novo — dobrando o tempo a cada tentativa e sempre respeitando o header Retry-After (que diz, em segundos, quanto esperar). Não fique reenviando em looping apertado.

Respeite os limites de chamadas (rate limit)obrigatório

O rate limit é o teto de chamadas por minuto, numa janela fixa de 60 segundos: 200 de leitura (GET/HEAD) e 100 de escrita (POST/PUT/PATCH/DELETE). Ao estourar, a API responde 429 com Retry-After e os cabeçalhos X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset. Para cargas grandes de leads, espalhe os envios ao longo do tempo.

Guarde o secret do webhook na criaçãoobrigatório

O secret de cada webhook volta uma única vez, na resposta do POST /api/v1/webhooks. É com ele que você confere que o aviso veio mesmo do GS Engage (assinatura HMAC SHA-256 — um "selo de autenticidade"). Salve-o no cofre do cliente na hora; se perder, terá de recriar o webhook.

Um secret por webhook, uma apiKey por cliente

Mantenha o mesmo padrão de organização das chaves: cada cliente tem sua apiKey e cada webhook tem seu secret. Guardados separadamente, um vazamento nunca contamina os outros clientes.

Como conferir a assinatura do webhook

Cada entrega chega no seu endereço como um POST com este envelope:

{
  "id": "evt_123",
  "test": false,
  "event": "prospection.won",
  "data": { },
  "retries": 0,
  "manualRetries": 0,
  "createdAt": "2026-07-17T12:00:00Z"
}

A entrega vem assinada com HMAC SHA-256 (um cabeçalho de assinatura calculado a partir do corpo da mensagem e do seu secret). Do seu lado, você recalcula a assinatura e compara: se baterem, o aviso é autêntico.

import crypto from "crypto";

function assinaturaConfere(corpoBruto, assinaturaRecebida, secret) {
  const esperada = crypto
    .createHmac("sha256", secret)
    .update(corpoBruto)
    .digest("hex");
  return crypto.timingSafeEqual(
    Buffer.from(esperada),
    Buffer.from(assinaturaRecebida)
  );
}

A assinatura mudou de SHA-1 para SHA-256

Se você mantém integrações antigas, atualize o cálculo para SHA-256. A validação com SHA-1 não confere mais.

Nem todo cliente tem equipe de desenvolvimento — e nem toda integração precisa de código. Para os casos simples (levar um lead de um formulário para a Cadência, ou avisar o time no chat quando uma venda fecha), você entrega em uma tarde usando ferramentas de automação.

O GS Engage oferece conexões nativas com o Zapier, incluindo gatilhos que reagem a eventos (webhooks). Você monta o fluxo arrastando blocos: um gatilho (formulário preenchido) e uma ação (criar o lead na Cadência) usando o passo "Webhooks by Zapier".

Make e n8n também consomem a API REST e recebem webhooks do GS Engage. A lógica é a mesma: um gatilho, um passo de HTTP apontando para https://api.gsengage.com/api/v1/... com a apiKey na URL, e o corpo do lead em JSON.

Vá para código quando precisar de validação de assinatura dos webhooks, deduplicação robusta de leads ou lógica de negócio própria. Notificações simples (mandar um Slack quando uma prospecção é ganha) o no-code resolve sem programar.

Regra prática de decisão

Se o objetivo cabe em "quando X acontece, faça Y" e não envolve conferir a assinatura do webhook, comece pelo no-code. Você entrega no mesmo dia e migra para código só se o cliente crescer.

O que mais gera retrabalho em implantações de agência:

Fazer
  • Guarde uma apiKey por cliente em variável de ambiente e parametrize o código pela conta.
  • Teste sempre primeiro com um lead de mentira (seu próprio e-mail), porque toda chamada é real e não há sandbox.
  • Copie e guarde o secret do webhook no momento da criação.
  • Confira se cada lead tem pelo menos um contato antes de enviar.
  • Ao receber 429, espere o tempo do Retry-After e tente de novo com backoff.
  • Trate a paginação com cuidado: use limit e page e leia o bloco meta das respostas paginadas.
Não fazer
  • Não deixe chaves fixas no código nem reutilize a mesma chave entre clientes diferentes.
  • Não use dados de clientes reais nos testes iniciais, nem rode escritas sem avisar o cliente.
  • Não conte com pegar o secret depois: ele só aparece uma vez, na resposta da criação.
  • Não ignore o 400: a resposta traz a lista errors com o campo exato e o motivo, em português.
  • Não dispare centenas de leads de uma vez: o limite de escrita é 100 chamadas por minuto.
  • Não espere meta de GET /webhooks (traz data sem meta). Já GET /custom-fields é paginado normal ({ data, meta }).

Mensagens de erro já vêm prontas em português

Reaproveite-as com o cliente no formato "o que houve → por quê → como corrigir". O 400 retorna { "message", "errors": [{ "field", "message" }] }; o 401 é chave ausente ou inválida; o 404 é registro não encontrado; o 429 é limite atingido.

Preciso de uma apiKey diferente para cada cliente?

Sim. Cada conta tem a sua chave, gerada em Configurações → Configurações de API. Parametrize o código pela conta e guarde cada chave em variável de ambiente separada. Assim, se uma vazar, você a regenera sem afetar os outros clientes.

Existe um ambiente de teste para eu validar sem risco?

Não. Toda chamada é real e afeta os dados de produção do cliente. Por isso, comece sempre por leituras (como listar campos ou Cadências) e avise o cliente antes de qualquer escrita. Nos testes, use um lead de mentira com o seu próprio e-mail.

Como valido a chave de um cliente novo rapidinho?

Faça um GET /api/v1/custom-fields?apiKey=SUA_CHAVE. Um 200 com uma lista (mesmo []) confirma que a chave funciona. Um 401 significa chave ausente ou inválida. Não existe GET /info nem GET /health.

Perdi o secret de um webhook. E agora?

O secret só é exibido uma vez, na resposta da criação. Se você não o guardou, apague o webhook (DELETE /api/v1/webhooks/{webhookId}) e crie de novo para receber um secret novo.

Consigo entregar sem escrever código?

Para fluxos simples, sim. Zapier tem conexão nativa; Make e n8n também consomem a API e recebem webhooks. Código passa a ser necessário quando você precisa validar a assinatura dos webhooks ou aplicar lógica de negócio própria.

Este artigo foi útil?

Nesta página

Última atualização