moderation_api 1.34.0__tar.gz → 1.35.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 (152) hide show
  1. moderation_api-1.35.0/.release-please-manifest.json +3 -0
  2. {moderation_api-1.34.0 → moderation_api-1.35.0}/CHANGELOG.md +8 -0
  3. {moderation_api-1.34.0 → moderation_api-1.35.0}/PKG-INFO +1 -1
  4. {moderation_api-1.34.0 → moderation_api-1.35.0}/api.md +35 -0
  5. {moderation_api-1.34.0 → moderation_api-1.35.0}/pyproject.toml +1 -1
  6. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_client.py +83 -3
  7. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_version.py +1 -1
  8. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/resources/__init__.py +28 -0
  9. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/resources/content.py +119 -1
  10. moderation_api-1.35.0/src/moderation_api/resources/webhook_secret.py +143 -0
  11. moderation_api-1.35.0/src/moderation_api/resources/webhooks.py +618 -0
  12. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/__init__.py +8 -0
  13. moderation_api-1.35.0/src/moderation_api/types/webhook_create_params.py +46 -0
  14. moderation_api-1.35.0/src/moderation_api/types/webhook_create_response.py +55 -0
  15. moderation_api-1.35.0/src/moderation_api/types/webhook_delete_response.py +13 -0
  16. moderation_api-1.35.0/src/moderation_api/types/webhook_list_response.py +58 -0
  17. moderation_api-1.35.0/src/moderation_api/types/webhook_retrieve_response.py +55 -0
  18. moderation_api-1.35.0/src/moderation_api/types/webhook_secret_retrieve_response.py +14 -0
  19. moderation_api-1.35.0/src/moderation_api/types/webhook_update_params.py +44 -0
  20. moderation_api-1.35.0/src/moderation_api/types/webhook_update_response.py +55 -0
  21. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/api_resources/test_content.py +68 -0
  22. moderation_api-1.35.0/tests/api_resources/test_webhook_secret.py +80 -0
  23. moderation_api-1.35.0/tests/api_resources/test_webhooks.py +464 -0
  24. moderation_api-1.34.0/.release-please-manifest.json +0 -3
  25. {moderation_api-1.34.0 → moderation_api-1.35.0}/.gitignore +0 -0
  26. {moderation_api-1.34.0 → moderation_api-1.35.0}/CONTRIBUTING.md +0 -0
  27. {moderation_api-1.34.0 → moderation_api-1.35.0}/LICENSE +0 -0
  28. {moderation_api-1.34.0 → moderation_api-1.35.0}/README.md +0 -0
  29. {moderation_api-1.34.0 → moderation_api-1.35.0}/SECURITY.md +0 -0
  30. {moderation_api-1.34.0 → moderation_api-1.35.0}/bin/check-release-environment +0 -0
  31. {moderation_api-1.34.0 → moderation_api-1.35.0}/bin/publish-pypi +0 -0
  32. {moderation_api-1.34.0 → moderation_api-1.35.0}/examples/.keep +0 -0
  33. {moderation_api-1.34.0 → moderation_api-1.35.0}/release-please-config.json +0 -0
  34. {moderation_api-1.34.0 → moderation_api-1.35.0}/requirements-dev.lock +0 -0
  35. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/__init__.py +0 -0
  36. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_base_client.py +0 -0
  37. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_compat.py +0 -0
  38. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_constants.py +0 -0
  39. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_exceptions.py +0 -0
  40. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_files.py +0 -0
  41. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_models.py +0 -0
  42. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_qs.py +0 -0
  43. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_resource.py +0 -0
  44. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_response.py +0 -0
  45. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_streaming.py +0 -0
  46. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_types.py +0 -0
  47. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_utils/__init__.py +0 -0
  48. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_utils/_compat.py +0 -0
  49. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_utils/_datetime_parse.py +0 -0
  50. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_utils/_json.py +0 -0
  51. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_utils/_logs.py +0 -0
  52. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_utils/_path.py +0 -0
  53. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_utils/_proxy.py +0 -0
  54. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_utils/_reflection.py +0 -0
  55. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_utils/_resources_proxy.py +0 -0
  56. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_utils/_streams.py +0 -0
  57. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_utils/_sync.py +0 -0
  58. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_utils/_transform.py +0 -0
  59. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_utils/_typing.py +0 -0
  60. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/_utils/_utils.py +0 -0
  61. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/lib/.keep +0 -0
  62. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/py.typed +0 -0
  63. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/resources/account.py +0 -0
  64. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/resources/actions/__init__.py +0 -0
  65. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/resources/actions/actions.py +0 -0
  66. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/resources/actions/execute.py +0 -0
  67. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/resources/auth.py +0 -0
  68. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/resources/authors.py +0 -0
  69. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/resources/queue/__init__.py +0 -0
  70. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/resources/queue/items.py +0 -0
  71. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/resources/queue/queue.py +0 -0
  72. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/resources/wordlist/__init__.py +0 -0
  73. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/resources/wordlist/wordlist.py +0 -0
  74. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/resources/wordlist/words.py +0 -0
  75. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/account_list_response.py +0 -0
  76. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/action_create_params.py +0 -0
  77. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/action_create_response.py +0 -0
  78. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/action_delete_response.py +0 -0
  79. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/action_list_params.py +0 -0
  80. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/action_list_response.py +0 -0
  81. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/action_retrieve_response.py +0 -0
  82. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/action_update_params.py +0 -0
  83. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/action_update_response.py +0 -0
  84. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/actions/__init__.py +0 -0
  85. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/actions/execute_execute_by_id_params.py +0 -0
  86. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/actions/execute_execute_by_id_response.py +0 -0
  87. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/actions/execute_execute_params.py +0 -0
  88. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/actions/execute_execute_response.py +0 -0
  89. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/auth_create_response.py +0 -0
  90. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/auth_retrieve_response.py +0 -0
  91. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/author_create_params.py +0 -0
  92. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/author_create_response.py +0 -0
  93. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/author_delete_response.py +0 -0
  94. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/author_list_params.py +0 -0
  95. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/author_list_response.py +0 -0
  96. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/author_retrieve_response.py +0 -0
  97. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/author_update_params.py +0 -0
  98. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/author_update_response.py +0 -0
  99. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/content_submit_params.py +0 -0
  100. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/content_submit_response.py +0 -0
  101. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/queue/__init__.py +0 -0
  102. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/queue/item_list_params.py +0 -0
  103. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/queue/item_list_response.py +0 -0
  104. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/queue/item_resolve_params.py +0 -0
  105. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/queue/item_resolve_response.py +0 -0
  106. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/queue/item_unresolve_params.py +0 -0
  107. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/queue/item_unresolve_response.py +0 -0
  108. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/queue_get_stats_params.py +0 -0
  109. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/queue_get_stats_response.py +0 -0
  110. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/queue_retrieve_response.py +0 -0
  111. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/wordlist/__init__.py +0 -0
  112. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/wordlist/word_add_params.py +0 -0
  113. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/wordlist/word_add_response.py +0 -0
  114. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/wordlist/word_remove_params.py +0 -0
  115. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/wordlist/word_remove_response.py +0 -0
  116. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/wordlist_get_embedding_status_response.py +0 -0
  117. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/wordlist_list_response.py +0 -0
  118. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/wordlist_retrieve_response.py +0 -0
  119. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/wordlist_update_params.py +0 -0
  120. {moderation_api-1.34.0 → moderation_api-1.35.0}/src/moderation_api/types/wordlist_update_response.py +0 -0
  121. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/__init__.py +0 -0
  122. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/api_resources/__init__.py +0 -0
  123. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/api_resources/actions/__init__.py +0 -0
  124. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/api_resources/actions/test_execute.py +0 -0
  125. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/api_resources/queue/__init__.py +0 -0
  126. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/api_resources/queue/test_items.py +0 -0
  127. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/api_resources/test_account.py +0 -0
  128. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/api_resources/test_actions.py +0 -0
  129. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/api_resources/test_auth.py +0 -0
  130. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/api_resources/test_authors.py +0 -0
  131. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/api_resources/test_queue.py +0 -0
  132. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/api_resources/test_wordlist.py +0 -0
  133. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/api_resources/wordlist/__init__.py +0 -0
  134. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/api_resources/wordlist/test_words.py +0 -0
  135. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/conftest.py +0 -0
  136. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/sample_file.txt +0 -0
  137. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/test_client.py +0 -0
  138. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/test_extract_files.py +0 -0
  139. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/test_files.py +0 -0
  140. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/test_models.py +0 -0
  141. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/test_qs.py +0 -0
  142. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/test_required_args.py +0 -0
  143. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/test_response.py +0 -0
  144. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/test_streaming.py +0 -0
  145. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/test_transform.py +0 -0
  146. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/test_utils/test_datetime_parse.py +0 -0
  147. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/test_utils/test_json.py +0 -0
  148. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/test_utils/test_path.py +0 -0
  149. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/test_utils/test_proxy.py +0 -0
  150. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/test_utils/test_typing.py +0 -0
  151. {moderation_api-1.34.0 → moderation_api-1.35.0}/tests/utils.py +0 -0
  152. {moderation_api-1.34.0 → moderation_api-1.35.0}/uv.lock +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "1.35.0"
