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.2.tar.gz (22.4 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.2-py3-none-any.whl (35.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: whatsapp_models-0.2.2.tar.gz
  • Upload date:
  • Size: 22.4 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.2.tar.gz
Algorithm Hash digest
SHA256 10bddb13b044e9882ff76639f149a08191eeb22274618267df9f0d3d687130e7
MD5 fae251f53db826380c00951d596668e3
BLAKE2b-256 87cf4dcb63ad00bfbaaffb64e1e1764149f5600d82133bb5e39542f5791b3724

See more details on using hashes here.

Provenance

The following attestation bundles were made for whatsapp_models-0.2.2.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.2-py3-none-any.whl.

File metadata

  • Download URL: whatsapp_models-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 35.7 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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 583992f9fa0ac73e4cedeab92d6c104d769c3b1051632c55beed8ebf37f6cb9e
MD5 8e39d62018df28411fefc2508094ac5b
BLAKE2b-256 7ce5ee0732008292c26e3eb6e2b506ce4fb44d5539eea577a9af961196a66160

See more details on using hashes here.

Provenance

The following attestation bundles were made for whatsapp_models-0.2.2-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