Programa Builders

Construa com a gente por um mês inteiro. Uso e add-ons ilimitados, chamadas semanais e seu próprio canal no Slack.

Saiba mais
Polymorfa

Criptografia de ponta a ponta

Decida quem pode ler suas mensagens

Escolha um nível de dados para cada número. A Polymorfa armazena as conversas na região, não armazena nada ou apenas repassa o texto cifrado enquanto as chaves Signal ficam nos seus servidores ou no navegador.

Níveis de dados para cada número
4
Chaves Signal que guardamos em números de conhecimento zero
0
Maior tempo de cópia na fila sem armazenamento hospedado
24 h
Bancos de dados com adaptadores oficiais
9

Níveis de dados

Um número, quatro formas de guardar os dados dele

Em números hospedados e de repasse, a Polymorfa processa o conteúdo das mensagens para entregá-lo. Nos dois níveis de conhecimento zero, só você consegue descriptografá-lo.

Hospedado. O Armazenamento hospedado de mensagens guarda conversas, contatos e mídia na região do número. Trabalhe pela caixa de entrada de Conversas e Contatos ou pela API de histórico; fixações, arquivamentos e status de leitura sincronizam com o celular.
Repasse. O padrão. Cada mensagem é descriptografada na memória e entregue ao seu webhook, e nenhum conteúdo é gravado em banco de dados. O histórico de eventos informa o corpo como não retido.
Seus servidores. Rode o serviço Signal na sua infraestrutura. Ele guarda as chaves Signal, descriptografa cada mensagem e entrega o texto puro ao seu app. A Polymorfa repassa texto cifrado.
Navegador. O signal-wasm descriptografa nos navegadores dos seus usuários ou na edge. A chave dele é uma chave WebCrypto não exportável, então as mensagens só são descriptografadas no cliente.

Números de conhecimento zero

Nós levamos o tráfego, você fica com as chaves

A Polymorfa mantém a conexão com o WhatsApp, as confirmações, as novas tentativas e o ritmo. Toda operação que precisa de uma chave privada vai para o seu serviço Signal, e o texto puro das mensagens nunca chega aos nossos servidores, nem na memória nem em disco.

Entra texto cifrado, sai texto cifrado. Seu serviço Signal abre a conexão com a Polymorfa, então você não expõe nenhuma porta de entrada. Uma conexão atende vários números.
Código aberto. O signal-node é publicado sob AGPL-3.0 e construído sobre o whatsapp-rust, então você pode ler exatamente o que roda ao lado das suas chaves.
Leases e failover. Cada réplica faz claim de um número em uma geração de lease, e a Polymorfa roteia para o claim mais recente. Rode duas réplicas e a de reserva assume.
As contrapartidas. Recursos que leem o conteúdo das mensagens não funcionam sem ele, e as solicitações para esses recursos retornam um erro claro. Números de conhecimento zero usam Linked Devices e custam o mesmo que os padrão.

Seu banco de dados

Sincronize com o banco de dados que você já usa

Todas as linguagens de SDK compartilham um único contrato de armazenamento. Aponte um handler de webhook ou um stream de eventos para um adaptador, e conversas, mensagens, contatos, mídia e histórico chegam às suas próprias tabelas.

Nove bancos de dados, um contrato. Upsert, patch, exclusão, deduplicação por ID de evento e retomada a partir de um cursor salvo. Os adaptadores de Postgres, MySQL, SQLite, MongoDB e DynamoDB existem nas seis linguagens de SDK.
Um preset para Supabase. Aplique o esquema com as políticas de segurança em nível de linha incluídas e consulte as mensagens no seu app como qualquer outra tabela.
Esquemas exportados para ORM. Gere as tabelas como modelos Drizzle, Prisma, SQLAlchemy, Django, Eloquent ou EF Core e mantenha-as nas suas próprias migrações.

Mídia e histórico diretos

Mídia e histórico sem conta de armazenamento

O SDK envia a mídia ao WhatsApp e baixa os blocos de histórico por conta própria, então nenhum dos dois gera custo de armazenamento. Os dois são grátis, sem medição.

Upload direto. Criptografe e envie a partir do seu servidor, pela conexão do número ou pela sua própria rede. Envie o resultado como um descritor de mídia.
Seu bucket. Envie ao WhatsApp a partir de um objeto compatível com S3 e arquive a mídia recebida no seu bucket antes que a cópia na CDN expire.
Histórico direto. A Polymorfa encaminha a referência do bloco, e o seu SDK o baixa e decodifica. Sem o consentimento da pessoa, nada é encaminhado.
  • Em números de conhecimento zero, a chave da mídia e o texto puro nunca chegam à Polymorfa
  • Seu serviço Signal cuida de todo o histórico dos números de conhecimento zero
  • Os buffers de texto puro para novas tentativas e eventos ficam desativados em todos os números, garantido pelo banco de dados

No seu código

Mantenha sua cópia com poucas linhas

Guarde eventos no seu banco de dados, envie mídia direto ao WhatsApp, arquive no seu bucket ou leia conversas hospedadas.

app/webhooks/route.ts
import { webhooks } from "@polymorfa/sdk";
import { storageWebhookHandler } from "@polymorfa/storage";
import { postgresAdapter } from "@polymorfa/storage/postgres";

const store = storageWebhookHandler(
  postgresAdapter({ connectionString: process.env.DATABASE_URL! }),
);

export async function POST(request: Request) {
  const event = await webhooks.verify({
    body: await request.arrayBuffer(),
    signature: request.headers.get("x-webhook-signature") ?? "",
    secret: process.env.WEBHOOK_SECRET!,
  });
  await store(event); // chats, messages, contacts, media
  return Response.json({ received: event.id });
}

Superfície da API

A API de dados

Conversas hospedadas pela API de mensagens e os comandos que o SDK usa para mídia e histórico diretos.

Armazenamento hospedado de mensagens

  • GET/messaging/{number}/chatsListe as conversas guardadas
  • GET/messaging/{number}/chats/{chat}Obtenha uma conversa
  • GET/messaging/{number}/chats/{chat}/messagesPercorra as mensagens guardadas
  • GET/messaging/{number}/chats/{chat}/messages/{id}/mediaBaixe a mídia guardada

Mídia e histórico diretos

  • POST/messaging/{number}/media/relay-uploadsEnvie texto cifrado pelo número
  • POST/messaging/{number}/media/upload-grantsPermissão de curta duração para enviar pela sua rede
  • POST/messaging/{number}/history/chunk-retriesPeça ao celular para enviar um bloco de novo
  • Eventohistory.syncUm bloco de histórico está pronto para baixar

Comece com um número grátis

Seu primeiro número real é grátis. Adicione mais números no Pay-As-You-Go.