3
+ }
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.35.0 (2026-08-20)
4
+
5
+ Full Changelog: [v1.34.0...v1.35.0](https://github.com/moderation-api/sdk-python/compare/v1.34.0...v1.35.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** webhooks and stream ([4f4bf9f](https://github.com/moderation-api/sdk-python/commit/4f4bf9f2d1e2b6c5ddea270e16fd4d8f10600618))
10
+
3
11
  ## 1.34.0 (2026-08-14)
4
12
 
5
13
  Full Changelog: [v1.33.0...v1.34.0](https://github.com/moderation-api/sdk-python/compare/v1.33.0...v1.34.0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: moderation_api
3
- Version: 1.34.0
3
+ Version: 1.35.0
4
4
  Summary: The official Python library for the moderation-api API
5
5
  Project-URL: Homepage, https://github.com/moderation-api/sdk-python
6
6
  Project-URL: Repository, https://github.com/moderation-api/sdk-python
@@ -92,6 +92,7 @@ from moderation_api.types import ContentSubmitResponse
92
92
 
93
93
  Methods:
94
94
 
95
+ - <code title="get /stream">client.content.<a href="./src/moderation_api/resources/content.py">stream</a>() -> None</code>
95
96
  - <code title="post /moderate">client.content.<a href="./src/moderation_api/resources/content.py">submit</a>(\*\*<a href="src/moderation_api/types/content_submit_params.py">params</a>) -> <a href="./src/moderation_api/types/content_submit_response.py">ContentSubmitResponse</a></code>
96
97
 
97
98
  # Account
@@ -151,3 +152,37 @@ Methods:
151
152
 
152
153
  - <code title="post /wordlist/{id}/words">client.wordlist.words.<a href="./src/moderation_api/resources/wordlist/words.py">add</a>(id, \*\*<a href="src/moderation_api/types/wordlist/word_add_params.py">params</a>) -> <a href="./src/moderation_api/types/wordlist/word_add_response.py">WordAddResponse</a></code>
153
154
  - <code title="delete /wordlist/{id}/words">client.wordlist.words.<a href="./src/moderation_api/resources/wordlist/words.py">remove</a>(id, \*\*<a href="src/moderation_api/types/wordlist/word_remove_params.py">params</a>) -> <a href="./src/moderation_api/types/wordlist/word_remove_response.py">WordRemoveResponse</a></code>
155
+
156
+ # Webhooks
157
+
158
+ Types:
159
+
160
+ ```python
161
+ from moderation_api.types import (
162
+ WebhookCreateResponse,
163
+ WebhookRetrieveResponse,
164
+ WebhookUpdateResponse,
165
+ WebhookListResponse,
166
+ WebhookDeleteResponse,
167
+ )
168
+ ```
169
+
170
+ Methods:
171
+
172
+ - <code title="post /webhooks">client.webhooks.<a href="./src/moderation_api/resources/webhooks.py">create</a>(\*\*<a href="src/moderation_api/types/webhook_create_params.py">params</a>) -> <a href="./src/moderation_api/types/webhook_create_response.py">WebhookCreateResponse</a></code>
173
+ - <code title="get /webhooks/{id}">client.webhooks.<a href="./src/moderation_api/resources/webhooks.py">retrieve</a>(id) -> <a href="./src/moderation_api/types/webhook_retrieve_response.py">WebhookRetrieveResponse</a></code>
174
+ - <code title="put /webhooks/{id}">client.webhooks.<a href="./src/moderation_api/resources/webhooks.py">update</a>(id, \*\*<a href="src/moderation_api/types/webhook_update_params.py">params</a>) -> <a href="./src/moderation_api/types/webhook_update_response.py">WebhookUpdateResponse</a></code>
175
+ - <code title="get /webhooks">client.webhooks.<a href="./src/moderation_api/resources/webhooks.py">list</a>() -> <a href="./src/moderation_api/types/webhook_list_response.py">WebhookListResponse</a></code>
176
+ - <code title="delete /webhooks/{id}">client.webhooks.<a href="./src/moderation_api/resources/webhooks.py">delete</a>(id) -> <a href="./src/moderation_api/types/webhook_delete_response.py">WebhookDeleteResponse</a></code>
177
+
178
+ # WebhookSecret
179
+
180
+ Types:
181
+
182
+ ```python
183
+ from moderation_api.types import WebhookSecretRetrieveResponse
184
+ ```
185
+
186
+ Methods:
187
+
188
+ - <code title="get /webhook-secret">client.webhook_secret.<a href="./src/moderation_api/resources/webhook_secret.py">retrieve</a>() -> <a href="./src/moderation_api/types/webhook_secret_retrieve_response.py">WebhookSecretRetrieveResponse</a></code>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "moderation_api"
3
- version = "1.34.0"
3
+ version = "1.35.0"
4
4
  description = "The official Python library for the moderation-api API"
5
5
  dynamic = ["readme"]
6
6
  license = "Apache-2.0"
@@ -35,12 +35,14 @@ from ._base_client import (
35
35
  )
36
36
 
37
37
  if TYPE_CHECKING:
38
- from .resources import auth, queue, account, actions, authors, content, wordlist
38
+ from .resources import auth, queue, account, actions, authors, content, webhooks, wordlist, webhook_secret
39
39
  from .resources.auth import AuthResource, AsyncAuthResource
40
40
  from .resources.account import AccountResource, AsyncAccountResource
41
41
  from .resources.authors import AuthorsResource, AsyncAuthorsResource
42
42
  from .resources.content import ContentResource, AsyncContentResource
43
+ from .resources.webhooks import WebhooksResource, AsyncWebhooksResource
43
44
  from .resources.queue.queue import QueueResource, AsyncQueueResource
45
+ from .resources.webhook_secret import WebhookSecretResource, AsyncWebhookSecretResource
44
46
  from .resources.actions.actions import ActionsResource, AsyncActionsResource
45
47
  from .resources.wordlist.wordlist import WordlistResource, AsyncWordlistResource
46
48
 
@@ -97,6 +99,7 @@ class ModerationAPI(SyncAPIClient):
97
99
 
98
100
  if base_url is None:
99
101
  base_url = os.environ.get("MODERATION_API_BASE_URL")
102
+ self._base_url_overridden = base_url is not None
100
103
  if base_url is None:
101
104
  base_url = f"https://api.moderationapi.com/v1"
102
105
 
@@ -162,6 +165,18 @@ class ModerationAPI(SyncAPIClient):
162
165
 
163
166
  return WordlistResource(self)
164
167
 
168
+ @cached_property
169
+ def webhooks(self) -> WebhooksResource:
170
+ from .resources.webhooks import WebhooksResource
171
+
172
+ return WebhooksResource(self)
173
+
174
+ @cached_property
175
+ def webhook_secret(self) -> WebhookSecretResource:
176
+ from .resources.webhook_secret import WebhookSecretResource
177
+
178
+ return WebhookSecretResource(self)
179
+
165
180
  @cached_property
166
181
  def with_raw_response(self) -> ModerationAPIWithRawResponse:
167
182
  return ModerationAPIWithRawResponse(self)
@@ -226,7 +241,7 @@ class ModerationAPI(SyncAPIClient):
226
241
  params = set_default_query
227
242
 
228
243
  http_client = http_client or self._client
229
- return self.__class__(
244
+ client = self.__class__(
230
245
  secret_key=secret_key or self.secret_key,
231
246
  base_url=base_url or self.base_url,
232
247
  timeout=self.timeout if isinstance(timeout, NotGiven) else timeout,
@@ -236,6 +251,8 @@ class ModerationAPI(SyncAPIClient):
236
251
  default_query=params,
237
252
  **_extra_kwargs,
238
253
  )
254
+ client._base_url_overridden = self._base_url_overridden or base_url is not None
255
+ return client
239
256
 
240
257
  # Alias for `copy` for nicer inline usage, e.g.
241
258
  # client.with_options(timeout=10).foo.create(...)
@@ -316,6 +333,7 @@ class AsyncModerationAPI(AsyncAPIClient):
316
333
 
317
334
  if base_url is None:
318
335
  base_url = os.environ.get("MODERATION_API_BASE_URL")
336
+ self._base_url_overridden = base_url is not None
319
337
  if base_url is None:
320
338
  base_url = f"https://api.moderationapi.com/v1"
321
339
 
@@ -381,6 +399,18 @@ class AsyncModerationAPI(AsyncAPIClient):
381
399
 
382
400
  return AsyncWordlistResource(self)
383
401
 
402
+ @cached_property
403
+ def webhooks(self) -> AsyncWebhooksResource:
404
+ from .resources.webhooks import AsyncWebhooksResource
405
+
406
+ return AsyncWebhooksResource(self)
407
+
408
+ @cached_property
409
+ def webhook_secret(self) -> AsyncWebhookSecretResource:
410
+ from .resources.webhook_secret import AsyncWebhookSecretResource
411
+
412
+ return AsyncWebhookSecretResource(self)
413
+
384
414
  @cached_property
385
415
  def with_raw_response(self) -> AsyncModerationAPIWithRawResponse:
386
416
  return AsyncModerationAPIWithRawResponse(self)
@@ -445,7 +475,7 @@ class AsyncModerationAPI(AsyncAPIClient):
445
475
  params = set_default_query
446
476
 
447
477
  http_client = http_client or self._client
448
- return self.__class__(
478
+ client = self.__class__(
449
479
  secret_key=secret_key or self.secret_key,
450
480
  base_url=base_url or self.base_url,
451
481
  timeout=self.timeout if isinstance(timeout, NotGiven) else timeout,
@@ -455,6 +485,8 @@ class AsyncModerationAPI(AsyncAPIClient):
455
485
  default_query=params,
456
486
  **_extra_kwargs,
457
487
  )
488
+ client._base_url_overridden = self._base_url_overridden or base_url is not None
489
+ return client
458
490
 
459
491
  # Alias for `copy` for nicer inline usage, e.g.
460
492
  # client.with_options(timeout=10).foo.create(...)
@@ -542,6 +574,18 @@ class ModerationAPIWithRawResponse:
542
574
 
543
575
  return WordlistResourceWithRawResponse(self._client.wordlist)
544
576
 
577
+ @cached_property
578
+ def webhooks(self) -> webhooks.WebhooksResourceWithRawResponse:
579
+ from .resources.webhooks import WebhooksResourceWithRawResponse
580
+
581
+ return WebhooksResourceWithRawResponse(self._client.webhooks)
582
+
583
+ @cached_property
584
+ def webhook_secret(self) -> webhook_secret.WebhookSecretResourceWithRawResponse:
585
+ from .resources.webhook_secret import WebhookSecretResourceWithRawResponse
586
+
587
+ return WebhookSecretResourceWithRawResponse(self._client.webhook_secret)
588
+
545
589
 
546
590
  class AsyncModerationAPIWithRawResponse:
547
591
  _client: AsyncModerationAPI
@@ -591,6 +635,18 @@ class AsyncModerationAPIWithRawResponse:
591
635
 
592
636
  return AsyncWordlistResourceWithRawResponse(self._client.wordlist)
593
637
 
638
+ @cached_property
639
+ def webhooks(self) -> webhooks.AsyncWebhooksResourceWithRawResponse:
640
+ from .resources.webhooks import AsyncWebhooksResourceWithRawResponse
641
+
642
+ return AsyncWebhooksResourceWithRawResponse(self._client.webhooks)
643
+
644
+ @cached_property
645
+ def webhook_secret(self) -> webhook_secret.AsyncWebhookSecretResourceWithRawResponse:
646
+ from .resources.webhook_secret import AsyncWebhookSecretResourceWithRawResponse
647
+
648
+ return AsyncWebhookSecretResourceWithRawResponse(self._client.webhook_secret)
649
+
594
650
 
595
651
  class ModerationAPIWithStreamedResponse:
596
652
  _client: ModerationAPI
@@ -640,6 +696,18 @@ class ModerationAPIWithStreamedResponse:
640
696
 
641
697
  return WordlistResourceWithStreamingResponse(self._client.wordlist)
642
698
 
699
+ @cached_property
700
+ def webhooks(self) -> webhooks.WebhooksResourceWithStreamingResponse:
701
+ from .resources.webhooks import WebhooksResourceWithStreamingResponse
702
+
703
+ return WebhooksResourceWithStreamingResponse(self._client.webhooks)
704
+
705
+ @cached_property
706
+ def webhook_secret(self) -> webhook_secret.WebhookSecretResourceWithStreamingResponse:
707
+ from .resources.webhook_secret import WebhookSecretResourceWithStreamingResponse
708
+
709
+ return WebhookSecretResourceWithStreamingResponse(self._client.webhook_secret)
710
+
643
711
 
644
712
  class AsyncModerationAPIWithStreamedResponse:
645
713
  _client: AsyncModerationAPI
@@ -689,6 +757,18 @@ class AsyncModerationAPIWithStreamedResponse:
689
757
 
690
758
  return AsyncWordlistResourceWithStreamingResponse(self._client.wordlist)
691
759
 
760
+ @cached_property
761
+ def webhooks(self) -> webhooks.AsyncWebhooksResourceWithStreamingResponse:
762
+ from .resources.webhooks import AsyncWebhooksResourceWithStreamingResponse
763
+
764
+ return AsyncWebhooksResourceWithStreamingResponse(self._client.webhooks)
765
+
766
+ @cached_property
767
+ def webhook_secret(self) -> webhook_secret.AsyncWebhookSecretResourceWithStreamingResponse:
768
+ from .resources.webhook_secret import AsyncWebhookSecretResourceWithStreamingResponse
769
+
770
+ return AsyncWebhookSecretResourceWithStreamingResponse(self._client.webhook_secret)
771
+
692
772
 
693
773
  Client = ModerationAPI
694
774
 
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "moderation_api"
4
- __version__ = "1.34.0" # x-release-please-version
4
+ __version__ = "1.35.0" # x-release-please-version
@@ -48,6 +48,14 @@ from .content import (
48
48
  ContentResourceWithStreamingResponse,
49
49
  AsyncContentResourceWithStreamingResponse,
50
50
  )
51
+ from .webhooks import (
52
+ WebhooksResource,
53
+ AsyncWebhooksResource,
54
+ WebhooksResourceWithRawResponse,
55
+ AsyncWebhooksResourceWithRawResponse,
56
+ WebhooksResourceWithStreamingResponse,
57
+ AsyncWebhooksResourceWithStreamingResponse,
58
+ )
51
59
  from .wordlist import (
52
60
  WordlistResource,
53
61
  AsyncWordlistResource,
@@ -56,6 +64,14 @@ from .wordlist import (
56
64
  WordlistResourceWithStreamingResponse,
57
65
  AsyncWordlistResourceWithStreamingResponse,
58
66
  )
67
+ from .webhook_secret import (
68
+ WebhookSecretResource,
69
+ AsyncWebhookSecretResource,
70
+ WebhookSecretResourceWithRawResponse,
71
+ AsyncWebhookSecretResourceWithRawResponse,
72
+ WebhookSecretResourceWithStreamingResponse,
73
+ AsyncWebhookSecretResourceWithStreamingResponse,
74
+ )
59
75
 
60
76
  __all__ = [
61
77
  "AuthorsResource",
@@ -100,4 +116,16 @@ __all__ = [
100
116
  "AsyncWordlistResourceWithRawResponse",
101
117
  "WordlistResourceWithStreamingResponse",
102
118
  "AsyncWordlistResourceWithStreamingResponse",
119
+ "WebhooksResource",
120
+ "AsyncWebhooksResource",
121
+ "WebhooksResourceWithRawResponse",
122
+ "AsyncWebhooksResourceWithRawResponse",
123
+ "WebhooksResourceWithStreamingResponse",
124
+ "AsyncWebhooksResourceWithStreamingResponse",
125
+ "WebhookSecretResource",
126
+ "AsyncWebhookSecretResource",
127
+ "WebhookSecretResourceWithRawResponse",
128
+ "AsyncWebhookSecretResourceWithRawResponse",
129
+ "WebhookSecretResourceWithStreamingResponse",
130
+ "AsyncWebhookSecretResourceWithStreamingResponse",
103
131
  ]
@@ -8,7 +8,7 @@ from typing_extensions import Literal
8
8
  import httpx
9
9
 
10
10
  from ..types import content_submit_params
11
- from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
11
+ from .._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given
12
12
  from .._utils import maybe_transform, async_maybe_transform
13
13
  from .._compat import cached_property
14
14
  from .._resource import SyncAPIResource, AsyncAPIResource
@@ -44,6 +44,59 @@ class ContentResource(SyncAPIResource):
44
44
  """
45
45
  return ContentResourceWithStreamingResponse(self)
46
46
 
47
+ def stream(
48
+ self,
49
+ *,
50
+ sec_web_socket_protocol: Literal["moderationapi.v1"],
51
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
52
+ # The extra values given here take precedence over values defined on the client or passed to this method.
53
+ extra_headers: Headers | None = None,
54
+ extra_query: Query | None = None,
55
+ extra_body: Body | None = None,
56
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
57
+ ) -> None:
58
+ """Open a WebSocket to moderate live voice/call audio in real time.
59
+
60
+ Speech is
61
+ transcribed and each finalized utterance is moderated by your enabled text
62
+ policies; you receive a verdict per utterance as it's spoken.
63
+
64
+ **This is a WebSocket upgrade, not a regular HTTP call.** The request body below
65
+ documents the frames you _send_ over the socket; the `101` response documents
66
+ the events you _receive_.
67
+
68
+ - **Auth:** `Authorization: Bearer <api_key>` on the upgrade. A missing/invalid
69
+ key closes `4401`; voice not enabled on the plan/channel closes `4403`.
70
+ - **Subprotocol:** request `moderationapi.v1`.
71
+ - **Flow:** send one `start` frame, then `media` frames as audio arrives, then
72
+ `stop` (or disconnect). You receive `session.started`, `utterance.final` per
73
+ utterance, optional `utterance.partial`/`warning`, and `session.ended`.
74
+ - **Close codes:** `1000` normal · `1011` server error · `4400` bad request ·
75
+ `4401` auth failed · `4403` voice not enabled · `4429` concurrency limit.
76
+
77
+ See the
78
+ [Real-time voice guide](https://docs.moderationapi.com/content-moderation/real-time-voice)
79
+ for the full walkthrough and code examples.
80
+
81
+ Args:
82
+ extra_headers: Send extra headers
83
+
84
+ extra_query: Add additional query parameters to the request
85
+
86
+ extra_body: Add additional JSON properties to the request
87
+
88
+ timeout: Override the client-level default timeout for this request, in seconds
89
+ """
90
+ extra_headers = {"Accept": "*/*", **(extra_headers or {})}
91
+ extra_headers.update({"Sec-WebSocket-Protocol": str(sec_web_socket_protocol)})
92
+ return self._get(
93
+ "/stream" if self._client._base_url_overridden else "wss://voice.moderationapi.com/v1/stream",
94
+ options=make_request_options(
95
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
96
+ ),
97
+ cast_to=NoneType,
98
+ )
99
+
47
100
  def submit(
48
101
  self,
49
102
  *,
@@ -147,6 +200,59 @@ class AsyncContentResource(AsyncAPIResource):
147
200
  """
148
201
  return AsyncContentResourceWithStreamingResponse(self)
149
202
 
203
+ async def stream(
204
+ self,
205
+ *,
206
+ sec_web_socket_protocol: Literal["moderationapi.v1"],
207
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
208
+ # The extra values given here take precedence over values defined on the client or passed to this method.
209
+ extra_headers: Headers | None = None,
210
+ extra_query: Query | None = None,
211
+ extra_body: Body | None = None,
212
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
213
+ ) -> None:
214
+ """Open a WebSocket to moderate live voice/call audio in real time.
215
+
216
+ Speech is
217
+ transcribed and each finalized utterance is moderated by your enabled text
218
+ policies; you receive a verdict per utterance as it's spoken.
219
+
220
+ **This is a WebSocket upgrade, not a regular HTTP call.** The request body below
221
+ documents the frames you _send_ over the socket; the `101` response documents
222
+ the events you _receive_.
223
+
224
+ - **Auth:** `Authorization: Bearer <api_key>` on the upgrade. A missing/invalid
225
+ key closes `4401`; voice not enabled on the plan/channel closes `4403`.
226
+ - **Subprotocol:** request `moderationapi.v1`.
227
+ - **Flow:** send one `start` frame, then `media` frames as audio arrives, then
228
+ `stop` (or disconnect). You receive `session.started`, `utterance.final` per
229
+ utterance, optional `utterance.partial`/`warning`, and `session.ended`.
230
+ - **Close codes:** `1000` normal · `1011` server error · `4400` bad request ·
231
+ `4401` auth failed · `4403` voice not enabled · `4429` concurrency limit.
232
+
233
+ See the
234
+ [Real-time voice guide](https://docs.moderationapi.com/content-moderation/real-time-voice)
235
+ for the full walkthrough and code examples.
236
+
237
+ Args:
238
+ extra_headers: Send extra headers
239
+
240
+ extra_query: Add additional query parameters to the request
241
+
242
+ extra_body: Add additional JSON properties to the request
243
+
244
+ timeout: Override the client-level default timeout for this request, in seconds
245
+ """
246
+ extra_headers = {"Accept": "*/*", **(extra_headers or {})}
247
+ extra_headers.update({"Sec-WebSocket-Protocol": str(sec_web_socket_protocol)})
248
+ return await self._get(
249
+ "/stream" if self._client._base_url_overridden else "wss://voice.moderationapi.com/v1/stream",
250
+ options=make_request_options(
251
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
252
+ ),
253
+ cast_to=NoneType,
254
+ )
255
+
150
256
  async def submit(
151
257
  self,
152
258
  *,
@@ -234,6 +340,9 @@ class ContentResourceWithRawResponse:
234
340
  def __init__(self, content: ContentResource) -> None:
235
341
  self._content = content
236
342
 
343
+ self.stream = to_raw_response_wrapper(
344
+ content.stream,
345
+ )
237
346
  self.submit = to_raw_response_wrapper(
238
347
  content.submit,
239
348
  )
@@ -243,6 +352,9 @@ class AsyncContentResourceWithRawResponse:
243
352
  def __init__(self, content: AsyncContentResource) -> None:
244
353
  self._content = content
245
354
 
355
+ self.stream = async_to_raw_response_wrapper(
356
+ content.stream,
357
+ )
246
358
  self.submit = async_to_raw_response_wrapper(
247
359
  content.submit,
248
360
  )
@@ -252,6 +364,9 @@ class ContentResourceWithStreamingResponse:
252
364
  def __init__(self, content: ContentResource) -> None:
253
365
  self._content = content
254
366
 
367
+ self.stream = to_streamed_response_wrapper(
368
+ content.stream,
369
+ )
255
370
  self.submit = to_streamed_response_wrapper(
256
371
  content.submit,
257
372
  )
@@ -261,6 +376,9 @@ class AsyncContentResourceWithStreamingResponse:
261
376
  def __init__(self, content: AsyncContentResource) -> None:
262
377
  self._content = content
263
378
 
379
+ self.stream = async_to_streamed_response_wrapper(
380
+ content.stream,
381
+ )
264
382
  self.submit = async_to_streamed_response_wrapper(
265
383
  content.submit,
266
384
  )
@@ -0,0 +1,143 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ import httpx
6
+
7
+ from .._types import Body, Query, Headers, NotGiven, not_given
8
+ from .._compat import cached_property
9
+ from .._resource import SyncAPIResource, AsyncAPIResource
10
+ from .._response import (
11
+ to_raw_response_wrapper,
12
+ to_streamed_response_wrapper,
13
+ async_to_raw_response_wrapper,
14
+ async_to_streamed_response_wrapper,
15
+ )
16
+ from .._base_client import make_request_options
17
+ from ..types.webhook_secret_retrieve_response import WebhookSecretRetrieveResponse
18
+
19
+ __all__ = ["WebhookSecretResource", "AsyncWebhookSecretResource"]
20
+
21
+
22
+ class WebhookSecretResource(SyncAPIResource):
23
+ @cached_property
24
+ def with_raw_response(self) -> WebhookSecretResourceWithRawResponse:
25
+ """
26
+ This property can be used as a prefix for any HTTP method call to return
27
+ the raw response object instead of the parsed content.
28
+
29
+ For more information, see https://www.github.com/moderation-api/sdk-python#accessing-raw-response-data-eg-headers
30
+ """
31
+ return WebhookSecretResourceWithRawResponse(self)
32
+
33
+ @cached_property
34
+ def with_streaming_response(self) -> WebhookSecretResourceWithStreamingResponse:
35
+ """
36
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
37
+
38
+ For more information, see https://www.github.com/moderation-api/sdk-python#with_streaming_response
39
+ """
40
+ return WebhookSecretResourceWithStreamingResponse(self)
41
+
42
+ def retrieve(
43
+ self,
44
+ *,
45
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
46
+ # The extra values given here take precedence over values defined on the client or passed to this method.
47
+ extra_headers: Headers | None = None,
48
+ extra_query: Query | None = None,
49
+ extra_body: Body | None = None,
50
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
51
+ ) -> WebhookSecretRetrieveResponse:
52
+ """
53
+ Get the signing secret used to sign webhook deliveries for this project,
54
+ creating one if none exists yet. Verify deliveries by comparing the
55
+ `modapi-signature` header to HMAC-SHA256(raw request body, secret) hex-encoded.
56
+ """
57
+ return self._get(
58
+ "/webhook-secret",
59
+ options=make_request_options(
60
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
61
+ ),
62
+ cast_to=WebhookSecretRetrieveResponse,
63
+ )
64
+
65
+
66
+ class AsyncWebhookSecretResource(AsyncAPIResource):
67
+ @cached_property
68
+ def with_raw_response(self) -> AsyncWebhookSecretResourceWithRawResponse:
69
+ """
70
+ This property can be used as a prefix for any HTTP method call to return
71
+ the raw response object instead of the parsed content.
72
+
73
+ For more information, see https://www.github.com/moderation-api/sdk-python#accessing-raw-response-data-eg-headers
74
+ """
75
+ return AsyncWebhookSecretResourceWithRawResponse(self)
76
+
77
+ @cached_property
78
+ def with_streaming_response(self) -> AsyncWebhookSecretResourceWithStreamingResponse:
79
+ """
80
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
81
+
82
+ For more information, see https://www.github.com/moderation-api/sdk-python#with_streaming_response
83
+ """
84
+ return AsyncWebhookSecretResourceWithStreamingResponse(self)
85
+
86
+ async def retrieve(
87
+ self,
88
+ *,
89
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
90
+ # The extra values given here take precedence over values defined on the client or passed to this method.
91
+ extra_headers: Headers | None = None,
92
+ extra_query: Query | None = None,
93
+ extra_body: Body | None = None,
94
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
95
+ ) -> WebhookSecretRetrieveResponse:
96
+ """
97
+ Get the signing secret used to sign webhook deliveries for this project,
98
+ creating one if none exists yet. Verify deliveries by comparing the
99
+ `modapi-signature` header to HMAC-SHA256(raw request body, secret) hex-encoded.
100
+ """
101
+ return await self._get(
102
+ "/webhook-secret",
103
+ options=make_request_options(
104
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
105
+ ),
106
+ cast_to=WebhookSecretRetrieveResponse,
107
+ )
108
+
109
+
110
+ class WebhookSecretResourceWithRawResponse:
111
+ def __init__(self, webhook_secret: WebhookSecretResource) -> None:
112
+ self._webhook_secret = webhook_secret
113
+
114
+ self.retrieve = to_raw_response_wrapper(
115
+ webhook_secret.retrieve,
116
+ )
117
+
118
+
119
+ class AsyncWebhookSecretResourceWithRawResponse:
120
+ def __init__(self, webhook_secret: AsyncWebhookSecretResource) -> None:
121
+ self._webhook_secret = webhook_secret
122
+
123
+ self.retrieve = async_to_raw_response_wrapper(
124
+ webhook_secret.retrieve,
125
+ )
126
+
127
+
128
+ class WebhookSecretResourceWithStreamingResponse:
129
+ def __init__(self, webhook_secret: WebhookSecretResource) -> None:
130
+ self._webhook_secret = webhook_secret
131
+
132
+ self.retrieve = to_streamed_response_wrapper(
133
+ webhook_secret.retrieve,
134
+ )
135
+
136
+
137
+ class AsyncWebhookSecretResourceWithStreamingResponse:
138
+ def __init__(self, webhook_secret: AsyncWebhookSecretResource) -> None:
139
+ self._webhook_secret = webhook_secret
140
+
141
+ self.retrieve = async_to_streamed_response_wrapper(
142
+ webhook_secret.retrieve,
143
+ )