Skip to main content

Pydantic v2 models for the WhatsApp Business API — outgoing messages, incoming webhooks, and template management.

Project description

whatsapp-models

Biblioteca Python de modelos de dados (Pydantic v2) para as APIs do WhatsApp Business da Meta.

Instalação

pip install whatsapp-models
# ou com uv
uv add whatsapp-models

Módulos

Módulo Descrição
messages Modelos de envio (POST /messages)
message_templates Criação e envio de templates
webhooks Payloads recebidos via webhook
phone_numbers Gerenciamento de números
media Upload e referência de mídia

Exemplos

Envio de mensagens

Mensagem de texto

from whatsapp_models import TextMessage

msg = TextMessage(to="+5511999999999", text={"body": "Olá!"})
payload = msg.model_dump()
# POST /messages — body: payload

Mensagem de mídia (imagem, vídeo, documento, áudio, sticker)

from whatsapp_models import ImageMessage, DocumentMessage

# Por ID de mídia previamente enviada
image = ImageMessage(to="+5511999999999", image={"id": "media_id_abc", "caption": "Foto do evento"})

# Por URL hospedada
doc = DocumentMessage(
    to="+5511999999999",
    document={"link": "https://example.com/relatorio.pdf", "filename": "relatorio.pdf"},
)

Mensagem interativa — botões de resposta rápida

from whatsapp_models import InteractiveMessage

msg = InteractiveMessage(
    to="+5511999999999",
    interactive={
        "type": "button",
        "body": {"text": "Confirme sua presença:"},
        "action": {
            "buttons": [
                {"type": "reply", "reply": {"id": "sim", "title": "Sim"}},
                {"type": "reply", "reply": {"id": "nao", "title": "Não"}},
            ]
        },
    },
)

Mensagem interativa — lista

from whatsapp_models import InteractiveMessage

msg = InteractiveMessage(
    to="+5511999999999",
    interactive={
        "type": "list",
        "body": {"text": "Escolha um departamento:"},
        "action": {
            "button": "Ver opções",
            "sections": [
                {
                    "title": "Suporte",
                    "rows": [
                        {"id": "tecnico", "title": "Suporte Técnico"},
                        {"id": "financeiro", "title": "Financeiro"},
                    ],
                }
            ],
        },
    },
)

Mensagem via template

from whatsapp_models import TemplateMessage

msg = TemplateMessage(
    to="+5511999999999",
    template={
        "name": "hello_world",
        "language": {"code": "pt_BR"},
        "components": [
            {
                "type": "body",
                "parameters": [{"type": "text", "text": "João"}],
            }
        ],
    },
)

Discriminated union — OutgoingMessage

Útil para serializar ou deserializar qualquer mensagem de saída pelo campo type:

from pydantic import TypeAdapter
from whatsapp_models import OutgoingMessage

adapter = TypeAdapter(OutgoingMessage)
msg = adapter.validate_python({
    "to": "+5511999999999",
    "type": "text",
    "text": {"body": "Olá!"},
})
# msg é uma instância de TextMessage

Templates

Criação de template

from whatsapp_models import (
    CreateTemplateRequest,
    TemplateCategory,
    HeaderComponent,
    BodyComponent,
    FooterComponent,
    HeaderFormat,
)

request = CreateTemplateRequest(
    name="confirmacao_pedido",
    language="pt_BR",
    category=TemplateCategory.UTILITY,
    components=[
        HeaderComponent(format=HeaderFormat.TEXT, text="Pedido confirmado"),
        BodyComponent(text="Olá {{1}}, seu pedido #{{2}} foi confirmado."),
        FooterComponent(text="Dúvidas? Fale conosco."),
    ],
)

Webhooks

Deserializar notificação recebida

from whatsapp_models import WebhookNotification

payload = { ... }  # dict recebido no endpoint
notification = WebhookNotification.model_validate(payload)

for entry in notification.entry:
    for change in entry.changes:
        for message in change.value.messages:
            print(type(message).__name__, message.type)

Mensagem direta — text

from whatsapp_models.webhooks.messages import IncomingTextMessage

if isinstance(message, IncomingTextMessage):
    print(message.from_, message.text.body)

Mensagem de grupo

Mensagens de grupo possuem group_id no payload e são resolvidas automaticamente para o tipo IncomingGroup* correspondente:

from whatsapp_models.webhooks.messages import IncomingGroupTextMessage

if isinstance(message, IncomingGroupTextMessage):
    print(f"Grupo {message.group_id}: {message.text.body}")

Status de entrega

from whatsapp_models.webhooks.statuses import DeliveryStatus

for status in change.value.statuses:
    if status.status == DeliveryStatus.failed:
        print(f"Falha ao entregar {status.id}: {status.errors}")

Números de telefone

from whatsapp_models import PhoneNumber, QualityRating

pn = PhoneNumber(
    id="pn_id_1",
    display_phone_number="+55 11 99999-9999",
    verified_name="Minha Empresa",
    quality_rating=QualityRating.GREEN,
)

Mídia

from whatsapp_models import MediaObject

# Referência por ID (após upload)
ref = MediaObject(id="media_id_abc")

# Referência por URL
ref = MediaObject(link="https://example.com/audio.ogg", filename="audio.ogg")

Convenções

  • Todos os modelos herdam de pydantic.BaseModel com validate_by_name=True e validate_by_alias=True
  • Campos opcionais usam field: Type | None = None
  • Enums usam StrEnum — serializam como string pura
  • Discriminated unions usam Field(discriminator="type") para parse direto sem tentativa e erro

Desenvolvimento

uv sync
uv run pytest
uv run ruff check . && uv run ruff format .

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

whatsapp_models-0.2.1.tar.gz (22.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

whatsapp_models-0.2.1-py3-none-any.whl (35.5 kB view details)

Uploaded Python 3

File details

Details for the file whatsapp_models-0.2.1.tar.gz.

File metadata

  • Download URL: whatsapp_models-0.2.1.tar.gz
  • Upload date:
  • Size: 22.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for whatsapp_models-0.2.1.tar.gz
Algorithm Hash digest
SHA256 9058fd68fbf4c8cce0dee5990d85edd3bb84b74ff9da17e7db0728914eb0fea1
MD5 f0486084b95ea5fcaaff9b1e928646cc
BLAKE2b-256 9599e88aa6eb2ee763834a68728354b32b6e333707038f116c47c0c357e105af

See more details on using hashes here.

Provenance

The following attestation bundles were made for whatsapp_models-0.2.1.tar.gz:

Publisher: release.yml on gabrielbchaves/whatsapp-models

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file whatsapp_models-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: whatsapp_models-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 35.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for whatsapp_models-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 9dbb8c61dce41ee09914e8019b1d394eb2e59d5109c4bbbe8ed134b25662f3d4
MD5 4948a40ceffcc777f4d230f9fbd26e11
BLAKE2b-256 672f0d7b0fa64712a6cef9033d5b8c92da549abd45ae83c22e06da2ab5445fc1

See more details on using hashes here.

Provenance

The following attestation bundles were made for whatsapp_models-0.2.1-py3-none-any.whl:

Publisher: release.yml on gabrielbchaves/whatsapp-models

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page