
PyWa β’ Python wrapper for the WhatsApp Cloud API#
PyWa is a Fast, Simple, Modern and easy-to-use asynchronous Python framework for building WhatsApp bots using the WhatsApp Cloud API.
π Quick Documentation Index#
Get Started β’ WhatsApp Client β’ Handlers β’ Filters β’ Updates β’ Flows β’ Examples
β‘ Features#
π Fast and simple to use. No need to worry about the low-level details.
π¬ Send text messages with interactive keyboards, images, videos, documents, audio, locations, contacts, etc.
π© Receive messages, callbacks, message status updates, etc.
β»οΈ Create, send and listen to Flows (NEW!)
π Built-in support for webhooks (Flask, FastAPI, etc.)
π¬ Filters for handling incoming updates
π Send and create templates
β Fully typed, documented and tested
π¨βπ» Usage#
Create a WhatsApp client and send a message ..
See Getting Started for more information.
from pywa import WhatsApp
wa = WhatsApp(
phone_id="100458559237541",
token="EAAEZC6hUxkTIB"
)
wa.send_message(
to="9876543210",
text="Hello from PyWa!"
)
To listen to updates, create a
WhatsAppclient, pass a web server app (FastAPI in this example) and register callbacks:
See Handlers for more information.
# wa.py
from pywa import WhatsApp, filters
from pywa.types import Message, CallbackButton, Button
from fastapi import FastAPI
fastapi_app = FastAPI()
wa = WhatsApp(
phone_id="1234567890",
token="xxxxxxx",
server=fastapi_app,
callback_url="https://yourdomain.com/",
verify_token="xyz123",
app_id=123456,
app_secret="yyyyyy"
)
@wa.on_message(filters.matches("Hello", "Hi"))
def hello(client: WhatsApp, msg: Message):
msg.react("π")
msg.reply_text(
text=f"Hello {msg.from_user.name}!",
buttons=[
Button(
title="Click me!",
callback_data="id:123"
)
]
)
@wa.on_callback_button(filters.startswith("id"))
def click_me(client: WhatsApp, clb: CallbackButton):
clb.reply_text("You clicked me!")
To run the server, use uvicorn (
pip install "uvicorn[standard]"):
uvicorn wa:fastapi_app # see uvicorn docs for more options (port, host, reload, etc.)
π« Async Usage
PyWa has async support! To use the async version, replace all the imports from
pywatopywa_asyncand useasync/await:
# 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(...)
uvicorn wa:fastapi_app
π Installation#
Install using pip3:
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#
Python 3.10 or higher - https://www.python.org
π Setup and Usage#
See the Documentation for detailed instructions
βοΈ TODO#
Add support for asyncAdd support for more web frameworks (Django, aiohttp, etc.)Add support for flowsAdd 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 feel free to submit a Pull Request.
π Changelog#
NOTE: pywa follows the semver versioning standard.
1.24.0 (2024-07-26) Latest#
[server] validating
X-Hub-Signature-256header[requirements] removing
requests[server] default callback url registration delay to 3 sec
1.23.0 (2024-07-14)#
[client] allowing to manage multiple numbers from the same client (Partner solutions)
[flows] adding
.respond()shortcut forFlowRequest[flows] allowing body in
FlowResponseErrorsubclasses
1.22.0 (2024-06-16)#
[handlers] introducing
FlowRequestCallbackWrapperto help split flow endpoint logic to multiple handlers[client] adding
add_flow_request_handlermethod to registerFlowRequestHandlers[flows] pop
flow_tokenfromFlowCompletion.response[docs] update examples
1.21.0 (2024-06-14)#
[flows] added new components
PhotoPicker,DocumentPicker,IfandSwitch
For full changelog, see here.#
π Contents#
- βοΈ Get Started
- π Client
WhatsApp- Client Reference
WhatsApp.send_message()WhatsApp.send_image()WhatsApp.send_video()WhatsApp.send_audio()WhatsApp.send_document()WhatsApp.send_location()WhatsApp.send_contact()WhatsApp.send_sticker()WhatsApp.send_catalog()WhatsApp.send_template()WhatsApp.send_product()WhatsApp.send_products()WhatsApp.send_reaction()WhatsApp.remove_reaction()WhatsApp.mark_message_as_read()WhatsApp.upload_media()WhatsApp.download_media()WhatsApp.get_media_url()WhatsApp.get_business_profile()WhatsApp.get_business_phone_number()WhatsApp.update_business_profile()WhatsApp.update_conversational_automation()WhatsApp.set_business_public_key()WhatsApp.get_commerce_settings()WhatsApp.update_commerce_settings()WhatsApp.create_template()WhatsApp.create_flow()WhatsApp.update_flow_metadata()WhatsApp.update_flow_json()WhatsApp.publish_flow()WhatsApp.delete_flow()WhatsApp.deprecate_flow()WhatsApp.get_flow()WhatsApp.get_flows()WhatsApp.get_flow_assets()WhatsApp.register_phone_number()WhatsApp.webhook_update_handler()WhatsApp.webhook_challenge_handler()WhatsApp.get_flow_request_handler()
- API Reference
- ποΈ Handlers
- π¬ Updates
- Message
- Callback Button
- Callback Selection
- Flow Completion
- Message Status
- Chat Opened
- Template Status
- Common methods
BaseUpdateBaseUserUpdateBaseUserUpdate.senderBaseUserUpdate.recipientBaseUserUpdate.message_id_to_replyBaseUserUpdate.reply_text()BaseUserUpdate.reply_image()BaseUserUpdate.reply_video()BaseUserUpdate.reply_document()BaseUserUpdate.reply_audio()BaseUserUpdate.reply_sticker()BaseUserUpdate.reply_location()BaseUserUpdate.reply_contact()BaseUserUpdate.react()BaseUserUpdate.unreact()BaseUserUpdate.reply_catalog()BaseUserUpdate.reply_product()BaseUserUpdate.reply_products()BaseUserUpdate.reply_template()BaseUserUpdate.mark_as_read()
- β»οΈ Flows
- Creating Flow
- Sending Flow
- Handling Flow requests and responding to them
- Getting Flow Completion message
- Flow JSON
FlowJSONScreenScreenDataLayoutLayoutTypeFormTextHeadingTextSubheadingTextBodyTextCaptionFontWeightTextInputInputTypeTextAreaCheckboxGroupRadioButtonsGroupFooterOptInDropdownEmbeddedLinkDatePickerImageScaleTypePhotoPickerPhotoSourceDocumentPickerIfSwitchDataSourceActionFlowActionTypeActionNextActionNextTypeDataKeyFormRef
- Flow Types
FlowRequestFlowRequestActionTypeFlowResponseFlowCategoryFlowDetailsFlowStatusFlowPreviewFlowValidationErrorFlowAssetFlowResponseErrorFlowTokenNoLongerValidFlowRequestSignatureAuthenticationFailedFlowRequestDecryptorFlowResponseEncryptordefault_flow_request_decryptor()default_flow_response_encryptor()flow_request_media_decryptor_sync()flow_request_media_decryptor_async()FlowRequestCallbackWrapper
- Flow JSON
- π¬ Filters
- Combining Filters
- Custom Filters
- Built-in Filters
- β οΈ Errors
- Base Exception
WhatsAppError- Sending Messages Errors
SendMessageErrorMessageUndeliverableReEngagementMessageUnsupportedMessageTypeRecipientNotInAllowedListInvalidParameterMissingRequiredParameterMediaDownloadErrorMediaUploadErrorTemplateParamCountMismatchTemplateParamFormatMismatchTemplateNotExistsTemplateTextTooLongGenericErrorUnknownErrorAccessDeniedServiceUnavailableRecipientCannotBeSenderBusinessPaymentIssueIncorrectCertificateAccountInMaintenanceMode
- Flows Errors
- Authorization Errors
- Rate Limit Errors
- Integrity Errors
- Base Exception
- βοΈ Types
- Media
- Keyboard
- Template
NewTemplateTemplateLanguageTemplateResponse
- Message Fields
- Others
- π‘ Examples
- π Changelog
- 1.24.0 (2024-07-26) Latest
- 1.23.0 (2024-07-14)
- 1.22.0 (2024-06-16)
- 1.21.0 (2024-06-14)
- 1.20.2 (2024-06-02)
- 1.20.1 (2024-06-02)
- 1.20.0 (2024-06-02)
- 1.19.0-rc.3 (2024-05-23)
- 1.19.0-rc.2 (2024-05-17)
- 1.19.0-rc.1 (2024-05-08)
- 1.18.1 (2024-05-05)
- 1.18.0 (2024-05-02)
- 1.17.0 (2024-04-30)
- 1.16.2 (2024-02-15)
- 1.16.0 (2024-01-22)
- 1.15.0 (2024-01-14)
- 1.14.0 (2024-01-01)
- 1.13.0 (2023-12-22)
- 1.13.0-rc.6 (2023-12-20)
- 1.13.0-rc.5 (2023-12-18)
- 1.13.0-rc.4 (2023-12-16)
- 1.13.0-rc.3 (2023-12-15)
- 1.13.0-rc.2 (2023-12-14)
- 1.13.0-rc.1 (2023-12-14)
- 1.12.1 (2023-11-29)
- 1.12.0 (2023-11-20)
- 1.11.1 (2023-11-07)
- 1.11.0 (2023-11-01)
- 1.10.0 (2023-10-29)
- 1.9.0 (2023-10-25)
- 1.8.0 (2023-10-20)
- 1.7.3 (2023-10-18)
- 1.7.2 (2023-10-12)
- 1.7.1 (2023-10-12)
- 1.7.0 (2023-10-12)
- 1.6.0 (2023-10-11)
- 1.5.4 (2023-10-08)
- 1.5.3 (2023-10-03)
- 1.5.2 (2023-10-03)
- 1.5.1 (2023-10-02)
- 1.5.0 (2023-10-02)
- 1.4.1 (2023-09-12)
- 1.4.0 (2023-09-10)
- 1.3.0 (2023-09-06)
- 1.2.0 (2023-08-21)
- 1.1.0 (2023-08-20)
- 1.0.0 (2023-08-16)