- 1
Duas formas de conectar o Gemini
Se o seu ambiente Gemini (por exemplo, o Gemini CLI com acesso a shell) puder rodar npm, instale o
@firstsales.io/clie exponha-o como uma ferramenta — ele cuida da autenticação, do JSON e da idempotência. Se o Gemini funcionar apenas via API, chame a Developer API da FirstSales por HTTPS a partir das implementações da sua função/ferramenta. A documentação classifica o Gemini junto com os agentes que priorizam a API por padrão. - 2
Guarde a chave fora do modelo
Crie uma chave da Developer API em Settings → API e mantenha-a na configuração server-side do seu app como
FIRSTSALES_API_KEY. O Gemini deve chamar uma tool/function que lê a chave no lado do servidor — o próprio modelo nunca deve ver ou emitir a chave bruta.FIRSTSALES_API_KEY=fs-key-... FIRSTSALES_BASE_URL=https://api.app.firstsales.io - 3
Defina ferramentas restritas, não uma porta de escape HTTP genérica
Dê ao Gemini um pequeno conjunto de funções feitas sob medida —
whoami,list_contacts,create_contact,campaign_analytics— cada uma mapeada para um endpoint público. Isso mantém o modelo na superfície suportada, em vez de deixá-lo construir URLs arbitrárias.# o que cada tool chama por baixo dos panos GET /api/v1/whoami GET /api/v1/organizations/{org}/workspaces/{ws}/contacts POST /api/v1/organizations/{org}/workspaces/{ws}/contacts # Idempotency-Key GET /api/v1/organizations/{org}/workspaces/{ws}/campaigns/{id}/analytics - 4
Verifique a identidade na primeira chamada de ferramenta
Faça o agente chamar
whoamiantes de qualquer escrita, para confirmar o contexto de org e workspace:curl https://api.app.firstsales.io/api/v1/whoami \ -H "Authorization: Bearer $FIRSTSALES_API_KEY" - 5
Escreva de forma idempotente a partir da sua tool de criação
Sua tool
create_contactdeve sempre anexar umIdempotency-Key, para que uma chamada de função repetida não gere uma escrita duplicada:curl -X POST \ https://api.app.firstsales.io/api/v1/organizations/ORG_ID/workspaces/WS_ID/contacts \ -H "Authorization: Bearer $FIRSTSALES_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: gemini-lead-2026-01" \ -d '{"email":"lead@acme.com","first_name":"Sam"}' - 6
Trate erros e permaneça na superfície pública
Em cada tool, trate
401(chave inválida/revogada),422(validação — exiba o campo) e429(recue e tente novamente). Emunsupported_operation, retorne a limitação ao modelo e pare — nunca deixe o Gemini raspar o app ou acessar rotas privadas, callbacks, pixels ou endpoints de cron.
Dicas de especialista
Atalhos conquistados na prática que mantêm o aquecimento nos trilhos.
Empacote endpoints como ferramentas restritas
Não entregue ao Gemini uma função genérica de 'chamar qualquer URL'. Ferramentas feitas sob medida (create_contact, campaign_analytics) mantêm o modelo na superfície pública e tornam suas ações auditáveis.
O modelo nunca toca na chave
Leia FIRSTSALES_API_KEY no lado do servidor, dentro da ferramenta. Se a chave puder aparecer no contexto ou na saída do modelo, ela pode vazar para os logs.
whoami como primeira chamada de função
Torne a verificação de identidade o primeiro passo, para que o Gemini sempre confirme org/workspace antes de escrever.
Tem shell disponível? O CLI é menos código
Se o Gemini CLI tiver shell + npm, chamar o firstsales via shell é melhor do que criar ferramentas HTTP na mão — autenticação, JSON, idempotência e confirmação de exclusão vêm de graça.
Perguntas frequentes
O Gemini usa o CLI ou a API?
Por padrão, a Developer API, empacotada como functions/tools. Se o seu ambiente Gemini tiver acesso a shell com npm, o CLI é uma alternativa de menor esforço que cuida da autenticação e da idempotência para você.
Como mantenho a chave longe do modelo?
Guarde FIRSTSALES_API_KEY na configuração server-side e leia-a dentro da implementação da ferramenta. O modelo chama a ferramenta; ele nunca vê ou emite a chave bruta.
Como devo estruturar as ferramentas?
Como funções restritas e de propósito único — uma por endpoint público (whoami, listar/criar contato, campaign analytics). Evite uma tool genérica de 'buscar qualquer URL' que permita ao modelo sair da superfície suportada.
Como evito escritas duplicadas?
Anexe um cabeçalho Idempotency-Key dentro da sua tool de criação. Uma chamada de função repetida com a mesma chave retorna o resultado original em vez de criar um duplicado.
O que está fora dos limites?
Rotas privadas do app, callbacks de provedores, pixels de rastreamento, handlers de descadastro, endpoints internos de cron e raspagem da UI. Fique na /api/v1 pública; pare em unsupported_operation.
Pronto para colocar isso em prática?
Comece seu teste do FirstSales e lance uma caixa de e-mail aquecida e autenticada em minutos.
Comece por $1