SDK TypeScript
Documentação completa do SDK TypeScript para integração com a WAME API. Envie mensagens, gerencie grupos, configure webhooks e muito mais.
Instalação
Instale o SDK via npm ou yarn:
npm i @raphaelvserafim/client-api-whatsappyarn add @raphaelvserafim/client-api-whatsappInicialização
Importe e inicialize o client:
import { WhatsApp, TypeMessage, StatusPresence } from '@raphaelvserafim/client-api-whatsapp';
const wa = new WhatsApp({ server: "https://us.api-wa.me", key: "YOUR_KEY" });
const to = "559999999999"; // Grupo: "123456789@g.us"Gerenciar Instância
Conecte, configure e gerencie sua instância:
// Conectar via QR Code
const qr = await wa.instance.connect();
// Conectar via Pairing Code
const code = await wa.instance.pairingCode("559999999999");
// Informações da instância
const info = await wa.instance.info();
// Logout, restart e resync
await wa.instance.logout();
await wa.instance.restart();
await wa.instance.resync();Configurações
await wa.instance.setting({
markMessageRead: true,
saveMedia: false,
receiveStatusMessage: false,
receivePresence: false,
});Perfil
await wa.instance.updateProfileName("My Bot");
await wa.instance.updateProfileStatus("Online");
await wa.instance.updateProfilePicture("https://example.com/avatar.jpg");
await wa.instance.removeProfilePicture();Proxy e MongoDB
await wa.instance.setProxy("http://user:pass@ip:port");
await wa.instance.addMongoDb("mongodb+srv://...", "mydb");Conexão Mobile
await wa.instance.mobileRegisterPrepare({
phoneNumberCountryCode: "55",
phoneNumberNationalNumber: "99999999999",
phoneNumberMobileCountryCode: "724",
phoneNumberMobileNetworkCode: "11",
});
await wa.instance.mobileRequestCode("sms");
await wa.instance.mobileVerifyCode("123456");Webhooks
Configure webhooks para receber eventos em tempo real:
await wa.instance.updateWebhook({
allowWebhook: true,
allowNumber: "all",
webhookMessage: "https://your-webhook.com/message",
webhookGroup: "",
webhookConnection: "",
webhookQrCode: "",
webhookMessageFromMe: "",
webhookHistory: "",
});
// Estatísticas de webhooks
const stats = await wa.instance.webhookStatistics();Enviar Texto
Envie mensagens de texto simples:
await wa.message.send({
type: TypeMessage.TEXT,
body: { to, text: "Hello!" },
});Enviar Mídia
Imagem
await wa.message.send({
type: TypeMessage.IMAGE,
body: { to, url: "https://example.com/photo.jpg", caption: "Toronto" },
});Áudio
await wa.message.send({
type: TypeMessage.AUDIO,
body: { to, url: "https://example.com/audio.mp3" },
});Vídeo
await wa.message.send({
type: TypeMessage.VIDEO,
body: { to, url: "https://example.com/video.mp4", caption: "Big Buck Bunny" },
});Documento
await wa.message.send({
type: TypeMessage.DOCUMENT,
body: {
to,
url: "https://example.com/file.pdf",
mimetype: "application/pdf",
fileName: "Resume.pdf"
},
});Sticker
await wa.message.sendSticker(to, "https://example.com/sticker.webp");Video Note (circular)
await wa.message.sendVideoNote(to, "https://example.com/video.mp4");Envio via Base64
await wa.message.sendImageBase64(to, "data:image/png;base64,...", "Caption");
await wa.message.sendAudioBase64(to, "data:audio/mp3;base64,...");
await wa.message.sendDocumentBase64(to, "data:application/pdf;base64,...", "application/pdf", "file.pdf", "My document");Enviar Contato
await wa.message.send({
type: TypeMessage.CONTACT,
body: {
to,
contact: {
fullName: "Raphael",
phoneNumber: "559999999999",
organization: "api-wa.me"
},
},
});Enviar Localização
await wa.message.send({
type: TypeMessage.LOCATION,
body: {
to,
location: {
latitude: 37.7749,
longitude: -122.4194,
address: "San Francisco, CA"
},
},
});Enviar Link Preview
await wa.message.send({
type: TypeMessage.LINK,
body: {
to,
title: "API WhatsApp",
text: "Check out our API",
description: "Powerful WhatsApp integration",
thumbnailUrl: "https://example.com/thumb.jpg",
sourceUrl: "https://api-wa.me",
},
});Enviar Reação
await wa.message.send({
type: TypeMessage.REACTION,
body: { to, msgId: "MESSAGE_ID", text: "👍" },
});Responder Mensagem
Passe true como segundo parâmetro para responder a uma mensagem:
await wa.message.send({
type: TypeMessage.TEXT,
body: { to, text: "This is a reply!", msgId: "ORIGINAL_MSG_ID" },
}, true);Presença (digitando...)
await wa.message.send({
type: TypeMessage.PRESENCE,
body: { to, status: StatusPresence.COMPOSING },
});Mensagem com Título
await wa.message.send({
type: TypeMessage.TITLE,
body: { to, title: "Order #123", text: "Your order is ready", footer: "Thank you!" },
});Botões de Resposta
Envie mensagens com botões de resposta rápida:
await wa.message.send({
type: TypeMessage.BUTTON_REPLY,
body: {
to,
header: { title: "Choose an option" },
text: "What do you prefer?",
footer: "Select one",
buttons: [
{ type: "quick_reply", id: "1", text: "Yes" },
{ type: "quick_reply", id: "2", text: "No" },
],
},
});Com Imagem no Header
await wa.message.send({
type: TypeMessage.BUTTON_REPLY,
body: {
to,
header: {
title: "Check this out",
hasMediaAttachment: true,
imageMessage: { url: "https://example.com/photo.jpg" },
},
text: "What do you think?",
buttons: [
{ type: "quick_reply", id: "1", text: "Like" },
{ type: "quick_reply", id: "2", text: "Dislike" },
],
},
});Botões de Ação (URL, Call, Copy)
Envie botões com ações como abrir URL, ligar ou copiar código:
await wa.message.send({
type: TypeMessage.BUTTON_ACTION,
body: {
to,
header: { title: "Actions" },
text: "Choose an action",
footer: "Select one",
buttons: [
{ type: "cta_url", url: "https://api-wa.me", text: "Visit website" },
{ type: "cta_call", phone_number: "+559999999999", text: "Call us" },
{ type: "cta_copy", copy_code: "PROMO2025", text: "Copy code" },
],
},
});Enquete / Poll
await wa.message.send({
type: TypeMessage.POLL,
body: { to, name: "Do you like TypeScript?", options: ["Yes", "No"] },
});
// Shorthand
await wa.message.sendPoll(to, "Favorite language?", ["TypeScript", "Python", "Go"], 1);Cobrança via Pix
Envie cobranças via Pix com itens detalhados:
await wa.message.send({
type: TypeMessage.BUTTON_PIX,
body: {
to,
title: "Pizza Order",
text: "Your order details",
referenceId: "order-123",
code: "0020101021226700014br.gov.bcb.pix",
key: "23711695000115",
merchantName: "MY STORE",
keyType: "CNPJ",
items: [
{ id: "1", name: "Pizza G", price: 45, quantity: 2 },
{ id: "2", name: "Soda", price: 8, quantity: 2 },
],
subtotal: "106",
totalAmount: "106",
},
});Evento, Pin e Call Link
Criar Evento
await wa.message.sendEvent({
to,
name: "Team Meeting",
description: "Weekly sync",
startTime: "2025-01-15T14:00:00Z",
locationName: "Office",
locationAddress: "123 Main St",
});Fixar Mensagem
await wa.message.pin("MESSAGE_ID", 604800); // 7 dias em segundosLink de Chamada
await wa.message.sendCallLink(to, "video", "Join the meeting");Encaminhar, Listar e Outros
// Encaminhar mensagem
await wa.message.forward(to, "MESSAGE_ID");
// Listar mensagens
const messages = await wa.message.list("559999999999", 1, 20);
// Detalhes e mídia da mensagem
const details = await wa.message.getDetails("MESSAGE_ID");
const media = await wa.message.getMedia("MESSAGE_ID", "base64");Desfixar Mensagem
await wa.message.unpin("MESSAGE_ID");Enviar Múltiplos Contatos
await wa.message.sendContacts({
to,
displayName: "Meus Contatos",
contacts: [
{ fullName: "Raphael", phoneNumber: "559999999999" },
{ fullName: "João", phoneNumber: "559888888888", organization: "WAME" },
],
});Localização em Tempo Real
await wa.message.sendLiveLocation({
to,
latitude: 37.7749,
longitude: -122.4194,
caption: "Estou aqui!",
});Enviar Produto do Catálogo
await wa.message.sendProduct({
to,
businessOwnerJid: "559999999999@s.whatsapp.net",
productId: "product_id",
catalogId: "catalog_id",
body: "Confira este produto!",
footer: "WAME Store",
});Enviar Convite de Grupo
await wa.message.sendGroupInvite({
to,
groupJid: "123456789@g.us",
groupName: "Developers",
inviteCode: "INVITE_CODE",
caption: "Entre no nosso grupo!",
});Solicitar Telefone e Criar Link de Chamada
// Solicitar número de telefone do contato
await wa.message.requestPhone(to);
// Criar link de chamada (sem enviar)
await wa.message.createCallLink("video");Gerenciar Chats
const chats = await wa.chat.list();
const msgs = await wa.chat.messages("559999999999@s.whatsapp.net", 1, 20);
// Marcar como lido
await wa.chat.modify("559999999999@s.whatsapp.net", "markRead", true);
// Fixar chat
await wa.chat.modify("559999999999@s.whatsapp.net", "pin", true);
// Deletar chat
await wa.chat.delete("559999999999@s.whatsapp.net");Presença, Mensagens Temporárias e Privacidade
// Inscrever-se para receber atualizações de presença
await wa.chat.presenceSubscribe("559999999999@s.whatsapp.net");
// Ativar mensagens temporárias (expiration em segundos)
await wa.chat.disappearing("559999999999@s.whatsapp.net", 604800); // 7 dias
// Consultar configurações de privacidade
const privacy = await wa.chat.privacy();Chamadas
// Chamada de voz
await wa.call.call(to, false);
// Chamada de vídeo
await wa.call.call(to, true);
// Aceitar chamada
await wa.call.accept("CALL_ID", "559999999999@s.whatsapp.net");
// Rejeitar chamada
await wa.call.reject("CALL_ID", "559999999999@s.whatsapp.net");
// Encerrar chamada
await wa.call.end("CALL_ID", "559999999999@s.whatsapp.net");Etiquetas / Labels
const labels = await wa.label.list();
await wa.label.create("VIP");
await wa.label.addToChat("label_id", to);
const labeled = await wa.label.getChats("label_id");
await wa.label.removeFromChat("label_id", to);
// Deletar etiqueta
await wa.label.delete("label_id");Contatos
const contacts = await wa.contact.list();
const profile = await wa.contact.profile("559999999999");
// Adicionar e remover contato
await wa.contact.add("559999999999", "Raphael");
await wa.contact.remove("559999999999");
// Bloquear / Desbloquear
await wa.contact.block("559999999999", "block");
await wa.contact.block("559999999999", "unblock");
// Listar contatos bloqueados
const blocked = await wa.contact.listBlocked();
// Status e sessão
const status = await wa.contact.getStatus("559999999999");
await wa.contact.clearSession("559999999999");
// Resolver LIDs
await wa.contact.resolveLids(["lid1", "lid2"]);
// Verificar se está registrado no WhatsApp
const check = await wa.action.checkRegistered("559999999999");Grupos
const groups = await wa.group.list();
const info = await wa.group.info("123456789@g.us");
// Criar grupo
const newGroup = await wa.group.create("Developers", ["559999999999"]);
// Atualizar grupo
await wa.group.update("123456789@g.us", "New Name", "New description");Configurações do Grupo
await wa.group.changeSettings("123456789@g.us", "announcement"); // Somente admins enviam
await wa.group.changeSettings("123456789@g.us", "not_announcement"); // Todos enviam
await wa.group.changeSettings("123456789@g.us", "locked"); // Somente admins editam
await wa.group.changeSettings("123456789@g.us", "unlocked"); // Todos editamParticipantes
await wa.group.addParticipants("123456789@g.us", ["559999999999"]);
await wa.group.removeParticipants("123456789@g.us", ["559999999999"]);
await wa.group.updateParticipantRole("123456789@g.us", "promote", ["559999999999"]);
await wa.group.updateParticipantRole("123456789@g.us", "demote", ["559999999999"]);
// Aprovação de participantes
const pending = await wa.group.getRequestParticipants("123456789@g.us");
await wa.group.updateRequestParticipants("123456789@g.us", {
participants: ["559999999999"],
action: "approve",
});Membros e Convites
// Listar membros do grupo
const members = await wa.group.getMembers("123456789@g.us");
// Código de convite
const invite = await wa.group.getInviteCode("123456789@g.us");
// Informações de um convite
const inviteInfo = await wa.group.getInviteInfo("INVITE_CODE");Outros
await wa.group.updatePicture("123456789@g.us", "https://example.com/photo.jpg");
await wa.group.removePicture("123456789@g.us");
await wa.group.leave("123456789@g.us");Comunidade
const communities = await wa.community.list();
const newComm = await wa.community.create({ name: "My Community", subject: "Tech" });
const commInfo = await wa.community.info("community_id");
await wa.community.update("community_id", {
subject: "Updated",
description: "New description",
});
await wa.community.updatePicture("community_id", "https://example.com/photo.jpg");
const commInvite = await wa.community.getInviteCode("community_id");
await wa.community.removeParticipants("community_id", ["559999999999"]);
await wa.community.leave("community_id");Convites e Aprovação
// Aceitar convite de comunidade
await wa.community.acceptInvite("INVITE_CODE");
// Informações de convite
const inviteInfo = await wa.community.getInviteInfo("INVITE_CODE");
// Participantes pendentes de aprovação
const pending = await wa.community.getRequestParticipants("community_id");
await wa.community.updateRequestParticipants("community_id", {
participants: ["559999999999"],
action: "approve",
});Grupos e Configurações
// Criar grupo dentro da comunidade
await wa.community.createGroup("community_id", {
subject: "Novo Grupo",
participants: ["559999999999"],
});
// Mensagens temporárias
await wa.community.ephemeral("community_id", 604800); // 7 dias
// Configurações da comunidade
await wa.community.updateSettings("community_id", "announcement");
await wa.community.memberAddMode("community_id", "admin_add");
await wa.community.joinApproval("community_id", "on");Business / Catálogo
// Listar catálogo
const catalog = await wa.business.getCatalog();
const catalogPage = await wa.business.getCatalog(10, "cursor_token");
// Criar produto
await wa.business.createProduct({
name: "Premium T-Shirt",
description: "100% cotton",
originCountryCode: "BR",
currency: "BRL",
price: 79.90,
images: [{ url: "https://example.com/photo.jpg" }],
});
// Atualizar produto
await wa.business.updateProduct("product_id", {
name: "Premium T-Shirt v2",
price: 89.90,
});
// Deletar produto
await wa.business.deleteProduct("product_id");Ações Extras
// Verificar número registrado
const result = await wa.action.checkRegistered("559999999999");
// Download de mídia
const media = await wa.action.downloadMedia("image", {
mediaKey: "...",
directPath: "...",
url: "...",
});
// Limpar storage
await wa.action.deleteStorage();HTTP Client Customizado
Você pode usar um client HTTP customizado:
import { WhatsApp, IHttpClient, RequestOptions } from '@raphaelvserafim/client-api-whatsapp';
class MyHttpClient implements IHttpClient {
async request<T>(options: RequestOptions): Promise<T> {
const response = await fetch(`https://us.api-wa.me/MY_KEY/${options.route}`, {
method: options.method,
headers: { 'Content-Type': 'application/json' },
body: options.body ? JSON.stringify(options.body) : undefined,
});
return response.json() as Promise<T>;
}
}
const wa = new WhatsApp(
{ server: "https://us.api-wa.me", key: "MY_KEY" },
new MyHttpClient(),
);Status / Stories
Publique e gerencie status (stories) do WhatsApp:
Texto
await wa.status.sendText({
text: "Olá! Este é meu status.",
statusJidList: ["559999999999@s.whatsapp.net"], // opcional: limitar quem vê
});Imagem
await wa.status.sendImage({
url: "https://example.com/photo.jpg",
caption: "Minha foto",
statusJidList: [], // vazio = todos os contatos
});Vídeo
await wa.status.sendVideo({
url: "https://example.com/video.mp4",
caption: "Meu vídeo",
});Áudio
await wa.status.sendAudio({
url: "https://example.com/audio.mp3",
});Menção
await wa.status.mention({
jid: "559999999999@s.whatsapp.net",
statusMsgId: "STATUS_MSG_ID",
});Contexto para AI
Use este arquivo de contexto para que assistentes de AI (Claude, ChatGPT, Copilot, etc.) entendam o SDK e possam te ajudar a programar com a WAME API.
llms.txt
Arquivo com toda a documentação do SDK em formato otimizado para AI. Inclui estrutura, tipos, exemplos e padrões comuns.
Como usar
Dica: No Claude Code ou Cursor, salve o arquivo no seu projeto como AGENTS.md ou CLAUDE.md para que a AI tenha o contexto automaticamente.
Tratamento de Erros
import { WhatsAppError } from '@raphaelvserafim/client-api-whatsapp';
try {
await wa.message.send({
type: TypeMessage.TEXT,
body: { to, text: "Hello" }
});
} catch (error) {
if (error instanceof WhatsAppError) {
console.error(error.message);
console.error(error.statusCode);
console.error(error.responseBody);
}
}WAME API SDK TypeScript — Documentação
Começar Agora