linq-python 0.39.0__tar.gz → 0.40.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- linq_python-0.40.0/.release-please-manifest.json +3 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/CHANGELOG.md +14 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/PKG-INFO +1 -1
- {linq_python-0.39.0 → linq_python-0.40.0}/api.md +1 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/pyproject.toml +1 -1
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_client.py +12 -12
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_version.py +1 -1
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/payment_requests.py +4 -4
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/webhook_subscriptions.py +2 -2
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/__init__.py +1 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat.py +5 -5
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_create_response.py +5 -5
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_created_webhook_event.py +5 -5
- linq_python-0.40.0/src/linq/types/contact_card_received_webhook_event.py +86 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_edited_webhook_event.py +5 -5
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_event_v2.py +5 -5
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/phone_number_list_response.py +4 -3
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/unwrap_webhook_event.py +2 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/webhook_event_list_response.py +1 -1
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_webhooks.py +2 -2
- {linq_python-0.39.0 → linq_python-0.40.0}/uv.lock +1 -1
- linq_python-0.39.0/.release-please-manifest.json +0 -3
- {linq_python-0.39.0 → linq_python-0.40.0}/.gitignore +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/CONTRIBUTING.md +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/LICENSE +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/README.md +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/SECURITY.md +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/bin/check-release-environment +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/bin/publish-pypi +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/examples/.keep +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/release-please-config.json +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/requirements-dev.lock +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/__init__.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_base_client.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_compat.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_constants.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_exceptions.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_files.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_models.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_qs.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_resource.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_streaming.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_types.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/__init__.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_compat.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_datetime_parse.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_json.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_logs.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_path.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_proxy.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_reflection.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_resources_proxy.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_streams.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_sync.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_transform.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_typing.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_utils.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/lib/.keep +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/pagination.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/py.typed +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/__init__.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/attachments.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/available_number.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/blocked_handles.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/capability.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/chats/__init__.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/chats/background.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/chats/chats.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/chats/location.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/chats/messages.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/chats/participants.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/chats/polls.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/chats/typing.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/contact_card.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/experiences.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/messages/__init__.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/messages/messages.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/messages/poll.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/payment_handles.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/payment_providers.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/payments.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/phone_numbers.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/phonenumbers.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/webhook_events.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/webhooks.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/attachment_create_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/attachment_create_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/attachment_retrieve_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/available_number_retrieve_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/available_number_retrieve_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/blocked_handle_block_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/blocked_handle_block_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/blocked_handle_entry.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/blocked_handle_list_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/blocked_handle_unblock_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/capability_check_RCS_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/capability_check_i_message_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_background_update_failed_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_background_updated_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_create_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_group_icon_update_failed_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_group_icon_updated_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_group_name_update_failed_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_group_name_updated_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_leave_chat_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_list_chats_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_send_voicememo_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_send_voicememo_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_typing_indicator_started_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_typing_indicator_stopped_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_update_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_update_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/__init__.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/background_set_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/get_chat_location_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/location_request_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/message_list_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/message_send_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/message_send_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/participant_add_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/participant_add_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/participant_remove_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/participant_remove_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/poll.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/poll_create_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/poll_envelope.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/sent_message.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/contact_card_create_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/contact_card_retrieve_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/contact_card_retrieve_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/contact_card_update_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/experience_list_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/experience_retrieve_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/handle_check_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/link_part_param.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/media_part_param.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_add_reaction_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_add_reaction_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_content_param.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_create_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_create_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_delivered_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_effect.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_effect_param.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_failed_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_list_messages_thread_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_read_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_received_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_sent_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_update_app_card_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_update_app_card_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_update_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/messages/__init__.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/messages/poll_add_options_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/messages/poll_vote_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/participant_added_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/participant_removed_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_create_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_credentials_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_handle_connection.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_handle_verify_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_provider.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_provider_connect_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_provider_connect_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_request.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_request_create_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_request_list_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_request_list_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/phone_number_status_updated_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/phone_number_update_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/phone_number_update_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/phonenumber_list_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/poll_delivered_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/poll_failed_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/poll_reaction_added_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/poll_read_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/poll_received_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/poll_sent_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/poll_updated_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/poll_vote_added_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/poll_vote_removed_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reaction_added_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reaction_event_base.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reaction_removed_webhook_event.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reply_to.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reply_to_param.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reputation_action_item.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reputation_audit.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reputation_audit_started.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reputation_driver.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reputation_driver_key.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reputation_evidence.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reputation_opt_out_chat.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reputation_report.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reputation_unhealthy_chat.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/schemas_media_part_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/schemas_message_effect.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/schemas_text_part_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/set_contact_card.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared/__init__.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared/chat_handle.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared/link_part_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared/media_part_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared/reaction.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared/reaction_type.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared/service_type.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared/text_decoration.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared/text_part_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared_params/__init__.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared_params/reaction_type.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared_params/service_type.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared_params/text_decoration.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/supported_content_type.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/text_part_param.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/webhook_event_type.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/webhook_subscription.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/webhook_subscription_create_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/webhook_subscription_create_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/webhook_subscription_list_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/webhook_subscription_update_params.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/__init__.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/__init__.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/chats/__init__.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/chats/test_background.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/chats/test_location.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/chats/test_messages.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/chats/test_participants.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/chats/test_polls.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/chats/test_typing.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/messages/__init__.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/messages/test_poll.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_attachments.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_available_number.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_blocked_handles.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_capability.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_chats.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_contact_card.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_experiences.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_messages.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_payment_handles.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_payment_providers.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_payment_requests.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_payments.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_phone_numbers.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_phonenumbers.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_webhook_events.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_webhook_subscriptions.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/conftest.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/sample_file.txt +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_client.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_extract_files.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_files.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_models.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_qs.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_required_args.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_response.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_streaming.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_transform.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_utils/test_datetime_parse.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_utils/test_json.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_utils/test_path.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_utils/test_proxy.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_utils/test_typing.py +0 -0
- {linq_python-0.39.0 → linq_python-0.40.0}/tests/utils.py +0 -0
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.40.0](https://github.com/linq-team/linq-python/compare/v0.39.1...v0.40.0) (2026-09-01)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* add contact card received webhook event ([82481ec](https://github.com/linq-team/linq-python/commit/82481ec3e3e7031e307e6234bc0c2775d0e08c46))
|
|
9
|
+
|
|
10
|
+
## [0.39.1](https://github.com/linq-team/linq-python/compare/v0.39.0...v0.39.1) (2026-09-01)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* update documentation links to include imessage channel path ([ee83a35](https://github.com/linq-team/linq-python/commit/ee83a355f4b017634bb477e794ea3bf5434ff26b))
|
|
16
|
+
|
|
3
17
|
## [0.39.0](https://github.com/linq-team/linq-python/compare/v0.38.0...v0.39.0) (2026-09-01)
|
|
4
18
|
|
|
5
19
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: linq-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.40.0
|
|
4
4
|
Summary: The official Python library for the linq-api-v3 API
|
|
5
5
|
Project-URL: Homepage, https://github.com/linq-team/linq-python
|
|
6
6
|
Project-URL: Repository, https://github.com/linq-team/linq-python
|
|
@@ -391,6 +391,7 @@ from linq.types import (
|
|
|
391
391
|
ChatTypingIndicatorStoppedWebhookEvent,
|
|
392
392
|
ChatBackgroundUpdatedWebhookEvent,
|
|
393
393
|
ChatBackgroundUpdateFailedWebhookEvent,
|
|
394
|
+
ContactCardReceivedWebhookEvent,
|
|
394
395
|
PhoneNumberStatusUpdatedWebhookEvent,
|
|
395
396
|
UnwrapWebhookEvent,
|
|
396
397
|
)
|
|
@@ -622,7 +622,7 @@ class LinqAPIV3(SyncAPIClient):
|
|
|
622
622
|
`POST /v3/chats/{chatId}/messages` — it renders as a rich card with your
|
|
623
623
|
branding (title, amount, image) instead of a bare URL, which converts far
|
|
624
624
|
better. A `link` part must be the only part in the message. See
|
|
625
|
-
[Rich Link Previews](/guides/messaging/sending-messages).
|
|
625
|
+
[Rich Link Previews](/channel/imessage/guides/messaging/sending-messages).
|
|
626
626
|
|
|
627
627
|
On a supported iPhone the link opens an **Apple Pay App Clip** — a native,
|
|
628
628
|
no-install checkout sheet. Everywhere else (Android, desktop, iPhones
|
|
@@ -672,7 +672,7 @@ class LinqAPIV3(SyncAPIClient):
|
|
|
672
672
|
Subscribe to payment lifecycle events to reconcile server-side rather than
|
|
673
673
|
polling: `payment.succeeded`, `payment.canceled`, and `payment.expired`.
|
|
674
674
|
Each event carries the payment request id, amount, currency, and your
|
|
675
|
-
`metadata`. See [Webhooks](/guides/webhooks).
|
|
675
|
+
`metadata`. See [Webhooks](/channel/imessage/guides/webhooks).
|
|
676
676
|
"""
|
|
677
677
|
from .resources.payment_requests import PaymentRequestsResource
|
|
678
678
|
|
|
@@ -1738,7 +1738,7 @@ class AsyncLinqAPIV3(AsyncAPIClient):
|
|
|
1738
1738
|
`POST /v3/chats/{chatId}/messages` — it renders as a rich card with your
|
|
1739
1739
|
branding (title, amount, image) instead of a bare URL, which converts far
|
|
1740
1740
|
better. A `link` part must be the only part in the message. See
|
|
1741
|
-
[Rich Link Previews](/guides/messaging/sending-messages).
|
|
1741
|
+
[Rich Link Previews](/channel/imessage/guides/messaging/sending-messages).
|
|
1742
1742
|
|
|
1743
1743
|
On a supported iPhone the link opens an **Apple Pay App Clip** — a native,
|
|
1744
1744
|
no-install checkout sheet. Everywhere else (Android, desktop, iPhones
|
|
@@ -1788,7 +1788,7 @@ class AsyncLinqAPIV3(AsyncAPIClient):
|
|
|
1788
1788
|
Subscribe to payment lifecycle events to reconcile server-side rather than
|
|
1789
1789
|
polling: `payment.succeeded`, `payment.canceled`, and `payment.expired`.
|
|
1790
1790
|
Each event carries the payment request id, amount, currency, and your
|
|
1791
|
-
`metadata`. See [Webhooks](/guides/webhooks).
|
|
1791
|
+
`metadata`. See [Webhooks](/channel/imessage/guides/webhooks).
|
|
1792
1792
|
"""
|
|
1793
1793
|
from .resources.payment_requests import AsyncPaymentRequestsResource
|
|
1794
1794
|
|
|
@@ -2788,7 +2788,7 @@ class LinqAPIV3WithRawResponse:
|
|
|
2788
2788
|
`POST /v3/chats/{chatId}/messages` — it renders as a rich card with your
|
|
2789
2789
|
branding (title, amount, image) instead of a bare URL, which converts far
|
|
2790
2790
|
better. A `link` part must be the only part in the message. See
|
|
2791
|
-
[Rich Link Previews](/guides/messaging/sending-messages).
|
|
2791
|
+
[Rich Link Previews](/channel/imessage/guides/messaging/sending-messages).
|
|
2792
2792
|
|
|
2793
2793
|
On a supported iPhone the link opens an **Apple Pay App Clip** — a native,
|
|
2794
2794
|
no-install checkout sheet. Everywhere else (Android, desktop, iPhones
|
|
@@ -2838,7 +2838,7 @@ class LinqAPIV3WithRawResponse:
|
|
|
2838
2838
|
Subscribe to payment lifecycle events to reconcile server-side rather than
|
|
2839
2839
|
polling: `payment.succeeded`, `payment.canceled`, and `payment.expired`.
|
|
2840
2840
|
Each event carries the payment request id, amount, currency, and your
|
|
2841
|
-
`metadata`. See [Webhooks](/guides/webhooks).
|
|
2841
|
+
`metadata`. See [Webhooks](/channel/imessage/guides/webhooks).
|
|
2842
2842
|
"""
|
|
2843
2843
|
from .resources.payment_requests import PaymentRequestsResourceWithRawResponse
|
|
2844
2844
|
|
|
@@ -3710,7 +3710,7 @@ class AsyncLinqAPIV3WithRawResponse:
|
|
|
3710
3710
|
`POST /v3/chats/{chatId}/messages` — it renders as a rich card with your
|
|
3711
3711
|
branding (title, amount, image) instead of a bare URL, which converts far
|
|
3712
3712
|
better. A `link` part must be the only part in the message. See
|
|
3713
|
-
[Rich Link Previews](/guides/messaging/sending-messages).
|
|
3713
|
+
[Rich Link Previews](/channel/imessage/guides/messaging/sending-messages).
|
|
3714
3714
|
|
|
3715
3715
|
On a supported iPhone the link opens an **Apple Pay App Clip** — a native,
|
|
3716
3716
|
no-install checkout sheet. Everywhere else (Android, desktop, iPhones
|
|
@@ -3760,7 +3760,7 @@ class AsyncLinqAPIV3WithRawResponse:
|
|
|
3760
3760
|
Subscribe to payment lifecycle events to reconcile server-side rather than
|
|
3761
3761
|
polling: `payment.succeeded`, `payment.canceled`, and `payment.expired`.
|
|
3762
3762
|
Each event carries the payment request id, amount, currency, and your
|
|
3763
|
-
`metadata`. See [Webhooks](/guides/webhooks).
|
|
3763
|
+
`metadata`. See [Webhooks](/channel/imessage/guides/webhooks).
|
|
3764
3764
|
"""
|
|
3765
3765
|
from .resources.payment_requests import AsyncPaymentRequestsResourceWithRawResponse
|
|
3766
3766
|
|
|
@@ -4632,7 +4632,7 @@ class LinqAPIV3WithStreamedResponse:
|
|
|
4632
4632
|
`POST /v3/chats/{chatId}/messages` — it renders as a rich card with your
|
|
4633
4633
|
branding (title, amount, image) instead of a bare URL, which converts far
|
|
4634
4634
|
better. A `link` part must be the only part in the message. See
|
|
4635
|
-
[Rich Link Previews](/guides/messaging/sending-messages).
|
|
4635
|
+
[Rich Link Previews](/channel/imessage/guides/messaging/sending-messages).
|
|
4636
4636
|
|
|
4637
4637
|
On a supported iPhone the link opens an **Apple Pay App Clip** — a native,
|
|
4638
4638
|
no-install checkout sheet. Everywhere else (Android, desktop, iPhones
|
|
@@ -4682,7 +4682,7 @@ class LinqAPIV3WithStreamedResponse:
|
|
|
4682
4682
|
Subscribe to payment lifecycle events to reconcile server-side rather than
|
|
4683
4683
|
polling: `payment.succeeded`, `payment.canceled`, and `payment.expired`.
|
|
4684
4684
|
Each event carries the payment request id, amount, currency, and your
|
|
4685
|
-
`metadata`. See [Webhooks](/guides/webhooks).
|
|
4685
|
+
`metadata`. See [Webhooks](/channel/imessage/guides/webhooks).
|
|
4686
4686
|
"""
|
|
4687
4687
|
from .resources.payment_requests import PaymentRequestsResourceWithStreamingResponse
|
|
4688
4688
|
|
|
@@ -5554,7 +5554,7 @@ class AsyncLinqAPIV3WithStreamedResponse:
|
|
|
5554
5554
|
`POST /v3/chats/{chatId}/messages` — it renders as a rich card with your
|
|
5555
5555
|
branding (title, amount, image) instead of a bare URL, which converts far
|
|
5556
5556
|
better. A `link` part must be the only part in the message. See
|
|
5557
|
-
[Rich Link Previews](/guides/messaging/sending-messages).
|
|
5557
|
+
[Rich Link Previews](/channel/imessage/guides/messaging/sending-messages).
|
|
5558
5558
|
|
|
5559
5559
|
On a supported iPhone the link opens an **Apple Pay App Clip** — a native,
|
|
5560
5560
|
no-install checkout sheet. Everywhere else (Android, desktop, iPhones
|
|
@@ -5604,7 +5604,7 @@ class AsyncLinqAPIV3WithStreamedResponse:
|
|
|
5604
5604
|
Subscribe to payment lifecycle events to reconcile server-side rather than
|
|
5605
5605
|
polling: `payment.succeeded`, `payment.canceled`, and `payment.expired`.
|
|
5606
5606
|
Each event carries the payment request id, amount, currency, and your
|
|
5607
|
-
`metadata`. See [Webhooks](/guides/webhooks).
|
|
5607
|
+
`metadata`. See [Webhooks](/channel/imessage/guides/webhooks).
|
|
5608
5608
|
"""
|
|
5609
5609
|
from .resources.payment_requests import AsyncPaymentRequestsResourceWithStreamingResponse
|
|
5610
5610
|
|
|
@@ -163,7 +163,7 @@ class PaymentRequestsResource(SyncAPIResource):
|
|
|
163
163
|
`POST /v3/chats/{chatId}/messages` — it renders as a rich card with your
|
|
164
164
|
branding (title, amount, image) instead of a bare URL, which converts far
|
|
165
165
|
better. A `link` part must be the only part in the message. See
|
|
166
|
-
[Rich Link Previews](/guides/messaging/sending-messages).
|
|
166
|
+
[Rich Link Previews](/channel/imessage/guides/messaging/sending-messages).
|
|
167
167
|
|
|
168
168
|
On a supported iPhone the link opens an **Apple Pay App Clip** — a native,
|
|
169
169
|
no-install checkout sheet. Everywhere else (Android, desktop, iPhones
|
|
@@ -213,7 +213,7 @@ class PaymentRequestsResource(SyncAPIResource):
|
|
|
213
213
|
Subscribe to payment lifecycle events to reconcile server-side rather than
|
|
214
214
|
polling: `payment.succeeded`, `payment.canceled`, and `payment.expired`.
|
|
215
215
|
Each event carries the payment request id, amount, currency, and your
|
|
216
|
-
`metadata`. See [Webhooks](/guides/webhooks).
|
|
216
|
+
`metadata`. See [Webhooks](/channel/imessage/guides/webhooks).
|
|
217
217
|
"""
|
|
218
218
|
|
|
219
219
|
@cached_property
|
|
@@ -628,7 +628,7 @@ class AsyncPaymentRequestsResource(AsyncAPIResource):
|
|
|
628
628
|
`POST /v3/chats/{chatId}/messages` — it renders as a rich card with your
|
|
629
629
|
branding (title, amount, image) instead of a bare URL, which converts far
|
|
630
630
|
better. A `link` part must be the only part in the message. See
|
|
631
|
-
[Rich Link Previews](/guides/messaging/sending-messages).
|
|
631
|
+
[Rich Link Previews](/channel/imessage/guides/messaging/sending-messages).
|
|
632
632
|
|
|
633
633
|
On a supported iPhone the link opens an **Apple Pay App Clip** — a native,
|
|
634
634
|
no-install checkout sheet. Everywhere else (Android, desktop, iPhones
|
|
@@ -678,7 +678,7 @@ class AsyncPaymentRequestsResource(AsyncAPIResource):
|
|
|
678
678
|
Subscribe to payment lifecycle events to reconcile server-side rather than
|
|
679
679
|
polling: `payment.succeeded`, `payment.canceled`, and `payment.expired`.
|
|
680
680
|
Each event carries the payment request id, amount, currency, and your
|
|
681
|
-
`metadata`. See [Webhooks](/guides/webhooks).
|
|
681
|
+
`metadata`. See [Webhooks](/channel/imessage/guides/webhooks).
|
|
682
682
|
"""
|
|
683
683
|
|
|
684
684
|
@cached_property
|
|
@@ -213,7 +213,7 @@ class WebhookSubscriptionsResource(SyncAPIResource):
|
|
|
213
213
|
- Legacy `X-Webhook-*` headers are also sent for backwards compatibility
|
|
214
214
|
(deprecated)
|
|
215
215
|
- See
|
|
216
|
-
[Verifying Webhook Signatures](https://docs.linqapp.com/guides/webhooks#verifying-webhook-signatures)
|
|
216
|
+
[Verifying Webhook Signatures](https://docs.linqapp.com/channel/imessage/guides/webhooks#verifying-webhook-signatures)
|
|
217
217
|
for verification details
|
|
218
218
|
- Failed deliveries (5xx, 429, network errors) are retried up to 10 times over
|
|
219
219
|
~25 minutes with exponential backoff
|
|
@@ -593,7 +593,7 @@ class AsyncWebhookSubscriptionsResource(AsyncAPIResource):
|
|
|
593
593
|
- Legacy `X-Webhook-*` headers are also sent for backwards compatibility
|
|
594
594
|
(deprecated)
|
|
595
595
|
- See
|
|
596
|
-
[Verifying Webhook Signatures](https://docs.linqapp.com/guides/webhooks#verifying-webhook-signatures)
|
|
596
|
+
[Verifying Webhook Signatures](https://docs.linqapp.com/channel/imessage/guides/webhooks#verifying-webhook-signatures)
|
|
597
597
|
for verification details
|
|
598
598
|
- Failed deliveries (5xx, 429, network errors) are retried up to 10 times over
|
|
599
599
|
~25 minutes with exponential backoff
|
|
@@ -115,6 +115,7 @@ from .available_number_retrieve_response import AvailableNumberRetrieveResponse
|
|
|
115
115
|
from .webhook_subscription_create_params import WebhookSubscriptionCreateParams as WebhookSubscriptionCreateParams
|
|
116
116
|
from .webhook_subscription_list_response import WebhookSubscriptionListResponse as WebhookSubscriptionListResponse
|
|
117
117
|
from .webhook_subscription_update_params import WebhookSubscriptionUpdateParams as WebhookSubscriptionUpdateParams
|
|
118
|
+
from .contact_card_received_webhook_event import ContactCardReceivedWebhookEvent as ContactCardReceivedWebhookEvent
|
|
118
119
|
from .message_list_messages_thread_params import MessageListMessagesThreadParams as MessageListMessagesThreadParams
|
|
119
120
|
from .webhook_subscription_create_response import WebhookSubscriptionCreateResponse as WebhookSubscriptionCreateResponse
|
|
120
121
|
from .chat_background_updated_webhook_event import (
|
|
@@ -18,7 +18,7 @@ class HealthStatus(BaseModel):
|
|
|
18
18
|
|
|
19
19
|
Switch on `status` to surface chat and line health in your UI — the enum is the long-term contract. Each status carries a `doc_url` that deep-links to the relevant section of the Chat Health guide. To gate a send, act on the response rather than the status: a `403` is the authoritative answer.
|
|
20
20
|
|
|
21
|
-
See the [Chat Health guide](/guides/chats/chat-health) for what each status means and how to react.
|
|
21
|
+
See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each status means and how to react.
|
|
22
22
|
"""
|
|
23
23
|
|
|
24
24
|
doc_url: str
|
|
@@ -27,8 +27,8 @@ class HealthStatus(BaseModel):
|
|
|
27
27
|
status: Literal["HEALTHY", "AT_RISK", "CRITICAL", "OPTED_OUT"]
|
|
28
28
|
"""Current health bucket for the chat.
|
|
29
29
|
|
|
30
|
-
See the [Chat Health guide](/guides/chats/chat-health) for what
|
|
31
|
-
and how to react. `doc_url` deep-links to the relevant section.
|
|
30
|
+
See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what
|
|
31
|
+
each value means and how to react. `doc_url` deep-links to the relevant section.
|
|
32
32
|
|
|
33
33
|
`OPTED_OUT` — the recipient sent `STOP`, `UNSUBSCRIBE`, `OPTOUT`, `CANCEL`,
|
|
34
34
|
`END`, or `QUIT`. The keyword must be the whole trimmed message, never part of a
|
|
@@ -88,8 +88,8 @@ class Chat(BaseModel):
|
|
|
88
88
|
relevant section of the Chat Health guide. To gate a send, act on the response
|
|
89
89
|
rather than the status: a `403` is the authoritative answer.
|
|
90
90
|
|
|
91
|
-
See the [Chat Health guide](/guides/chats/chat-health) for what
|
|
92
|
-
means and how to react.
|
|
91
|
+
See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what
|
|
92
|
+
each status means and how to react.
|
|
93
93
|
"""
|
|
94
94
|
|
|
95
95
|
is_archived: bool
|
|
@@ -19,7 +19,7 @@ class ChatHealthStatus(BaseModel):
|
|
|
19
19
|
|
|
20
20
|
Switch on `status` to surface chat and line health in your UI — the enum is the long-term contract. Each status carries a `doc_url` that deep-links to the relevant section of the Chat Health guide. To gate a send, act on the response rather than the status: a `403` is the authoritative answer.
|
|
21
21
|
|
|
22
|
-
See the [Chat Health guide](/guides/chats/chat-health) for what each status means and how to react.
|
|
22
|
+
See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each status means and how to react.
|
|
23
23
|
"""
|
|
24
24
|
|
|
25
25
|
doc_url: str
|
|
@@ -28,8 +28,8 @@ class ChatHealthStatus(BaseModel):
|
|
|
28
28
|
status: Literal["HEALTHY", "AT_RISK", "CRITICAL", "OPTED_OUT"]
|
|
29
29
|
"""Current health bucket for the chat.
|
|
30
30
|
|
|
31
|
-
See the [Chat Health guide](/guides/chats/chat-health) for what
|
|
32
|
-
and how to react. `doc_url` deep-links to the relevant section.
|
|
31
|
+
See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what
|
|
32
|
+
each value means and how to react. `doc_url` deep-links to the relevant section.
|
|
33
33
|
|
|
34
34
|
`OPTED_OUT` — the recipient sent `STOP`, `UNSUBSCRIBE`, `OPTOUT`, `CANCEL`,
|
|
35
35
|
`END`, or `QUIT`. The keyword must be the whole trimmed message, never part of a
|
|
@@ -86,8 +86,8 @@ class Chat(BaseModel):
|
|
|
86
86
|
relevant section of the Chat Health guide. To gate a send, act on the response
|
|
87
87
|
rather than the status: a `403` is the authoritative answer.
|
|
88
88
|
|
|
89
|
-
See the [Chat Health guide](/guides/chats/chat-health) for what
|
|
90
|
-
means and how to react.
|
|
89
|
+
See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what
|
|
90
|
+
each status means and how to react.
|
|
91
91
|
"""
|
|
92
92
|
|
|
93
93
|
is_group: bool
|
|
@@ -19,7 +19,7 @@ class DataHealthStatus(BaseModel):
|
|
|
19
19
|
|
|
20
20
|
Switch on `status` to surface chat and line health in your UI — the enum is the long-term contract. Each status carries a `doc_url` that deep-links to the relevant section of the Chat Health guide. To gate a send, act on the response rather than the status: a `403` is the authoritative answer.
|
|
21
21
|
|
|
22
|
-
See the [Chat Health guide](/guides/chats/chat-health) for what each status means and how to react.
|
|
22
|
+
See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each status means and how to react.
|
|
23
23
|
"""
|
|
24
24
|
|
|
25
25
|
doc_url: str
|
|
@@ -28,8 +28,8 @@ class DataHealthStatus(BaseModel):
|
|
|
28
28
|
status: Literal["HEALTHY", "AT_RISK", "CRITICAL", "OPTED_OUT"]
|
|
29
29
|
"""Current health bucket for the chat.
|
|
30
30
|
|
|
31
|
-
See the [Chat Health guide](/guides/chats/chat-health) for what
|
|
32
|
-
and how to react. `doc_url` deep-links to the relevant section.
|
|
31
|
+
See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what
|
|
32
|
+
each value means and how to react. `doc_url` deep-links to the relevant section.
|
|
33
33
|
|
|
34
34
|
`OPTED_OUT` — the recipient sent `STOP`, `UNSUBSCRIBE`, `OPTOUT`, `CANCEL`,
|
|
35
35
|
`END`, or `QUIT`. The keyword must be the whole trimmed message, never part of a
|
|
@@ -94,8 +94,8 @@ class Data(BaseModel):
|
|
|
94
94
|
relevant section of the Chat Health guide. To gate a send, act on the response
|
|
95
95
|
rather than the status: a `403` is the authoritative answer.
|
|
96
96
|
|
|
97
|
-
See the [Chat Health guide](/guides/chats/chat-health) for what
|
|
98
|
-
means and how to react.
|
|
97
|
+
See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what
|
|
98
|
+
each status means and how to react.
|
|
99
99
|
"""
|
|
100
100
|
|
|
101
101
|
is_group: bool
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
|
|
6
|
+
from .._models import BaseModel
|
|
7
|
+
from .webhook_event_type import WebhookEventType
|
|
8
|
+
|
|
9
|
+
__all__ = ["ContactCardReceivedWebhookEvent", "Data"]
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Data(BaseModel):
|
|
13
|
+
"""Payload for contact_card.received webhook events.
|
|
14
|
+
|
|
15
|
+
A contact belongs to a line, not to an individual chat. You receive one event per person who
|
|
16
|
+
shares their contact, regardless of how many chats they have in common with your line.
|
|
17
|
+
|
|
18
|
+
The event fires again whenever the shared contact's name or media changes.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
first_name: str
|
|
22
|
+
"""First name from the shared contact card"""
|
|
23
|
+
|
|
24
|
+
last_name: str
|
|
25
|
+
"""Last name from the shared contact card (may be empty)"""
|
|
26
|
+
|
|
27
|
+
owner_handle: str
|
|
28
|
+
"""Which of your lines they shared it with."""
|
|
29
|
+
|
|
30
|
+
sender_handle: str
|
|
31
|
+
"""The person who shared their card — a phone number or email address."""
|
|
32
|
+
|
|
33
|
+
media_url: Optional[str] = None
|
|
34
|
+
"""URL of the contact's media, served from `cdn.linqapp.com`.
|
|
35
|
+
|
|
36
|
+
`null` when the contact shared no media, and also when media was shared but
|
|
37
|
+
could not be retrieved — this field does not distinguish the two.
|
|
38
|
+
|
|
39
|
+
Download the media and store it yourself. The URL may be signed and expire, in
|
|
40
|
+
as little as 45 minutes, and altering its query string invalidates it
|
|
41
|
+
immediately.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class ContactCardReceivedWebhookEvent(BaseModel):
|
|
46
|
+
"""Complete webhook payload for contact_card.received events"""
|
|
47
|
+
|
|
48
|
+
api_version: str
|
|
49
|
+
"""API version for the webhook payload format"""
|
|
50
|
+
|
|
51
|
+
created_at: datetime
|
|
52
|
+
"""When the event was created"""
|
|
53
|
+
|
|
54
|
+
data: Data
|
|
55
|
+
"""Payload for contact_card.received webhook events.
|
|
56
|
+
|
|
57
|
+
A contact belongs to a line, not to an individual chat. You receive one event
|
|
58
|
+
per person who shares their contact, regardless of how many chats they have in
|
|
59
|
+
common with your line.
|
|
60
|
+
|
|
61
|
+
The event fires again whenever the shared contact's name or media changes.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
event_id: str
|
|
65
|
+
"""Unique identifier for this event (for deduplication)"""
|
|
66
|
+
|
|
67
|
+
event_type: WebhookEventType
|
|
68
|
+
"""Valid webhook event types that can be subscribed to.
|
|
69
|
+
|
|
70
|
+
**Note:** `message.edited` is only delivered to subscriptions using
|
|
71
|
+
`webhook_version: "2026-02-03"`. Subscribing to this event on a v2025
|
|
72
|
+
subscription will not produce any deliveries.
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
partner_id: str
|
|
76
|
+
"""Partner identifier. Present on all webhooks for cross-referencing."""
|
|
77
|
+
|
|
78
|
+
trace_id: str
|
|
79
|
+
"""Trace ID for debugging and correlation across systems."""
|
|
80
|
+
|
|
81
|
+
webhook_version: str
|
|
82
|
+
"""
|
|
83
|
+
Date-based webhook payload version. Determined by the `?version=` query
|
|
84
|
+
parameter in your webhook subscription URL. If no version parameter is
|
|
85
|
+
specified, defaults based on subscription creation date.
|
|
86
|
+
"""
|
|
@@ -17,7 +17,7 @@ class DataChatHealthStatus(BaseModel):
|
|
|
17
17
|
|
|
18
18
|
Switch on `status` to surface chat and line health in your UI — the enum is the long-term contract. Each status carries a `doc_url` that deep-links to the relevant section of the Chat Health guide. To gate a send, act on the response rather than the status: a `403` is the authoritative answer.
|
|
19
19
|
|
|
20
|
-
See the [Chat Health guide](/guides/chats/chat-health) for what each status means and how to react.
|
|
20
|
+
See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each status means and how to react.
|
|
21
21
|
"""
|
|
22
22
|
|
|
23
23
|
doc_url: str
|
|
@@ -26,8 +26,8 @@ class DataChatHealthStatus(BaseModel):
|
|
|
26
26
|
status: Literal["HEALTHY", "AT_RISK", "CRITICAL", "OPTED_OUT"]
|
|
27
27
|
"""Current health bucket for the chat.
|
|
28
28
|
|
|
29
|
-
See the [Chat Health guide](/guides/chats/chat-health) for what
|
|
30
|
-
and how to react. `doc_url` deep-links to the relevant section.
|
|
29
|
+
See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what
|
|
30
|
+
each value means and how to react. `doc_url` deep-links to the relevant section.
|
|
31
31
|
|
|
32
32
|
`OPTED_OUT` — the recipient sent `STOP`, `UNSUBSCRIBE`, `OPTOUT`, `CANCEL`,
|
|
33
33
|
`END`, or `QUIT`. The keyword must be the whole trimmed message, never part of a
|
|
@@ -72,8 +72,8 @@ class DataChat(BaseModel):
|
|
|
72
72
|
relevant section of the Chat Health guide. To gate a send, act on the response
|
|
73
73
|
rather than the status: a `403` is the authoritative answer.
|
|
74
74
|
|
|
75
|
-
See the [Chat Health guide](/guides/chats/chat-health) for what
|
|
76
|
-
means and how to react.
|
|
75
|
+
See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what
|
|
76
|
+
each status means and how to react.
|
|
77
77
|
"""
|
|
78
78
|
|
|
79
79
|
is_group: bool
|
|
@@ -33,7 +33,7 @@ class ChatHealthStatus(BaseModel):
|
|
|
33
33
|
|
|
34
34
|
Switch on `status` to surface chat and line health in your UI — the enum is the long-term contract. Each status carries a `doc_url` that deep-links to the relevant section of the Chat Health guide. To gate a send, act on the response rather than the status: a `403` is the authoritative answer.
|
|
35
35
|
|
|
36
|
-
See the [Chat Health guide](/guides/chats/chat-health) for what each status means and how to react.
|
|
36
|
+
See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each status means and how to react.
|
|
37
37
|
"""
|
|
38
38
|
|
|
39
39
|
doc_url: str
|
|
@@ -42,8 +42,8 @@ class ChatHealthStatus(BaseModel):
|
|
|
42
42
|
status: Literal["HEALTHY", "AT_RISK", "CRITICAL", "OPTED_OUT"]
|
|
43
43
|
"""Current health bucket for the chat.
|
|
44
44
|
|
|
45
|
-
See the [Chat Health guide](/guides/chats/chat-health) for what
|
|
46
|
-
and how to react. `doc_url` deep-links to the relevant section.
|
|
45
|
+
See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what
|
|
46
|
+
each value means and how to react. `doc_url` deep-links to the relevant section.
|
|
47
47
|
|
|
48
48
|
`OPTED_OUT` — the recipient sent `STOP`, `UNSUBSCRIBE`, `OPTOUT`, `CANCEL`,
|
|
49
49
|
`END`, or `QUIT`. The keyword must be the whole trimmed message, never part of a
|
|
@@ -88,8 +88,8 @@ class Chat(BaseModel):
|
|
|
88
88
|
relevant section of the Chat Health guide. To gate a send, act on the response
|
|
89
89
|
rather than the status: a `403` is the authoritative answer.
|
|
90
90
|
|
|
91
|
-
See the [Chat Health guide](/guides/chats/chat-health) for what
|
|
92
|
-
means and how to react.
|
|
91
|
+
See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what
|
|
92
|
+
each status means and how to react.
|
|
93
93
|
"""
|
|
94
94
|
|
|
95
95
|
is_group: Optional[bool] = None
|
|
@@ -15,7 +15,7 @@ class PhoneNumberReputation(BaseModel):
|
|
|
15
15
|
|
|
16
16
|
Unlike chat health, line reputation does not include `opted_out` — opt-out applies to individual recipients, not the whole line.
|
|
17
17
|
|
|
18
|
-
See the [Phone Reputation guide](/guides/phone-numbers/phone-reputation) for what each status means and how to react.
|
|
18
|
+
See the [Phone Reputation guide](/channel/imessage/guides/phone-numbers/phone-reputation) for what each status means and how to react.
|
|
19
19
|
"""
|
|
20
20
|
|
|
21
21
|
doc_url: str
|
|
@@ -55,8 +55,9 @@ class PhoneNumber(BaseModel):
|
|
|
55
55
|
Unlike chat health, line reputation does not include `opted_out` — opt-out
|
|
56
56
|
applies to individual recipients, not the whole line.
|
|
57
57
|
|
|
58
|
-
See the
|
|
59
|
-
|
|
58
|
+
See the
|
|
59
|
+
[Phone Reputation guide](/channel/imessage/guides/phone-numbers/phone-reputation)
|
|
60
|
+
for what each status means and how to react.
|
|
60
61
|
"""
|
|
61
62
|
|
|
62
63
|
forwarding_number: Optional[str] = None
|
|
@@ -24,6 +24,7 @@ from .participant_added_webhook_event import ParticipantAddedWebhookEvent
|
|
|
24
24
|
from .poll_vote_removed_webhook_event import PollVoteRemovedWebhookEvent
|
|
25
25
|
from .participant_removed_webhook_event import ParticipantRemovedWebhookEvent
|
|
26
26
|
from .poll_reaction_added_webhook_event import PollReactionAddedWebhookEvent
|
|
27
|
+
from .contact_card_received_webhook_event import ContactCardReceivedWebhookEvent
|
|
27
28
|
from .chat_background_updated_webhook_event import ChatBackgroundUpdatedWebhookEvent
|
|
28
29
|
from .chat_group_icon_updated_webhook_event import ChatGroupIconUpdatedWebhookEvent
|
|
29
30
|
from .chat_group_name_updated_webhook_event import ChatGroupNameUpdatedWebhookEvent
|
|
@@ -66,6 +67,7 @@ UnwrapWebhookEvent: TypeAlias = Annotated[
|
|
|
66
67
|
ChatTypingIndicatorStoppedWebhookEvent,
|
|
67
68
|
ChatBackgroundUpdatedWebhookEvent,
|
|
68
69
|
ChatBackgroundUpdateFailedWebhookEvent,
|
|
70
|
+
ContactCardReceivedWebhookEvent,
|
|
69
71
|
PhoneNumberStatusUpdatedWebhookEvent,
|
|
70
72
|
],
|
|
71
73
|
PropertyInfo(discriminator="event_type"),
|
|
@@ -10,7 +10,7 @@ __all__ = ["WebhookEventListResponse"]
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class WebhookEventListResponse(BaseModel):
|
|
13
|
-
doc_url: Literal["https://docs.linqapp.com/guides/webhooks/events"]
|
|
13
|
+
doc_url: Literal["https://docs.linqapp.com/channel/imessage/guides/webhooks/events"]
|
|
14
14
|
"""URL to the webhook events documentation"""
|
|
15
15
|
|
|
16
16
|
events: List[WebhookEventType]
|
|
@@ -31,7 +31,7 @@ class TestWebhooks:
|
|
|
31
31
|
|
|
32
32
|
client = client.with_options(webhook_secret=client_opt)
|
|
33
33
|
|
|
34
|
-
data = """{"api_version":"v3","created_at":"2025-11-23T17:30:00Z","data":{"id":"550e8400-e29b-41d4-a716-446655440001","chat":{"id":"550e8400-e29b-41d4-a716-446655440000","health_status":{"doc_url":"https://docs.linqapp.com/guides/chats/chat-health#at-risk","status":"AT_RISK","updated_at":"2026-05-01T18:28:25Z"},"is_group":true,"owner_handle":{"id":"550e8400-e29b-41d4-a716-446655440000","handle":"+15551234567","joined_at":"2025-05-21T15:30:00.000-05:00","service":"iMessage","is_me":false,"left_at":"2019-12-27T18:11:19.117Z","status":"active"}},"direction":"outbound","parts":[{"type":"text","value":"Hello!","mention":"+14155551234","mention_range":[4,9],"mentions":[{"handle":"+14155550123","is_me":true,"range":[4,9]}],"text_decorations":[{"range":[0,5],"animation":"shake","style":"bold"}]}],"sender_handle":{"id":"550e8400-e29b-41d4-a716-446655440000","handle":"+15551234567","joined_at":"2025-05-21T15:30:00.000-05:00","service":"iMessage","is_me":false,"left_at":"2019-12-27T18:11:19.117Z","status":"active"},"service":"iMessage","delivered_at":"2026-01-30T20:49:20.352Z","effect":{"name":"gentle","type":"bubble"},"idempotency_key":"unique-key","preferred_service":"iMessage","read_at":null,"reconciled_at":"2026-01-30T22:05:00.000Z","reply_to":{"message_id":"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e","part_index":0},"sent_at":"2026-01-30T20:49:19.704Z"},"event_id":"550e8400-e29b-41d4-a716-446655440000","event_type":"message.sent","partner_id":"partner_abc123","trace_id":"abc123def456","webhook_version":"2025-01-01"}"""
|
|
34
|
+
data = """{"api_version":"v3","created_at":"2025-11-23T17:30:00Z","data":{"id":"550e8400-e29b-41d4-a716-446655440001","chat":{"id":"550e8400-e29b-41d4-a716-446655440000","health_status":{"doc_url":"https://docs.linqapp.com/channel/imessage/guides/chats/chat-health#at-risk","status":"AT_RISK","updated_at":"2026-05-01T18:28:25Z"},"is_group":true,"owner_handle":{"id":"550e8400-e29b-41d4-a716-446655440000","handle":"+15551234567","joined_at":"2025-05-21T15:30:00.000-05:00","service":"iMessage","is_me":false,"left_at":"2019-12-27T18:11:19.117Z","status":"active"}},"direction":"outbound","parts":[{"type":"text","value":"Hello!","mention":"+14155551234","mention_range":[4,9],"mentions":[{"handle":"+14155550123","is_me":true,"range":[4,9]}],"text_decorations":[{"range":[0,5],"animation":"shake","style":"bold"}]}],"sender_handle":{"id":"550e8400-e29b-41d4-a716-446655440000","handle":"+15551234567","joined_at":"2025-05-21T15:30:00.000-05:00","service":"iMessage","is_me":false,"left_at":"2019-12-27T18:11:19.117Z","status":"active"},"service":"iMessage","delivered_at":"2026-01-30T20:49:20.352Z","effect":{"name":"gentle","type":"bubble"},"idempotency_key":"unique-key","preferred_service":"iMessage","read_at":null,"reconciled_at":"2026-01-30T22:05:00.000Z","reply_to":{"message_id":"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e","part_index":0},"sent_at":"2026-01-30T20:49:19.704Z"},"event_id":"550e8400-e29b-41d4-a716-446655440000","event_type":"message.sent","partner_id":"partner_abc123","trace_id":"abc123def456","webhook_version":"2025-01-01"}"""
|
|
35
35
|
msg_id = "1"
|
|
36
36
|
timestamp = datetime.now(tz=timezone.utc)
|
|
37
37
|
sig = hook.sign(msg_id=msg_id, timestamp=timestamp, data=data)
|
|
@@ -78,7 +78,7 @@ class TestAsyncWebhooks:
|
|
|
78
78
|
|
|
79
79
|
async_client = async_client.with_options(webhook_secret=client_opt)
|
|
80
80
|
|
|
81
|
-
data = """{"api_version":"v3","created_at":"2025-11-23T17:30:00Z","data":{"id":"550e8400-e29b-41d4-a716-446655440001","chat":{"id":"550e8400-e29b-41d4-a716-446655440000","health_status":{"doc_url":"https://docs.linqapp.com/guides/chats/chat-health#at-risk","status":"AT_RISK","updated_at":"2026-05-01T18:28:25Z"},"is_group":true,"owner_handle":{"id":"550e8400-e29b-41d4-a716-446655440000","handle":"+15551234567","joined_at":"2025-05-21T15:30:00.000-05:00","service":"iMessage","is_me":false,"left_at":"2019-12-27T18:11:19.117Z","status":"active"}},"direction":"outbound","parts":[{"type":"text","value":"Hello!","mention":"+14155551234","mention_range":[4,9],"mentions":[{"handle":"+14155550123","is_me":true,"range":[4,9]}],"text_decorations":[{"range":[0,5],"animation":"shake","style":"bold"}]}],"sender_handle":{"id":"550e8400-e29b-41d4-a716-446655440000","handle":"+15551234567","joined_at":"2025-05-21T15:30:00.000-05:00","service":"iMessage","is_me":false,"left_at":"2019-12-27T18:11:19.117Z","status":"active"},"service":"iMessage","delivered_at":"2026-01-30T20:49:20.352Z","effect":{"name":"gentle","type":"bubble"},"idempotency_key":"unique-key","preferred_service":"iMessage","read_at":null,"reconciled_at":"2026-01-30T22:05:00.000Z","reply_to":{"message_id":"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e","part_index":0},"sent_at":"2026-01-30T20:49:19.704Z"},"event_id":"550e8400-e29b-41d4-a716-446655440000","event_type":"message.sent","partner_id":"partner_abc123","trace_id":"abc123def456","webhook_version":"2025-01-01"}"""
|
|
81
|
+
data = """{"api_version":"v3","created_at":"2025-11-23T17:30:00Z","data":{"id":"550e8400-e29b-41d4-a716-446655440001","chat":{"id":"550e8400-e29b-41d4-a716-446655440000","health_status":{"doc_url":"https://docs.linqapp.com/channel/imessage/guides/chats/chat-health#at-risk","status":"AT_RISK","updated_at":"2026-05-01T18:28:25Z"},"is_group":true,"owner_handle":{"id":"550e8400-e29b-41d4-a716-446655440000","handle":"+15551234567","joined_at":"2025-05-21T15:30:00.000-05:00","service":"iMessage","is_me":false,"left_at":"2019-12-27T18:11:19.117Z","status":"active"}},"direction":"outbound","parts":[{"type":"text","value":"Hello!","mention":"+14155551234","mention_range":[4,9],"mentions":[{"handle":"+14155550123","is_me":true,"range":[4,9]}],"text_decorations":[{"range":[0,5],"animation":"shake","style":"bold"}]}],"sender_handle":{"id":"550e8400-e29b-41d4-a716-446655440000","handle":"+15551234567","joined_at":"2025-05-21T15:30:00.000-05:00","service":"iMessage","is_me":false,"left_at":"2019-12-27T18:11:19.117Z","status":"active"},"service":"iMessage","delivered_at":"2026-01-30T20:49:20.352Z","effect":{"name":"gentle","type":"bubble"},"idempotency_key":"unique-key","preferred_service":"iMessage","read_at":null,"reconciled_at":"2026-01-30T22:05:00.000Z","reply_to":{"message_id":"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e","part_index":0},"sent_at":"2026-01-30T20:49:19.704Z"},"event_id":"550e8400-e29b-41d4-a716-446655440000","event_type":"message.sent","partner_id":"partner_abc123","trace_id":"abc123def456","webhook_version":"2025-01-01"}"""
|
|
82
82
|
msg_id = "1"
|
|
83
83
|
timestamp = datetime.now(tz=timezone.utc)
|
|
84
84
|
sig = hook.sign(msg_id=msg_id, timestamp=timestamp, data=data)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|