PyWa
The Python framework for building WhatsApp bots.
Fast. Typed. Production-ready. From prototype to production in minutes.
PyWa is a comprehensive, fully-typed Python framework for the WhatsApp Cloud API. It handles everything β sending messages, receiving webhooks, building interactive flows, managing templates, handling calls β so you can focus on building your bot, not wrestling with the API.
pip install -U "pywa[server]"
β¨ Why PyWa?#
| π¬ Rich Messaging | Text, images, videos, documents, audio, stickers, locations, contacts, buttons, lists & more |
| π© Real-Time Webhooks | Messages, button clicks, delivery receipts, read receipts, reactions & account updates |
| π Listeners | Chain conversations naturally β wait for replies, clicks, or reactions inline |
| π Templates | Create, send, and manage WhatsApp message templates with full parameter support |
| β»οΈ Flows | Build rich, multi-screen interactive WhatsApp Flows in pure Python |
| π Calls | Handle incoming and outgoing WhatsApp call events |
| β‘ Async Support | Full async/await API via pywa_async β same interface, zero friction |
| π Server Integrations | Built-in webhook server, or plug into your existing FastAPI / Flask app |
| π‘οΈ Type Safety | Fully typed - full autocomplete and static analysis everywhere |
| π¬ Smart Filters | Composable filters with logical operators for precise update routing |
| π§° CLI Tools | pywa dev for local development, pywa run for production |
π Quick Start#
1. Echo Bot β 5 lines of code#
# main.py
from pywa import WhatsApp, filters, types
wa = WhatsApp(
phone_id="1234567890",
token="EAA...",
app_id=1234567890,
app_secret="********",
callback_url="https://your-domain.ngrok-free.app",
verify_token="my-verify-token",
)
@wa.on_message(filters.text)
def echo(_: WhatsApp, msg: types.Message):
msg.reply(f"You said: {msg.text}")
Start the webhook server:
pywa dev # Local development
pywa run # Production
3. Conversational Flows β Listeners#
Handlers define entry points. Listeners let you continue the conversation naturally:
@wa.on_message(filters.command("start"))
def start(_: WhatsApp, msg: types.Message):
name = msg.reply("What's your name?").wait_for_reply(filters=filters.text).text
msg.reply(f"Nice to meet you, {name}!")
4. Plug Into Your Own Server#
from fastapi import FastAPI
from pywa import WhatsApp, filters, types
app = FastAPI()
wa = WhatsApp(..., server=app, webhook_endpoint="/webhook")
@wa.on_message(filters.text)
def echo(_: WhatsApp, msg: types.Message):
msg.reply(msg.text)
@app.get("/")
def health():
return {"status": "ok"}
5. Full Async Support#
Same API. Just swap the import and add await:
from pywa_async import WhatsApp, filters, types
wa = WhatsApp(...)
@wa.on_message(filters.text)
async def hello(_: WhatsApp, msg: types.Message):
await msg.react("π")
await msg.reply("Hello from async PyWa!")
6. Templates#
Create and send WhatsApp message templates with full parameter support:
from pywa import WhatsApp
from pywa.types.templates import *
wa = WhatsApp(..., waba_id=123456)
wa.create_template(
template=Template(
name="order_update",
category=TemplateCategory.MARKETING,
language=TemplateLanguage.ENGLISH_US,
parameter_format=ParamFormat.NAMED,
components=[
ht := HeaderText("Your order #{{order_id}} has shipped!", order_id="12345"),
bt := BodyText("Track it with code {{code}}.", code="ABC123"),
FooterText(text="Powered by PyWa"),
Buttons(buttons=[
url := URLButton(text="Track Order", url="https://example.com/track/{{1}}", example="12345"),
QuickReplyButton(text="Unsubscribe"),
]),
],
),
)
# Send it
wa.send_template(
to="9876543210",
name="order_update",
language=TemplateLanguage.ENGLISH_US,
params=[
ht.params(order_id="67890"),
bt.params(code="XYZ789"),
url.params(url_variable="67890", index=0),
],
)
7. Interactive Flows#
Build WhatsApp Flows β multi-screen interactive experiences β entirely in Python:
from pywa import WhatsApp, types
from pywa.types.flows import *
wa = WhatsApp(..., waba_id=123456)
my_flow = FlowJSON(
screens=[
Screen(
id="SIGNUP",
title="Join Our Newsletter",
layout=Layout(children=[
TextHeading(text="Subscribe for updates"),
name := TextInput(name="name", label="Name", input_type=InputType.TEXT),
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="newsletter_signup", categories=[FlowCategory.SIGN_UP], flow_json=my_flow, publish=True)
@wa.on_flow_completion
def on_signup(_: WhatsApp, flow: types.FlowCompletion):
flow.reply(text=f"Welcome, {flow.response['name']}! You're subscribed at {flow.response['email']}.")
8. Account & Resource Management#
Beyond messaging, PyWa gives you full control over your WhatsApp Business resources:
from pywa import WhatsApp
wa = WhatsApp(phone_id="1234567890", token="EAA...", waba_id=123456)
# Business profile
profile = wa.get_business_profile()
wa.update_business_profile(about="Powered by PyWa", description="We build bots!", profile_picture="profile.jpg")
# Media management
media = wa.upload_media(media="photo.jpg")
media.stream(), media.download(), media.reupload(), media.delete()
# QR codes
qr = wa.create_qr_code(prefilled_message="Hi! I saw your QR code")
qr.qr_image_url, qr.code, qr.update(prefilled_message="Hello"), qr.delete()
# Usernames
wa.get_reserved_usernames()
wa.set_username(username="mybusiness")
wa.get_current_username()
# Groups
wa.create_group(subject="VIP Customers")
wa.get_groups()
wa.get_group_join_requests()
# Commerce
wa.get_commerce_settings()
wa.update_commerce_settings(is_catalog_visible=True, is_cart_enabled=
True)
# User management
wa.block_users(users=["9876543210"])
blocked = wa.get_blocked_users()
See the Client guide for the full resource management API β templates, flows, media, QR codes, commerce, groups, calls, and more.
9. Partners & Tech Providers#
Building a platform on top of WhatsApp? PyWa supports multi-WABA management, phone number provisioning, and callback routing for Solution Partners and Tech Providers:
from pywa import WhatsApp, types, filters
wa = WhatsApp(phone_id="1234567890", token="EAA...", waba_id=123456)
@wa.on_message(filters.sent_to(phone_number_id=...))
def handle_message_for_specific_phone_number(wa: WhatsApp, msg: types.Message): ...
@wa.on_account_update(filters.account_restriction)
def handle_account_restriction(wa: WhatsApp, update: types.AccountUpdate): ...
@wa.on_message(filters.account_deleted)
def handle_account_deletion(wa: WhatsApp, update: types.AccountUpdate): ...
# Get all WABAs you manage
shared_wabas = wa.get_shared_business_accounts()
owned_wabas = wa.get_owned_business_accounts()
# Provision phone numbers on a WABA
phone = wa.create_phone_number(country_calling_code="1", phone_number="5551234567", verified_name="John Doe")
wa.request_verification_code(phone_id=phone.id, code_method="SMS")
wa.verify_phone_number(code="123456", phone_id=phone.id)
wa.register_phone_number(phone_id=phone.id)
# Route webhooks per-WABA or per-phone
wa.override_waba_callback_url(callback_url="https://your-platform.com/waba/123")
wa.override_phone_callback_url(callback_url="https://your-platform.com/phone/456")
# Migrate templates & flows between WABAs
wa.migrate_templates(source_waba_id=111111, destination_waba_id=222222)
wa.migrate_flows(source_waba_id=111111, destination_waba_id=222222, source_flow_names=["flow_1"])
π¦ Installation#
# Core (sending messages, no webhook server)
pip install -U pywa
# With built-in webhook server (recommended)
pip install -U "pywa[server]"
# For Flow encryption support
pip install -U "pywa[cryptography]"
# Everything
pip install -U "pywa[server,cryptography]"
Requirements: Python 3.10+
π Documentation#
Full documentation is available at pywa.readthedocs.io.
Topic |
Description |
|---|---|
Setup, first bot, and key concepts |
|
Sending messages, media, and managing resources |
|
Decorators, filters, and webhook routing |
|
Conversational flows and inline waiting |
|
Message, callback, status, and system updates |
|
Composable, reusable update filtering |
|
Create, send, and manage message templates |
|
Build interactive multi-screen flows |
|
Handle voice call events |
π€ Contributing#
Contributions are welcome! Check out the Contributing Guide to get started.
π¬ Community#
Questions? Ideas? Join the conversation:
π¬ Telegram Chat β Community discussions & support
π’ Telegram Channel β Announcements & updates
βοΈ License#
PyWa is open-source software licensed under the MIT License.
π Changelog#
NOTE: pywa follows the semver versioning standard.
4.0.0 (2026-06-09) Latest#
WORK IN PROGRESS
4.0.0b7 (2026-04-30)#
[helpers] fix incoming updates in
fastapiandstarlette[helpers] hide webhook endpoints from OpenAPI schema
[ci] streamline publish workflow for PyPI
4.0.0b6 (2026-04-25)#
[client] add
runmethod to start the webhook server and listen for updates[server] refactor webhook handling to include validation and improve endpoint management
[user] make
profiletemporary optional for testing[utils] add
start_ngrok_tunnelfunction to facilitate local webhook testing[templates] enhance
duplicatemethod to includetarget_waba_idparameter for template creation[templates] add validation for URL variables in
URLButtonto enforce constraints on example and variable usage
4.0.0b5 (2026-04-17)#
[client] add methods for creating and verifying phone numbers on WhatsApp Business Account
[templates] enhance
TemplateandTemplateDetailswith new methods for component retrieval and validation[templates] add
param_namesproperty for introspection of named parameters[templates] enhance error handling for positional and named examples in
HeaderTextandBodyText
See the full changelog here.
π Contents#
- βοΈ Get Started
- π Client
WhatsApp- Sending Messages
- Handling Updates
- Listening
- Media
- Templates
- Flows
- Business
- Managing Users
- QR Codes
- Commerce
- Calls
- Groups
- Server
- Partner tools
- Others
- Client Reference
WhatsApp.send_message()WhatsApp.send_image()WhatsApp.send_video()WhatsApp.send_audio()WhatsApp.send_voice()WhatsApp.send_document()WhatsApp.send_location()WhatsApp.request_location()WhatsApp.request_contact_info()WhatsApp.send_contact()WhatsApp.send_sticker()WhatsApp.send_catalog()WhatsApp.send_template()WhatsApp.send_product()WhatsApp.send_products()WhatsApp.send_carousel()WhatsApp.send_reaction()WhatsApp.remove_reaction()WhatsApp.mark_message_as_read()WhatsApp.indicate_typing()WhatsApp.listen()WhatsApp.stop_listening()WhatsApp.upload_media()WhatsApp.download_media()WhatsApp.stream_media()WhatsApp.get_media_bytes()WhatsApp.get_media_url()WhatsApp.delete_media()WhatsApp.get_business_account()WhatsApp.update_business_account_settings()WhatsApp.get_business_profile()WhatsApp.get_business_phone_numbers()WhatsApp.get_business_phone_number()WhatsApp.get_business_phone_number_settings()WhatsApp.update_business_phone_number_settings()WhatsApp.update_business_profile()WhatsApp.update_display_name()WhatsApp.update_conversational_automation()WhatsApp.set_business_public_key()WhatsApp.get_commerce_settings()WhatsApp.update_commerce_settings()WhatsApp.create_template()WhatsApp.upsert_authentication_template()WhatsApp.update_template()WhatsApp.get_template()WhatsApp.get_templates()WhatsApp.delete_template()WhatsApp.unpause_template()WhatsApp.archive_templates()WhatsApp.unarchive_templates()WhatsApp.compare_templates()WhatsApp.migrate_templates()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.migrate_flows()WhatsApp.block_users()WhatsApp.unblock_users()WhatsApp.get_blocked_users()WhatsApp.register_phone_number()WhatsApp.deregister_phone_number()WhatsApp.create_phone_number()WhatsApp.request_verification_code()WhatsApp.verify_phone_number()WhatsApp.create_qr_code()WhatsApp.get_qr_code()WhatsApp.get_qr_codes()WhatsApp.update_qr_code()WhatsApp.delete_qr_code()WhatsApp.set_username()WhatsApp.get_current_username()WhatsApp.get_reserved_usernames()WhatsApp.delete_username()WhatsApp.delete_qr_code()WhatsApp.get_call_permissions()WhatsApp.pre_accept_call()WhatsApp.accept_call()WhatsApp.reject_call()WhatsApp.terminate_call()WhatsApp.create_group()WhatsApp.get_group()WhatsApp.get_groups()WhatsApp.delete_group()WhatsApp.approve_group_join_requests()WhatsApp.reject_group_join_requests()WhatsApp.get_group_invite_link()WhatsApp.reset_group_invite_link()WhatsApp.remove_group_participants()WhatsApp.update_group_settings()WhatsApp.pin_message()WhatsApp.unpin_message()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.get_shared_business_accounts()WhatsApp.get_owned_business_accounts()WhatsApp.delete_phone_callback_url()WhatsApp.run()WhatsApp.webhook_update_handler()WhatsApp.webhook_update_validator()WhatsApp.webhook_challenge_handler()WhatsApp.get_flow_request_handler()WhatsApp.load_handlers_modules()
- API Reference
- Client Reference
- ποΈ Handlers
- Your First Handler
- Registering Handlers
- Available Handlers
- Handlers or Listeners?
- Making WhatsApp Reach Your App
- Registering the Callback URL
- Subscribing to Webhook Fields
- Running pywa
- Handler Order and Flow
- Validating Updates
- Using Other Web Frameworks
- What pywa runs
- 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_phone_number_change()WhatsApp.on_identity_change()WhatsApp.on_call_connect()WhatsApp.on_call_terminate()WhatsApp.on_call_status()WhatsApp.on_call_permission_update()WhatsApp.on_user_marketing_preferences()WhatsApp.on_template_status_update()WhatsApp.on_template_category_update()WhatsApp.on_template_quality_update()WhatsApp.on_template_components_update()WhatsApp.on_edited_message()WhatsApp.on_deleted_message()WhatsApp.on_outgoing_message()WhatsApp.on_outgoing_edited_message()WhatsApp.on_outgoing_deleted_message()WhatsApp.on_account_update()WhatsApp.on_raw_update()WhatsApp.remove_callbacks()WhatsApp.load_handlers_modules()
- Handler Objects
WhatsApp.add_handlers()WhatsApp.add_flow_request_handler()WhatsApp.remove_handlers()MessageHandlerCallbackButtonHandlerCallbackSelectionHandlerFlowCompletionHandlerFlowRequestHandlerMessageStatusHandlerPhoneNumberChangeHandlerIdentityChangeHandlerCallConnectHandlerCallTerminateHandlerCallStatusHandlerCallPermissionUpdateHandlerUserMarketingPreferencesHandlerTemplateStatusUpdateHandlerTemplateCategoryUpdateHandlerTemplateQualityUpdateHandlerTemplateComponentsUpdateHandlerEditedMessageHandlerDeletedMessageHandlerOutgoingMessageHandlerOutgoingEditedMessageHandlerOutgoingDeletedMessageHandlerAccountUpdateHandlerRawUpdateHandler
- Handler Decorators
- π₯ Listeners
- Listening
- Canceling
- Handling cancel and timeout
- Custom listeners
- Shortcuts
- Listeners reference
SentMessage.wait_for_reply()SentMessage.wait_for_click()SentMessage.wait_for_selection()SentMessage.wait_until_read()SentMessage.wait_until_delivered()SentMessage.wait_for_completion()SentMessage.wait_for_call_permission()SentMessage.wait_for_incoming_voice_call()SentVoiceMessage.wait_until_played()SentLocationRequest.wait_for_location()CreatedTemplate.wait_until_approved()ListenerTimeoutListenerCanceledListenerStopped
- Listeners reference
- π¬ Updates
- Supported Fields
- Update Types
- Common Properties
- Message
- Callback Button
- Callback Selection
- Flow Completion
- Message Status
- Phone Number Change
- Identity Change
- Call Connect
- Call Terminate
- Call Status
- Call Permission Update
- User Marketing Preferences
- Template Status Update
- Template Category Update
- Template Quality Update
- Template Components Update
- Edited Message
- Deleted Message
- Outgoing Message
- Outgoing Edited Message
- Outgoing Deleted Message
- Account Update
- Raw Update
- Common methods
BaseUpdateBaseUserUpdateBaseUserUpdate.senderBaseUserUpdate.recipientBaseUserUpdate.block_sender()BaseUserUpdate.call()BaseUserUpdate.indicate_typing()BaseUserUpdate.mark_as_read()BaseUserUpdate.react()BaseUserUpdate.reply_audio()BaseUserUpdate.reply_carousel()BaseUserUpdate.reply_catalog()BaseUserUpdate.reply_contact()BaseUserUpdate.reply_contact_info_request()BaseUserUpdate.reply_document()BaseUserUpdate.reply_image()BaseUserUpdate.reply_location()BaseUserUpdate.reply_location_request()BaseUserUpdate.reply_product()BaseUserUpdate.reply_products()BaseUserUpdate.reply_sticker()BaseUserUpdate.reply_template()BaseUserUpdate.reply_text()BaseUserUpdate.reply_video()BaseUserUpdate.reply_voice()BaseUserUpdate.unreact()BaseUserUpdate.unblock_sender()BaseUserUpdate.message_id_to_reply
- β»οΈ Flows
- Creating Flow
- Available components
- Sending Flow
- Getting Flow Completion message
- Handling Flow requests
- Flow JSON
FlowJSONScreenScreenDataScreenDataUpdateLayoutLayoutTypeFormFormComponentTextHeadingTextSubheadingTextBodyTextCaptionRichTextFontWeightTextInputInputTypeTextAreaCheckboxGroupChipsSelectorRadioButtonsGroupMediaSizeFooterOptInDropdownEmbeddedLinkNavigationListNavigationItemNavigationItemStartNavigationItemMainContentNavigationItemEndDatePickerCalendarPickerCalendarPickerModeCalendarDayImageScaleTypePhotoPickerPhotoSourceDocumentPickerIfSwitchDataSourceDataExchangeActionNavigateActionCompleteActionUpdateDataActionOpenURLActionNextNextTypeFlowStrScreenDataRefComponentRefConditionMathExpression
- Flow Types
FlowRequestFlowRequestActionTypeFlowResponseFlowCategoryFlowDetailsFlowStatusFlowPreviewFlowJSONUpdateResultFlowValidationErrorFlowAssetFlowMetricNameFlowMetricGranularityCreatedFlowMigrateFlowsResponseMigratedFlowMigratedFlowErrorFlowResponseErrorFlowTokenNoLongerValidFlowRequestSignatureAuthenticationFailedFlowRequestDecryptedMediaFlowRequestDecryptorFlowResponseEncryptordefault_flow_request_decryptor()default_flow_response_encryptor()flow_request_media_decryptor()FlowRequestCallbackWrapper
- Flow JSON
- π Templates
- Defining Template
- Template Components
- Creating Template
- Sending Template
- Media Templates
- Authentication Templates
- Template Library
- Template Types
TemplateTemplateDetailsTemplateStatusQualityScoreLibraryTemplateTemplateCategoryTemplateLanguageParamFormatHeaderTextHeaderImageHeaderVideoHeaderDocumentHeaderGIFHeaderLocationHeaderProductBodyTextDateTimeCurrencyFooterTextButtonsCopyCodeButtonFlowButtonFlowButtonIconPhoneNumberButtonVoiceCallButtonCallPermissionRequestButtonQuickReplyButtonURLButtonAppDeepLinkCatalogButtonMPMButtonSPMButtonOneTapOTPButtonZeroTapOTPButtonCopyCodeOTPButtonOTPSupportedAppLimitedTimeOfferCarouselCarouselCardTapTargetConfigurationAuthenticationBodyAuthenticationFooterTemplatesResultCreatedTemplateCreatedTemplatesUpdatedTemplateTemplateUnpauseResultTemplatesCompareResultTopBlockReasonTypeMigrateTemplatesResultMigratedTemplateMigratedTemplateErrorDegreesOfFreedomSpecCreativeFeaturesSpec
- Template Types
- π¬ Filters
- Basic Usage
- Combining Filters
- Custom Filters
- Built-in Filters
- Common filters
new()filters.messagefilters.callback_buttonfilters.callback_selectionfilters.message_statusfilters.flow_completionfilters.call_connectfilters.call_terminatefilters.call_statusfilters.call_permission_updatefilters.user_marketing_preferencesfilters.template_statusfilters.template_categoryfilters.template_qualityfilters.template_componentsfilters.phone_number_changefilters.identity_changefilters.account_updatefilters.privatefilters.groupsent_to()filters.sent_to_mefrom_users()no_wa_id()from_countries()matches()contains()startswith()endswith()regex()
- 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
- Common filters
- β οΈ Errors
- Basic Example
- Message Status Errors
- Handling Specific Errors
- Incoming Errors (Unsupported Messages)
- Catching All Exceptions
- Base Exception
- Categories of Exceptions
- Sending Messages Errors
SendMessageErrorMessageUndeliverableReEngagementMessageUnsupportedMessageTypeRecipientNotInAllowedListInvalidParameterMissingRequiredParameterMediaDownloadErrorMediaUploadErrorTemplateParamCountMismatchTemplateParamFormatMismatchTemplateNotExistsTemplateTextTooLongGenericErrorUnknownErrorAccessDeniedServiceUnavailableRecipientCannotBeSenderBusinessPaymentIssueIncorrectCertificateAccountInMaintenanceModeUserIsInExperimentGroupRecipientIdentityKeyMismatchUserStoppedMarketingMessagesBSUIDRecipientNotSupportedMarketingTemplatesDisabledForCloudAPI
- Flows Errors
- Authorization Errors
- Rate Limit Errors
- Integrity Errors
- Block Users Errors
- Calling Errors
- Username Errors
- Template Creation Errors
- Group Errors
GroupErrorBadGroupGroupUnknownGroupInvalidCursorGroupRequestPartiallySucceededGroupDuplicateParticipantGroupParticipantOverlimitGroupSuspendedGroupRateLimitHitGroupInvalidProfilePictureAspectRatioGroupImageTooSmallGroupCreationLimitReachedGroupParticipantNotInGroupGroupJoinRequestDoesNotExistGroupCreationTemporarilyDisabledGroupAPINotEligible
- Sending Messages Errors
- βοΈ Types
- Media
- Keyboard
- Others
SentMessageSentTemplateSentMediaMessageSentVoiceMessageSentLocationRequestSentReactionSentTemplateStatusSuccessResultResultPaginationBusinessVerificationStatusMarketingMessagesLiteAPIStatusMarketingMessagesOnboardingStatusBusinessProfileBusinessPhoneNumberBusinessPhoneNumberSettingsStorageConfigurationConversationalAutomationQRCodeQRCodeImageTypeCommandCommerceSettingsIndustryWhatsAppBusinessAccountFacebookApplicationUsersBlockedResultUsersUnblockedResultBlockUserFailureVersionStopHandlingContinueHandlingCallbackURLScopeWebhookFieldsstart_ngrok_tunnel()
- π₯ Groups
- π Calls
- Call Types
CallingSettingsCallingSettingsStatusCallIconVisibilityCallbackPermissionStatusSIPServerSIPStatusSTRPKeyExchangeProtocolCallHoursWeekDayMondayTuesdayWednesdayThursdayFridaySaturdaySundayHolidayScheduleCallPermissionsCallPermissionCallPermissionStatusCallPermissionActionCallPermissionActionLimit
- Call Types
- π‘ Examples
- π Changelog
- 4.0.0 (2026-06-09) Latest
- 4.0.0b7 (2026-04-30)
- 4.0.0b6 (2026-04-25)
- 4.0.0b5 (2026-04-17)
- 4.0.0b4 (2026-04-11)
- 4.0.0b3 (2026-04-01)
- 4.0.0b1 (2026-03-30)
- 3.9.0 (2026-03-11) Latest
- 3.8.0 (2026-01-23)
- 3.7.0 (2026-01-11)
- 3.6.1 (2025-12-11)
- 3.6.0 (2025-11-27)
- 3.5.2 (2025-11-17)
- 3.5.1 (2025-11-08)
- 3.5.0 (2025-11-08)
- 3.4.0 (2025-10-26)
- 3.3.0 (2025-10-26)
- 3.2.0 (2025-10-24)
- 3.1.1 (2025-09-21)
- 3.1.0 (2025-09-21)
- 3.0.0 (2025-08-22)
- 3.0.0-rc.3 (2025-08-06)
- 3.0.0-rc.2 (2025-08-04)
- 3.0.0-rc.1 (2025-07-31)
- 2.11.0 (2025-06-17)
- 2.10.0 (2025-05-14)
- 2.9.0 (2025-05-04)
- 2.8.0 (2025-04-27)
- 2.7.0 (2025-01-18)
- 2.6.0 (2025-01-11)
- 2.5.2 (2025-01-07)
- 2.5.1 (2025-01-02)
- 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 3.x to 4.x
- New features
- Breaking changes
- Migration steps
- Step 1: Update user identity storage
- Step 7: Run webhooks with the new built-in server
- Step 3: Update filters that identify users
- Step 4: Replace in-memory media downloads
- Step 5: Update sent-message recipient access
- Step 6: Replace
ChatOpenedentry points - Step 7: Use chat-aware group/private handling
- Migration from 2.x to 3.x
- Migration from 1.x to 2.x