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.
Files changed (267) hide show
  1. linq_python-0.40.0/.release-please-manifest.json +3 -0
  2. {linq_python-0.39.0 → linq_python-0.40.0}/CHANGELOG.md +14 -0
  3. {linq_python-0.39.0 → linq_python-0.40.0}/PKG-INFO +1 -1
  4. {linq_python-0.39.0 → linq_python-0.40.0}/api.md +1 -0
  5. {linq_python-0.39.0 → linq_python-0.40.0}/pyproject.toml +1 -1
  6. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_client.py +12 -12
  7. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_version.py +1 -1
  8. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/payment_requests.py +4 -4
  9. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/webhook_subscriptions.py +2 -2
  10. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/__init__.py +1 -0
  11. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat.py +5 -5
  12. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_create_response.py +5 -5
  13. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_created_webhook_event.py +5 -5
  14. linq_python-0.40.0/src/linq/types/contact_card_received_webhook_event.py +86 -0
  15. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_edited_webhook_event.py +5 -5
  16. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_event_v2.py +5 -5
  17. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/phone_number_list_response.py +4 -3
  18. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/unwrap_webhook_event.py +2 -0
  19. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/webhook_event_list_response.py +1 -1
  20. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_webhooks.py +2 -2
  21. {linq_python-0.39.0 → linq_python-0.40.0}/uv.lock +1 -1
  22. linq_python-0.39.0/.release-please-manifest.json +0 -3
  23. {linq_python-0.39.0 → linq_python-0.40.0}/.gitignore +0 -0
  24. {linq_python-0.39.0 → linq_python-0.40.0}/CONTRIBUTING.md +0 -0
  25. {linq_python-0.39.0 → linq_python-0.40.0}/LICENSE +0 -0
  26. {linq_python-0.39.0 → linq_python-0.40.0}/README.md +0 -0
  27. {linq_python-0.39.0 → linq_python-0.40.0}/SECURITY.md +0 -0
  28. {linq_python-0.39.0 → linq_python-0.40.0}/bin/check-release-environment +0 -0
  29. {linq_python-0.39.0 → linq_python-0.40.0}/bin/publish-pypi +0 -0
  30. {linq_python-0.39.0 → linq_python-0.40.0}/examples/.keep +0 -0
  31. {linq_python-0.39.0 → linq_python-0.40.0}/release-please-config.json +0 -0
  32. {linq_python-0.39.0 → linq_python-0.40.0}/requirements-dev.lock +0 -0
  33. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/__init__.py +0 -0
  34. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_base_client.py +0 -0
  35. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_compat.py +0 -0
  36. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_constants.py +0 -0
  37. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_exceptions.py +0 -0
  38. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_files.py +0 -0
  39. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_models.py +0 -0
  40. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_qs.py +0 -0
  41. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_resource.py +0 -0
  42. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_response.py +0 -0
  43. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_streaming.py +0 -0
  44. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_types.py +0 -0
  45. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/__init__.py +0 -0
  46. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_compat.py +0 -0
  47. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_datetime_parse.py +0 -0
  48. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_json.py +0 -0
  49. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_logs.py +0 -0
  50. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_path.py +0 -0
  51. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_proxy.py +0 -0
  52. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_reflection.py +0 -0
  53. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_resources_proxy.py +0 -0
  54. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_streams.py +0 -0
  55. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_sync.py +0 -0
  56. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_transform.py +0 -0
  57. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_typing.py +0 -0
  58. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/_utils/_utils.py +0 -0
  59. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/lib/.keep +0 -0
  60. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/pagination.py +0 -0
  61. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/py.typed +0 -0
  62. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/__init__.py +0 -0
  63. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/attachments.py +0 -0
  64. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/available_number.py +0 -0
  65. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/blocked_handles.py +0 -0
  66. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/capability.py +0 -0
  67. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/chats/__init__.py +0 -0
  68. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/chats/background.py +0 -0
  69. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/chats/chats.py +0 -0
  70. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/chats/location.py +0 -0
  71. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/chats/messages.py +0 -0
  72. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/chats/participants.py +0 -0
  73. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/chats/polls.py +0 -0
  74. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/chats/typing.py +0 -0
  75. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/contact_card.py +0 -0
  76. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/experiences.py +0 -0
  77. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/messages/__init__.py +0 -0
  78. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/messages/messages.py +0 -0
  79. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/messages/poll.py +0 -0
  80. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/payment_handles.py +0 -0
  81. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/payment_providers.py +0 -0
  82. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/payments.py +0 -0
  83. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/phone_numbers.py +0 -0
  84. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/phonenumbers.py +0 -0
  85. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/webhook_events.py +0 -0
  86. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/resources/webhooks.py +0 -0
  87. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/attachment_create_params.py +0 -0
  88. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/attachment_create_response.py +0 -0
  89. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/attachment_retrieve_response.py +0 -0
  90. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/available_number_retrieve_params.py +0 -0
  91. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/available_number_retrieve_response.py +0 -0
  92. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/blocked_handle_block_params.py +0 -0
  93. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/blocked_handle_block_response.py +0 -0
  94. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/blocked_handle_entry.py +0 -0
  95. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/blocked_handle_list_response.py +0 -0
  96. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/blocked_handle_unblock_params.py +0 -0
  97. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/capability_check_RCS_params.py +0 -0
  98. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/capability_check_i_message_params.py +0 -0
  99. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_background_update_failed_webhook_event.py +0 -0
  100. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_background_updated_webhook_event.py +0 -0
  101. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_create_params.py +0 -0
  102. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_group_icon_update_failed_webhook_event.py +0 -0
  103. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_group_icon_updated_webhook_event.py +0 -0
  104. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_group_name_update_failed_webhook_event.py +0 -0
  105. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_group_name_updated_webhook_event.py +0 -0
  106. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_leave_chat_response.py +0 -0
  107. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_list_chats_params.py +0 -0
  108. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_send_voicememo_params.py +0 -0
  109. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_send_voicememo_response.py +0 -0
  110. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_typing_indicator_started_webhook_event.py +0 -0
  111. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_typing_indicator_stopped_webhook_event.py +0 -0
  112. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_update_params.py +0 -0
  113. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chat_update_response.py +0 -0
  114. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/__init__.py +0 -0
  115. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/background_set_params.py +0 -0
  116. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/get_chat_location_response.py +0 -0
  117. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/location_request_response.py +0 -0
  118. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/message_list_params.py +0 -0
  119. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/message_send_params.py +0 -0
  120. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/message_send_response.py +0 -0
  121. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/participant_add_params.py +0 -0
  122. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/participant_add_response.py +0 -0
  123. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/participant_remove_params.py +0 -0
  124. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/participant_remove_response.py +0 -0
  125. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/poll.py +0 -0
  126. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/poll_create_params.py +0 -0
  127. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/poll_envelope.py +0 -0
  128. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/chats/sent_message.py +0 -0
  129. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/contact_card_create_params.py +0 -0
  130. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/contact_card_retrieve_params.py +0 -0
  131. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/contact_card_retrieve_response.py +0 -0
  132. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/contact_card_update_params.py +0 -0
  133. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/experience_list_response.py +0 -0
  134. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/experience_retrieve_response.py +0 -0
  135. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/handle_check_response.py +0 -0
  136. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/link_part_param.py +0 -0
  137. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/media_part_param.py +0 -0
  138. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message.py +0 -0
  139. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_add_reaction_params.py +0 -0
  140. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_add_reaction_response.py +0 -0
  141. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_content_param.py +0 -0
  142. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_create_params.py +0 -0
  143. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_create_response.py +0 -0
  144. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_delivered_webhook_event.py +0 -0
  145. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_effect.py +0 -0
  146. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_effect_param.py +0 -0
  147. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_failed_webhook_event.py +0 -0
  148. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_list_messages_thread_params.py +0 -0
  149. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_read_webhook_event.py +0 -0
  150. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_received_webhook_event.py +0 -0
  151. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_sent_webhook_event.py +0 -0
  152. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_update_app_card_params.py +0 -0
  153. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_update_app_card_response.py +0 -0
  154. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/message_update_params.py +0 -0
  155. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/messages/__init__.py +0 -0
  156. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/messages/poll_add_options_params.py +0 -0
  157. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/messages/poll_vote_params.py +0 -0
  158. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/participant_added_webhook_event.py +0 -0
  159. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/participant_removed_webhook_event.py +0 -0
  160. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment.py +0 -0
  161. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_create_params.py +0 -0
  162. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_credentials_response.py +0 -0
  163. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_handle_connection.py +0 -0
  164. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_handle_verify_params.py +0 -0
  165. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_provider.py +0 -0
  166. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_provider_connect_params.py +0 -0
  167. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_provider_connect_response.py +0 -0
  168. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_request.py +0 -0
  169. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_request_create_params.py +0 -0
  170. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_request_list_params.py +0 -0
  171. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/payment_request_list_response.py +0 -0
  172. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/phone_number_status_updated_webhook_event.py +0 -0
  173. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/phone_number_update_params.py +0 -0
  174. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/phone_number_update_response.py +0 -0
  175. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/phonenumber_list_response.py +0 -0
  176. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/poll_delivered_webhook_event.py +0 -0
  177. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/poll_failed_webhook_event.py +0 -0
  178. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/poll_reaction_added_webhook_event.py +0 -0
  179. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/poll_read_webhook_event.py +0 -0
  180. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/poll_received_webhook_event.py +0 -0
  181. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/poll_sent_webhook_event.py +0 -0
  182. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/poll_updated_webhook_event.py +0 -0
  183. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/poll_vote_added_webhook_event.py +0 -0
  184. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/poll_vote_removed_webhook_event.py +0 -0
  185. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reaction_added_webhook_event.py +0 -0
  186. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reaction_event_base.py +0 -0
  187. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reaction_removed_webhook_event.py +0 -0
  188. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reply_to.py +0 -0
  189. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reply_to_param.py +0 -0
  190. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reputation_action_item.py +0 -0
  191. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reputation_audit.py +0 -0
  192. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reputation_audit_started.py +0 -0
  193. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reputation_driver.py +0 -0
  194. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reputation_driver_key.py +0 -0
  195. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reputation_evidence.py +0 -0
  196. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reputation_opt_out_chat.py +0 -0
  197. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reputation_report.py +0 -0
  198. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/reputation_unhealthy_chat.py +0 -0
  199. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/schemas_media_part_response.py +0 -0
  200. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/schemas_message_effect.py +0 -0
  201. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/schemas_text_part_response.py +0 -0
  202. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/set_contact_card.py +0 -0
  203. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared/__init__.py +0 -0
  204. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared/chat_handle.py +0 -0
  205. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared/link_part_response.py +0 -0
  206. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared/media_part_response.py +0 -0
  207. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared/reaction.py +0 -0
  208. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared/reaction_type.py +0 -0
  209. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared/service_type.py +0 -0
  210. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared/text_decoration.py +0 -0
  211. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared/text_part_response.py +0 -0
  212. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared_params/__init__.py +0 -0
  213. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared_params/reaction_type.py +0 -0
  214. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared_params/service_type.py +0 -0
  215. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/shared_params/text_decoration.py +0 -0
  216. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/supported_content_type.py +0 -0
  217. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/text_part_param.py +0 -0
  218. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/webhook_event_type.py +0 -0
  219. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/webhook_subscription.py +0 -0
  220. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/webhook_subscription_create_params.py +0 -0
  221. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/webhook_subscription_create_response.py +0 -0
  222. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/webhook_subscription_list_response.py +0 -0
  223. {linq_python-0.39.0 → linq_python-0.40.0}/src/linq/types/webhook_subscription_update_params.py +0 -0
  224. {linq_python-0.39.0 → linq_python-0.40.0}/tests/__init__.py +0 -0
  225. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/__init__.py +0 -0
  226. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/chats/__init__.py +0 -0
  227. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/chats/test_background.py +0 -0
  228. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/chats/test_location.py +0 -0
  229. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/chats/test_messages.py +0 -0
  230. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/chats/test_participants.py +0 -0
  231. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/chats/test_polls.py +0 -0
  232. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/chats/test_typing.py +0 -0
  233. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/messages/__init__.py +0 -0
  234. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/messages/test_poll.py +0 -0
  235. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_attachments.py +0 -0
  236. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_available_number.py +0 -0
  237. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_blocked_handles.py +0 -0
  238. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_capability.py +0 -0
  239. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_chats.py +0 -0
  240. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_contact_card.py +0 -0
  241. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_experiences.py +0 -0
  242. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_messages.py +0 -0
  243. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_payment_handles.py +0 -0
  244. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_payment_providers.py +0 -0
  245. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_payment_requests.py +0 -0
  246. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_payments.py +0 -0
  247. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_phone_numbers.py +0 -0
  248. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_phonenumbers.py +0 -0
  249. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_webhook_events.py +0 -0
  250. {linq_python-0.39.0 → linq_python-0.40.0}/tests/api_resources/test_webhook_subscriptions.py +0 -0
  251. {linq_python-0.39.0 → linq_python-0.40.0}/tests/conftest.py +0 -0
  252. {linq_python-0.39.0 → linq_python-0.40.0}/tests/sample_file.txt +0 -0
  253. {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_client.py +0 -0
  254. {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_extract_files.py +0 -0
  255. {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_files.py +0 -0
  256. {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_models.py +0 -0
  257. {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_qs.py +0 -0
  258. {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_required_args.py +0 -0
  259. {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_response.py +0 -0
  260. {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_streaming.py +0 -0
  261. {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_transform.py +0 -0
  262. {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_utils/test_datetime_parse.py +0 -0
  263. {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_utils/test_json.py +0 -0
  264. {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_utils/test_path.py +0 -0
  265. {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_utils/test_proxy.py +0 -0
  266. {linq_python-0.39.0 → linq_python-0.40.0}/tests/test_utils/test_typing.py +0 -0
  267. {linq_python-0.39.0 → linq_python-0.40.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.40.0"
3
+ }
@@ -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.39.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
  )
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "linq-python"
3
- version = "0.39.0"
3
+ version = "0.40.0"
4
4
  description = "The official Python library for the linq-api-v3 API"
5
5
  dynamic = ["readme"]
6
6
  license = "Apache-2.0"
@@ -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
 
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "linq"
4
- __version__ = "0.39.0" # x-release-please-version
4
+ __version__ = "0.40.0" # x-release-please-version
@@ -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 each value means
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 each status
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 each value means
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 each status
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 each value means
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 each status
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 each value means
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 each status
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 each value means
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 each status
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 [Phone Reputation guide](/guides/phone-numbers/phone-reputation) for
59
- what each status means and how to react.
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)
@@ -530,7 +530,7 @@ wheels = [
530
530
 
531
531
  [[package]]
532
532
  name = "linq-python"
533
- version = "0.38.0"
533
+ version = "0.39.1"
534
534
  source = { editable = "." }
535
535
  dependencies = [
536
536
  { name = "anyio" },
@@ -1,3 +0,0 @@
1
- {
2
- ".": "0.39.0"
3
- }
File without changes
File without changes
File without changes
File without changes