PyWa β’ Build WhatsApp Bots in Python β’ Fast, Effortless, Powerful π

π« PyWa is the all-in-one Python framework for the WhatsApp Cloud API
Send rich messages with media and interactive buttons, Listen to user events in real time, Build and send flows, Create and send template messages, Enjoy blazing-fast async support and seamless integration with FastAPI, Flask, and more. Fully typed, documented, and production-ready. Build powerful WhatsApp bots in minutes.
π Quick Documentation Index
Get Started
β’ WhatsApp Client
β’ Handlers
β’ Listeners
β’ Filters
β’ Updates
β’ Flows
β’ Examples
β‘ Why PyWa?
- π Fast and Simple: Focus on building your bot without worrying about low-level details.
- π¬ Rich Messaging: Send text, images, videos, documents, audio, locations, contacts, and interactive keyboards.
- π© Real-Time Updates: Receive messages, callbacks, and message status updates effortlessly.
- π Listeners: Use powerful listeners to wait for specific user events.
- β»οΈ Flows Support: Create, send, and listen to Flows seamlessly.
- π Webhook Integration: Built-in support for popular frameworks like Flask and FastAPI.
- π¬ Advanced Filters: Handle incoming updates with powerful filtering options.
- π Template Messaging: Easily create and send template messages.
- β
Production-Ready: Fully typed, documented, and rigorously tested for reliability.
π¨βπ» How to Use
See WhatsApp Client for all the options.
from pywa import WhatsApp, types
wa = WhatsApp(
phone_id="100458559237541",
token="EAAEZC6hUxkTIB"
)
wa.send_message(
to="9876543210",
text="Hello from PyWa!",
buttons=[
types.Button(title="Menu", callback_data="menu"),
types.Button(title="Help", callback_data="help")
]
)
wa.send_image(
to="9876543210",
image="https://example.com/image.jpg",
caption="Check out this image!",
)
- Handle incoming updates (with FastAPI in this example)
See Handlers for fully detailed guide.
from pywa import WhatsApp, filters, types
from fastapi import FastAPI
fastapi_app = FastAPI()
wa = WhatsApp(
phone_id=1234567890,
token="************",
server=fastapi_app,
callback_url="https://yourdomain.com/",
verify_token="xyz123",
app_id=123456,
app_secret="*******"
)
@wa.on_message(filters.matches("Hello", "Hi"))
def hello(client: WhatsApp, msg: types.Message):
msg.react("π")
msg.reply_text(
text=f"Hello {msg.from_user.name}!",
buttons=[
types.Button(
title="About me",
callback_data="about_me"
)
]
)
age = msg.reply(text="What's your age?").wait_for_reply(filters=filters.text).text
msg.reply_text(f"Your age is {age}.")
@wa.on_callback_button(filters.matches("about_me"))
def click_me(client: WhatsApp, clb: types.CallbackButton):
clb.reply_text(f"Hello {clb.from_user.name}, I am a WhatsApp bot built with PyWa!")
- To run the server, use fastapi-cli (
pip install "fastapi[standard]"
):
fastapi dev wa.py
import fastapi
from pywa_async import WhatsApp, types
fastapi_app = fastapi.FastAPI()
wa = WhatsApp(..., server=fastapi_app)
async def main():
await wa.send_message(...)
@wa.on_message
async def hello(_: WhatsApp, msg: types.Message):
await msg.react("π")
await msg.reply(...)
See Flows for much more details and examples.
from pywa import WhatsApp, types
from pywa.types.flows import *
wa = WhatsApp(..., business_account_id=123456)
my_flow_json = FlowJSON(
screens=[
Screen(
id="NEWSLETTER",
title="PyWa Newsletter",
layout=Layout(
children=[
TextHeading(text="Subscribe to our newsletter"),
name := TextInput(
name="name",
label="Name",
input_type=InputType.TEXT,
required=False,
),
email := TextInput(
name="email",
label="Email",
input_type=InputType.EMAIL,
required=True,
),
Footer(
label="Subscribe",
on_click_action=CompleteAction(
payload={
"name": name.ref,
"email": email.ref,
}
)
)
]
)
)
]
)
wa.create_flow(
name="subscribe_to_newsletter",
categories=[FlowCategory.SIGN_UP, FlowCategory.OTHER],
flow_json=my_flow_json,
publish=True
)
wa.send_text(
to="9876543210",
text="Hello from PyWa!",
buttons=types.FlowButton(
title="Subscribe to our newsletter!",
flow_name="subscribe_to_newsletter",
)
)
@wa.on_flow_completion
def handle_flow_response(_: WhatsApp, flow: types.FlowCompletion):
flow.reply(
text=f"Thank you for subscribing to our newsletter, {flow.response['name']}! "
f"We will send you updates to {flow.response['email']}.",
buttons=[types.Button(title="Unsubscribe", callback_data="unsubscribe")]
)
- Create and send template messages
from pywa import WhatsApp, types
wa = WhatsApp(..., business_account_id=123456)
created = wa.create_template(
template=types.NewTemplate(
name="buy_new_iphone_x",
category=types.NewTemplate.Category.MARKETING,
language=types.NewTemplate.Language.ENGLISH_US,
header=types.NewTemplate.Text(text="The New iPhone {15} is here!"),
body=types.NewTemplate.Body(text="Buy now and use the code {WA_IPHONE_15} to get {15%} off!"),
footer=types.NewTemplate.Footer(text="Powered by PyWa"),
buttons=[
types.NewTemplate.UrlButton(title="Buy Now", url="https://example.com/shop/{iphone15}"),
types.NewTemplate.PhoneNumberButton(title="Call Us", phone_number='1234567890'),
types.NewTemplate.QuickReplyButton(text="Unsubscribe from marketing messages"),
types.NewTemplate.QuickReplyButton(text="Unsubscribe from all messages"),
],
),
)
wa.send_template(
to="9876543210",
template=types.Template(
name="buy_new_iphone_x",
language=types.Template.Language.ENGLISH_US,
header=types.Template.TextValue(value="15"),
body=[
types.Template.TextValue(value="John Doe"),
types.Template.TextValue(value="WA_IPHONE_15"),
types.Template.TextValue(value="15%"),
],
buttons=[
types.Template.UrlButtonValue(value="iphone15"),
types.Template.QuickReplyButtonData(data="unsubscribe_from_marketing_messages"),
types.Template.QuickReplyButtonData(data="unsubscribe_from_all_messages"),
],
),
)
π Installation
pip3 install -U pywa
- Install from source (the bleeding edge):
pip3 install -U git+https://github.com/david-lev/pywa.git
- If you going to use the webhook features, here is shortcut to install the required dependencies:
pip3 install -U "pywa[fastapi]"
pip3 install -U "pywa[flask]"
- If you going to use the Flow features and want to use the default FlowRequestDecryptor and the default FlowResponseEncryptor, here is shortcut to install the required dependencies:
pip3 install -U "pywa[cryptography]"
πΎ Requirements
π Setup and Usage
See the Documentation for detailed instructions
βοΈ TODO
Add support for async
Add support for more web frameworks (Django, aiohttp, etc.)
Add support for flows
- Add support for more types of updates (
account_alerts
, phone_number_quality_updates
, template_category_updates
, etc.)
- Add more examples and guides
Feel free to open an issue if you have any suggestions. or even better - submit a PR!
βοΈ License
This project is licensed under the MIT License - see the
LICENSE file for details
π± Contributing
Contributions are welcome! Please see the Contributing Guide for more information.