O cliente oficial sparkcrm oferece acesso tipado à API REST do Spark a partir de TypeScript ou JavaScript no servidor. O código-fonte e o changelog ficam no repositório gepetojj/spark-typescript.
Requisitos
- TypeScript ≥ 4.9 (recomendado para aproveitar os tipos exportados).
- Node.js 20 LTS ou superior, ou runtimes compatíveis: Bun, Deno, Cloudflare Workers, Vercel Edge, Nitro ≥ 2.6.
- React Native não é suportado no momento.
- Chave de API da organização (
pk_… ou sk_…) com ambiente de desenvolvedores habilitado.
Instalação
Alternativas equivalentes: pnpm add sparkcrm, yarn add sparkcrm, bun add sparkcrm.
Configurar o cliente
Crie o cliente uma vez por processo (ou por requisição, em serverless) e reutilize:
import SparkCRM from "sparkcrm";
const client = new SparkCRM({
apiKey: process.env.SPARK_API_KEY, // ou SPARK_API_KEY no ambiente
});
| Opção / variável | Função |
|---|
apiKey / SPARK_API_KEY | Chave enviada no cabeçalho X-API-Key em todas as requisições |
baseURL / SPARK_CRM_BASE_URL | URL base da API (padrão: https://gateway.crmspark.com.br) |
Use sk_… apenas no backend. Nunca exponha chave secreta em apps mobile, front-end público ou repositórios.
Primeira chamada
Listar os entrypoints (canais) da organização:
import SparkCRM from "sparkcrm";
const client = new SparkCRM({
apiKey: process.env.SPARK_API_KEY,
});
const { entrypoints } = await client.entrypoints.list();
for (const ep of entrypoints) {
console.log(ep.id, ep.platform, ep.name);
}
Filtrar por plataforma:
const whatsappOnly = await client.entrypoints.list({
platform: "whatsapp",
});
Tipos exportados
Cada método tem parâmetros e resposta tipados. Importe o namespace do pacote quando quiser anotar variáveis:
import SparkCRM from "sparkcrm";
const client = new SparkCRM({ apiKey: process.env.SPARK_API_KEY! });
const response: SparkCRM.EntrypointListResponse =
await client.entrypoints.list();
No editor, passe o mouse sobre client.entrypoints.list para ver docstrings geradas a partir da API.
Fluxos comuns
Enviar mensagem de texto
await client.messaging.chats.sendMessage(chatId, {
text: "Olá! Recebemos seu contato.",
});
Enviar mídia
- Faça upload:
import { readFileSync } from "node:fs";
const results = await client.messaging.uploadMedia({
files: [readFileSync("./foto.jpg")],
});
const uploaded = results.find((r) => r.success);
if (!uploaded || !uploaded.success) {
throw new Error("Falha no upload");
}
await client.messaging.chats.sendMessage(chatId, {
text: "Segue a imagem.",
mediaIds: [uploaded.id],
});
Variáveis manuais vão em commonVariables (var1, var2, …). Variáveis automáticas (dados do chat) são resolvidas pelo Spark — veja Modelos de mensagem.
Enquanto o método tipado sendTemplate estiver sendo publicado em novas versões do pacote, use o helper HTTP do cliente:
await client.post(`/v1/messaging/chats/${chatId}/templates`, {
body: {
templateId: "seu_template_id",
commonVariables: {
var1: "Promoção de maio",
},
},
});
O endpoint e o contrato estão na Referência da API (POST /v1/messaging/chats/{chatId}/templates).
const result = await client.forms.submitResponse(publicFormId, {
name: "Maria Silva",
phone: "+5581999999999",
answers: [
{ questionKey: "interesse", value: "produto_a" },
],
});
console.log(result.submissionId, result.outcomes);
Webhooks
O SDK não envia webhooks — ele exporta os tipos dos eventos (SparkCRM.MessagesReceivedWebhook, etc.) para você tipar o handler depois de verificar a assinatura Svix. Detalhes em TypeScript — webhooks e tipos.
Onde ir depois