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 β’ Listeners β’ 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, types
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: types.Message):
msg.react("π")
msg.reply_text(
text=f"Hello {msg.from_user.name}!",
buttons=[
types.Button(
title="Click me!",
callback_data="id:123"
)
]
)
@wa.on_callback_button(filters.startswith("id"))
def click_me(client: WhatsApp, clb: types.CallbackButton):
clb.reply_text("You clicked me!")
To run the server, use fastapi-cli (
pip install "fastapi[standard]"):
fastapi dev wa.py # 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(...)
fastapi dev wa.py
π 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 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.
π Changelog#
NOTE: pywa follows the semver versioning standard.
2.5.1 (2025-01-02) Latest#
[project] hot fix to include missing files in the package
2.5.0 (2025-01-02)#
[handlers] adding
on_init,on_data_exchangeandon_backdecorators for flow request callback wrapper[flows]
FlowRequest.responddefaults to request flow token[flows] adding
FlowRequest.token_no_longer_validshortcut[flows] deprecate
FlowRequest.is_health_checkandFlowRequestActionType.PING
2.4.0 (2024-12-14)#
[sent_message] adding
SentTemplatewithSentTemplateStatus[flows] adding
patternforTextInput[flows] adding support for
NavigationList[flows] defaulting actionβs payload to empty dict
[flows] deprecating
ActionNextandActionNextType
2.3.0 (2024-11-30)#
[client] allowing to specify the callback url scope
[client] expose methods to override callback url in waba and phone scopes
See the full changelog here.
π Contents#
- βοΈ Get Started
- π Client
WhatsApp- Sending messages
- Handling updates
- Listening
- Media
- Templates
- Flows
- Business profile
- QR Codes
- Commerce
- Server
- Others
- Client Reference
WhatsApp.send_message()WhatsApp.send_image()WhatsApp.send_video()WhatsApp.send_audio()WhatsApp.send_document()WhatsApp.send_location()WhatsApp.request_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.listen()WhatsApp.stop_listening()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_metrics()WhatsApp.get_flow_assets()WhatsApp.register_phone_number()WhatsApp.create_qr_code()WhatsApp.get_qr_code()WhatsApp.get_qr_codes()WhatsApp.update_qr_code()WhatsApp.delete_qr_code()WhatsApp.get_app_access_token()WhatsApp.set_app_callback_url()WhatsApp.override_waba_callback_url()WhatsApp.delete_waba_callback_url()WhatsApp.override_phone_callback_url()WhatsApp.delete_phone_callback_url()WhatsApp.webhook_update_handler()WhatsApp.webhook_challenge_handler()WhatsApp.get_flow_request_handler()WhatsApp.load_handlers_modules()
- API Reference
- Client Reference
- ποΈ Handlers
- Automatically registering the callback url
- Registering the callback url manually in the WhatsApp App Dashboard
- Available handlers
- Filtering updates
- Listen instead of registering
- Stop or continue handling updates
- Validating the updates
- Handler Decorators
WhatsApp.on_message()WhatsApp.on_callback_button()WhatsApp.on_callback_selection()WhatsApp.on_flow_completion()WhatsApp.on_flow_request()WhatsApp.on_message_status()WhatsApp.on_chat_opened()WhatsApp.on_template_status()WhatsApp.on_raw_update()WhatsApp.remove_callbacks()WhatsApp.load_handlers_modules()
- Handler Objects
- Handler Decorators
- π₯ Listeners
- π¬ 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_audio()BaseUserUpdate.reply_document()BaseUserUpdate.reply_location()BaseUserUpdate.reply_location_request()BaseUserUpdate.reply_contact()BaseUserUpdate.reply_sticker()BaseUserUpdate.reply_template()BaseUserUpdate.reply_catalog()BaseUserUpdate.reply_product()BaseUserUpdate.reply_products()BaseUserUpdate.react()BaseUserUpdate.unreact()BaseUserUpdate.mark_as_read()
- β»οΈ Flows
- Creating Flow
- Sending Flow
- Handling Flow requests and responding to them
- Getting Flow Completion message
- Flow JSON
FlowJSONScreenScreenDataScreenDataUpdateLayoutLayoutTypeFormFormComponent.ref()FormComponent.ref_in()TextHeadingTextSubheadingTextBodyTextCaptionRichTextFontWeightTextInputInputTypeTextAreaCheckboxGroupRadioButtonsGroupMediaSizeFooterOptInDropdownEmbeddedLinkNavigationListNavigationItemNavigationItemStartNavigationItemMainContentNavigationItemEndDatePickerCalendarPickerCalendarPickerModeCalendarDayImageScaleTypePhotoPickerPhotoSourceDocumentPickerIfSwitchDataSourceDataExchangeActionNavigateActionCompleteActionUpdateDataActionOpenUrlActionNextNextTypeScreenDataRefComponentRefConditionMathExpression
- Flow Types
FlowRequestFlowRequestActionTypeFlowResponseFlowCategoryFlowDetailsFlowStatusFlowPreviewFlowValidationErrorFlowAssetFlowMetricNameFlowMetricGranularityFlowResponseErrorFlowTokenNoLongerValidFlowRequestSignatureAuthenticationFailedFlowRequestDecryptorFlowResponseEncryptordefault_flow_request_decryptor()default_flow_response_encryptor()flow_request_media_decryptor()FlowRequestCallbackWrapper
- Flow JSON
- π¬ Filters
- Combining Filters
- Custom Filters
- Built-in Filters
- Common filters
- Message Filters
filters.forwardedfilters.forwarded_many_timesfilters.replyreplays_to()filters.has_referred_productfilters.textfilters.is_commandcommand()filters.mediamimetypes()extensions()filters.has_captionfilters.imagefilters.videofilters.audiofilters.audio_onlyfilters.voicefilters.documentfilters.stickerfilters.animated_stickerfilters.static_stickerfilters.reactionfilters.reaction_addedfilters.reaction_removedreaction_emojis()filters.unsupportedfilters.locationfilters.current_locationlocation_in_radius()filters.contactsfilters.contacts_has_wafilters.order
- Message Status 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
- 2.5.1 (2025-01-02) Latest
- 2.5.0 (2025-01-02)
- 2.4.0 (2024-12-14)
- 2.3.0 (2024-11-30)
- 2.2.0 (2024-11-29)
- 2.1.0 (2024-11-24)
- 2.0.5 (2024-11-10)
- 2.0.4 (2024-11-08)
- 2.0.3 (2024-11-02)
- 2.0.2 (2024-10-30)
- 2.0.1 (2024-10-30)
- 2.0.0 (2024-10-30)
- 1.26.0 (2024-09-22)
- 1.25.0 (2024-08-15)
- 1.24.0 (2024-07-26)
- 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)
- π€ Contributing
- Prerequisites
- Getting Started
- Code Standards
- Making Changes
- Communication
- License
- Project Structure
- π Migration
- Migration from 1.x to 2.x