SDK OFICIAL

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-whatsapp
$yarn add @raphaelvserafim/client-api-whatsapp

Inicialização

Importe e inicialize o client:

typescript
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:

typescript
// 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

typescript
await wa.instance.setting({
  markMessageRead: true,
  saveMedia: false,
  receiveStatusMessage: false,
  receivePresence: false,
});

Perfil

typescript
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

typescript
await wa.instance.setProxy("http://user:pass@ip:port");
await wa.instance.addMongoDb("mongodb+srv://...", "mydb");

Conexão Mobile

typescript
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:

typescript
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:

typescript
await wa.message.send({
  type: TypeMessage.TEXT,
  body: { to, text: "Hello!" },
});

Enviar Mídia

Imagem

typescript
await wa.message.send({
  type: TypeMessage.IMAGE,
  body: { to, url: "https://example.com/photo.jpg", caption: "Toronto" },
});

Áudio

typescript
await wa.message.send({
  type: TypeMessage.AUDIO,
  body: { to, url: "https://example.com/audio.mp3" },
});

Vídeo

typescript
await wa.message.send({
  type: TypeMessage.VIDEO,
  body: { to, url: "https://example.com/video.mp4", caption: "Big Buck Bunny" },
});

Documento

typescript
await wa.message.send({
  type: TypeMessage.DOCUMENT,
  body: {
    to,
    url: "https://example.com/file.pdf",
    mimetype: "application/pdf",
    fileName: "Resume.pdf"
  },
});

Sticker

typescript
await wa.message.sendSticker(to, "https://example.com/sticker.webp");

Video Note (circular)

typescript
await wa.message.sendVideoNote(to, "https://example.com/video.mp4");

Envio via Base64

typescript
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

typescript
await wa.message.send({
  type: TypeMessage.CONTACT,
  body: {
    to,
    contact: {
      fullName: "Raphael",
      phoneNumber: "559999999999",
      organization: "api-wa.me"
    },
  },
});

Enviar Localização

typescript
await wa.message.send({
  type: TypeMessage.LOCATION,
  body: {
    to,
    location: {
      latitude: 37.7749,
      longitude: -122.4194,
      address: "San Francisco, CA"
    },
  },
});

Enviar Reação

typescript
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:

typescript
await wa.message.send({
  type: TypeMessage.TEXT,
  body: { to, text: "This is a reply!", msgId: "ORIGINAL_MSG_ID" },
}, true);

Presença (digitando...)

typescript
await wa.message.send({
  type: TypeMessage.PRESENCE,
  body: { to, status: StatusPresence.COMPOSING },
});

Mensagem com Título

typescript
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:

typescript
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

typescript
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:

typescript
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" },
    ],
  },
});

Lista / Menu

Envie menus interativos com seções e itens:

typescript
await wa.message.send({
  type: TypeMessage.MENU,
  body: {
    to,
    buttonText: "View Menu",
    text: "Choose an item",
    title: "Menu",
    description: "Our products",
    footer: "Prices may vary",
    sections: [
      {
        title: "Pizzas",
        rows: [
          { title: "Margherita", description: "Classic cheese pizza", rowId: "1" },
          { title: "Pepperoni", description: "Spicy pepperoni", rowId: "2" },
        ],
      },
      {
        title: "Drinks",
        rows: [
          { title: "Cola", description: "350ml", rowId: "3" },
        ],
      },
    ],
  },
});

Enquete / Poll

typescript
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:

typescript
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

typescript
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

typescript
await wa.message.pin("MESSAGE_ID", 604800); // 7 dias em segundos

Link de Chamada

typescript
await wa.message.sendCallLink(to, "video", "Join the meeting");

Encaminhar, Listar e Outros

typescript
// 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

typescript
await wa.message.unpin("MESSAGE_ID");

Enviar Múltiplos Contatos

typescript
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

typescript
await wa.message.sendLiveLocation({
  to,
  latitude: 37.7749,
  longitude: -122.4194,
  caption: "Estou aqui!",
});

Enviar Produto do Catálogo

typescript
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

typescript
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

typescript
// 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

typescript
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

typescript
// 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

typescript
// 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

typescript
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

typescript
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

typescript
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

typescript
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 editam

Participantes

typescript
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

typescript
// 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

typescript
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

typescript
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

typescript
// 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

typescript
// 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

typescript
// 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

typescript
// 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:

typescript
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(),
);

Newsletter / Canal

Gerencie canais/newsletters do WhatsApp:

typescript
// Criar newsletter
await wa.newsletter.create("Meu Canal", "Descrição do canal");

// Obter informações
const metadata = await wa.newsletter.getMetadata("invite", "NEWSLETTER_ID");
const subscribers = await wa.newsletter.getSubscribers("NEWSLETTER_ID");
const admins = await wa.newsletter.getAdmins("NEWSLETTER_ID");

// Seguir / Deixar de seguir
await wa.newsletter.follow("NEWSLETTER_ID");
await wa.newsletter.unfollow("NEWSLETTER_ID");

Atualizar Canal

typescript
await wa.newsletter.updateName("NEWSLETTER_ID", "Novo Nome");
await wa.newsletter.updateDescription("NEWSLETTER_ID", "Nova descrição");
await wa.newsletter.updatePicture("NEWSLETTER_ID", "https://example.com/photo.jpg");
await wa.newsletter.removePicture("NEWSLETTER_ID");

Administração

typescript
// Transferir propriedade
await wa.newsletter.transferOwnership("NEWSLETTER_ID", "559999999999@s.whatsapp.net");

// Rebaixar admin
await wa.newsletter.demoteAdmin("NEWSLETTER_ID", "559999999999@s.whatsapp.net");

Mensagens e Interação

typescript
// Listar mensagens do canal
const messages = await wa.newsletter.getMessages("NEWSLETTER_ID", 10);

// Reagir a uma mensagem
await wa.newsletter.react("NEWSLETTER_ID", "SERVER_ID", "👍");

// Silenciar / Ativar notificações
await wa.newsletter.mute("NEWSLETTER_ID");
await wa.newsletter.unmute("NEWSLETTER_ID");

// Deletar newsletter
await wa.newsletter.delete("NEWSLETTER_ID");

Status / Stories

Publique e gerencie status (stories) do WhatsApp:

Texto

typescript
await wa.status.sendText({
  text: "Olá! Este é meu status.",
  statusJidList: ["559999999999@s.whatsapp.net"], // opcional: limitar quem vê
});

Imagem

typescript
await wa.status.sendImage({
  url: "https://example.com/photo.jpg",
  caption: "Minha foto",
  statusJidList: [], // vazio = todos os contatos
});

Vídeo

typescript
await wa.status.sendVideo({
  url: "https://example.com/video.mp4",
  caption: "Meu vídeo",
});

Áudio

typescript
await wa.status.sendAudio({
  url: "https://example.com/audio.mp3",
});

Menção

typescript
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

1Clique em Iniciar conversa com Claude para abrir o Claude já com o contexto do SDK
2Ou copie o conteúdo e cole no início da conversa com seu assistente de AI preferido
3Peça para a AI te ajudar a construir integrações com a WAME API

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

typescript
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