Bolt, v0 e Replit
Em todas essas plataformas o padrão é o mesmo: o front-end chama uma rota do seu backend, e só o backend chama a TopTalking, com a chave guardada como variável de ambiente.
Navegador → rota do seu backend (/api/...) → https://platform.toptalking.com.br/v1 sem chave lê TOPTALKING_API_KEYO padrão de rota
Seção intitulada “O padrão de rota”Um exemplo de rota de backend em Next.js (o mesmo raciocínio vale para Express, Flask, Edge Functions…):
import { NextResponse } from 'next/server';
const API = 'https://platform.toptalking.com.br/v1';
export async function POST(req: Request) { const { nome, telefone, leadId } = await req.json();
const digitos = String(telefone ?? '').replace(/\D/g, ''); if (digitos.length < 10 || !nome || !leadId) { return NextResponse.json({ erro: 'Dados inválidos' }, { status: 400 }); }
const res = await fetch(`${API}/messages`, { method: 'POST', headers: { Authorization: `Bearer ${process.env.TOPTALKING_API_KEY}`, // só existe no servidor 'Content-Type': 'application/json', 'Idempotency-Key': `lead-${leadId}-boas-vindas`, }, body: JSON.stringify({ to: digitos, contact_name: nome, text: `Olá, ${nome}! Recebemos seu contato e logo falamos com você por aqui.`, }), });
const body = await res.json(); if (!res.ok) { // body.error = { type, code, message, request_id } return NextResponse.json({ erro: body.error.message, codigo: body.error.code }, { status: 502 }); } return NextResponse.json({ ok: true, mensagemId: body.id });}Por plataforma
Seção intitulada “Por plataforma”Projetos do Bolt costumam ser front-end (Vite + React). Para ter um backend, use a integração com Supabase do Bolt (Edge Functions) ou um framework com rotas de servidor (ex.: Next.js, Remix, Astro com SSR).
- Guarde a chave como
TOPTALKING_API_KEYnos secrets do backend escolhido (Supabase: Edge Functions → Secrets). - Se usar Supabase, os prompts do guia do Lovable funcionam quase sem mudança.
Quero integrar este projeto com a API da TopTalking (WhatsApp + CRM).Documentação (leia antes de codar): https://platform.toptalking.com.br/llms-full.txtURL base: https://platform.toptalking.com.br/v1 — cabeçalho "Authorization: Bearer <chave>".
Regras obrigatórias:- A API NÃO aceita chamadas do navegador (sem CORS) e a chave NUNCA pode ir para o front-end. Crie o backend com Supabase Edge Functions (conecte o Supabase se ainda não estiver conectado). A chave fica no secret TOPTALKING_API_KEY e é lida com Deno.env.get("TOPTALKING_API_KEY").- Nada de variável VITE_ com a chave. Nada de chave no código.- Envio de mensagem sempre com o cabeçalho Idempotency-Key.
Tarefa: na página de checkout, depois que o pedido for criado, chame uma Edge Function "confirmar-pedido-whatsapp"que envia POST /v1/messages com { "to": <telefone do cliente com 55 + DDD>, "contact_name": <nome>,"text": "Olá, <nome>! Recebemos seu pedido #<id>. Avisaremos por aqui quando ele sair para entrega." }e Idempotency-Key "pedido-<id>-confirmado". Trate erros pelo error.code ({ "error": { "type", "code", "message" } })e não bloqueie a finalização do pedido se o WhatsApp falhar.O v0 gera apps Next.js que rodam na Vercel. Use Route Handlers (app/api/.../route.ts) ou Server Actions.
- Adicione
TOPTALKING_API_KEYnas variáveis de ambiente do projeto (no v0, na área de variáveis do projeto; na Vercel, em Settings → Environment Variables). - Não use
NEXT_PUBLIC_.
Integre este app Next.js com a API da TopTalking (WhatsApp + CRM com Kanban).Documentação (leia antes de codar): https://platform.toptalking.com.br/llms-full.txtURL base: https://platform.toptalking.com.br/v1 — cabeçalho "Authorization: Bearer ${process.env.TOPTALKING_API_KEY}".
Regras obrigatórias:- Chame a TopTalking SOMENTE em código de servidor (Route Handlers em app/api ou Server Actions). Nunca em componentes "use client". A API não aceita chamadas do navegador. Coloque import "server-only" no módulo da TopTalking.- A chave vem da variável de ambiente TOPTALKING_API_KEY (sem NEXT_PUBLIC_). Me peça para adicioná-la.- Envios com o cabeçalho Idempotency-Key.
Tarefa: crie uma página /leads com um formulário (nome, WhatsApp, consentimento obrigatório) que envia paraapp/api/leads/route.ts. A rota:1. valida os dados (zod) e normaliza o telefone para só dígitos com 55;2. busca as etapas (GET /v1/stages) e pega o id da etapa "Novo lead";3. cria/atualiza o contato com POST /v1/contacts { phone, name, stage_id };4. envia a mensagem de boas-vindas com POST /v1/messages { contact_id, text } e Idempotency-Key "lead-<telefone>-boas-vindas";5. responde { ok: true } ou a mensagem de erro amigável a partir de error.code.No Replit, crie um backend (Node com Express ou Python com Flask/FastAPI) e guarde a chave na ferramenta Secrets do Replit, com o nome TOPTALKING_API_KEY. No código, ela aparece como variável de ambiente (process.env.TOPTALKING_API_KEY / os.environ["TOPTALKING_API_KEY"]).
Crie um backend em Node.js + Express integrado à API da TopTalking (WhatsApp + CRM).Documentação (leia antes de codar): https://platform.toptalking.com.br/llms-full.txtURL base: https://platform.toptalking.com.br/v1 — cabeçalho "Authorization: Bearer <chave>".
Regras obrigatórias:- A chave fica no Secret TOPTALKING_API_KEY (me peça para criar). Nunca no código e nunca enviada ao front-end.- O front-end (se houver) chama só as rotas deste backend; a API da TopTalking não aceita chamadas do navegador.- Envio de mensagem sempre com Idempotency-Key.
Tarefas:1. POST /api/avisar-entrega { pedidoId, nome, telefone }: envia POST /v1/messages com { "to": telefone, "contact_name": nome, "text": "Olá, <nome>! Seu pedido #<pedidoId> saiu para entrega. 🚚" } e Idempotency-Key "pedido-<pedidoId>-saiu". Proteja a rota com um token próprio (cabeçalho X-Admin-Token comparado com o Secret ADMIN_TOKEN).2. POST /webhooks/toptalking: usa express.raw({ type: "application/json" }) para ler o corpo cru, valida X-TopTalking-Signature ("t=<unix>,v1=<hex>"; HMAC-SHA256 hex de "<t>.<corpo cru>" com o Secret TOPTALKING_WEBHOOK_SECRET; tolerância de 300 s; crypto.timingSafeEqual), responde 200 e registra no console os eventos message.received. Ignore eventos repetidos pelo id.3. Mostre a URL pública do webhook para eu cadastrar no painel da TopTalking (Configurações → Desenvolvedor → Webhooks).