whatsapp-sdk


Namewhatsapp-sdk JSON
Version 0.2.0 PyPI version JSON
download
home_pageNone
SummaryA comprehensive synchronous Python SDK for WhatsApp Business Cloud API following Meta's official documentation
upload_time2025-09-08 13:30:00
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT
keywords whatsapp whatsapp-business sdk api meta cloud-api messaging chatbot business-messaging
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # WhatsApp SDK Python

[![PyPI version](https://badge.fury.io/py/whatsapp-sdk.svg)](https://badge.fury.io/py/whatsapp-sdk)
[![Python Support](https://img.shields.io/pypi/pyversions/whatsapp-sdk.svg)](https://pypi.org/project/whatsapp-sdk/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Tests](https://github.com/alejandrovelez243/whatsapp-sdk/actions/workflows/ci.yml/badge.svg)](https://github.com/alejandrovelez243/whatsapp-sdk/actions/workflows/ci.yml)
[![codecov](https://codecov.io/gh/alejandrovelez243/whatsapp-sdk/branch/main/graph/badge.svg)](https://codecov.io/gh/alejandrovelez243/whatsapp-sdk)
[![Documentation Status](https://readthedocs.org/projects/whatsapp-sdk/badge/?version=latest)](https://whatsapp-sdk.readthedocs.io/en/latest)

A comprehensive **synchronous** Python SDK for WhatsApp Business Cloud API, following Meta's official documentation.

## 🌟 Features

- ✅ **100% Synchronous** - Simple, straightforward API without async complexity
- 📘 **Fully Type-Hinted** - Complete type safety with Pydantic models
- 🔄 **Auto-Retry Logic** - Built-in retry mechanism for robust API calls
- 🔐 **Webhook Verification** - Secure webhook signature validation
- 📦 **Media Management** - Upload, download, and manage media files
- 💬 **Template Messages** - Full template message support
- 🔔 **Interactive Messages** - Buttons, lists, and quick replies
- 📍 **Location Messages** - Send and receive location data
- 👥 **Contact Messages** - Share contact cards
- ⌨️ **Typing Indicators** - Show typing status for better user experience
- ✨ **Modern Python** - Supports Python 3.8+
- 🛡️ **Secure**: Webhook signature validation and secure token handling
- 📝 **Well-Documented**: Extensive documentation and examples

## Installation

```bash
pip install whatsapp-sdk
```

## Quick Start

```python
from whatsapp_sdk import WhatsAppClient

# Initialize client
client = WhatsAppClient(
    phone_number_id="YOUR_PHONE_NUMBER_ID",
    access_token="YOUR_ACCESS_TOKEN"
)

# Send a text message
response = client.messages.send_text(
    to="+1234567890",
    body="Hello from WhatsApp SDK!"
)
print(f"Message sent! ID: {response.messages[0].id}")
```

## Configuration

### Using Environment Variables

```bash
export WHATSAPP_PHONE_NUMBER_ID="your_phone_id"
export WHATSAPP_ACCESS_TOKEN="your_access_token"
```

```python
from whatsapp_sdk import WhatsAppClient

# Create client from environment
client = WhatsAppClient.from_env()
```

### Direct Configuration

```python
client = WhatsAppClient(
    phone_number_id="YOUR_PHONE_NUMBER_ID",
    access_token="YOUR_ACCESS_TOKEN",
    app_secret="YOUR_APP_SECRET",  # Optional: for webhook validation
    webhook_verify_token="YOUR_VERIFY_TOKEN",  # Optional: for webhook setup
    api_version="v23.0",  # Optional: API version
    timeout=30,  # Optional: Request timeout
    max_retries=3,  # Optional: Max retry attempts
    rate_limit=80  # Optional: Requests per second
)
```

## Usage Examples

### Sending Messages

#### Text Messages

```python
# Simple text
response = client.messages.send_text(
    to="+1234567890",
    body="Hello World!"
)

# Text with URL preview
response = client.messages.send_text(
    to="+1234567890",
    body="Check out https://example.com",
    preview_url=True
)

# Using Pydantic model
from whatsapp_sdk import TextMessage

message = TextMessage(
    body="Hello with Pydantic!",
    preview_url=True
)
response = client.messages.send_text(
    to="+1234567890",
    text=message
)
```

#### Media Messages

```python
# Send image
response = client.messages.send_image(
    to="+1234567890",
    image="https://example.com/image.jpg",
    caption="Look at this!"
)

# Send document
response = client.messages.send_document(
    to="+1234567890",
    document="https://example.com/file.pdf",
    caption="Important document",
    filename="contract.pdf"
)

# Send video
response = client.messages.send_video(
    to="+1234567890",
    video="https://example.com/video.mp4",
    caption="Check this out!"
)

# Send audio
response = client.messages.send_audio(
    to="+1234567890",
    audio="https://example.com/audio.mp3"
)
```

#### Location Messages

```python
response = client.messages.send_location(
    to="+1234567890",
    latitude=37.4847,
    longitude=-122.1477,
    name="Meta Headquarters",
    address="1 Hacker Way, Menlo Park, CA"
)
```

#### Contact Messages

```python
from whatsapp_sdk import Contact, Name, Phone, Email

contact = Contact(
    name=Name(
        formatted_name="John Doe",
        first_name="John",
        last_name="Doe"
    ),
    phones=[
        Phone(phone="+1234567890", type="MOBILE")
    ],
    emails=[
        Email(email="john@example.com", type="WORK")
    ]
)

response = client.messages.send_contact(
    to="+9876543210",
    contacts=[contact]
)
```

#### Interactive Messages

```python
from whatsapp_sdk import (
    InteractiveMessage,
    InteractiveBody,
    InteractiveAction,
    Button
)

# Button message
interactive = InteractiveMessage(
    type="button",
    body=InteractiveBody(text="Choose an option:"),
    action=InteractiveAction(
        buttons=[
            Button(type="reply", reply={"id": "yes", "title": "Yes"}),
            Button(type="reply", reply={"id": "no", "title": "No"})
        ]
    )
)

response = client.messages.send_interactive(
    to="+1234567890",
    interactive=interactive
)
```

### Message Status

```python
# Mark message as read
response = client.messages.mark_as_read("wamid.xxx")

# Mark as read with typing indicator
response = client.messages.mark_as_read("wamid.xxx", typing_indicator=True)

# Show typing indicator while processing
response = client.messages.send_typing_indicator("wamid.xxx")
```

### Template Messages

```python
# Send template message
response = client.templates.send(
    to="+1234567890",
    template_name="hello_world",
    language_code="en_US"
)

# Send template with parameters
from whatsapp_sdk.models import TemplateComponent, TemplateParameter

components = [
    TemplateComponent(
        type="body",
        parameters=[
            TemplateParameter(type="text", text="John"),
            TemplateParameter(type="text", text="ABC123")
        ]
    )
]

response = client.templates.send(
    to="+1234567890",
    template_name="order_confirmation",
    language_code="en_US",
    components=components
)
```

### Media Operations

```python
# Upload media from file
response = client.media.upload("/path/to/image.jpg")
media_id = response.id
print(f"Uploaded: {media_id}")

# Upload from bytes
with open("document.pdf", "rb") as f:
    response = client.media.upload_from_bytes(
        file_bytes=f.read(),
        mime_type="application/pdf",
        filename="document.pdf"
    )

# Get media URL and info
url_response = client.media.get_url("media_id_123")
print(f"URL: {url_response.url}")
print(f"Size: {url_response.file_size} bytes")

# Download media to memory
content = client.media.download("media_id_123")
with open("downloaded.jpg", "wb") as f:
    f.write(content)

# Download directly to file (memory efficient)
saved_path = client.media.download_to_file(
    "media_id_123",
    "/path/to/save/file.jpg"
)

# Delete media
success = client.media.delete("media_id_123")
```

### Webhook Handling

```python
# FastAPI webhook example
from fastapi import FastAPI, Request, Header, Query

app = FastAPI()

@app.get("/webhook")
def verify_webhook(
    hub_mode: str = Query(None, alias="hub.mode"),
    hub_verify_token: str = Query(None, alias="hub.verify_token"),
    hub_challenge: str = Query(None, alias="hub.challenge")
):
    result = client.webhooks.handle_verification(
        hub_mode, hub_verify_token, hub_challenge
    )
    if result:
        return result
    return {"error": "Invalid token"}, 403

@app.post("/webhook")
async def handle_webhook(
    request: Request,
    x_hub_signature_256: str = Header(None)
):
    body = await request.body()
    event = client.webhooks.handle_event(x_hub_signature_256, body)

    # Process messages
    messages = client.webhooks.extract_messages(event)
    for message in messages:
        if message.type == "text":
            print(f"Received: {message.text.body}")

    return {"status": "ok"}
```

## Development Status

### ✅ Completed Phases

- **Phase 1**: Foundation & Setup
  - Project structure
  - Configuration management
  - HTTP client setup
  - Exception hierarchy

- **Phase 2**: Core Models (Pydantic)
  - Base models (BaseResponse, Error, Contact)
  - Message models (Text, Image, Video, Audio, Document, Location, etc.)
  - Contact models (Name, Phone, Email, Address, Organization)
  - Template models (Template, Component, Parameter)
  - Media models (Upload, URL, Delete responses)
  - Webhook models (Event, Entry, Message, Status)

- **Phase 3**: Services Implementation ✅
  - **Messages Service**: All message types with full functionality
  - **Templates Service**: Send, create, list, delete, update templates
  - **Media Service**: Upload, download, delete media files
  - **Webhooks Service**: Verification, signature validation, event parsing

- **Phase 4**: Client Integration ✅
  - All services wired and functional
  - Environment configuration support
  - Clean service-oriented architecture

### 📋 Upcoming Phases

- **Phase 5**: Testing
  - Unit tests for all services
  - Integration tests
  - Mock responses

- **Phase 6**: Examples & Documentation
  - Basic usage examples
  - Advanced examples
  - API documentation

- **Phase 7**: Quality & Release
  - Code quality checks
  - CI/CD setup
  - PyPI release

## API Design Principles

- **Synchronous First**: No async/await complexity
- **Pydantic Models**: Type-safe data structures
- **Flexible Input**: Accept Pydantic models, dicts, or simple parameters
- **Always Returns Pydantic**: Consistent, type-safe responses
- **Service-Oriented**: Clean separation of concerns

## Requirements

- Python 3.8+
- httpx
- pydantic >= 2.0

## Contributing

This SDK is under active development. Contributions are welcome!

1. Fork the repository
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request

## Development Setup

```bash
# Clone the repository
git clone https://github.com/yourusername/whatsapp-sdk.git
cd whatsapp-sdk

# Install with development dependencies
uv sync --extra dev

# Run tests
uv run pytest

# Run linting
uv run ruff check src/ tests/

# Run type checking
uv run mypy src/
```

## License

MIT License - see [LICENSE](LICENSE) file for details.

## Support

- **Documentation**: [Full documentation](https://whatsapp-sdk.readthedocs.io) (coming soon)
- **Issues**: [GitHub Issues](https://github.com/yourusername/whatsapp-sdk/issues)
- **Discussions**: [GitHub Discussions](https://github.com/yourusername/whatsapp-sdk/discussions)

## Disclaimer

This SDK is not officially affiliated with Meta or WhatsApp. It's an independent implementation following the official WhatsApp Business API documentation.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "whatsapp-sdk",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "Alejandro Velez <alejandro-243@hotmail.com>",
    "keywords": "whatsapp, whatsapp-business, sdk, api, meta, cloud-api, messaging, chatbot, business-messaging",
    "author": null,
    "author_email": "Alejandro Velez <alejandro-243@hotmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/3e/33/97c60697dc7cab065a5786b6e1b17dc2a26447b10946cda74a804cdb2cba/whatsapp_sdk-0.2.0.tar.gz",
    "platform": null,
    "description": "# WhatsApp SDK Python\n\n[![PyPI version](https://badge.fury.io/py/whatsapp-sdk.svg)](https://badge.fury.io/py/whatsapp-sdk)\n[![Python Support](https://img.shields.io/pypi/pyversions/whatsapp-sdk.svg)](https://pypi.org/project/whatsapp-sdk/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Tests](https://github.com/alejandrovelez243/whatsapp-sdk/actions/workflows/ci.yml/badge.svg)](https://github.com/alejandrovelez243/whatsapp-sdk/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/alejandrovelez243/whatsapp-sdk/branch/main/graph/badge.svg)](https://codecov.io/gh/alejandrovelez243/whatsapp-sdk)\n[![Documentation Status](https://readthedocs.org/projects/whatsapp-sdk/badge/?version=latest)](https://whatsapp-sdk.readthedocs.io/en/latest)\n\nA comprehensive **synchronous** Python SDK for WhatsApp Business Cloud API, following Meta's official documentation.\n\n## \ud83c\udf1f Features\n\n- \u2705 **100% Synchronous** - Simple, straightforward API without async complexity\n- \ud83d\udcd8 **Fully Type-Hinted** - Complete type safety with Pydantic models\n- \ud83d\udd04 **Auto-Retry Logic** - Built-in retry mechanism for robust API calls\n- \ud83d\udd10 **Webhook Verification** - Secure webhook signature validation\n- \ud83d\udce6 **Media Management** - Upload, download, and manage media files\n- \ud83d\udcac **Template Messages** - Full template message support\n- \ud83d\udd14 **Interactive Messages** - Buttons, lists, and quick replies\n- \ud83d\udccd **Location Messages** - Send and receive location data\n- \ud83d\udc65 **Contact Messages** - Share contact cards\n- \u2328\ufe0f **Typing Indicators** - Show typing status for better user experience\n- \u2728 **Modern Python** - Supports Python 3.8+\n- \ud83d\udee1\ufe0f **Secure**: Webhook signature validation and secure token handling\n- \ud83d\udcdd **Well-Documented**: Extensive documentation and examples\n\n## Installation\n\n```bash\npip install whatsapp-sdk\n```\n\n## Quick Start\n\n```python\nfrom whatsapp_sdk import WhatsAppClient\n\n# Initialize client\nclient = WhatsAppClient(\n    phone_number_id=\"YOUR_PHONE_NUMBER_ID\",\n    access_token=\"YOUR_ACCESS_TOKEN\"\n)\n\n# Send a text message\nresponse = client.messages.send_text(\n    to=\"+1234567890\",\n    body=\"Hello from WhatsApp SDK!\"\n)\nprint(f\"Message sent! ID: {response.messages[0].id}\")\n```\n\n## Configuration\n\n### Using Environment Variables\n\n```bash\nexport WHATSAPP_PHONE_NUMBER_ID=\"your_phone_id\"\nexport WHATSAPP_ACCESS_TOKEN=\"your_access_token\"\n```\n\n```python\nfrom whatsapp_sdk import WhatsAppClient\n\n# Create client from environment\nclient = WhatsAppClient.from_env()\n```\n\n### Direct Configuration\n\n```python\nclient = WhatsAppClient(\n    phone_number_id=\"YOUR_PHONE_NUMBER_ID\",\n    access_token=\"YOUR_ACCESS_TOKEN\",\n    app_secret=\"YOUR_APP_SECRET\",  # Optional: for webhook validation\n    webhook_verify_token=\"YOUR_VERIFY_TOKEN\",  # Optional: for webhook setup\n    api_version=\"v23.0\",  # Optional: API version\n    timeout=30,  # Optional: Request timeout\n    max_retries=3,  # Optional: Max retry attempts\n    rate_limit=80  # Optional: Requests per second\n)\n```\n\n## Usage Examples\n\n### Sending Messages\n\n#### Text Messages\n\n```python\n# Simple text\nresponse = client.messages.send_text(\n    to=\"+1234567890\",\n    body=\"Hello World!\"\n)\n\n# Text with URL preview\nresponse = client.messages.send_text(\n    to=\"+1234567890\",\n    body=\"Check out https://example.com\",\n    preview_url=True\n)\n\n# Using Pydantic model\nfrom whatsapp_sdk import TextMessage\n\nmessage = TextMessage(\n    body=\"Hello with Pydantic!\",\n    preview_url=True\n)\nresponse = client.messages.send_text(\n    to=\"+1234567890\",\n    text=message\n)\n```\n\n#### Media Messages\n\n```python\n# Send image\nresponse = client.messages.send_image(\n    to=\"+1234567890\",\n    image=\"https://example.com/image.jpg\",\n    caption=\"Look at this!\"\n)\n\n# Send document\nresponse = client.messages.send_document(\n    to=\"+1234567890\",\n    document=\"https://example.com/file.pdf\",\n    caption=\"Important document\",\n    filename=\"contract.pdf\"\n)\n\n# Send video\nresponse = client.messages.send_video(\n    to=\"+1234567890\",\n    video=\"https://example.com/video.mp4\",\n    caption=\"Check this out!\"\n)\n\n# Send audio\nresponse = client.messages.send_audio(\n    to=\"+1234567890\",\n    audio=\"https://example.com/audio.mp3\"\n)\n```\n\n#### Location Messages\n\n```python\nresponse = client.messages.send_location(\n    to=\"+1234567890\",\n    latitude=37.4847,\n    longitude=-122.1477,\n    name=\"Meta Headquarters\",\n    address=\"1 Hacker Way, Menlo Park, CA\"\n)\n```\n\n#### Contact Messages\n\n```python\nfrom whatsapp_sdk import Contact, Name, Phone, Email\n\ncontact = Contact(\n    name=Name(\n        formatted_name=\"John Doe\",\n        first_name=\"John\",\n        last_name=\"Doe\"\n    ),\n    phones=[\n        Phone(phone=\"+1234567890\", type=\"MOBILE\")\n    ],\n    emails=[\n        Email(email=\"john@example.com\", type=\"WORK\")\n    ]\n)\n\nresponse = client.messages.send_contact(\n    to=\"+9876543210\",\n    contacts=[contact]\n)\n```\n\n#### Interactive Messages\n\n```python\nfrom whatsapp_sdk import (\n    InteractiveMessage,\n    InteractiveBody,\n    InteractiveAction,\n    Button\n)\n\n# Button message\ninteractive = InteractiveMessage(\n    type=\"button\",\n    body=InteractiveBody(text=\"Choose an option:\"),\n    action=InteractiveAction(\n        buttons=[\n            Button(type=\"reply\", reply={\"id\": \"yes\", \"title\": \"Yes\"}),\n            Button(type=\"reply\", reply={\"id\": \"no\", \"title\": \"No\"})\n        ]\n    )\n)\n\nresponse = client.messages.send_interactive(\n    to=\"+1234567890\",\n    interactive=interactive\n)\n```\n\n### Message Status\n\n```python\n# Mark message as read\nresponse = client.messages.mark_as_read(\"wamid.xxx\")\n\n# Mark as read with typing indicator\nresponse = client.messages.mark_as_read(\"wamid.xxx\", typing_indicator=True)\n\n# Show typing indicator while processing\nresponse = client.messages.send_typing_indicator(\"wamid.xxx\")\n```\n\n### Template Messages\n\n```python\n# Send template message\nresponse = client.templates.send(\n    to=\"+1234567890\",\n    template_name=\"hello_world\",\n    language_code=\"en_US\"\n)\n\n# Send template with parameters\nfrom whatsapp_sdk.models import TemplateComponent, TemplateParameter\n\ncomponents = [\n    TemplateComponent(\n        type=\"body\",\n        parameters=[\n            TemplateParameter(type=\"text\", text=\"John\"),\n            TemplateParameter(type=\"text\", text=\"ABC123\")\n        ]\n    )\n]\n\nresponse = client.templates.send(\n    to=\"+1234567890\",\n    template_name=\"order_confirmation\",\n    language_code=\"en_US\",\n    components=components\n)\n```\n\n### Media Operations\n\n```python\n# Upload media from file\nresponse = client.media.upload(\"/path/to/image.jpg\")\nmedia_id = response.id\nprint(f\"Uploaded: {media_id}\")\n\n# Upload from bytes\nwith open(\"document.pdf\", \"rb\") as f:\n    response = client.media.upload_from_bytes(\n        file_bytes=f.read(),\n        mime_type=\"application/pdf\",\n        filename=\"document.pdf\"\n    )\n\n# Get media URL and info\nurl_response = client.media.get_url(\"media_id_123\")\nprint(f\"URL: {url_response.url}\")\nprint(f\"Size: {url_response.file_size} bytes\")\n\n# Download media to memory\ncontent = client.media.download(\"media_id_123\")\nwith open(\"downloaded.jpg\", \"wb\") as f:\n    f.write(content)\n\n# Download directly to file (memory efficient)\nsaved_path = client.media.download_to_file(\n    \"media_id_123\",\n    \"/path/to/save/file.jpg\"\n)\n\n# Delete media\nsuccess = client.media.delete(\"media_id_123\")\n```\n\n### Webhook Handling\n\n```python\n# FastAPI webhook example\nfrom fastapi import FastAPI, Request, Header, Query\n\napp = FastAPI()\n\n@app.get(\"/webhook\")\ndef verify_webhook(\n    hub_mode: str = Query(None, alias=\"hub.mode\"),\n    hub_verify_token: str = Query(None, alias=\"hub.verify_token\"),\n    hub_challenge: str = Query(None, alias=\"hub.challenge\")\n):\n    result = client.webhooks.handle_verification(\n        hub_mode, hub_verify_token, hub_challenge\n    )\n    if result:\n        return result\n    return {\"error\": \"Invalid token\"}, 403\n\n@app.post(\"/webhook\")\nasync def handle_webhook(\n    request: Request,\n    x_hub_signature_256: str = Header(None)\n):\n    body = await request.body()\n    event = client.webhooks.handle_event(x_hub_signature_256, body)\n\n    # Process messages\n    messages = client.webhooks.extract_messages(event)\n    for message in messages:\n        if message.type == \"text\":\n            print(f\"Received: {message.text.body}\")\n\n    return {\"status\": \"ok\"}\n```\n\n## Development Status\n\n### \u2705 Completed Phases\n\n- **Phase 1**: Foundation & Setup\n  - Project structure\n  - Configuration management\n  - HTTP client setup\n  - Exception hierarchy\n\n- **Phase 2**: Core Models (Pydantic)\n  - Base models (BaseResponse, Error, Contact)\n  - Message models (Text, Image, Video, Audio, Document, Location, etc.)\n  - Contact models (Name, Phone, Email, Address, Organization)\n  - Template models (Template, Component, Parameter)\n  - Media models (Upload, URL, Delete responses)\n  - Webhook models (Event, Entry, Message, Status)\n\n- **Phase 3**: Services Implementation \u2705\n  - **Messages Service**: All message types with full functionality\n  - **Templates Service**: Send, create, list, delete, update templates\n  - **Media Service**: Upload, download, delete media files\n  - **Webhooks Service**: Verification, signature validation, event parsing\n\n- **Phase 4**: Client Integration \u2705\n  - All services wired and functional\n  - Environment configuration support\n  - Clean service-oriented architecture\n\n### \ud83d\udccb Upcoming Phases\n\n- **Phase 5**: Testing\n  - Unit tests for all services\n  - Integration tests\n  - Mock responses\n\n- **Phase 6**: Examples & Documentation\n  - Basic usage examples\n  - Advanced examples\n  - API documentation\n\n- **Phase 7**: Quality & Release\n  - Code quality checks\n  - CI/CD setup\n  - PyPI release\n\n## API Design Principles\n\n- **Synchronous First**: No async/await complexity\n- **Pydantic Models**: Type-safe data structures\n- **Flexible Input**: Accept Pydantic models, dicts, or simple parameters\n- **Always Returns Pydantic**: Consistent, type-safe responses\n- **Service-Oriented**: Clean separation of concerns\n\n## Requirements\n\n- Python 3.8+\n- httpx\n- pydantic >= 2.0\n\n## Contributing\n\nThis SDK is under active development. Contributions are welcome!\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## Development Setup\n\n```bash\n# Clone the repository\ngit clone https://github.com/yourusername/whatsapp-sdk.git\ncd whatsapp-sdk\n\n# Install with development dependencies\nuv sync --extra dev\n\n# Run tests\nuv run pytest\n\n# Run linting\nuv run ruff check src/ tests/\n\n# Run type checking\nuv run mypy src/\n```\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n## Support\n\n- **Documentation**: [Full documentation](https://whatsapp-sdk.readthedocs.io) (coming soon)\n- **Issues**: [GitHub Issues](https://github.com/yourusername/whatsapp-sdk/issues)\n- **Discussions**: [GitHub Discussions](https://github.com/yourusername/whatsapp-sdk/discussions)\n\n## Disclaimer\n\nThis SDK is not officially affiliated with Meta or WhatsApp. It's an independent implementation following the official WhatsApp Business API documentation.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A comprehensive synchronous Python SDK for WhatsApp Business Cloud API following Meta's official documentation",
    "version": "0.2.0",
    "project_urls": {
        "Bug Tracker": "https://github.com/alejandrovelez243/whatsapp-sdk/issues",
        "Changelog": "https://github.com/alejandrovelez243/whatsapp-sdk/blob/main/CHANGELOG.md",
        "Documentation": "https://whatsapp-sdk.readthedocs.io",
        "Homepage": "https://github.com/alejandrovelez243/whatsapp-sdk",
        "Repository": "https://github.com/alejandrovelez243/whatsapp-sdk"
    },
    "split_keywords": [
        "whatsapp",
        " whatsapp-business",
        " sdk",
        " api",
        " meta",
        " cloud-api",
        " messaging",
        " chatbot",
        " business-messaging"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fb2ab8230ac9183c6cfb558204dcc0856ce383a55e4e2365102174f5513a1f6e",
                "md5": "ce76ebfeb127ea25e4ff3a8abbebf2be",
                "sha256": "0895ebcdd7e4df523cf980638aa34657f8235dd20103cfa83631a4c86a050b31"
            },
            "downloads": -1,
            "filename": "whatsapp_sdk-0.2.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "ce76ebfeb127ea25e4ff3a8abbebf2be",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 36003,
            "upload_time": "2025-09-08T13:29:59",
            "upload_time_iso_8601": "2025-09-08T13:29:59.018941Z",
            "url": "https://files.pythonhosted.org/packages/fb/2a/b8230ac9183c6cfb558204dcc0856ce383a55e4e2365102174f5513a1f6e/whatsapp_sdk-0.2.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3e3397c60697dc7cab065a5786b6e1b17dc2a26447b10946cda74a804cdb2cba",
                "md5": "148c3ba611d5ad62a1cc1cc95cbb22da",
                "sha256": "c49c7cbf1c54e6e5a1834cb3215fc701c9cdbe2d5ee319cb1d6a0220c4b53dda"
            },
            "downloads": -1,
            "filename": "whatsapp_sdk-0.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "148c3ba611d5ad62a1cc1cc95cbb22da",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 34851,
            "upload_time": "2025-09-08T13:30:00",
            "upload_time_iso_8601": "2025-09-08T13:30:00.080133Z",
            "url": "https://files.pythonhosted.org/packages/3e/33/97c60697dc7cab065a5786b6e1b17dc2a26447b10946cda74a804cdb2cba/whatsapp_sdk-0.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-09-08 13:30:00",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "alejandrovelez243",
    "github_project": "whatsapp-sdk",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "whatsapp-sdk"
}
        
Elapsed time: 0.70164s