sequenzy 2.0.0__py3-none-any.whl

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 (1149) hide show
  1. sequenzy/.fern/metadata.json +12 -0
  2. sequenzy/__init__.py +3017 -0
  3. sequenzy/_default_clients.py +30 -0
  4. sequenzy/ab_tests/__init__.py +91 -0
  5. sequenzy/ab_tests/client.py +1229 -0
  6. sequenzy/ab_tests/raw_client.py +2275 -0
  7. sequenzy/ab_tests/types/__init__.py +89 -0
  8. sequenzy/ab_tests/types/add_variant_ab_tests_response.py +32 -0
  9. sequenzy/ab_tests/types/create_ab_tests_request_test_type.py +5 -0
  10. sequenzy/ab_tests/types/create_ab_tests_request_variants_item.py +32 -0
  11. sequenzy/ab_tests/types/create_ab_tests_request_winner_criteria.py +5 -0
  12. sequenzy/ab_tests/types/create_ab_tests_response.py +50 -0
  13. sequenzy/ab_tests/types/delete_ab_tests_response.py +19 -0
  14. sequenzy/ab_tests/types/delete_variant_ab_tests_response.py +30 -0
  15. sequenzy/ab_tests/types/get_ab_tests_response.py +30 -0
  16. sequenzy/ab_tests/types/get_stats_ab_tests_request_period.py +5 -0
  17. sequenzy/ab_tests/types/get_stats_ab_tests_response.py +31 -0
  18. sequenzy/ab_tests/types/get_stats_ab_tests_response_variants_item.py +27 -0
  19. sequenzy/ab_tests/types/list_ab_tests_response.py +30 -0
  20. sequenzy/ab_tests/types/restart_ab_tests_request_test_type.py +5 -0
  21. sequenzy/ab_tests/types/restart_ab_tests_response.py +41 -0
  22. sequenzy/ab_tests/types/update_ab_tests_request_test_type.py +5 -0
  23. sequenzy/ab_tests/types/update_ab_tests_request_winner_criteria.py +5 -0
  24. sequenzy/ab_tests/types/update_ab_tests_response.py +30 -0
  25. sequenzy/ab_tests/types/update_variant_ab_tests_response.py +28 -0
  26. sequenzy/account/__init__.py +103 -0
  27. sequenzy/account/client.py +646 -0
  28. sequenzy/account/raw_client.py +1257 -0
  29. sequenzy/account/types/__init__.py +103 -0
  30. sequenzy/account/types/create_api_key_request_preset.py +17 -0
  31. sequenzy/account/types/create_api_key_response.py +27 -0
  32. sequenzy/account/types/create_api_key_response_api_key.py +42 -0
  33. sequenzy/account/types/create_api_key_response_api_key_permissions.py +39 -0
  34. sequenzy/account/types/get_account_response.py +42 -0
  35. sequenzy/account/types/get_account_response_api_key_permissions.py +136 -0
  36. sequenzy/account/types/get_account_response_api_key_permissions_active_key.py +31 -0
  37. sequenzy/account/types/get_account_response_api_key_permissions_active_key_type.py +5 -0
  38. sequenzy/account/types/get_account_response_api_key_permissions_preset.py +18 -0
  39. sequenzy/account/types/get_account_response_companies_item.py +25 -0
  40. sequenzy/account/types/get_account_response_companies_item_role.py +5 -0
  41. sequenzy/account/types/get_account_response_user.py +19 -0
  42. sequenzy/account/types/get_integration_guide_response.py +23 -0
  43. sequenzy/account/types/list_api_keys_response.py +25 -0
  44. sequenzy/account/types/request_api_key_handoff_request_preset.py +17 -0
  45. sequenzy/account/types/request_api_key_handoff_response.py +27 -0
  46. sequenzy/account/types/request_api_key_handoff_response_handoff.py +81 -0
  47. sequenzy/account/types/request_api_key_handoff_response_handoff_key_type.py +5 -0
  48. sequenzy/account/types/request_api_key_handoff_response_handoff_replaces.py +30 -0
  49. sequenzy/account/types/revoke_api_key_response.py +24 -0
  50. sequenzy/account/types/update_api_key_request_preset.py +17 -0
  51. sequenzy/account/types/update_api_key_response.py +24 -0
  52. sequenzy/analytics/__init__.py +163 -0
  53. sequenzy/analytics/client.py +1896 -0
  54. sequenzy/analytics/raw_client.py +3036 -0
  55. sequenzy/analytics/types/__init__.py +167 -0
  56. sequenzy/analytics/types/get_campaign_metrics_request_period.py +5 -0
  57. sequenzy/analytics/types/get_campaign_metrics_response.py +67 -0
  58. sequenzy/analytics/types/get_campaign_stats_legacy_request_period.py +5 -0
  59. sequenzy/analytics/types/get_campaign_stats_legacy_response.py +63 -0
  60. sequenzy/analytics/types/get_metrics_request_email_type.py +5 -0
  61. sequenzy/analytics/types/get_metrics_request_period.py +5 -0
  62. sequenzy/analytics/types/get_metrics_response.py +76 -0
  63. sequenzy/analytics/types/get_metrics_response_email_type.py +5 -0
  64. sequenzy/analytics/types/get_recipients_request_period.py +5 -0
  65. sequenzy/analytics/types/get_recipients_response.py +23 -0
  66. sequenzy/analytics/types/get_recipients_response_recipients_item.py +24 -0
  67. sequenzy/analytics/types/get_recipients_response_recipients_item_clicked_item.py +41 -0
  68. sequenzy/analytics/types/get_recipients_response_recipients_item_clicked_item_engagement_quality.py +7 -0
  69. sequenzy/analytics/types/get_recipients_response_recipients_item_opened_item.py +40 -0
  70. sequenzy/analytics/types/get_recipients_response_recipients_item_opened_item_engagement_quality.py +7 -0
  71. sequenzy/analytics/types/get_sequence_metrics_request_period.py +5 -0
  72. sequenzy/analytics/types/get_sequence_metrics_response.py +58 -0
  73. sequenzy/analytics/types/get_sequence_metrics_response_enrollment_skipped.py +37 -0
  74. sequenzy/analytics/types/get_sequence_metrics_response_steps_item.py +61 -0
  75. sequenzy/analytics/types/get_sequence_metrics_response_steps_item_failed_subscribers_item.py +52 -0
  76. sequenzy/analytics/types/get_stats_legacy_request_email_type.py +5 -0
  77. sequenzy/analytics/types/get_stats_legacy_request_period.py +5 -0
  78. sequenzy/analytics/types/get_stats_legacy_response.py +52 -0
  79. sequenzy/analytics/types/get_stats_legacy_response_email_type.py +5 -0
  80. sequenzy/analytics/types/get_transactional_metrics_legacy_request_period.py +5 -0
  81. sequenzy/analytics/types/get_transactional_metrics_request_period.py +5 -0
  82. sequenzy/analytics/types/list_campaign_events_request_event_type.py +10 -0
  83. sequenzy/analytics/types/list_campaign_events_request_period.py +5 -0
  84. sequenzy/analytics/types/list_campaign_events_response.py +31 -0
  85. sequenzy/analytics/types/list_campaign_poll_responses_legacy_response.py +31 -0
  86. sequenzy/analytics/types/list_campaign_poll_responses_response.py +37 -0
  87. sequenzy/analytics/types/list_email_metrics_request_email_type.py +5 -0
  88. sequenzy/analytics/types/list_email_metrics_request_order.py +5 -0
  89. sequenzy/analytics/types/list_email_metrics_request_period.py +5 -0
  90. sequenzy/analytics/types/list_email_metrics_request_sort.py +20 -0
  91. sequenzy/analytics/types/list_email_metrics_response.py +55 -0
  92. sequenzy/analytics/types/list_email_metrics_response_email_type.py +5 -0
  93. sequenzy/analytics/types/list_email_metrics_response_emails_item.py +63 -0
  94. sequenzy/analytics/types/list_email_metrics_response_emails_item_email_type.py +5 -0
  95. sequenzy/analytics/types/list_sequence_events_request_event_type.py +10 -0
  96. sequenzy/analytics/types/list_sequence_events_request_period.py +5 -0
  97. sequenzy/analytics/types/list_sequence_events_response.py +36 -0
  98. sequenzy/audience_syncs/__init__.py +64 -0
  99. sequenzy/audience_syncs/client.py +484 -0
  100. sequenzy/audience_syncs/raw_client.py +954 -0
  101. sequenzy/audience_syncs/types/__init__.py +62 -0
  102. sequenzy/audience_syncs/types/create_audience_syncs_request.py +5 -0
  103. sequenzy/audience_syncs/types/create_audience_syncs_request_frequency.py +5 -0
  104. sequenzy/audience_syncs/types/create_audience_syncs_response.py +25 -0
  105. sequenzy/audience_syncs/types/delete_audience_syncs_response.py +19 -0
  106. sequenzy/audience_syncs/types/list_ad_accounts_response.py +25 -0
  107. sequenzy/audience_syncs/types/list_audience_syncs_response.py +27 -0
  108. sequenzy/audience_syncs/types/run_now_audience_syncs_response.py +20 -0
  109. sequenzy/audience_syncs/types/update_audience_syncs_request_frequency.py +5 -0
  110. sequenzy/audience_syncs/types/update_audience_syncs_response.py +25 -0
  111. sequenzy/campaigns/__init__.py +145 -0
  112. sequenzy/campaigns/client.py +2788 -0
  113. sequenzy/campaigns/raw_client.py +4803 -0
  114. sequenzy/campaigns/types/__init__.py +143 -0
  115. sequenzy/campaigns/types/cancel_campaigns_response.py +26 -0
  116. sequenzy/campaigns/types/create_campaigns_request_email_preset.py +5 -0
  117. sequenzy/campaigns/types/create_campaigns_request_status.py +5 -0
  118. sequenzy/campaigns/types/create_campaigns_response.py +23 -0
  119. sequenzy/campaigns/types/create_campaigns_response_campaign.py +98 -0
  120. sequenzy/campaigns/types/create_goal_campaigns_response.py +21 -0
  121. sequenzy/campaigns/types/create_share_link_campaigns_response.py +44 -0
  122. sequenzy/campaigns/types/delete_campaigns_response.py +19 -0
  123. sequenzy/campaigns/types/delete_goal_campaigns_response.py +24 -0
  124. sequenzy/campaigns/types/duplicate_campaigns_request_mode.py +5 -0
  125. sequenzy/campaigns/types/duplicate_campaigns_response.py +26 -0
  126. sequenzy/campaigns/types/duplicate_campaigns_response_campaign.py +245 -0
  127. sequenzy/campaigns/types/get_audience_campaigns_response.py +51 -0
  128. sequenzy/campaigns/types/get_campaigns_response.py +26 -0
  129. sequenzy/campaigns/types/list_campaigns_request_status.py +8 -0
  130. sequenzy/campaigns/types/list_campaigns_response.py +23 -0
  131. sequenzy/campaigns/types/list_campaigns_response_pagination.py +27 -0
  132. sequenzy/campaigns/types/list_goals_campaigns_response.py +21 -0
  133. sequenzy/campaigns/types/pause_campaigns_response.py +26 -0
  134. sequenzy/campaigns/types/preview_computed_data_campaigns_request_subscriber.py +36 -0
  135. sequenzy/campaigns/types/preview_computed_data_campaigns_response.py +22 -0
  136. sequenzy/campaigns/types/preview_computed_data_campaigns_response_lists_item.py +21 -0
  137. sequenzy/campaigns/types/resend_to_non_openers_campaigns_response.py +40 -0
  138. sequenzy/campaigns/types/resend_to_non_openers_campaigns_response_campaign.py +245 -0
  139. sequenzy/campaigns/types/resume_campaigns_response.py +26 -0
  140. sequenzy/campaigns/types/revoke_share_link_campaigns_response.py +24 -0
  141. sequenzy/campaigns/types/schedule_campaigns_request_recurring_interval.py +5 -0
  142. sequenzy/campaigns/types/schedule_campaigns_response.py +36 -0
  143. sequenzy/campaigns/types/schedule_campaigns_response_campaign.py +60 -0
  144. sequenzy/campaigns/types/schedule_campaigns_response_campaign_status.py +5 -0
  145. sequenzy/campaigns/types/send_test_campaigns_response.py +48 -0
  146. sequenzy/campaigns/types/unschedule_campaigns_response.py +26 -0
  147. sequenzy/campaigns/types/update_campaigns_request_email_preset.py +5 -0
  148. sequenzy/campaigns/types/update_campaigns_response.py +23 -0
  149. sequenzy/campaigns/types/update_campaigns_response_campaign.py +71 -0
  150. sequenzy/campaigns/types/update_goal_campaigns_response.py +21 -0
  151. sequenzy/client.py +974 -0
  152. sequenzy/companies/__init__.py +79 -0
  153. sequenzy/companies/client.py +624 -0
  154. sequenzy/companies/raw_client.py +962 -0
  155. sequenzy/companies/types/__init__.py +77 -0
  156. sequenzy/companies/types/create_companies_response.py +22 -0
  157. sequenzy/companies/types/create_companies_response_company.py +26 -0
  158. sequenzy/companies/types/get_companies_response.py +21 -0
  159. sequenzy/companies/types/list_companies_response.py +26 -0
  160. sequenzy/companies/types/update_companies_request_email_direction.py +5 -0
  161. sequenzy/companies/types/update_companies_request_email_length_preference.py +7 -0
  162. sequenzy/companies/types/update_companies_request_email_theme.py +60 -0
  163. sequenzy/companies/types/update_companies_request_email_theme_button_style.py +5 -0
  164. sequenzy/companies/types/update_companies_request_email_theme_colors.py +46 -0
  165. sequenzy/companies/types/update_companies_request_email_theme_layout.py +53 -0
  166. sequenzy/companies/types/update_companies_request_email_theme_preset_id.py +7 -0
  167. sequenzy/companies/types/update_companies_request_email_theme_typography.py +90 -0
  168. sequenzy/companies/types/update_companies_request_reply_tracking_domain_mode.py +5 -0
  169. sequenzy/companies/types/update_companies_response.py +21 -0
  170. sequenzy/conversations/__init__.py +70 -0
  171. sequenzy/conversations/client.py +529 -0
  172. sequenzy/conversations/raw_client.py +938 -0
  173. sequenzy/conversations/types/__init__.py +70 -0
  174. sequenzy/conversations/types/get_conversations_response.py +24 -0
  175. sequenzy/conversations/types/list_conversations_request_status.py +5 -0
  176. sequenzy/conversations/types/list_conversations_request_unread.py +5 -0
  177. sequenzy/conversations/types/list_conversations_response.py +23 -0
  178. sequenzy/conversations/types/mark_read_conversations_response.py +23 -0
  179. sequenzy/conversations/types/send_message_conversations_request_type.py +5 -0
  180. sequenzy/conversations/types/send_message_conversations_response.py +21 -0
  181. sequenzy/conversations/types/update_status_conversations_request_status.py +5 -0
  182. sequenzy/conversations/types/update_status_conversations_response.py +21 -0
  183. sequenzy/conversations/types/update_status_conversations_response_conversation.py +23 -0
  184. sequenzy/conversations/types/update_status_conversations_response_conversation_status.py +5 -0
  185. sequenzy/core/__init__.py +127 -0
  186. sequenzy/core/api_error.py +23 -0
  187. sequenzy/core/client_wrapper.py +146 -0
  188. sequenzy/core/datetime_utils.py +70 -0
  189. sequenzy/core/file.py +67 -0
  190. sequenzy/core/force_multipart.py +18 -0
  191. sequenzy/core/http_client.py +940 -0
  192. sequenzy/core/http_response.py +63 -0
  193. sequenzy/core/http_sse/__init__.py +42 -0
  194. sequenzy/core/http_sse/_api.py +455 -0
  195. sequenzy/core/http_sse/_decoders.py +74 -0
  196. sequenzy/core/http_sse/_exceptions.py +7 -0
  197. sequenzy/core/http_sse/_models.py +17 -0
  198. sequenzy/core/jsonable_encoder.py +133 -0
  199. sequenzy/core/logging.py +107 -0
  200. sequenzy/core/parse_error.py +36 -0
  201. sequenzy/core/pydantic_utilities.py +508 -0
  202. sequenzy/core/query_encoder.py +58 -0
  203. sequenzy/core/remove_none_from_dict.py +11 -0
  204. sequenzy/core/request_options.py +40 -0
  205. sequenzy/core/serialization.py +347 -0
  206. sequenzy/email_blocks/__init__.py +49 -0
  207. sequenzy/email_blocks/client.py +207 -0
  208. sequenzy/email_blocks/raw_client.py +344 -0
  209. sequenzy/email_blocks/types/__init__.py +47 -0
  210. sequenzy/email_blocks/types/get_email_blocks_request_condition_fields.py +5 -0
  211. sequenzy/email_blocks/types/get_email_blocks_response.py +55 -0
  212. sequenzy/email_blocks/types/list_email_blocks_request_creatable_only.py +5 -0
  213. sequenzy/email_blocks/types/list_email_blocks_response.py +45 -0
  214. sequenzy/email_components/__init__.py +79 -0
  215. sequenzy/email_components/client.py +717 -0
  216. sequenzy/email_components/raw_client.py +1373 -0
  217. sequenzy/email_components/types/__init__.py +77 -0
  218. sequenzy/email_components/types/create_email_components_request_component_type.py +5 -0
  219. sequenzy/email_components/types/create_email_components_response.py +28 -0
  220. sequenzy/email_components/types/delete_email_components_response.py +20 -0
  221. sequenzy/email_components/types/get_default_email_components_request_slot.py +5 -0
  222. sequenzy/email_components/types/get_default_email_components_response.py +26 -0
  223. sequenzy/email_components/types/get_email_components_response.py +26 -0
  224. sequenzy/email_components/types/list_email_components_request_defaults_only.py +5 -0
  225. sequenzy/email_components/types/list_email_components_request_slot.py +5 -0
  226. sequenzy/email_components/types/list_email_components_request_type.py +5 -0
  227. sequenzy/email_components/types/list_email_components_response.py +26 -0
  228. sequenzy/email_components/types/set_default_email_components_request_slot.py +5 -0
  229. sequenzy/email_components/types/set_default_email_components_response.py +28 -0
  230. sequenzy/email_components/types/update_email_components_request_component_type.py +5 -0
  231. sequenzy/email_components/types/update_email_components_response.py +28 -0
  232. sequenzy/email_sends/__init__.py +64 -0
  233. sequenzy/email_sends/client.py +342 -0
  234. sequenzy/email_sends/raw_client.py +559 -0
  235. sequenzy/email_sends/types/__init__.py +62 -0
  236. sequenzy/email_sends/types/get_email_sends_response.py +30 -0
  237. sequenzy/email_sends/types/get_email_sends_response_source.py +5 -0
  238. sequenzy/email_sends/types/list_email_sends_request_bounce_type.py +5 -0
  239. sequenzy/email_sends/types/list_email_sends_request_email_type.py +5 -0
  240. sequenzy/email_sends/types/list_email_sends_request_sort_field.py +7 -0
  241. sequenzy/email_sends/types/list_email_sends_request_sort_order.py +5 -0
  242. sequenzy/email_sends/types/list_email_sends_request_status.py +10 -0
  243. sequenzy/email_sends/types/list_email_sends_response.py +32 -0
  244. sequenzy/email_sends/types/list_email_sends_response_email_sends_item.py +27 -0
  245. sequenzy/emails/__init__.py +49 -0
  246. sequenzy/emails/client.py +435 -0
  247. sequenzy/emails/raw_client.py +800 -0
  248. sequenzy/emails/types/__init__.py +47 -0
  249. sequenzy/emails/types/create_emails_response.py +28 -0
  250. sequenzy/emails/types/update_blocks_emails_request_type.py +5 -0
  251. sequenzy/emails/types/update_blocks_emails_response.py +28 -0
  252. sequenzy/emails/types/update_emails_response.py +28 -0
  253. sequenzy/environment.py +7 -0
  254. sequenzy/errors/__init__.py +62 -0
  255. sequenzy/errors/bad_request_error.py +10 -0
  256. sequenzy/errors/conflict_error.py +10 -0
  257. sequenzy/errors/forbidden_error.py +11 -0
  258. sequenzy/errors/internal_server_error.py +10 -0
  259. sequenzy/errors/not_found_error.py +10 -0
  260. sequenzy/errors/service_unavailable_error.py +10 -0
  261. sequenzy/errors/too_many_requests_error.py +10 -0
  262. sequenzy/errors/unauthorized_error.py +10 -0
  263. sequenzy/errors/unprocessable_entity_error.py +10 -0
  264. sequenzy/events/__init__.py +37 -0
  265. sequenzy/events/client.py +129 -0
  266. sequenzy/events/raw_client.py +201 -0
  267. sequenzy/events/types/__init__.py +38 -0
  268. sequenzy/events/types/get_schemas_events_request_provider.py +7 -0
  269. sequenzy/events/types/get_schemas_events_response.py +40 -0
  270. sequenzy/feedback/__init__.py +49 -0
  271. sequenzy/feedback/client.py +212 -0
  272. sequenzy/feedback/raw_client.py +317 -0
  273. sequenzy/feedback/types/__init__.py +47 -0
  274. sequenzy/feedback/types/submit_feedback_request_category.py +7 -0
  275. sequenzy/feedback/types/submit_feedback_request_source.py +5 -0
  276. sequenzy/feedback/types/submit_feedback_request_tool_calls_item.py +32 -0
  277. sequenzy/feedback/types/submit_feedback_response.py +20 -0
  278. sequenzy/generation/__init__.py +55 -0
  279. sequenzy/generation/client.py +352 -0
  280. sequenzy/generation/raw_client.py +676 -0
  281. sequenzy/generation/types/__init__.py +53 -0
  282. sequenzy/generation/types/generate_email_request_email_type.py +5 -0
  283. sequenzy/generation/types/generate_email_response.py +38 -0
  284. sequenzy/generation/types/generate_sms_messages_response.py +22 -0
  285. sequenzy/generation/types/generate_sms_messages_response_messages_item.py +27 -0
  286. sequenzy/generation/types/generate_sms_messages_response_messages_item_encoding.py +5 -0
  287. sequenzy/generation/types/generate_subject_lines_response.py +21 -0
  288. sequenzy/integrations/__init__.py +82 -0
  289. sequenzy/integrations/client.py +851 -0
  290. sequenzy/integrations/raw_client.py +1689 -0
  291. sequenzy/integrations/types/__init__.py +80 -0
  292. sequenzy/integrations/types/activate_pixel_integrations_response.py +33 -0
  293. sequenzy/integrations/types/connect_integrations_request_history_import.py +61 -0
  294. sequenzy/integrations/types/connect_integrations_request_history_import_region.py +5 -0
  295. sequenzy/integrations/types/connect_integrations_request_provider.py +8 -0
  296. sequenzy/integrations/types/connect_integrations_request_settings.py +30 -0
  297. sequenzy/integrations/types/connect_integrations_response.py +60 -0
  298. sequenzy/integrations/types/connect_integrations_response_history.py +25 -0
  299. sequenzy/integrations/types/list_activity_integrations_request_status.py +7 -0
  300. sequenzy/integrations/types/list_activity_integrations_response.py +27 -0
  301. sequenzy/integrations/types/list_capabilities_integrations_response.py +21 -0
  302. sequenzy/integrations/types/list_integrations_response.py +21 -0
  303. sequenzy/integrations/types/sync_integrations_response.py +44 -0
  304. sequenzy/integrations/types/sync_integrations_response_sync_target.py +31 -0
  305. sequenzy/integrations/types/update_sync_integrations_response.py +73 -0
  306. sequenzy/integrations/types/update_sync_integrations_response_list_targeting.py +7 -0
  307. sequenzy/landing_pages/__init__.py +88 -0
  308. sequenzy/landing_pages/client.py +1368 -0
  309. sequenzy/landing_pages/raw_client.py +2615 -0
  310. sequenzy/landing_pages/types/__init__.py +86 -0
  311. sequenzy/landing_pages/types/connect_dedicated_domain_landing_pages_response.py +22 -0
  312. sequenzy/landing_pages/types/connect_domain_landing_pages_response.py +22 -0
  313. sequenzy/landing_pages/types/create_landing_pages_request_template.py +20 -0
  314. sequenzy/landing_pages/types/create_landing_pages_response.py +26 -0
  315. sequenzy/landing_pages/types/delete_landing_pages_response.py +25 -0
  316. sequenzy/landing_pages/types/duplicate_landing_pages_response.py +26 -0
  317. sequenzy/landing_pages/types/get_dedicated_domain_landing_pages_response.py +21 -0
  318. sequenzy/landing_pages/types/get_domain_landing_pages_response.py +21 -0
  319. sequenzy/landing_pages/types/get_landing_pages_response.py +25 -0
  320. sequenzy/landing_pages/types/list_landing_pages_response.py +31 -0
  321. sequenzy/landing_pages/types/publish_landing_pages_response.py +25 -0
  322. sequenzy/landing_pages/types/remove_dedicated_domain_landing_pages_response.py +21 -0
  323. sequenzy/landing_pages/types/unpublish_landing_pages_response.py +25 -0
  324. sequenzy/landing_pages/types/update_domain_settings_landing_pages_response.py +21 -0
  325. sequenzy/landing_pages/types/update_landing_pages_response.py +25 -0
  326. sequenzy/landing_pages/types/verify_dedicated_domain_landing_pages_response.py +21 -0
  327. sequenzy/landing_pages/types/verify_domain_landing_pages_response.py +21 -0
  328. sequenzy/lists/__init__.py +64 -0
  329. sequenzy/lists/client.py +608 -0
  330. sequenzy/lists/raw_client.py +1095 -0
  331. sequenzy/lists/types/__init__.py +62 -0
  332. sequenzy/lists/types/add_subscribers_lists_request_duplicate_strategy.py +5 -0
  333. sequenzy/lists/types/add_subscribers_lists_request_opt_in_mode.py +5 -0
  334. sequenzy/lists/types/add_subscribers_lists_response.py +41 -0
  335. sequenzy/lists/types/add_subscribers_lists_response_results_item.py +29 -0
  336. sequenzy/lists/types/create_lists_response.py +25 -0
  337. sequenzy/lists/types/delete_lists_response.py +30 -0
  338. sequenzy/lists/types/list_lists_response.py +21 -0
  339. sequenzy/lists/types/remove_subscribers_lists_response.py +35 -0
  340. sequenzy/lists/types/update_lists_response.py +25 -0
  341. sequenzy/media/__init__.py +49 -0
  342. sequenzy/media/client.py +375 -0
  343. sequenzy/media/raw_client.py +682 -0
  344. sequenzy/media/types/__init__.py +47 -0
  345. sequenzy/media/types/complete_email_image_upload_response.py +21 -0
  346. sequenzy/media/types/complete_email_image_upload_response_asset.py +39 -0
  347. sequenzy/media/types/create_email_image_upload_url_response.py +31 -0
  348. sequenzy/media/types/upload_email_image_bytes_response.py +25 -0
  349. sequenzy/migrations/__init__.py +58 -0
  350. sequenzy/migrations/client.py +645 -0
  351. sequenzy/migrations/raw_client.py +1250 -0
  352. sequenzy/migrations/types/__init__.py +56 -0
  353. sequenzy/migrations/types/approve_plan_migrations_response.py +20 -0
  354. sequenzy/migrations/types/cancel_migrations_response.py +20 -0
  355. sequenzy/migrations/types/connect_source_migrations_response.py +20 -0
  356. sequenzy/migrations/types/discover_source_migrations_response.py +20 -0
  357. sequenzy/migrations/types/get_agent_package_migrations_response.py +20 -0
  358. sequenzy/migrations/types/get_run_migrations_response.py +20 -0
  359. sequenzy/migrations/types/start_migrations_response.py +20 -0
  360. sequenzy/notification_preferences/__init__.py +4 -0
  361. sequenzy/notification_preferences/client.py +198 -0
  362. sequenzy/notification_preferences/raw_client.py +311 -0
  363. sequenzy/orders/__init__.py +49 -0
  364. sequenzy/orders/client.py +393 -0
  365. sequenzy/orders/raw_client.py +539 -0
  366. sequenzy/orders/types/__init__.py +47 -0
  367. sequenzy/orders/types/push_orders_request_customer_totals.py +30 -0
  368. sequenzy/orders/types/push_orders_request_status.py +5 -0
  369. sequenzy/orders/types/push_orders_response.py +29 -0
  370. sequenzy/orders/types/track_checkout_started_response.py +30 -0
  371. sequenzy/products/__init__.py +82 -0
  372. sequenzy/products/client.py +905 -0
  373. sequenzy/products/raw_client.py +1642 -0
  374. sequenzy/products/types/__init__.py +82 -0
  375. sequenzy/products/types/attach_delivery_products_request_source.py +5 -0
  376. sequenzy/products/types/attach_delivery_products_response.py +21 -0
  377. sequenzy/products/types/create_delivery_upload_url_products_response.py +30 -0
  378. sequenzy/products/types/delete_products_response.py +20 -0
  379. sequenzy/products/types/get_products_response.py +21 -0
  380. sequenzy/products/types/list_products_request_provider.py +7 -0
  381. sequenzy/products/types/list_products_response.py +23 -0
  382. sequenzy/products/types/list_products_response_pagination.py +40 -0
  383. sequenzy/products/types/register_back_in_stock_response.py +24 -0
  384. sequenzy/products/types/remove_delivery_products_response.py +21 -0
  385. sequenzy/products/types/sync_stripe_products_response.py +24 -0
  386. sequenzy/products/types/upsert_products_request_products_item.py +89 -0
  387. sequenzy/products/types/upsert_products_request_products_item_variants_item.py +53 -0
  388. sequenzy/products/types/upsert_products_request_products_item_variants_item_options_item.py +20 -0
  389. sequenzy/products/types/upsert_products_response.py +36 -0
  390. sequenzy/reference.md +27269 -0
  391. sequenzy/segments/__init__.py +61 -0
  392. sequenzy/segments/client.py +445 -0
  393. sequenzy/segments/raw_client.py +831 -0
  394. sequenzy/segments/types/__init__.py +59 -0
  395. sequenzy/segments/types/create_segments_request.py +5 -0
  396. sequenzy/segments/types/create_segments_request_filter_join_operator.py +5 -0
  397. sequenzy/segments/types/create_segments_response.py +30 -0
  398. sequenzy/segments/types/delete_segments_response.py +19 -0
  399. sequenzy/segments/types/get_count_segments_response.py +25 -0
  400. sequenzy/segments/types/list_segments_response.py +26 -0
  401. sequenzy/segments/types/update_segments_request_filter_join_operator.py +5 -0
  402. sequenzy/segments/types/update_segments_response.py +30 -0
  403. sequenzy/sender_profiles/__init__.py +38 -0
  404. sequenzy/sender_profiles/client.py +269 -0
  405. sequenzy/sender_profiles/raw_client.py +524 -0
  406. sequenzy/sender_profiles/types/__init__.py +40 -0
  407. sequenzy/sender_profiles/types/list_sender_profiles_response.py +43 -0
  408. sequenzy/sender_profiles/types/update_reply_profile_response.py +30 -0
  409. sequenzy/sender_profiles/types/update_sender_profiles_response.py +32 -0
  410. sequenzy/sending_status/__init__.py +34 -0
  411. sequenzy/sending_status/client.py +182 -0
  412. sequenzy/sending_status/raw_client.py +363 -0
  413. sequenzy/sending_status/types/__init__.py +34 -0
  414. sequenzy/sending_status/types/resume_sending_status_response.py +28 -0
  415. sequenzy/sequences/__init__.py +139 -0
  416. sequenzy/sequences/client.py +4043 -0
  417. sequenzy/sequences/raw_client.py +6760 -0
  418. sequenzy/sequences/types/__init__.py +139 -0
  419. sequenzy/sequences/types/archive_sequences_response.py +21 -0
  420. sequenzy/sequences/types/configure_inbound_webhook_sequences_response.py +21 -0
  421. sequenzy/sequences/types/create_goal_sequences_response.py +21 -0
  422. sequenzy/sequences/types/delete_goal_sequences_response.py +24 -0
  423. sequenzy/sequences/types/duplicate_sequences_response.py +25 -0
  424. sequenzy/sequences/types/enroll_subscribers_in_sequences_response.py +58 -0
  425. sequenzy/sequences/types/generate_sequences_response.py +25 -0
  426. sequenzy/sequences/types/get_inbound_webhook_sequences_response.py +21 -0
  427. sequenzy/sequences/types/get_sequences_response.py +26 -0
  428. sequenzy/sequences/types/get_stats_sequences_request_period.py +5 -0
  429. sequenzy/sequences/types/get_stats_sequences_response.py +58 -0
  430. sequenzy/sequences/types/get_stats_sequences_response_enrollment_skipped.py +37 -0
  431. sequenzy/sequences/types/get_stats_sequences_response_steps_item.py +61 -0
  432. sequenzy/sequences/types/get_stats_sequences_response_steps_item_failed_subscribers_item.py +31 -0
  433. sequenzy/sequences/types/list_enrollments_sequences_request_sort.py +7 -0
  434. sequenzy/sequences/types/list_goals_sequences_response.py +21 -0
  435. sequenzy/sequences/types/list_sequences_response.py +23 -0
  436. sequenzy/sequences/types/list_sequences_response_pagination.py +31 -0
  437. sequenzy/sequences/types/rotate_inbound_webhook_secret_sequences_response.py +21 -0
  438. sequenzy/sequences/types/send_test_email_sequences_response.py +26 -0
  439. sequenzy/sequences/types/send_test_email_sequences_response_results_item.py +43 -0
  440. sequenzy/sequences/types/sequence_create_request_email_style.py +5 -0
  441. sequenzy/sequences/types/sequence_create_request_inactivity_baseline.py +7 -0
  442. sequenzy/sequences/types/sequence_create_request_list_scope.py +5 -0
  443. sequenzy/sequences/types/sequence_enrollment_move_request_sort.py +7 -0
  444. sequenzy/sequences/types/sequence_update_request_inactivity_baseline.py +7 -0
  445. sequenzy/sequences/types/sequence_update_request_list_scope.py +5 -0
  446. sequenzy/sequences/types/simulate_sequences_response.py +43 -0
  447. sequenzy/sequences/types/simulate_sequences_response_readiness.py +25 -0
  448. sequenzy/sequences/types/unarchive_sequences_response.py +21 -0
  449. sequenzy/sequences/types/update_goal_sequences_response.py +21 -0
  450. sequenzy/sequences/types/update_sequences_response.py +23 -0
  451. sequenzy/sequences/types/update_sequences_response_sequence.py +162 -0
  452. sequenzy/sequences/types/update_sequences_response_sequence_graph_edit_action.py +7 -0
  453. sequenzy/shopify/__init__.py +37 -0
  454. sequenzy/shopify/client.py +215 -0
  455. sequenzy/shopify/raw_client.py +432 -0
  456. sequenzy/shopify/types/__init__.py +38 -0
  457. sequenzy/shopify/types/get_automation_settings_shopify_response.py +43 -0
  458. sequenzy/shopify/types/update_automation_settings_shopify_response.py +44 -0
  459. sequenzy/sms/__init__.py +55 -0
  460. sequenzy/sms/client.py +313 -0
  461. sequenzy/sms/raw_client.py +663 -0
  462. sequenzy/sms/types/__init__.py +53 -0
  463. sequenzy/sms/types/get_settings_sms_response.py +22 -0
  464. sequenzy/sms/types/get_settings_sms_response_sms.py +35 -0
  465. sequenzy/sms/types/get_settings_sms_response_sms_numbers_item.py +39 -0
  466. sequenzy/sms/types/send_test_sms_response.py +28 -0
  467. sequenzy/sms/types/update_number_label_sms_response.py +22 -0
  468. sequenzy/sms/types/update_number_label_sms_response_number.py +25 -0
  469. sequenzy/subscribers/__init__.py +229 -0
  470. sequenzy/subscribers/client.py +2872 -0
  471. sequenzy/subscribers/events/__init__.py +67 -0
  472. sequenzy/subscribers/events/client.py +352 -0
  473. sequenzy/subscribers/events/raw_client.py +460 -0
  474. sequenzy/subscribers/events/types/__init__.py +65 -0
  475. sequenzy/subscribers/events/types/trigger_bulk_events_request_events_item.py +47 -0
  476. sequenzy/subscribers/events/types/trigger_bulk_events_response.py +38 -0
  477. sequenzy/subscribers/events/types/trigger_bulk_events_response_events_item.py +41 -0
  478. sequenzy/subscribers/events/types/trigger_bulk_events_response_opt_in.py +28 -0
  479. sequenzy/subscribers/events/types/trigger_bulk_events_response_subscriber.py +25 -0
  480. sequenzy/subscribers/events/types/trigger_events_response.py +76 -0
  481. sequenzy/subscribers/events/types/trigger_events_response_event.py +35 -0
  482. sequenzy/subscribers/events/types/trigger_events_response_events_item.py +26 -0
  483. sequenzy/subscribers/events/types/trigger_events_response_opt_in.py +28 -0
  484. sequenzy/subscribers/events/types/trigger_events_response_subscriber.py +25 -0
  485. sequenzy/subscribers/raw_client.py +4840 -0
  486. sequenzy/subscribers/tags/__init__.py +58 -0
  487. sequenzy/subscribers/tags/client.py +302 -0
  488. sequenzy/subscribers/tags/raw_client.py +415 -0
  489. sequenzy/subscribers/tags/types/__init__.py +56 -0
  490. sequenzy/subscribers/tags/types/add_tags_response.py +38 -0
  491. sequenzy/subscribers/tags/types/add_tags_response_opt_in.py +28 -0
  492. sequenzy/subscribers/tags/types/add_tags_response_subscriber.py +30 -0
  493. sequenzy/subscribers/tags/types/add_tags_response_tag.py +25 -0
  494. sequenzy/subscribers/tags/types/remove_tags_response.py +23 -0
  495. sequenzy/subscribers/tags/types/remove_tags_response_subscriber.py +30 -0
  496. sequenzy/subscribers/tags/types/remove_tags_response_tag.py +23 -0
  497. sequenzy/subscribers/types/__init__.py +173 -0
  498. sequenzy/subscribers/types/add_tags_bulk_response.py +38 -0
  499. sequenzy/subscribers/types/add_tags_bulk_response_opt_in.py +28 -0
  500. sequenzy/subscribers/types/add_tags_bulk_response_subscriber.py +26 -0
  501. sequenzy/subscribers/types/add_tags_bulk_response_tags.py +27 -0
  502. sequenzy/subscribers/types/create_import_subscribers_request_duplicate_strategy.py +5 -0
  503. sequenzy/subscribers/types/create_import_subscribers_request_opt_in_mode.py +7 -0
  504. sequenzy/subscribers/types/create_import_subscribers_response.py +27 -0
  505. sequenzy/subscribers/types/create_note_by_external_id_subscribers_response.py +21 -0
  506. sequenzy/subscribers/types/create_note_subscribers_response.py +21 -0
  507. sequenzy/subscribers/types/create_subscribers_request_duplicate_strategy.py +5 -0
  508. sequenzy/subscribers/types/create_subscribers_request_opt_in_mode.py +5 -0
  509. sequenzy/subscribers/types/create_subscribers_request_status.py +5 -0
  510. sequenzy/subscribers/types/create_subscribers_response.py +35 -0
  511. sequenzy/subscribers/types/create_subscribers_response_opt_in.py +28 -0
  512. sequenzy/subscribers/types/create_subscribers_response_subscriber.py +33 -0
  513. sequenzy/subscribers/types/delete_by_external_id_path_subscribers_response.py +20 -0
  514. sequenzy/subscribers/types/delete_by_external_id_subscribers_response.py +20 -0
  515. sequenzy/subscribers/types/delete_note_subscribers_response.py +26 -0
  516. sequenzy/subscribers/types/delete_subscribers_response.py +20 -0
  517. sequenzy/subscribers/types/get_account_info_response.py +21 -0
  518. sequenzy/subscribers/types/get_account_info_response_account.py +26 -0
  519. sequenzy/subscribers/types/get_by_external_id_path_subscribers_response.py +21 -0
  520. sequenzy/subscribers/types/get_by_external_id_subscribers_response.py +21 -0
  521. sequenzy/subscribers/types/get_import_subscribers_response.py +25 -0
  522. sequenzy/subscribers/types/get_subscribers_response.py +21 -0
  523. sequenzy/subscribers/types/import_events_subscribers_request_events_item.py +71 -0
  524. sequenzy/subscribers/types/import_events_subscribers_response.py +83 -0
  525. sequenzy/subscribers/types/import_events_subscribers_response_failures_item.py +20 -0
  526. sequenzy/subscribers/types/import_events_subscribers_response_side_effect_failures_item.py +21 -0
  527. sequenzy/subscribers/types/list_notes_by_external_id_subscribers_response.py +21 -0
  528. sequenzy/subscribers/types/list_notes_subscribers_response.py +21 -0
  529. sequenzy/subscribers/types/list_subscribers_request_attribute_operator.py +7 -0
  530. sequenzy/subscribers/types/list_subscribers_request_include_total.py +5 -0
  531. sequenzy/subscribers/types/list_subscribers_request_status.py +5 -0
  532. sequenzy/subscribers/types/list_subscribers_response.py +23 -0
  533. sequenzy/subscribers/types/update_by_external_id_path_subscribers_request_custom_attributes_strategy.py +7 -0
  534. sequenzy/subscribers/types/update_by_external_id_path_subscribers_request_status.py +7 -0
  535. sequenzy/subscribers/types/update_by_external_id_path_subscribers_response.py +21 -0
  536. sequenzy/subscribers/types/update_by_external_id_subscribers_request_custom_attributes_strategy.py +7 -0
  537. sequenzy/subscribers/types/update_by_external_id_subscribers_request_status.py +7 -0
  538. sequenzy/subscribers/types/update_by_external_id_subscribers_response.py +21 -0
  539. sequenzy/subscribers/types/update_subscribers_request_custom_attributes_strategy.py +5 -0
  540. sequenzy/subscribers/types/update_subscribers_request_status.py +5 -0
  541. sequenzy/subscribers/types/update_subscribers_response.py +21 -0
  542. sequenzy/suppressions/__init__.py +94 -0
  543. sequenzy/suppressions/client.py +358 -0
  544. sequenzy/suppressions/raw_client.py +760 -0
  545. sequenzy/suppressions/types/__init__.py +98 -0
  546. sequenzy/suppressions/types/get_suppressions_response.py +21 -0
  547. sequenzy/suppressions/types/get_suppressions_response_suppression.py +29 -0
  548. sequenzy/suppressions/types/get_suppressions_response_suppression_local.py +51 -0
  549. sequenzy/suppressions/types/get_suppressions_response_suppression_local_scope.py +5 -0
  550. sequenzy/suppressions/types/get_suppressions_response_suppression_local_suppression_type.py +7 -0
  551. sequenzy/suppressions/types/get_suppressions_response_suppression_ses.py +25 -0
  552. sequenzy/suppressions/types/get_suppressions_response_suppression_ses_entries_item.py +36 -0
  553. sequenzy/suppressions/types/get_suppressions_response_suppression_ses_entries_item_reason.py +5 -0
  554. sequenzy/suppressions/types/list_suppressions_request_order.py +5 -0
  555. sequenzy/suppressions/types/list_suppressions_request_sort.py +5 -0
  556. sequenzy/suppressions/types/list_suppressions_response.py +49 -0
  557. sequenzy/suppressions/types/list_suppressions_response_sort_by.py +5 -0
  558. sequenzy/suppressions/types/list_suppressions_response_sort_order.py +5 -0
  559. sequenzy/suppressions/types/list_suppressions_response_suppressions_item.py +63 -0
  560. sequenzy/suppressions/types/list_suppressions_response_suppressions_item_reason.py +5 -0
  561. sequenzy/suppressions/types/list_suppressions_response_suppressions_item_scope.py +5 -0
  562. sequenzy/suppressions/types/list_suppressions_response_suppressions_item_source.py +7 -0
  563. sequenzy/suppressions/types/list_suppressions_response_suppressions_item_suppression_type.py +7 -0
  564. sequenzy/suppressions/types/remove_suppressions_response.py +52 -0
  565. sequenzy/sync_rules/__init__.py +34 -0
  566. sequenzy/sync_rules/client.py +223 -0
  567. sequenzy/sync_rules/raw_client.py +330 -0
  568. sequenzy/sync_rules/types/__init__.py +38 -0
  569. sequenzy/sync_rules/types/get_sync_rules_response.py +34 -0
  570. sequenzy/sync_rules/types/update_sync_rules_response.py +29 -0
  571. sequenzy/tags/__init__.py +39 -0
  572. sequenzy/tags/client.py +340 -0
  573. sequenzy/tags/raw_client.py +746 -0
  574. sequenzy/tags/types/__init__.py +42 -0
  575. sequenzy/tags/types/create_tags_response.py +21 -0
  576. sequenzy/tags/types/delete_tags_response.py +19 -0
  577. sequenzy/tags/types/list_tags_response.py +21 -0
  578. sequenzy/tags/types/update_tags_response.py +21 -0
  579. sequenzy/team/__init__.py +55 -0
  580. sequenzy/team/client.py +282 -0
  581. sequenzy/team/raw_client.py +658 -0
  582. sequenzy/team/types/__init__.py +53 -0
  583. sequenzy/team/types/cancel_invitation_team_response.py +19 -0
  584. sequenzy/team/types/invite_team_request_role.py +5 -0
  585. sequenzy/team/types/invite_team_response.py +23 -0
  586. sequenzy/team/types/invite_team_response_invitation.py +35 -0
  587. sequenzy/team/types/invite_team_response_invitation_role.py +5 -0
  588. sequenzy/team/types/list_team_response.py +21 -0
  589. sequenzy/templates/__init__.py +73 -0
  590. sequenzy/templates/client.py +1152 -0
  591. sequenzy/templates/raw_client.py +2088 -0
  592. sequenzy/templates/types/__init__.py +71 -0
  593. sequenzy/templates/types/create_share_link_templates_response.py +44 -0
  594. sequenzy/templates/types/create_templates_response.py +23 -0
  595. sequenzy/templates/types/create_templates_response_template.py +22 -0
  596. sequenzy/templates/types/delete_templates_response.py +25 -0
  597. sequenzy/templates/types/get_templates_response.py +27 -0
  598. sequenzy/templates/types/list_templates_response.py +33 -0
  599. sequenzy/templates/types/list_templates_response_pagination.py +34 -0
  600. sequenzy/templates/types/revoke_share_link_templates_response.py +24 -0
  601. sequenzy/templates/types/set_localization_templates_response.py +33 -0
  602. sequenzy/templates/types/sync_localizations_templates_response.py +30 -0
  603. sequenzy/templates/types/update_templates_response.py +24 -0
  604. sequenzy/templates/types/update_templates_response_template.py +27 -0
  605. sequenzy/tests/conftest.py +21 -0
  606. sequenzy/tests/test_aiohttp_autodetect.py +113 -0
  607. sequenzy/tracking_settings/__init__.py +37 -0
  608. sequenzy/tracking_settings/client.py +267 -0
  609. sequenzy/tracking_settings/raw_client.py +415 -0
  610. sequenzy/tracking_settings/types/__init__.py +38 -0
  611. sequenzy/tracking_settings/types/update_tracking_settings_request_auto_utm_settings.py +27 -0
  612. sequenzy/tracking_settings/types/update_tracking_settings_response.py +20 -0
  613. sequenzy/transactional/__init__.py +103 -0
  614. sequenzy/transactional/client.py +968 -0
  615. sequenzy/transactional/raw_client.py +1678 -0
  616. sequenzy/transactional/types/__init__.py +103 -0
  617. sequenzy/transactional/types/create_transactional_response.py +28 -0
  618. sequenzy/transactional/types/delete_transactional_response.py +22 -0
  619. sequenzy/transactional/types/delete_transactional_response_deleted.py +35 -0
  620. sequenzy/transactional/types/get_transactional_response.py +26 -0
  621. sequenzy/transactional/types/list_transactional_request_order.py +5 -0
  622. sequenzy/transactional/types/list_transactional_request_sort.py +7 -0
  623. sequenzy/transactional/types/list_transactional_request_status.py +5 -0
  624. sequenzy/transactional/types/list_transactional_response.py +21 -0
  625. sequenzy/transactional/types/send_transactional_request_bcc.py +5 -0
  626. sequenzy/transactional/types/send_transactional_request_cc.py +5 -0
  627. sequenzy/transactional/types/send_transactional_request_email_type.py +5 -0
  628. sequenzy/transactional/types/send_transactional_request_to.py +5 -0
  629. sequenzy/transactional/types/send_transactional_request_tracking_settings.py +46 -0
  630. sequenzy/transactional/types/send_transactional_response.py +8 -0
  631. sequenzy/transactional/types/send_transactional_response_one.py +67 -0
  632. sequenzy/transactional/types/send_transactional_response_one_email_type.py +5 -0
  633. sequenzy/transactional/types/send_transactional_response_one_to.py +5 -0
  634. sequenzy/transactional/types/send_transactional_response_transactional.py +69 -0
  635. sequenzy/transactional/types/send_transactional_response_transactional_email_type.py +5 -0
  636. sequenzy/transactional/types/send_transactional_response_transactional_to.py +5 -0
  637. sequenzy/transactional/types/send_transactional_response_transactional_transactional.py +21 -0
  638. sequenzy/transactional/types/update_transactional_response.py +28 -0
  639. sequenzy/types/__init__.py +1409 -0
  640. sequenzy/types/ab_test.py +119 -0
  641. sequenzy/types/ab_test_content_editing.py +30 -0
  642. sequenzy/types/ab_test_kind.py +5 -0
  643. sequenzy/types/ab_test_test_type.py +5 -0
  644. sequenzy/types/ab_test_variant.py +63 -0
  645. sequenzy/types/ad_account.py +20 -0
  646. sequenzy/types/agent_friendly_error.py +55 -0
  647. sequenzy/types/api_key_metadata.py +65 -0
  648. sequenzy/types/api_key_metadata_type.py +5 -0
  649. sequenzy/types/attachment.py +58 -0
  650. sequenzy/types/audience_sync.py +72 -0
  651. sequenzy/types/audience_sync_frequency.py +5 -0
  652. sequenzy/types/bad_request_error_body.py +21 -0
  653. sequenzy/types/bad_request_error_body_error.py +20 -0
  654. sequenzy/types/block_field_warnings.py +8 -0
  655. sequenzy/types/bulk_subscriber_tag_request.py +63 -0
  656. sequenzy/types/bulk_subscriber_tag_response.py +76 -0
  657. sequenzy/types/bulk_subscriber_tag_response_failures_item.py +25 -0
  658. sequenzy/types/bulk_subscriber_tag_response_not_found.py +31 -0
  659. sequenzy/types/campaign_channel.py +5 -0
  660. sequenzy/types/campaign_detail.py +108 -0
  661. sequenzy/types/campaign_goal.py +71 -0
  662. sequenzy/types/campaign_goal_attribute_condition.py +5 -0
  663. sequenzy/types/campaign_goal_input.py +65 -0
  664. sequenzy/types/campaign_goal_input_attribute_condition.py +7 -0
  665. sequenzy/types/campaign_goal_input_trigger_type.py +5 -0
  666. sequenzy/types/campaign_goal_metrics.py +33 -0
  667. sequenzy/types/campaign_goal_scope.py +5 -0
  668. sequenzy/types/campaign_goal_trigger_type.py +5 -0
  669. sequenzy/types/campaign_status.py +8 -0
  670. sequenzy/types/campaign_summary.py +160 -0
  671. sequenzy/types/clicked_link.py +36 -0
  672. sequenzy/types/commerce_customer.py +41 -0
  673. sequenzy/types/commerce_forecast_range.py +26 -0
  674. sequenzy/types/commerce_order_item.py +55 -0
  675. sequenzy/types/commerce_product.py +99 -0
  676. sequenzy/types/commerce_product_provider.py +5 -0
  677. sequenzy/types/commerce_product_variants_item.py +47 -0
  678. sequenzy/types/commerce_product_variants_item_options_item.py +20 -0
  679. sequenzy/types/commerce_value_forecast.py +47 -0
  680. sequenzy/types/commerce_value_forecast_actual.py +33 -0
  681. sequenzy/types/commerce_value_forecast_confidence.py +5 -0
  682. sequenzy/types/commerce_value_forecast_eligibility.py +20 -0
  683. sequenzy/types/commerce_value_forecast_eligibility_reasons_item.py +22 -0
  684. sequenzy/types/commerce_value_forecast_forecast.py +56 -0
  685. sequenzy/types/commerce_value_forecast_history.py +40 -0
  686. sequenzy/types/commerce_value_forecast_status.py +5 -0
  687. sequenzy/types/company.py +204 -0
  688. sequenzy/types/company_email_length_preference.py +5 -0
  689. sequenzy/types/company_reply_tracking_domain_mode.py +5 -0
  690. sequenzy/types/conversation_message.py +61 -0
  691. sequenzy/types/conversation_message_type.py +5 -0
  692. sequenzy/types/conversation_summary.py +51 -0
  693. sequenzy/types/conversation_summary_context.py +27 -0
  694. sequenzy/types/conversation_summary_status.py +5 -0
  695. sequenzy/types/detailed_subscriber.py +37 -0
  696. sequenzy/types/email.py +44 -0
  697. sequenzy/types/email_block.py +108 -0
  698. sequenzy/types/email_block_condition_field_reference.py +74 -0
  699. sequenzy/types/email_block_condition_field_reference_preview_support.py +7 -0
  700. sequenzy/types/email_block_conditions_item.py +31 -0
  701. sequenzy/types/email_block_conditions_item_field.py +7 -0
  702. sequenzy/types/email_block_conditions_item_operator.py +8 -0
  703. sequenzy/types/email_block_field_reference.py +53 -0
  704. sequenzy/types/email_block_layout.py +5 -0
  705. sequenzy/types/email_block_overlay_position.py +5 -0
  706. sequenzy/types/email_block_styles.py +69 -0
  707. sequenzy/types/email_block_styles_text_align.py +5 -0
  708. sequenzy/types/email_block_type.py +47 -0
  709. sequenzy/types/email_block_type_reference.py +49 -0
  710. sequenzy/types/email_body_input.py +34 -0
  711. sequenzy/types/email_component.py +64 -0
  712. sequenzy/types/email_component_component_type.py +5 -0
  713. sequenzy/types/email_component_default_slot.py +5 -0
  714. sequenzy/types/email_event.py +89 -0
  715. sequenzy/types/email_event_email_type.py +5 -0
  716. sequenzy/types/email_event_event_type.py +10 -0
  717. sequenzy/types/email_preset.py +5 -0
  718. sequenzy/types/email_send.py +250 -0
  719. sequenzy/types/email_send_additional_recipients.py +25 -0
  720. sequenzy/types/email_send_automation.py +20 -0
  721. sequenzy/types/email_send_campaign.py +20 -0
  722. sequenzy/types/email_send_email_type.py +5 -0
  723. sequenzy/types/email_send_event.py +101 -0
  724. sequenzy/types/email_send_event_delivery_policy.py +5 -0
  725. sequenzy/types/email_send_event_email_type.py +5 -0
  726. sequenzy/types/email_send_internal_failure_code.py +7 -0
  727. sequenzy/types/email_send_status.py +10 -0
  728. sequenzy/types/email_send_subscriber.py +28 -0
  729. sequenzy/types/email_send_suppression_reason.py +5 -0
  730. sequenzy/types/email_send_type.py +5 -0
  731. sequenzy/types/email_theme_patch.py +40 -0
  732. sequenzy/types/email_theme_patch_button_style.py +5 -0
  733. sequenzy/types/email_theme_patch_colors.py +33 -0
  734. sequenzy/types/email_theme_patch_layout.py +52 -0
  735. sequenzy/types/email_theme_patch_preset_id.py +5 -0
  736. sequenzy/types/email_theme_patch_typography.py +55 -0
  737. sequenzy/types/engagement_stats.py +143 -0
  738. sequenzy/types/engagement_stats_rate_denominator_basis.py +5 -0
  739. sequenzy/types/error.py +30 -0
  740. sequenzy/types/event_schema.py +71 -0
  741. sequenzy/types/event_schema_documented_providers_item.py +7 -0
  742. sequenzy/types/event_schema_providers_item.py +33 -0
  743. sequenzy/types/event_schema_providers_item_properties_item.py +43 -0
  744. sequenzy/types/event_schema_providers_item_provider.py +7 -0
  745. sequenzy/types/filter_group.py +39 -0
  746. sequenzy/types/filter_group_children_item.py +54 -0
  747. sequenzy/types/filter_group_join_operator.py +5 -0
  748. sequenzy/types/filter_group_kind.py +5 -0
  749. sequenzy/types/filter_leaf.py +41 -0
  750. sequenzy/types/filter_leaf_field.py +33 -0
  751. sequenzy/types/filter_leaf_kind.py +5 -0
  752. sequenzy/types/filter_leaf_operator.py +25 -0
  753. sequenzy/types/integration_activity_entry.py +86 -0
  754. sequenzy/types/integration_activity_entry_status.py +7 -0
  755. sequenzy/types/integration_detail.py +74 -0
  756. sequenzy/types/integration_detail_activity.py +42 -0
  757. sequenzy/types/integration_detail_activity_recent_failures_item.py +30 -0
  758. sequenzy/types/integration_detail_ingestion.py +88 -0
  759. sequenzy/types/integration_detail_ingestion_list_targeting.py +7 -0
  760. sequenzy/types/integration_detail_ingestion_lists_item.py +20 -0
  761. sequenzy/types/integration_detail_integration.py +91 -0
  762. sequenzy/types/integration_detail_integration_category.py +7 -0
  763. sequenzy/types/integration_detail_pixel.py +40 -0
  764. sequenzy/types/integration_detail_recommendations_item.py +23 -0
  765. sequenzy/types/integration_detail_recommendations_item_severity.py +5 -0
  766. sequenzy/types/integration_event_wiring.py +81 -0
  767. sequenzy/types/integration_event_wiring_listeners_item.py +37 -0
  768. sequenzy/types/integration_event_wiring_rule_source.py +5 -0
  769. sequenzy/types/integration_event_wiring_rules_item.py +27 -0
  770. sequenzy/types/integration_pixel_state.py +47 -0
  771. sequenzy/types/integration_pixel_state_pixel.py +68 -0
  772. sequenzy/types/integration_provider_capability.py +78 -0
  773. sequenzy/types/integration_provider_capability_actions_item.py +10 -0
  774. sequenzy/types/integration_provider_capability_availability.py +5 -0
  775. sequenzy/types/integration_provider_capability_category.py +7 -0
  776. sequenzy/types/integration_provider_capability_connect_fields_item.py +26 -0
  777. sequenzy/types/integration_provider_capability_connect_fields_item_key.py +7 -0
  778. sequenzy/types/integration_provider_capability_connect_method.py +7 -0
  779. sequenzy/types/integration_provider_capability_emits_item.py +27 -0
  780. sequenzy/types/integration_provider_capability_writes_attributes_item.py +20 -0
  781. sequenzy/types/integration_summary.py +91 -0
  782. sequenzy/types/integration_summary_category.py +7 -0
  783. sequenzy/types/integration_sync_skip_summary.py +47 -0
  784. sequenzy/types/integration_sync_skip_summary_records_item.py +27 -0
  785. sequenzy/types/integration_sync_skip_summary_records_item_outcome.py +5 -0
  786. sequenzy/types/internal_server_error_body.py +20 -0
  787. sequenzy/types/landing_page_content.py +41 -0
  788. sequenzy/types/landing_page_content_seo.py +50 -0
  789. sequenzy/types/landing_page_content_theme.py +46 -0
  790. sequenzy/types/landing_page_content_theme_section_animation.py +7 -0
  791. sequenzy/types/landing_page_content_theme_section_animation_speed.py +5 -0
  792. sequenzy/types/landing_page_domain.py +125 -0
  793. sequenzy/types/landing_page_domain_dns_record_type.py +5 -0
  794. sequenzy/types/landing_page_domain_domain_scope.py +5 -0
  795. sequenzy/types/landing_page_summary.py +94 -0
  796. sequenzy/types/landing_page_summary_custom_domain_scope.py +5 -0
  797. sequenzy/types/landing_page_summary_status.py +5 -0
  798. sequenzy/types/not_found_error_body.py +21 -0
  799. sequenzy/types/not_found_error_body_error.py +20 -0
  800. sequenzy/types/notification_preference.py +29 -0
  801. sequenzy/types/notification_preference_event.py +7 -0
  802. sequenzy/types/notification_preference_mode.py +5 -0
  803. sequenzy/types/notification_preferences.py +47 -0
  804. sequenzy/types/outbound_webhook_delivery.py +56 -0
  805. sequenzy/types/outbound_webhook_delivery_attempt.py +40 -0
  806. sequenzy/types/outbound_webhook_delivery_attempt_status.py +5 -0
  807. sequenzy/types/outbound_webhook_delivery_status.py +7 -0
  808. sequenzy/types/outbound_webhook_endpoint.py +80 -0
  809. sequenzy/types/outbound_webhook_endpoint_signing_secrets_item.py +26 -0
  810. sequenzy/types/outbound_webhook_endpoint_status.py +5 -0
  811. sequenzy/types/outbound_webhook_event_type.py +34 -0
  812. sequenzy/types/pagination.py +26 -0
  813. sequenzy/types/poll_response.py +85 -0
  814. sequenzy/types/poll_response_variant.py +5 -0
  815. sequenzy/types/poll_results_summary.py +84 -0
  816. sequenzy/types/poll_results_summary_answers_item.py +33 -0
  817. sequenzy/types/poll_results_summary_nps.py +30 -0
  818. sequenzy/types/poll_results_summary_variant.py +5 -0
  819. sequenzy/types/product.py +60 -0
  820. sequenzy/types/product_digital_delivery.py +40 -0
  821. sequenzy/types/product_digital_delivery_source.py +5 -0
  822. sequenzy/types/product_provider.py +5 -0
  823. sequenzy/types/recommendation_metrics.py +83 -0
  824. sequenzy/types/recommendation_metrics_revenue_by_currency_item.py +33 -0
  825. sequenzy/types/recommendation_metrics_top_products_item.py +35 -0
  826. sequenzy/types/render_email_request.py +65 -0
  827. sequenzy/types/render_email_request_subscriber.py +40 -0
  828. sequenzy/types/render_email_response.py +86 -0
  829. sequenzy/types/render_email_response_entity.py +26 -0
  830. sequenzy/types/render_email_response_entity_type.py +5 -0
  831. sequenzy/types/render_email_response_unevaluated_conditions_item.py +41 -0
  832. sequenzy/types/render_email_response_unevaluated_conditions_item_reason.py +7 -0
  833. sequenzy/types/render_email_response_unresolved_merge_tags_item.py +28 -0
  834. sequenzy/types/render_email_response_unresolved_merge_tags_item_reason.py +5 -0
  835. sequenzy/types/reply_profile_summary.py +30 -0
  836. sequenzy/types/resolved_audience_entity.py +28 -0
  837. sequenzy/types/resolved_audience_rule.py +24 -0
  838. sequenzy/types/resolved_audience_rule_type.py +5 -0
  839. sequenzy/types/resolved_campaign_audience.py +67 -0
  840. sequenzy/types/resolved_campaign_audience_filter_join_operator.py +5 -0
  841. sequenzy/types/resolved_campaign_audience_type.py +7 -0
  842. sequenzy/types/saved_popup.py +81 -0
  843. sequenzy/types/saved_popup_embed.py +36 -0
  844. sequenzy/types/saved_popup_frequency.py +30 -0
  845. sequenzy/types/saved_popup_schedule.py +37 -0
  846. sequenzy/types/saved_popup_stats.py +58 -0
  847. sequenzy/types/saved_popup_status.py +5 -0
  848. sequenzy/types/saved_popup_targeting.py +31 -0
  849. sequenzy/types/saved_popup_targeting_device.py +5 -0
  850. sequenzy/types/saved_popup_trigger.py +56 -0
  851. sequenzy/types/saved_popup_trigger_type.py +5 -0
  852. sequenzy/types/saved_popup_visual.py +37 -0
  853. sequenzy/types/saved_popup_visual_placement.py +5 -0
  854. sequenzy/types/saved_popup_visual_style.py +7 -0
  855. sequenzy/types/segment.py +53 -0
  856. sequenzy/types/segment_filter_join_operator.py +5 -0
  857. sequenzy/types/segment_format.py +5 -0
  858. sequenzy/types/sender_health_metric.py +37 -0
  859. sequenzy/types/sender_health_threshold_bound.py +24 -0
  860. sequenzy/types/sender_profile_summary.py +55 -0
  861. sequenzy/types/sending_status.py +85 -0
  862. sequenzy/types/sending_status_metrics_window.py +42 -0
  863. sequenzy/types/sending_status_metrics_window_kind.py +5 -0
  864. sequenzy/types/sending_status_pause_reason_kind.py +10 -0
  865. sequenzy/types/sending_status_remediation.py +37 -0
  866. sequenzy/types/sending_status_self_resume.py +78 -0
  867. sequenzy/types/sending_status_self_resume_ai_review_status.py +7 -0
  868. sequenzy/types/sending_status_self_resume_unavailable_reason.py +8 -0
  869. sequenzy/types/sending_status_sender_health.py +71 -0
  870. sequenzy/types/sending_status_sender_health_enforcement_mode.py +5 -0
  871. sequenzy/types/sending_status_status.py +5 -0
  872. sequenzy/types/sequence_ab_test_step_summary.py +53 -0
  873. sequenzy/types/sequence_ab_test_step_summary_test_type.py +5 -0
  874. sequenzy/types/sequence_ab_test_step_variant.py +54 -0
  875. sequenzy/types/sequence_action_response.py +79 -0
  876. sequenzy/types/sequence_branch_condition_input.py +155 -0
  877. sequenzy/types/sequence_branch_condition_input_activity_scope.py +7 -0
  878. sequenzy/types/sequence_branch_condition_input_condition_type.py +21 -0
  879. sequenzy/types/sequence_branch_input.py +102 -0
  880. sequenzy/types/sequence_branch_input_split_mode.py +5 -0
  881. sequenzy/types/sequence_branch_path_step_input.py +210 -0
  882. sequenzy/types/sequence_branch_path_step_input_ineligible_action.py +5 -0
  883. sequenzy/types/sequence_branch_path_step_input_node_type.py +22 -0
  884. sequenzy/types/sequence_branch_path_step_input_type.py +10 -0
  885. sequenzy/types/sequence_create_response.py +51 -0
  886. sequenzy/types/sequence_create_response_event_tracking.py +72 -0
  887. sequenzy/types/sequence_create_response_event_tracking_integration_guide.py +20 -0
  888. sequenzy/types/sequence_create_response_event_tracking_payload_contract.py +42 -0
  889. sequenzy/types/sequence_create_response_sequence.py +107 -0
  890. sequenzy/types/sequence_delay_input.py +134 -0
  891. sequenzy/types/sequence_delay_input_direction.py +5 -0
  892. sequenzy/types/sequence_delay_input_missing_action.py +5 -0
  893. sequenzy/types/sequence_delay_input_mode.py +5 -0
  894. sequenzy/types/sequence_delay_input_until_missing_action.py +5 -0
  895. sequenzy/types/sequence_delay_input_until_offset_direction.py +5 -0
  896. sequenzy/types/sequence_delay_offset_input.py +25 -0
  897. sequenzy/types/sequence_details.py +91 -0
  898. sequenzy/types/sequence_details_enrichment_status.py +5 -0
  899. sequenzy/types/sequence_discount_input.py +173 -0
  900. sequenzy/types/sequence_discount_input_discount_type.py +5 -0
  901. sequenzy/types/sequence_discount_input_duration.py +5 -0
  902. sequenzy/types/sequence_discount_input_provider.py +5 -0
  903. sequenzy/types/sequence_effective_status.py +7 -0
  904. sequenzy/types/sequence_email.py +206 -0
  905. sequenzy/types/sequence_email_delay_mode.py +5 -0
  906. sequenzy/types/sequence_email_email_preset.py +5 -0
  907. sequenzy/types/sequence_email_node_type.py +5 -0
  908. sequenzy/types/sequence_email_update_input.py +203 -0
  909. sequenzy/types/sequence_email_update_input_email_preset.py +5 -0
  910. sequenzy/types/sequence_enrollment_cancel_response.py +70 -0
  911. sequenzy/types/sequence_enrollment_cancel_response_enrollments_item.py +33 -0
  912. sequenzy/types/sequence_enrollment_counts.py +50 -0
  913. sequenzy/types/sequence_enrollment_counts_by_current_node_item.py +77 -0
  914. sequenzy/types/sequence_enrollment_list_response.py +61 -0
  915. sequenzy/types/sequence_enrollment_list_response_enrollments_item.py +203 -0
  916. sequenzy/types/sequence_enrollment_list_response_enrollments_item_entered_via.py +44 -0
  917. sequenzy/types/sequence_enrollment_list_response_enrollments_item_entered_via_kind.py +8 -0
  918. sequenzy/types/sequence_enrollment_list_response_enrollments_item_status.py +7 -0
  919. sequenzy/types/sequence_enrollment_list_response_pagination.py +27 -0
  920. sequenzy/types/sequence_enrollment_mode.py +5 -0
  921. sequenzy/types/sequence_enrollment_move_response.py +133 -0
  922. sequenzy/types/sequence_enrollment_move_response_enqueue_errors_item.py +24 -0
  923. sequenzy/types/sequence_enrollment_move_response_enrollments_item.py +33 -0
  924. sequenzy/types/sequence_enrollment_realign_job_response.py +36 -0
  925. sequenzy/types/sequence_enrollment_realign_job_response_status.py +7 -0
  926. sequenzy/types/sequence_enrollment_realign_queued_response.py +30 -0
  927. sequenzy/types/sequence_enrollment_realign_queued_response_status.py +5 -0
  928. sequenzy/types/sequence_enrollment_realign_response.py +125 -0
  929. sequenzy/types/sequence_enrollment_realign_response_changes_item.py +42 -0
  930. sequenzy/types/sequence_goal.py +69 -0
  931. sequenzy/types/sequence_goal_attribute_condition.py +5 -0
  932. sequenzy/types/sequence_goal_input.py +65 -0
  933. sequenzy/types/sequence_goal_input_attribute_condition.py +7 -0
  934. sequenzy/types/sequence_goal_input_trigger_type.py +5 -0
  935. sequenzy/types/sequence_goal_trigger_type.py +5 -0
  936. sequenzy/types/sequence_graph_edge_input.py +42 -0
  937. sequenzy/types/sequence_graph_edit_input.py +76 -0
  938. sequenzy/types/sequence_graph_edit_input_action.py +7 -0
  939. sequenzy/types/sequence_inbound_webhook.py +50 -0
  940. sequenzy/types/sequence_inbound_webhook_field_mapping.py +32 -0
  941. sequenzy/types/sequence_inbound_webhook_status.py +5 -0
  942. sequenzy/types/sequence_linear_step_insertion_input.py +42 -0
  943. sequenzy/types/sequence_node.py +64 -0
  944. sequenzy/types/sequence_node_update_hints.py +45 -0
  945. sequenzy/types/sequence_node_update_input.py +47 -0
  946. sequenzy/types/sequence_node_update_input_changes.py +49 -0
  947. sequenzy/types/sequence_node_update_input_changes_email_preset.py +5 -0
  948. sequenzy/types/sequence_path_step_config.py +329 -0
  949. sequenzy/types/sequence_path_step_config_activity_scope.py +7 -0
  950. sequenzy/types/sequence_path_step_config_condition_type.py +21 -0
  951. sequenzy/types/sequence_path_step_config_method.py +5 -0
  952. sequenzy/types/sequence_path_step_config_on_error.py +5 -0
  953. sequenzy/types/sequence_path_step_config_output_fields_item.py +46 -0
  954. sequenzy/types/sequence_path_step_config_timeout_action.py +5 -0
  955. sequenzy/types/sequence_position.py +20 -0
  956. sequenzy/types/sequence_sending_window.py +56 -0
  957. sequenzy/types/sequence_sending_window_days_item.py +7 -0
  958. sequenzy/types/sequence_sms_step_update_input.py +64 -0
  959. sequenzy/types/sequence_sms_step_update_input_ineligible_action.py +5 -0
  960. sequenzy/types/sequence_status.py +5 -0
  961. sequenzy/types/sequence_step_input.py +388 -0
  962. sequenzy/types/sequence_step_input_discount_type.py +5 -0
  963. sequenzy/types/sequence_step_input_duration.py +5 -0
  964. sequenzy/types/sequence_step_input_ineligible_action.py +5 -0
  965. sequenzy/types/sequence_step_input_node_type.py +7 -0
  966. sequenzy/types/sequence_step_input_provider.py +5 -0
  967. sequenzy/types/sequence_step_input_type.py +7 -0
  968. sequenzy/types/sequence_stop_condition.py +43 -0
  969. sequenzy/types/sequence_stop_condition_match_config.py +110 -0
  970. sequenzy/types/sequence_stop_condition_match_config_entry_audience.py +25 -0
  971. sequenzy/types/sequence_stop_condition_match_config_entry_audience_audience.py +5 -0
  972. sequenzy/types/sequence_stop_condition_match_config_event_property.py +22 -0
  973. sequenzy/types/sequence_stop_condition_match_config_event_property_filter.py +34 -0
  974. sequenzy/types/sequence_stop_condition_match_config_event_property_filter_property_filters_item.py +31 -0
  975. sequenzy/types/sequence_stop_condition_match_config_event_property_filter_property_filters_item_operator.py +8 -0
  976. sequenzy/types/sequence_stop_condition_match_config_event_property_rules_item.py +26 -0
  977. sequenzy/types/sequence_stop_condition_match_config_field_value.py +23 -0
  978. sequenzy/types/sequence_stop_condition_match_config_field_value_operator.py +7 -0
  979. sequenzy/types/sequence_stop_condition_type.py +17 -0
  980. sequenzy/types/sequence_subscriber_update_step_update_input.py +30 -0
  981. sequenzy/types/sequence_summary.py +151 -0
  982. sequenzy/types/sequence_summary_paused_by_user.py +21 -0
  983. sequenzy/types/sequence_trigger_property_filter.py +34 -0
  984. sequenzy/types/sequence_trigger_property_filter_operator.py +8 -0
  985. sequenzy/types/sequence_trigger_property_filter_value.py +9 -0
  986. sequenzy/types/sequence_trigger_property_filter_value_three_item.py +5 -0
  987. sequenzy/types/sequence_trigger_type.py +10 -0
  988. sequenzy/types/sequence_wait_until_input.py +93 -0
  989. sequenzy/types/sequence_wait_until_input_direction.py +5 -0
  990. sequenzy/types/sequence_wait_until_input_missing_action.py +5 -0
  991. sequenzy/types/sequence_wait_until_input_until_missing_action.py +5 -0
  992. sequenzy/types/sequence_wait_until_input_until_offset_direction.py +5 -0
  993. sequenzy/types/sequence_wait_until_weekday_input.py +86 -0
  994. sequenzy/types/service_unavailable_error_body.py +26 -0
  995. sequenzy/types/shopify_browse_abandonment_settings.py +48 -0
  996. sequenzy/types/shopify_cart_abandonment_settings.py +60 -0
  997. sequenzy/types/shopify_price_drop_settings.py +59 -0
  998. sequenzy/types/subscriber.py +91 -0
  999. sequenzy/types/subscriber_activity_event.py +108 -0
  1000. sequenzy/types/subscriber_activity_event_engagement_quality.py +5 -0
  1001. sequenzy/types/subscriber_email_stats.py +25 -0
  1002. sequenzy/types/subscriber_import.py +96 -0
  1003. sequenzy/types/subscriber_import_record.py +69 -0
  1004. sequenzy/types/subscriber_import_record_custom_attributes_value.py +11 -0
  1005. sequenzy/types/subscriber_import_record_custom_attributes_value_three_item.py +5 -0
  1006. sequenzy/types/subscriber_import_record_status.py +5 -0
  1007. sequenzy/types/subscriber_import_status.py +5 -0
  1008. sequenzy/types/subscriber_list.py +62 -0
  1009. sequenzy/types/subscriber_list_membership.py +42 -0
  1010. sequenzy/types/subscriber_list_pagination.py +54 -0
  1011. sequenzy/types/subscriber_note.py +40 -0
  1012. sequenzy/types/subscriber_note_author.py +21 -0
  1013. sequenzy/types/subscriber_sequence_enrollment.py +54 -0
  1014. sequenzy/types/subscriber_sms_status.py +7 -0
  1015. sequenzy/types/subscriber_status.py +5 -0
  1016. sequenzy/types/subscriber_update_config.py +39 -0
  1017. sequenzy/types/subscriber_update_config_custom_attribute_updates_item.py +37 -0
  1018. sequenzy/types/subscriber_update_config_custom_attribute_updates_item_value.py +5 -0
  1019. sequenzy/types/subscriber_update_config_custom_attribute_updates_item_value_type.py +7 -0
  1020. sequenzy/types/subscriber_update_config_status.py +5 -0
  1021. sequenzy/types/sync_rule.py +36 -0
  1022. sequenzy/types/sync_rule_actions.py +26 -0
  1023. sequenzy/types/sync_rule_conditions.py +56 -0
  1024. sequenzy/types/sync_rule_conditions_purchased_product.py +32 -0
  1025. sequenzy/types/tag_definition.py +26 -0
  1026. sequenzy/types/team_member.py +53 -0
  1027. sequenzy/types/team_member_invited_by.py +21 -0
  1028. sequenzy/types/team_member_kind.py +5 -0
  1029. sequenzy/types/team_member_role.py +5 -0
  1030. sequenzy/types/team_member_status.py +5 -0
  1031. sequenzy/types/team_member_user.py +22 -0
  1032. sequenzy/types/template_detail.py +52 -0
  1033. sequenzy/types/template_localization.py +51 -0
  1034. sequenzy/types/template_localization_status.py +5 -0
  1035. sequenzy/types/template_summary.py +43 -0
  1036. sequenzy/types/too_many_requests_error_body.py +20 -0
  1037. sequenzy/types/tracking_settings.py +50 -0
  1038. sequenzy/types/tracking_settings_auto_utm.py +20 -0
  1039. sequenzy/types/tracking_settings_consent.py +59 -0
  1040. sequenzy/types/tracking_settings_reply_tracking.py +31 -0
  1041. sequenzy/types/tracking_settings_tracking.py +48 -0
  1042. sequenzy/types/tracking_settings_tracking_domain.py +37 -0
  1043. sequenzy/types/transactional_email.py +34 -0
  1044. sequenzy/types/transactional_email_details.py +40 -0
  1045. sequenzy/types/transactional_email_list_item.py +28 -0
  1046. sequenzy/types/transactional_email_list_item_stats.py +31 -0
  1047. sequenzy/types/transactional_metrics_response.py +49 -0
  1048. sequenzy/types/transactional_metrics_response_bounce_breakdown.py +25 -0
  1049. sequenzy/types/transactional_metrics_response_bounce_breakdown_subtypes_item.py +28 -0
  1050. sequenzy/types/transactional_metrics_response_bounce_breakdown_subtypes_item_type.py +7 -0
  1051. sequenzy/types/transactional_metrics_response_clicked_links_item.py +21 -0
  1052. sequenzy/types/transactional_metrics_response_complaints.py +20 -0
  1053. sequenzy/types/transactional_metrics_response_engagement_breakdown.py +26 -0
  1054. sequenzy/types/transactional_metrics_response_engagement_breakdown_human.py +20 -0
  1055. sequenzy/types/transactional_metrics_response_engagement_breakdown_machine.py +20 -0
  1056. sequenzy/types/transactional_metrics_response_stats.py +25 -0
  1057. sequenzy/types/transactional_metrics_response_transactional.py +21 -0
  1058. sequenzy/types/transactional_send_diagnostics.py +41 -0
  1059. sequenzy/types/transactional_send_diagnostics_missing_required_variables_item.py +34 -0
  1060. sequenzy/types/transactional_send_diagnostics_missing_required_variables_item_used_in_item.py +31 -0
  1061. sequenzy/types/transactional_send_diagnostics_missing_required_variables_item_used_in_item_surface.py +7 -0
  1062. sequenzy/types/transactional_send_diagnostics_status.py +5 -0
  1063. sequenzy/types/transactional_send_diagnostics_unused_variables_item.py +21 -0
  1064. sequenzy/types/unauthorized_error_body.py +21 -0
  1065. sequenzy/types/unauthorized_error_body_error.py +20 -0
  1066. sequenzy/types/unprocessable_entity_error_body.py +26 -0
  1067. sequenzy/types/url_attachment.py +31 -0
  1068. sequenzy/types/web_tracking_key.py +100 -0
  1069. sequenzy/types/website.py +102 -0
  1070. sequenzy/types/website_readiness.py +26 -0
  1071. sequenzy/types/website_readiness_reason.py +10 -0
  1072. sequenzy/types/website_readiness_status.py +7 -0
  1073. sequenzy/types/website_status.py +7 -0
  1074. sequenzy/web_tracking_keys/__init__.py +55 -0
  1075. sequenzy/web_tracking_keys/client.py +554 -0
  1076. sequenzy/web_tracking_keys/raw_client.py +1087 -0
  1077. sequenzy/web_tracking_keys/types/__init__.py +53 -0
  1078. sequenzy/web_tracking_keys/types/create_web_tracking_keys_response.py +22 -0
  1079. sequenzy/web_tracking_keys/types/delete_web_tracking_keys_response.py +20 -0
  1080. sequenzy/web_tracking_keys/types/get_web_tracking_keys_response.py +21 -0
  1081. sequenzy/web_tracking_keys/types/list_web_tracking_keys_response.py +21 -0
  1082. sequenzy/web_tracking_keys/types/mint_identity_web_tracking_keys_response.py +47 -0
  1083. sequenzy/web_tracking_keys/types/update_web_tracking_keys_response.py +21 -0
  1084. sequenzy/webhooks/__init__.py +70 -0
  1085. sequenzy/webhooks/client.py +834 -0
  1086. sequenzy/webhooks/raw_client.py +1602 -0
  1087. sequenzy/webhooks/types/__init__.py +68 -0
  1088. sequenzy/webhooks/types/add_signing_secret_webhooks_response.py +21 -0
  1089. sequenzy/webhooks/types/create_webhooks_response.py +21 -0
  1090. sequenzy/webhooks/types/delete_webhooks_response.py +21 -0
  1091. sequenzy/webhooks/types/list_deliveries_webhooks_response.py +21 -0
  1092. sequenzy/webhooks/types/list_delivery_attempts_webhooks_response.py +21 -0
  1093. sequenzy/webhooks/types/list_webhooks_response.py +21 -0
  1094. sequenzy/webhooks/types/remove_signing_secret_webhooks_response.py +21 -0
  1095. sequenzy/webhooks/types/replay_delivery_webhooks_response.py +21 -0
  1096. sequenzy/webhooks/types/test_webhooks_response.py +29 -0
  1097. sequenzy/webhooks/types/update_webhooks_request_status.py +5 -0
  1098. sequenzy/webhooks/types/update_webhooks_response.py +21 -0
  1099. sequenzy/websites/__init__.py +39 -0
  1100. sequenzy/websites/client.py +320 -0
  1101. sequenzy/websites/raw_client.py +696 -0
  1102. sequenzy/websites/types/__init__.py +42 -0
  1103. sequenzy/websites/types/add_websites_response.py +21 -0
  1104. sequenzy/websites/types/get_websites_response.py +21 -0
  1105. sequenzy/websites/types/list_websites_response.py +21 -0
  1106. sequenzy/websites/types/verify_sending_domain_response.py +42 -0
  1107. sequenzy/widgets/__init__.py +133 -0
  1108. sequenzy/widgets/client.py +2327 -0
  1109. sequenzy/widgets/preferences/__init__.py +34 -0
  1110. sequenzy/widgets/preferences/client.py +123 -0
  1111. sequenzy/widgets/preferences/raw_client.py +224 -0
  1112. sequenzy/widgets/preferences/types/__init__.py +34 -0
  1113. sequenzy/widgets/preferences/types/generate_token_preferences_response.py +23 -0
  1114. sequenzy/widgets/raw_client.py +3966 -0
  1115. sequenzy/widgets/types/__init__.py +127 -0
  1116. sequenzy/widgets/types/create_saved_form_request_duplicate_strategy.py +5 -0
  1117. sequenzy/widgets/types/create_saved_form_response.py +21 -0
  1118. sequenzy/widgets/types/create_saved_popup_request_duplicate_strategy.py +5 -0
  1119. sequenzy/widgets/types/create_saved_popup_request_placement.py +5 -0
  1120. sequenzy/widgets/types/create_saved_popup_request_presentation.py +7 -0
  1121. sequenzy/widgets/types/create_saved_popup_request_status.py +5 -0
  1122. sequenzy/widgets/types/create_saved_popup_request_template.py +21 -0
  1123. sequenzy/widgets/types/create_saved_popup_response.py +24 -0
  1124. sequenzy/widgets/types/delete_saved_popup_response.py +25 -0
  1125. sequenzy/widgets/types/duplicate_saved_popup_response.py +22 -0
  1126. sequenzy/widgets/types/get_saved_form_embed_response.py +22 -0
  1127. sequenzy/widgets/types/get_saved_form_embed_response_embed.py +36 -0
  1128. sequenzy/widgets/types/get_saved_popup_embed_response.py +23 -0
  1129. sequenzy/widgets/types/get_saved_popup_response.py +23 -0
  1130. sequenzy/widgets/types/list_saved_forms_response.py +24 -0
  1131. sequenzy/widgets/types/list_saved_forms_response_forms_item.py +27 -0
  1132. sequenzy/widgets/types/list_saved_popups_request_include_content.py +5 -0
  1133. sequenzy/widgets/types/list_saved_popups_response.py +30 -0
  1134. sequenzy/widgets/types/submit_company_scoped_saved_signup_form_request_duplicate_strategy.py +7 -0
  1135. sequenzy/widgets/types/submit_company_scoped_saved_signup_form_response.py +19 -0
  1136. sequenzy/widgets/types/submit_saved_popup_response.py +32 -0
  1137. sequenzy/widgets/types/submit_signup_form_request_duplicate_strategy.py +5 -0
  1138. sequenzy/widgets/types/submit_signup_form_response.py +19 -0
  1139. sequenzy/widgets/types/update_saved_form_request_duplicate_strategy.py +5 -0
  1140. sequenzy/widgets/types/update_saved_form_response.py +26 -0
  1141. sequenzy/widgets/types/update_saved_popup_request_duplicate_strategy.py +5 -0
  1142. sequenzy/widgets/types/update_saved_popup_request_placement.py +5 -0
  1143. sequenzy/widgets/types/update_saved_popup_request_presentation.py +7 -0
  1144. sequenzy/widgets/types/update_saved_popup_request_status.py +5 -0
  1145. sequenzy/widgets/types/update_saved_popup_response.py +24 -0
  1146. sequenzy-2.0.0.dist-info/METADATA +204 -0
  1147. sequenzy-2.0.0.dist-info/RECORD +1149 -0
  1148. sequenzy-2.0.0.dist-info/WHEEL +4 -0
  1149. sequenzy-2.0.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,3966 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+ from json.decoder import JSONDecodeError
5
+
6
+ from ..core.api_error import ApiError
7
+ from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
8
+ from ..core.http_response import AsyncHttpResponse, HttpResponse
9
+ from ..core.jsonable_encoder import encode_path_param
10
+ from ..core.parse_error import ParsingError
11
+ from ..core.pydantic_utilities import parse_obj_as
12
+ from ..core.request_options import RequestOptions
13
+ from ..core.serialization import convert_and_respect_annotation_metadata
14
+ from ..errors.bad_request_error import BadRequestError
15
+ from ..errors.forbidden_error import ForbiddenError
16
+ from ..errors.internal_server_error import InternalServerError
17
+ from ..errors.not_found_error import NotFoundError
18
+ from ..errors.service_unavailable_error import ServiceUnavailableError
19
+ from ..errors.too_many_requests_error import TooManyRequestsError
20
+ from ..errors.unauthorized_error import UnauthorizedError
21
+ from ..types.error import Error
22
+ from ..types.saved_popup_frequency import SavedPopupFrequency
23
+ from ..types.saved_popup_schedule import SavedPopupSchedule
24
+ from ..types.saved_popup_targeting import SavedPopupTargeting
25
+ from ..types.saved_popup_trigger import SavedPopupTrigger
26
+ from ..types.saved_popup_visual import SavedPopupVisual
27
+ from .types.create_saved_form_request_duplicate_strategy import CreateSavedFormRequestDuplicateStrategy
28
+ from .types.create_saved_form_response import CreateSavedFormResponse
29
+ from .types.create_saved_popup_request_duplicate_strategy import CreateSavedPopupRequestDuplicateStrategy
30
+ from .types.create_saved_popup_request_placement import CreateSavedPopupRequestPlacement
31
+ from .types.create_saved_popup_request_presentation import CreateSavedPopupRequestPresentation
32
+ from .types.create_saved_popup_request_status import CreateSavedPopupRequestStatus
33
+ from .types.create_saved_popup_request_template import CreateSavedPopupRequestTemplate
34
+ from .types.create_saved_popup_response import CreateSavedPopupResponse
35
+ from .types.delete_saved_popup_response import DeleteSavedPopupResponse
36
+ from .types.duplicate_saved_popup_response import DuplicateSavedPopupResponse
37
+ from .types.get_saved_form_embed_response import GetSavedFormEmbedResponse
38
+ from .types.get_saved_popup_embed_response import GetSavedPopupEmbedResponse
39
+ from .types.get_saved_popup_response import GetSavedPopupResponse
40
+ from .types.list_saved_forms_response import ListSavedFormsResponse
41
+ from .types.list_saved_popups_request_include_content import ListSavedPopupsRequestIncludeContent
42
+ from .types.list_saved_popups_response import ListSavedPopupsResponse
43
+ from .types.submit_company_scoped_saved_signup_form_request_duplicate_strategy import (
44
+ SubmitCompanyScopedSavedSignupFormRequestDuplicateStrategy,
45
+ )
46
+ from .types.submit_company_scoped_saved_signup_form_response import SubmitCompanyScopedSavedSignupFormResponse
47
+ from .types.submit_saved_popup_response import SubmitSavedPopupResponse
48
+ from .types.submit_signup_form_request_duplicate_strategy import SubmitSignupFormRequestDuplicateStrategy
49
+ from .types.submit_signup_form_response import SubmitSignupFormResponse
50
+ from .types.update_saved_form_request_duplicate_strategy import UpdateSavedFormRequestDuplicateStrategy
51
+ from .types.update_saved_form_response import UpdateSavedFormResponse
52
+ from .types.update_saved_popup_request_duplicate_strategy import UpdateSavedPopupRequestDuplicateStrategy
53
+ from .types.update_saved_popup_request_placement import UpdateSavedPopupRequestPlacement
54
+ from .types.update_saved_popup_request_presentation import UpdateSavedPopupRequestPresentation
55
+ from .types.update_saved_popup_request_status import UpdateSavedPopupRequestStatus
56
+ from .types.update_saved_popup_response import UpdateSavedPopupResponse
57
+ from pydantic import ValidationError
58
+
59
+ # this is used as the default value for optional parameters
60
+ OMIT = typing.cast(typing.Any, ...)
61
+
62
+
63
+ class RawWidgetsClient:
64
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
65
+ self._client_wrapper = client_wrapper
66
+
67
+ def create_saved_form(
68
+ self,
69
+ *,
70
+ list_ids: typing.Sequence[str],
71
+ name: str,
72
+ button_text: typing.Optional[str] = OMIT,
73
+ description: typing.Optional[str] = OMIT,
74
+ duplicate_strategy: typing.Optional[CreateSavedFormRequestDuplicateStrategy] = OMIT,
75
+ headline: typing.Optional[str] = OMIT,
76
+ redirect_url: typing.Optional[str] = OMIT,
77
+ show_first_name: typing.Optional[bool] = OMIT,
78
+ show_last_name: typing.Optional[bool] = OMIT,
79
+ success_message: typing.Optional[str] = OMIT,
80
+ tag_ids: typing.Optional[typing.Sequence[str]] = OMIT,
81
+ theme: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
82
+ request_options: typing.Optional[RequestOptions] = None,
83
+ ) -> HttpResponse[CreateSavedFormResponse]:
84
+ """
85
+ Creates and publishes a saved signup form. Its opaque form ID becomes a client-safe public capability while audience and success settings remain server-side.
86
+
87
+ Parameters
88
+ ----------
89
+ list_ids : typing.Sequence[str]
90
+
91
+ name : str
92
+
93
+ button_text : typing.Optional[str]
94
+
95
+ description : typing.Optional[str]
96
+
97
+ duplicate_strategy : typing.Optional[CreateSavedFormRequestDuplicateStrategy]
98
+
99
+ headline : typing.Optional[str]
100
+
101
+ redirect_url : typing.Optional[str]
102
+
103
+ show_first_name : typing.Optional[bool]
104
+
105
+ show_last_name : typing.Optional[bool]
106
+
107
+ success_message : typing.Optional[str]
108
+
109
+ tag_ids : typing.Optional[typing.Sequence[str]]
110
+
111
+ theme : typing.Optional[typing.Dict[str, typing.Any]]
112
+ Optional visual theme overrides (accentColor, backgroundColor, textColor, mutedTextColor, cardColor, borderColor as "#rrggbb", borderRadius 0-32, headingFontFamily, bodyFontFamily, density).
113
+
114
+ request_options : typing.Optional[RequestOptions]
115
+ Request-specific configuration.
116
+
117
+ Returns
118
+ -------
119
+ HttpResponse[CreateSavedFormResponse]
120
+ Form created and published
121
+ """
122
+ _response = self._client_wrapper.httpx_client.request(
123
+ "forms",
124
+ method="POST",
125
+ json={
126
+ "buttonText": button_text,
127
+ "description": description,
128
+ "duplicateStrategy": duplicate_strategy,
129
+ "headline": headline,
130
+ "listIds": list_ids,
131
+ "name": name,
132
+ "redirectUrl": redirect_url,
133
+ "showFirstName": show_first_name,
134
+ "showLastName": show_last_name,
135
+ "successMessage": success_message,
136
+ "tagIds": tag_ids,
137
+ "theme": theme,
138
+ },
139
+ headers={
140
+ "content-type": "application/json",
141
+ },
142
+ request_options=request_options,
143
+ omit=OMIT,
144
+ )
145
+ try:
146
+ if 200 <= _response.status_code < 300:
147
+ _data = typing.cast(
148
+ CreateSavedFormResponse,
149
+ parse_obj_as(
150
+ type_=CreateSavedFormResponse, # type: ignore
151
+ object_=_response.json(),
152
+ ),
153
+ )
154
+ return HttpResponse(response=_response, data=_data)
155
+ if _response.status_code == 400:
156
+ raise BadRequestError(
157
+ headers=dict(_response.headers),
158
+ body=typing.cast(
159
+ typing.Any,
160
+ parse_obj_as(
161
+ type_=typing.Any, # type: ignore
162
+ object_=_response.json(),
163
+ ),
164
+ ),
165
+ )
166
+ if _response.status_code == 401:
167
+ raise UnauthorizedError(
168
+ headers=dict(_response.headers),
169
+ body=typing.cast(
170
+ typing.Any,
171
+ parse_obj_as(
172
+ type_=typing.Any, # type: ignore
173
+ object_=_response.json(),
174
+ ),
175
+ ),
176
+ )
177
+ if _response.status_code == 403:
178
+ raise ForbiddenError(
179
+ headers=dict(_response.headers),
180
+ body=typing.cast(
181
+ Error,
182
+ parse_obj_as(
183
+ type_=Error, # type: ignore
184
+ object_=_response.json(),
185
+ ),
186
+ ),
187
+ )
188
+ if _response.status_code == 500:
189
+ raise InternalServerError(
190
+ headers=dict(_response.headers),
191
+ body=typing.cast(
192
+ typing.Any,
193
+ parse_obj_as(
194
+ type_=typing.Any, # type: ignore
195
+ object_=_response.json(),
196
+ ),
197
+ ),
198
+ )
199
+ _response_json = _response.json()
200
+ except JSONDecodeError:
201
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
202
+ except ValidationError as e:
203
+ raise ParsingError(
204
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
205
+ )
206
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
207
+
208
+ def create_saved_popup(
209
+ self,
210
+ *,
211
+ name: str,
212
+ blocks: typing.Optional[typing.Sequence[typing.Dict[str, typing.Any]]] = OMIT,
213
+ button_text: typing.Optional[str] = OMIT,
214
+ description: typing.Optional[str] = OMIT,
215
+ duplicate_strategy: typing.Optional[CreateSavedPopupRequestDuplicateStrategy] = OMIT,
216
+ frequency: typing.Optional[SavedPopupFrequency] = OMIT,
217
+ headline: typing.Optional[str] = OMIT,
218
+ list_ids: typing.Optional[typing.Sequence[str]] = OMIT,
219
+ placement: typing.Optional[CreateSavedPopupRequestPlacement] = OMIT,
220
+ presentation: typing.Optional[CreateSavedPopupRequestPresentation] = OMIT,
221
+ redirect_url: typing.Optional[str] = OMIT,
222
+ schedule: typing.Optional[SavedPopupSchedule] = OMIT,
223
+ status: typing.Optional[CreateSavedPopupRequestStatus] = OMIT,
224
+ success_message: typing.Optional[str] = OMIT,
225
+ tag_ids: typing.Optional[typing.Sequence[str]] = OMIT,
226
+ targeting: typing.Optional[SavedPopupTargeting] = OMIT,
227
+ template: typing.Optional[CreateSavedPopupRequestTemplate] = OMIT,
228
+ theme: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
229
+ trigger: typing.Optional[SavedPopupTrigger] = OMIT,
230
+ visual: typing.Optional[SavedPopupVisual] = OMIT,
231
+ request_options: typing.Optional[RequestOptions] = None,
232
+ ) -> HttpResponse[CreateSavedPopupResponse]:
233
+ """
234
+ Creates a saved on-site signup popup and returns the one-line script tag that deploys it. The popup is published by default, so the script is live as soon as it is added to the site. Trigger, targeting, audience, and duplicate handling stay server-side, so the deployed script carries no API key.
235
+
236
+ Omit `listIds` to capture into every list, matching the dashboard default.
237
+
238
+ Parameters
239
+ ----------
240
+ name : str
241
+
242
+ blocks : typing.Optional[typing.Sequence[typing.Dict[str, typing.Any]]]
243
+ Complete replacement for the popup's content blocks. The popup must keep exactly one required email field and one submit button.
244
+
245
+ button_text : typing.Optional[str]
246
+
247
+ description : typing.Optional[str]
248
+
249
+ duplicate_strategy : typing.Optional[CreateSavedPopupRequestDuplicateStrategy]
250
+
251
+ frequency : typing.Optional[SavedPopupFrequency]
252
+
253
+ headline : typing.Optional[str]
254
+
255
+ list_ids : typing.Optional[typing.Sequence[str]]
256
+ Lists every signup is added to. Omit or pass an empty array to capture into every list.
257
+
258
+ placement : typing.Optional[CreateSavedPopupRequestPlacement]
259
+
260
+ presentation : typing.Optional[CreateSavedPopupRequestPresentation]
261
+
262
+ redirect_url : typing.Optional[str]
263
+
264
+ schedule : typing.Optional[SavedPopupSchedule]
265
+
266
+ status : typing.Optional[CreateSavedPopupRequestStatus]
267
+
268
+ success_message : typing.Optional[str]
269
+
270
+ tag_ids : typing.Optional[typing.Sequence[str]]
271
+
272
+ targeting : typing.Optional[SavedPopupTargeting]
273
+
274
+ template : typing.Optional[CreateSavedPopupRequestTemplate]
275
+ Starting design for the popup's blocks and theme.
276
+
277
+ theme : typing.Optional[typing.Dict[str, typing.Any]]
278
+ Optional visual theme overrides (accentColor, backgroundColor, textColor, mutedTextColor, cardColor, borderColor as "#rrggbb", borderRadius 0-32, headingFontFamily, bodyFontFamily, density).
279
+
280
+ trigger : typing.Optional[SavedPopupTrigger]
281
+
282
+ visual : typing.Optional[SavedPopupVisual]
283
+
284
+ request_options : typing.Optional[RequestOptions]
285
+ Request-specific configuration.
286
+
287
+ Returns
288
+ -------
289
+ HttpResponse[CreateSavedPopupResponse]
290
+ Popup created
291
+ """
292
+ _response = self._client_wrapper.httpx_client.request(
293
+ "popups",
294
+ method="POST",
295
+ json={
296
+ "blocks": blocks,
297
+ "buttonText": button_text,
298
+ "description": description,
299
+ "duplicateStrategy": duplicate_strategy,
300
+ "frequency": convert_and_respect_annotation_metadata(
301
+ object_=frequency, annotation=SavedPopupFrequency, direction="write"
302
+ ),
303
+ "headline": headline,
304
+ "listIds": list_ids,
305
+ "name": name,
306
+ "placement": placement,
307
+ "presentation": presentation,
308
+ "redirectUrl": redirect_url,
309
+ "schedule": convert_and_respect_annotation_metadata(
310
+ object_=schedule, annotation=SavedPopupSchedule, direction="write"
311
+ ),
312
+ "status": status,
313
+ "successMessage": success_message,
314
+ "tagIds": tag_ids,
315
+ "targeting": convert_and_respect_annotation_metadata(
316
+ object_=targeting, annotation=SavedPopupTargeting, direction="write"
317
+ ),
318
+ "template": template,
319
+ "theme": theme,
320
+ "trigger": convert_and_respect_annotation_metadata(
321
+ object_=trigger, annotation=SavedPopupTrigger, direction="write"
322
+ ),
323
+ "visual": convert_and_respect_annotation_metadata(
324
+ object_=visual, annotation=SavedPopupVisual, direction="write"
325
+ ),
326
+ },
327
+ headers={
328
+ "content-type": "application/json",
329
+ },
330
+ request_options=request_options,
331
+ omit=OMIT,
332
+ )
333
+ try:
334
+ if 200 <= _response.status_code < 300:
335
+ _data = typing.cast(
336
+ CreateSavedPopupResponse,
337
+ parse_obj_as(
338
+ type_=CreateSavedPopupResponse, # type: ignore
339
+ object_=_response.json(),
340
+ ),
341
+ )
342
+ return HttpResponse(response=_response, data=_data)
343
+ if _response.status_code == 400:
344
+ raise BadRequestError(
345
+ headers=dict(_response.headers),
346
+ body=typing.cast(
347
+ typing.Any,
348
+ parse_obj_as(
349
+ type_=typing.Any, # type: ignore
350
+ object_=_response.json(),
351
+ ),
352
+ ),
353
+ )
354
+ if _response.status_code == 401:
355
+ raise UnauthorizedError(
356
+ headers=dict(_response.headers),
357
+ body=typing.cast(
358
+ typing.Any,
359
+ parse_obj_as(
360
+ type_=typing.Any, # type: ignore
361
+ object_=_response.json(),
362
+ ),
363
+ ),
364
+ )
365
+ if _response.status_code == 403:
366
+ raise ForbiddenError(
367
+ headers=dict(_response.headers),
368
+ body=typing.cast(
369
+ Error,
370
+ parse_obj_as(
371
+ type_=Error, # type: ignore
372
+ object_=_response.json(),
373
+ ),
374
+ ),
375
+ )
376
+ if _response.status_code == 500:
377
+ raise InternalServerError(
378
+ headers=dict(_response.headers),
379
+ body=typing.cast(
380
+ typing.Any,
381
+ parse_obj_as(
382
+ type_=typing.Any, # type: ignore
383
+ object_=_response.json(),
384
+ ),
385
+ ),
386
+ )
387
+ _response_json = _response.json()
388
+ except JSONDecodeError:
389
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
390
+ except ValidationError as e:
391
+ raise ParsingError(
392
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
393
+ )
394
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
395
+
396
+ def delete_saved_popup(
397
+ self, popup_id: str, *, request_options: typing.Optional[RequestOptions] = None
398
+ ) -> HttpResponse[DeleteSavedPopupResponse]:
399
+ """
400
+ Permanently deletes a saved popup along with its view and conversion counts. Subscribers it already captured are not affected. To stop a popup from showing while keeping its stats, set its status to draft instead.
401
+
402
+ Parameters
403
+ ----------
404
+ popup_id : str
405
+
406
+ request_options : typing.Optional[RequestOptions]
407
+ Request-specific configuration.
408
+
409
+ Returns
410
+ -------
411
+ HttpResponse[DeleteSavedPopupResponse]
412
+ Popup deleted
413
+ """
414
+ _response = self._client_wrapper.httpx_client.request(
415
+ f"popups/{encode_path_param(popup_id)}",
416
+ method="DELETE",
417
+ request_options=request_options,
418
+ )
419
+ try:
420
+ if 200 <= _response.status_code < 300:
421
+ _data = typing.cast(
422
+ DeleteSavedPopupResponse,
423
+ parse_obj_as(
424
+ type_=DeleteSavedPopupResponse, # type: ignore
425
+ object_=_response.json(),
426
+ ),
427
+ )
428
+ return HttpResponse(response=_response, data=_data)
429
+ if _response.status_code == 401:
430
+ raise UnauthorizedError(
431
+ headers=dict(_response.headers),
432
+ body=typing.cast(
433
+ typing.Any,
434
+ parse_obj_as(
435
+ type_=typing.Any, # type: ignore
436
+ object_=_response.json(),
437
+ ),
438
+ ),
439
+ )
440
+ if _response.status_code == 403:
441
+ raise ForbiddenError(
442
+ headers=dict(_response.headers),
443
+ body=typing.cast(
444
+ Error,
445
+ parse_obj_as(
446
+ type_=Error, # type: ignore
447
+ object_=_response.json(),
448
+ ),
449
+ ),
450
+ )
451
+ if _response.status_code == 404:
452
+ raise NotFoundError(
453
+ headers=dict(_response.headers),
454
+ body=typing.cast(
455
+ typing.Any,
456
+ parse_obj_as(
457
+ type_=typing.Any, # type: ignore
458
+ object_=_response.json(),
459
+ ),
460
+ ),
461
+ )
462
+ if _response.status_code == 503:
463
+ raise ServiceUnavailableError(
464
+ headers=dict(_response.headers),
465
+ body=typing.cast(
466
+ typing.Any,
467
+ parse_obj_as(
468
+ type_=typing.Any, # type: ignore
469
+ object_=_response.json(),
470
+ ),
471
+ ),
472
+ )
473
+ _response_json = _response.json()
474
+ except JSONDecodeError:
475
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
476
+ except ValidationError as e:
477
+ raise ParsingError(
478
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
479
+ )
480
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
481
+
482
+ def duplicate_saved_popup(
483
+ self,
484
+ popup_id: str,
485
+ *,
486
+ name: typing.Optional[str] = OMIT,
487
+ request_options: typing.Optional[RequestOptions] = None,
488
+ ) -> HttpResponse[DuplicateSavedPopupResponse]:
489
+ """
490
+ Copies a saved popup into a new draft with its own view and conversion counts. The original keeps its status and stats, so a live popup carries on showing while the copy is edited.
491
+
492
+ Parameters
493
+ ----------
494
+ popup_id : str
495
+
496
+ name : typing.Optional[str]
497
+ Name for the copy. Defaults to the original name with " (copy)" appended.
498
+
499
+ request_options : typing.Optional[RequestOptions]
500
+ Request-specific configuration.
501
+
502
+ Returns
503
+ -------
504
+ HttpResponse[DuplicateSavedPopupResponse]
505
+ Popup duplicated as a draft
506
+ """
507
+ _response = self._client_wrapper.httpx_client.request(
508
+ f"popups/{encode_path_param(popup_id)}/duplicate",
509
+ method="POST",
510
+ json={
511
+ "name": name,
512
+ },
513
+ headers={
514
+ "content-type": "application/json",
515
+ },
516
+ request_options=request_options,
517
+ omit=OMIT,
518
+ )
519
+ try:
520
+ if 200 <= _response.status_code < 300:
521
+ _data = typing.cast(
522
+ DuplicateSavedPopupResponse,
523
+ parse_obj_as(
524
+ type_=DuplicateSavedPopupResponse, # type: ignore
525
+ object_=_response.json(),
526
+ ),
527
+ )
528
+ return HttpResponse(response=_response, data=_data)
529
+ if _response.status_code == 400:
530
+ raise BadRequestError(
531
+ headers=dict(_response.headers),
532
+ body=typing.cast(
533
+ typing.Any,
534
+ parse_obj_as(
535
+ type_=typing.Any, # type: ignore
536
+ object_=_response.json(),
537
+ ),
538
+ ),
539
+ )
540
+ if _response.status_code == 401:
541
+ raise UnauthorizedError(
542
+ headers=dict(_response.headers),
543
+ body=typing.cast(
544
+ typing.Any,
545
+ parse_obj_as(
546
+ type_=typing.Any, # type: ignore
547
+ object_=_response.json(),
548
+ ),
549
+ ),
550
+ )
551
+ if _response.status_code == 403:
552
+ raise ForbiddenError(
553
+ headers=dict(_response.headers),
554
+ body=typing.cast(
555
+ Error,
556
+ parse_obj_as(
557
+ type_=Error, # type: ignore
558
+ object_=_response.json(),
559
+ ),
560
+ ),
561
+ )
562
+ if _response.status_code == 404:
563
+ raise NotFoundError(
564
+ headers=dict(_response.headers),
565
+ body=typing.cast(
566
+ typing.Any,
567
+ parse_obj_as(
568
+ type_=typing.Any, # type: ignore
569
+ object_=_response.json(),
570
+ ),
571
+ ),
572
+ )
573
+ if _response.status_code == 500:
574
+ raise InternalServerError(
575
+ headers=dict(_response.headers),
576
+ body=typing.cast(
577
+ typing.Any,
578
+ parse_obj_as(
579
+ type_=typing.Any, # type: ignore
580
+ object_=_response.json(),
581
+ ),
582
+ ),
583
+ )
584
+ _response_json = _response.json()
585
+ except JSONDecodeError:
586
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
587
+ except ValidationError as e:
588
+ raise ParsingError(
589
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
590
+ )
591
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
592
+
593
+ def get_company_scoped_saved_signup_form_embed_script(
594
+ self, company_id_or_form_id: str, form_id: str, *, request_options: typing.Optional[RequestOptions] = None
595
+ ) -> HttpResponse[None]:
596
+ """
597
+ Compatibility path for saved signup form embed scripts. New embeds should use `/forms/{formId}/embed.js`.
598
+
599
+ The script renders the current saved form settings when the page loads, so dashboard edits apply to deployed JavaScript embeds without copying new HTML.
600
+
601
+ Parameters
602
+ ----------
603
+ company_id_or_form_id : str
604
+ The company ID the form belongs to
605
+
606
+ form_id : str
607
+ The saved form ID
608
+
609
+ request_options : typing.Optional[RequestOptions]
610
+ Request-specific configuration.
611
+
612
+ Returns
613
+ -------
614
+ HttpResponse[None]
615
+ """
616
+ _response = self._client_wrapper.httpx_client.request(
617
+ f"forms/{encode_path_param(company_id_or_form_id)}/{encode_path_param(form_id)}/embed.js",
618
+ method="GET",
619
+ request_options=request_options,
620
+ )
621
+ try:
622
+ if 200 <= _response.status_code < 300:
623
+ return HttpResponse(response=_response, data=None)
624
+ if _response.status_code == 404:
625
+ raise NotFoundError(
626
+ headers=dict(_response.headers),
627
+ body=typing.cast(
628
+ typing.Any,
629
+ parse_obj_as(
630
+ type_=typing.Any, # type: ignore
631
+ object_=_response.json(),
632
+ ),
633
+ ),
634
+ )
635
+ if _response.status_code == 503:
636
+ raise ServiceUnavailableError(
637
+ headers=dict(_response.headers),
638
+ body=typing.cast(
639
+ typing.Any,
640
+ parse_obj_as(
641
+ type_=typing.Any, # type: ignore
642
+ object_=_response.json(),
643
+ ),
644
+ ),
645
+ )
646
+ _response_json = _response.json()
647
+ except JSONDecodeError:
648
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
649
+ except ValidationError as e:
650
+ raise ParsingError(
651
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
652
+ )
653
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
654
+
655
+ def get_popup_widget_runtime(
656
+ self, *, request_options: typing.Optional[RequestOptions] = None
657
+ ) -> HttpResponse[None]:
658
+ """
659
+ Load the hosted JavaScript runtime for popup signup widgets. No API key is required.
660
+
661
+ Parameters
662
+ ----------
663
+ request_options : typing.Optional[RequestOptions]
664
+ Request-specific configuration.
665
+
666
+ Returns
667
+ -------
668
+ HttpResponse[None]
669
+ """
670
+ _response = self._client_wrapper.httpx_client.request(
671
+ "widgets/popup.js",
672
+ method="GET",
673
+ request_options=request_options,
674
+ )
675
+ try:
676
+ if 200 <= _response.status_code < 300:
677
+ return HttpResponse(response=_response, data=None)
678
+ if _response.status_code == 503:
679
+ raise ServiceUnavailableError(
680
+ headers=dict(_response.headers),
681
+ body=typing.cast(
682
+ typing.Any,
683
+ parse_obj_as(
684
+ type_=typing.Any, # type: ignore
685
+ object_=_response.json(),
686
+ ),
687
+ ),
688
+ )
689
+ _response_json = _response.json()
690
+ except JSONDecodeError:
691
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
692
+ except ValidationError as e:
693
+ raise ParsingError(
694
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
695
+ )
696
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
697
+
698
+ def get_saved_form_embed(
699
+ self, form_id: str, *, request_options: typing.Optional[RequestOptions] = None
700
+ ) -> HttpResponse[GetSavedFormEmbedResponse]:
701
+ """
702
+ Returns a published saved form's public action URL, hosted JavaScript, minimal native form, fetch enhancement, and supported static-site platforms.
703
+
704
+ Parameters
705
+ ----------
706
+ form_id : str
707
+
708
+ request_options : typing.Optional[RequestOptions]
709
+ Request-specific configuration.
710
+
711
+ Returns
712
+ -------
713
+ HttpResponse[GetSavedFormEmbedResponse]
714
+ Embed recipes returned successfully
715
+ """
716
+ _response = self._client_wrapper.httpx_client.request(
717
+ f"forms/embed/{encode_path_param(form_id)}",
718
+ method="GET",
719
+ request_options=request_options,
720
+ )
721
+ try:
722
+ if 200 <= _response.status_code < 300:
723
+ _data = typing.cast(
724
+ GetSavedFormEmbedResponse,
725
+ parse_obj_as(
726
+ type_=GetSavedFormEmbedResponse, # type: ignore
727
+ object_=_response.json(),
728
+ ),
729
+ )
730
+ return HttpResponse(response=_response, data=_data)
731
+ if _response.status_code == 400:
732
+ raise BadRequestError(
733
+ headers=dict(_response.headers),
734
+ body=typing.cast(
735
+ typing.Any,
736
+ parse_obj_as(
737
+ type_=typing.Any, # type: ignore
738
+ object_=_response.json(),
739
+ ),
740
+ ),
741
+ )
742
+ if _response.status_code == 401:
743
+ raise UnauthorizedError(
744
+ headers=dict(_response.headers),
745
+ body=typing.cast(
746
+ typing.Any,
747
+ parse_obj_as(
748
+ type_=typing.Any, # type: ignore
749
+ object_=_response.json(),
750
+ ),
751
+ ),
752
+ )
753
+ if _response.status_code == 403:
754
+ raise ForbiddenError(
755
+ headers=dict(_response.headers),
756
+ body=typing.cast(
757
+ Error,
758
+ parse_obj_as(
759
+ type_=Error, # type: ignore
760
+ object_=_response.json(),
761
+ ),
762
+ ),
763
+ )
764
+ if _response.status_code == 404:
765
+ raise NotFoundError(
766
+ headers=dict(_response.headers),
767
+ body=typing.cast(
768
+ typing.Any,
769
+ parse_obj_as(
770
+ type_=typing.Any, # type: ignore
771
+ object_=_response.json(),
772
+ ),
773
+ ),
774
+ )
775
+ if _response.status_code == 503:
776
+ raise ServiceUnavailableError(
777
+ headers=dict(_response.headers),
778
+ body=typing.cast(
779
+ typing.Any,
780
+ parse_obj_as(
781
+ type_=typing.Any, # type: ignore
782
+ object_=_response.json(),
783
+ ),
784
+ ),
785
+ )
786
+ _response_json = _response.json()
787
+ except JSONDecodeError:
788
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
789
+ except ValidationError as e:
790
+ raise ParsingError(
791
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
792
+ )
793
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
794
+
795
+ def get_saved_popup(
796
+ self, popup_id: str, *, request_options: typing.Optional[RequestOptions] = None
797
+ ) -> HttpResponse[GetSavedPopupResponse]:
798
+ """
799
+ Returns one saved popup with its complete content blocks, trigger, targeting, schedule, frequency, and theme. Read this before replacing blocks so the replacement array stays complete.
800
+
801
+ Parameters
802
+ ----------
803
+ popup_id : str
804
+
805
+ request_options : typing.Optional[RequestOptions]
806
+ Request-specific configuration.
807
+
808
+ Returns
809
+ -------
810
+ HttpResponse[GetSavedPopupResponse]
811
+ Popup returned successfully
812
+ """
813
+ _response = self._client_wrapper.httpx_client.request(
814
+ f"popups/{encode_path_param(popup_id)}",
815
+ method="GET",
816
+ request_options=request_options,
817
+ )
818
+ try:
819
+ if 200 <= _response.status_code < 300:
820
+ _data = typing.cast(
821
+ GetSavedPopupResponse,
822
+ parse_obj_as(
823
+ type_=GetSavedPopupResponse, # type: ignore
824
+ object_=_response.json(),
825
+ ),
826
+ )
827
+ return HttpResponse(response=_response, data=_data)
828
+ if _response.status_code == 401:
829
+ raise UnauthorizedError(
830
+ headers=dict(_response.headers),
831
+ body=typing.cast(
832
+ typing.Any,
833
+ parse_obj_as(
834
+ type_=typing.Any, # type: ignore
835
+ object_=_response.json(),
836
+ ),
837
+ ),
838
+ )
839
+ if _response.status_code == 403:
840
+ raise ForbiddenError(
841
+ headers=dict(_response.headers),
842
+ body=typing.cast(
843
+ Error,
844
+ parse_obj_as(
845
+ type_=Error, # type: ignore
846
+ object_=_response.json(),
847
+ ),
848
+ ),
849
+ )
850
+ if _response.status_code == 404:
851
+ raise NotFoundError(
852
+ headers=dict(_response.headers),
853
+ body=typing.cast(
854
+ typing.Any,
855
+ parse_obj_as(
856
+ type_=typing.Any, # type: ignore
857
+ object_=_response.json(),
858
+ ),
859
+ ),
860
+ )
861
+ if _response.status_code == 503:
862
+ raise ServiceUnavailableError(
863
+ headers=dict(_response.headers),
864
+ body=typing.cast(
865
+ typing.Any,
866
+ parse_obj_as(
867
+ type_=typing.Any, # type: ignore
868
+ object_=_response.json(),
869
+ ),
870
+ ),
871
+ )
872
+ _response_json = _response.json()
873
+ except JSONDecodeError:
874
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
875
+ except ValidationError as e:
876
+ raise ParsingError(
877
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
878
+ )
879
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
880
+
881
+ def get_saved_popup_embed(
882
+ self, popup_id: str, *, request_options: typing.Optional[RequestOptions] = None
883
+ ) -> HttpResponse[GetSavedPopupEmbedResponse]:
884
+ """
885
+ Returns a published popup's script URL plus ready-to-paste snippets for plain HTML, React and Next.js, WordPress, and Shopify. The snippets carry no API key.
886
+
887
+ Parameters
888
+ ----------
889
+ popup_id : str
890
+
891
+ request_options : typing.Optional[RequestOptions]
892
+ Request-specific configuration.
893
+
894
+ Returns
895
+ -------
896
+ HttpResponse[GetSavedPopupEmbedResponse]
897
+ Embed recipes returned successfully
898
+ """
899
+ _response = self._client_wrapper.httpx_client.request(
900
+ f"popups/embed/{encode_path_param(popup_id)}",
901
+ method="GET",
902
+ request_options=request_options,
903
+ )
904
+ try:
905
+ if 200 <= _response.status_code < 300:
906
+ _data = typing.cast(
907
+ GetSavedPopupEmbedResponse,
908
+ parse_obj_as(
909
+ type_=GetSavedPopupEmbedResponse, # type: ignore
910
+ object_=_response.json(),
911
+ ),
912
+ )
913
+ return HttpResponse(response=_response, data=_data)
914
+ if _response.status_code == 400:
915
+ raise BadRequestError(
916
+ headers=dict(_response.headers),
917
+ body=typing.cast(
918
+ typing.Any,
919
+ parse_obj_as(
920
+ type_=typing.Any, # type: ignore
921
+ object_=_response.json(),
922
+ ),
923
+ ),
924
+ )
925
+ if _response.status_code == 401:
926
+ raise UnauthorizedError(
927
+ headers=dict(_response.headers),
928
+ body=typing.cast(
929
+ typing.Any,
930
+ parse_obj_as(
931
+ type_=typing.Any, # type: ignore
932
+ object_=_response.json(),
933
+ ),
934
+ ),
935
+ )
936
+ if _response.status_code == 403:
937
+ raise ForbiddenError(
938
+ headers=dict(_response.headers),
939
+ body=typing.cast(
940
+ Error,
941
+ parse_obj_as(
942
+ type_=Error, # type: ignore
943
+ object_=_response.json(),
944
+ ),
945
+ ),
946
+ )
947
+ if _response.status_code == 404:
948
+ raise NotFoundError(
949
+ headers=dict(_response.headers),
950
+ body=typing.cast(
951
+ typing.Any,
952
+ parse_obj_as(
953
+ type_=typing.Any, # type: ignore
954
+ object_=_response.json(),
955
+ ),
956
+ ),
957
+ )
958
+ if _response.status_code == 503:
959
+ raise ServiceUnavailableError(
960
+ headers=dict(_response.headers),
961
+ body=typing.cast(
962
+ typing.Any,
963
+ parse_obj_as(
964
+ type_=typing.Any, # type: ignore
965
+ object_=_response.json(),
966
+ ),
967
+ ),
968
+ )
969
+ _response_json = _response.json()
970
+ except JSONDecodeError:
971
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
972
+ except ValidationError as e:
973
+ raise ParsingError(
974
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
975
+ )
976
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
977
+
978
+ def get_saved_signup_form_embed_script(
979
+ self, company_id_or_form_id: str, *, request_options: typing.Optional[RequestOptions] = None
980
+ ) -> HttpResponse[None]:
981
+ """
982
+ Load a saved signup form with one line of JavaScript. No API key is required.
983
+
984
+ The script renders the current saved form settings when the page loads, so dashboard edits apply to deployed JavaScript embeds without copying new HTML.
985
+
986
+ Parameters
987
+ ----------
988
+ company_id_or_form_id : str
989
+ The saved form ID
990
+
991
+ request_options : typing.Optional[RequestOptions]
992
+ Request-specific configuration.
993
+
994
+ Returns
995
+ -------
996
+ HttpResponse[None]
997
+ """
998
+ _response = self._client_wrapper.httpx_client.request(
999
+ f"forms/{encode_path_param(company_id_or_form_id)}/embed.js",
1000
+ method="GET",
1001
+ request_options=request_options,
1002
+ )
1003
+ try:
1004
+ if 200 <= _response.status_code < 300:
1005
+ return HttpResponse(response=_response, data=None)
1006
+ if _response.status_code == 404:
1007
+ raise NotFoundError(
1008
+ headers=dict(_response.headers),
1009
+ body=typing.cast(
1010
+ typing.Any,
1011
+ parse_obj_as(
1012
+ type_=typing.Any, # type: ignore
1013
+ object_=_response.json(),
1014
+ ),
1015
+ ),
1016
+ )
1017
+ if _response.status_code == 503:
1018
+ raise ServiceUnavailableError(
1019
+ headers=dict(_response.headers),
1020
+ body=typing.cast(
1021
+ typing.Any,
1022
+ parse_obj_as(
1023
+ type_=typing.Any, # type: ignore
1024
+ object_=_response.json(),
1025
+ ),
1026
+ ),
1027
+ )
1028
+ _response_json = _response.json()
1029
+ except JSONDecodeError:
1030
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1031
+ except ValidationError as e:
1032
+ raise ParsingError(
1033
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1034
+ )
1035
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1036
+
1037
+ def list_saved_forms(
1038
+ self, *, request_options: typing.Optional[RequestOptions] = None
1039
+ ) -> HttpResponse[ListSavedFormsResponse]:
1040
+ """
1041
+ Lists saved signup forms for the authenticated workspace, including their server-managed audience settings and public action URLs.
1042
+
1043
+ Parameters
1044
+ ----------
1045
+ request_options : typing.Optional[RequestOptions]
1046
+ Request-specific configuration.
1047
+
1048
+ Returns
1049
+ -------
1050
+ HttpResponse[ListSavedFormsResponse]
1051
+ Saved forms returned successfully
1052
+ """
1053
+ _response = self._client_wrapper.httpx_client.request(
1054
+ "forms",
1055
+ method="GET",
1056
+ request_options=request_options,
1057
+ )
1058
+ try:
1059
+ if 200 <= _response.status_code < 300:
1060
+ _data = typing.cast(
1061
+ ListSavedFormsResponse,
1062
+ parse_obj_as(
1063
+ type_=ListSavedFormsResponse, # type: ignore
1064
+ object_=_response.json(),
1065
+ ),
1066
+ )
1067
+ return HttpResponse(response=_response, data=_data)
1068
+ if _response.status_code == 401:
1069
+ raise UnauthorizedError(
1070
+ headers=dict(_response.headers),
1071
+ body=typing.cast(
1072
+ typing.Any,
1073
+ parse_obj_as(
1074
+ type_=typing.Any, # type: ignore
1075
+ object_=_response.json(),
1076
+ ),
1077
+ ),
1078
+ )
1079
+ if _response.status_code == 403:
1080
+ raise ForbiddenError(
1081
+ headers=dict(_response.headers),
1082
+ body=typing.cast(
1083
+ Error,
1084
+ parse_obj_as(
1085
+ type_=Error, # type: ignore
1086
+ object_=_response.json(),
1087
+ ),
1088
+ ),
1089
+ )
1090
+ if _response.status_code == 503:
1091
+ raise ServiceUnavailableError(
1092
+ headers=dict(_response.headers),
1093
+ body=typing.cast(
1094
+ typing.Any,
1095
+ parse_obj_as(
1096
+ type_=typing.Any, # type: ignore
1097
+ object_=_response.json(),
1098
+ ),
1099
+ ),
1100
+ )
1101
+ _response_json = _response.json()
1102
+ except JSONDecodeError:
1103
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1104
+ except ValidationError as e:
1105
+ raise ParsingError(
1106
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1107
+ )
1108
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1109
+
1110
+ def list_saved_popups(
1111
+ self,
1112
+ *,
1113
+ include_content: typing.Optional[ListSavedPopupsRequestIncludeContent] = None,
1114
+ request_options: typing.Optional[RequestOptions] = None,
1115
+ ) -> HttpResponse[ListSavedPopupsResponse]:
1116
+ """
1117
+ Lists saved on-site signup popups for the authenticated workspace, including their trigger, targeting, audience settings, and view and conversion counts.
1118
+
1119
+ Parameters
1120
+ ----------
1121
+ include_content : typing.Optional[ListSavedPopupsRequestIncludeContent]
1122
+ Set to `true` to include every popup's full content blocks. Omitted by default because each popup adds roughly 1.8k characters; read one popup with `GET /popups/{popupId}` instead.
1123
+
1124
+ request_options : typing.Optional[RequestOptions]
1125
+ Request-specific configuration.
1126
+
1127
+ Returns
1128
+ -------
1129
+ HttpResponse[ListSavedPopupsResponse]
1130
+ Saved popups returned successfully
1131
+ """
1132
+ _response = self._client_wrapper.httpx_client.request(
1133
+ "popups",
1134
+ method="GET",
1135
+ params={
1136
+ "includeContent": include_content,
1137
+ },
1138
+ request_options=request_options,
1139
+ )
1140
+ try:
1141
+ if 200 <= _response.status_code < 300:
1142
+ _data = typing.cast(
1143
+ ListSavedPopupsResponse,
1144
+ parse_obj_as(
1145
+ type_=ListSavedPopupsResponse, # type: ignore
1146
+ object_=_response.json(),
1147
+ ),
1148
+ )
1149
+ return HttpResponse(response=_response, data=_data)
1150
+ if _response.status_code == 401:
1151
+ raise UnauthorizedError(
1152
+ headers=dict(_response.headers),
1153
+ body=typing.cast(
1154
+ typing.Any,
1155
+ parse_obj_as(
1156
+ type_=typing.Any, # type: ignore
1157
+ object_=_response.json(),
1158
+ ),
1159
+ ),
1160
+ )
1161
+ if _response.status_code == 403:
1162
+ raise ForbiddenError(
1163
+ headers=dict(_response.headers),
1164
+ body=typing.cast(
1165
+ Error,
1166
+ parse_obj_as(
1167
+ type_=Error, # type: ignore
1168
+ object_=_response.json(),
1169
+ ),
1170
+ ),
1171
+ )
1172
+ if _response.status_code == 503:
1173
+ raise ServiceUnavailableError(
1174
+ headers=dict(_response.headers),
1175
+ body=typing.cast(
1176
+ typing.Any,
1177
+ parse_obj_as(
1178
+ type_=typing.Any, # type: ignore
1179
+ object_=_response.json(),
1180
+ ),
1181
+ ),
1182
+ )
1183
+ _response_json = _response.json()
1184
+ except JSONDecodeError:
1185
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1186
+ except ValidationError as e:
1187
+ raise ParsingError(
1188
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1189
+ )
1190
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1191
+
1192
+ def submit_company_scoped_saved_signup_form(
1193
+ self,
1194
+ company_id_or_form_id: str,
1195
+ form_id: str,
1196
+ *,
1197
+ email: str,
1198
+ custom_attributes: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
1199
+ duplicate_strategy: typing.Optional[SubmitCompanyScopedSavedSignupFormRequestDuplicateStrategy] = OMIT,
1200
+ duplicate_strategy_token: typing.Optional[str] = OMIT,
1201
+ first_name: typing.Optional[str] = OMIT,
1202
+ last_name: typing.Optional[str] = OMIT,
1203
+ list_ids: typing.Optional[typing.Sequence[str]] = OMIT,
1204
+ list_ids_bracketed: typing.Optional[typing.Sequence[str]] = OMIT,
1205
+ phone: typing.Optional[str] = OMIT,
1206
+ redirect_url: typing.Optional[str] = OMIT,
1207
+ tag_ids: typing.Optional[typing.Sequence[str]] = OMIT,
1208
+ tag_ids_bracketed: typing.Optional[typing.Sequence[str]] = OMIT,
1209
+ website: typing.Optional[str] = OMIT,
1210
+ request_options: typing.Optional[RequestOptions] = None,
1211
+ ) -> HttpResponse[SubmitCompanyScopedSavedSignupFormResponse]:
1212
+ """
1213
+ Compatibility path for saved signup form submissions. New embeds should use `/forms/{formId}`.
1214
+
1215
+ The form's stored settings are the source of truth for audience targeting (lists, tags) and success behavior (success message or redirect URL), so dashboard edits apply to deployed embeds without re-embedding. List, tag, and redirect values in the request are ignored.
1216
+
1217
+ Parameters
1218
+ ----------
1219
+ company_id_or_form_id : str
1220
+ The company ID the form belongs to
1221
+
1222
+ form_id : str
1223
+ The saved form ID
1224
+
1225
+ email : str
1226
+ Subscriber email address
1227
+
1228
+ custom_attributes : typing.Optional[typing.Dict[str, typing.Any]]
1229
+ Subscriber custom attributes for custom fields configured on the saved form
1230
+
1231
+ duplicate_strategy : typing.Optional[SubmitCompanyScopedSavedSignupFormRequestDuplicateStrategy]
1232
+ Ignored for saved forms. Stored form settings are used.
1233
+
1234
+ duplicate_strategy_token : typing.Optional[str]
1235
+ Ignored for saved forms. Stored form settings are used.
1236
+
1237
+ first_name : typing.Optional[str]
1238
+
1239
+ last_name : typing.Optional[str]
1240
+
1241
+ list_ids : typing.Optional[typing.Sequence[str]]
1242
+ Ignored for saved forms. Stored form settings are used.
1243
+
1244
+ list_ids_bracketed : typing.Optional[typing.Sequence[str]]
1245
+ Ignored for saved forms. Stored form settings are used.
1246
+
1247
+ phone : typing.Optional[str]
1248
+ Subscriber phone number in E.164 or US national format, when configured on the saved form. Stored on the base subscriber profile and does not grant SMS consent.
1249
+
1250
+ redirect_url : typing.Optional[str]
1251
+ Ignored for saved forms. Stored form settings are used.
1252
+
1253
+ tag_ids : typing.Optional[typing.Sequence[str]]
1254
+ Ignored for saved forms. Stored form settings are used.
1255
+
1256
+ tag_ids_bracketed : typing.Optional[typing.Sequence[str]]
1257
+ Ignored for saved forms. Stored form settings are used.
1258
+
1259
+ website : typing.Optional[str]
1260
+ Honeypot field. Leave empty.
1261
+
1262
+ request_options : typing.Optional[RequestOptions]
1263
+ Request-specific configuration.
1264
+
1265
+ Returns
1266
+ -------
1267
+ HttpResponse[SubmitCompanyScopedSavedSignupFormResponse]
1268
+ Form submitted successfully. Native HTML form posts that accept `text/html` receive a hosted confirmation page showing the form's success message instead of JSON.
1269
+ """
1270
+ _response = self._client_wrapper.httpx_client.request(
1271
+ f"forms/{encode_path_param(company_id_or_form_id)}/{encode_path_param(form_id)}",
1272
+ method="POST",
1273
+ json={
1274
+ "customAttributes": custom_attributes,
1275
+ "duplicateStrategy": duplicate_strategy,
1276
+ "duplicateStrategyToken": duplicate_strategy_token,
1277
+ "email": email,
1278
+ "firstName": first_name,
1279
+ "lastName": last_name,
1280
+ "listIds": list_ids,
1281
+ "listIds[]": list_ids_bracketed,
1282
+ "phone": phone,
1283
+ "redirectUrl": redirect_url,
1284
+ "tagIds": tag_ids,
1285
+ "tagIds[]": tag_ids_bracketed,
1286
+ "website": website,
1287
+ },
1288
+ headers={
1289
+ "content-type": "application/json",
1290
+ },
1291
+ request_options=request_options,
1292
+ omit=OMIT,
1293
+ )
1294
+ try:
1295
+ if 200 <= _response.status_code < 300:
1296
+ _data = typing.cast(
1297
+ SubmitCompanyScopedSavedSignupFormResponse,
1298
+ parse_obj_as(
1299
+ type_=SubmitCompanyScopedSavedSignupFormResponse, # type: ignore
1300
+ object_=_response.json(),
1301
+ ),
1302
+ )
1303
+ return HttpResponse(response=_response, data=_data)
1304
+ if _response.status_code == 400:
1305
+ raise BadRequestError(
1306
+ headers=dict(_response.headers),
1307
+ body=typing.cast(
1308
+ typing.Any,
1309
+ parse_obj_as(
1310
+ type_=typing.Any, # type: ignore
1311
+ object_=_response.json(),
1312
+ ),
1313
+ ),
1314
+ )
1315
+ if _response.status_code == 404:
1316
+ raise NotFoundError(
1317
+ headers=dict(_response.headers),
1318
+ body=typing.cast(
1319
+ typing.Any,
1320
+ parse_obj_as(
1321
+ type_=typing.Any, # type: ignore
1322
+ object_=_response.json(),
1323
+ ),
1324
+ ),
1325
+ )
1326
+ if _response.status_code == 429:
1327
+ raise TooManyRequestsError(
1328
+ headers=dict(_response.headers),
1329
+ body=typing.cast(
1330
+ typing.Any,
1331
+ parse_obj_as(
1332
+ type_=typing.Any, # type: ignore
1333
+ object_=_response.json(),
1334
+ ),
1335
+ ),
1336
+ )
1337
+ if _response.status_code == 500:
1338
+ raise InternalServerError(
1339
+ headers=dict(_response.headers),
1340
+ body=typing.cast(
1341
+ typing.Any,
1342
+ parse_obj_as(
1343
+ type_=typing.Any, # type: ignore
1344
+ object_=_response.json(),
1345
+ ),
1346
+ ),
1347
+ )
1348
+ _response_json = _response.json()
1349
+ except JSONDecodeError:
1350
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1351
+ except ValidationError as e:
1352
+ raise ParsingError(
1353
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1354
+ )
1355
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1356
+
1357
+ def submit_saved_popup(
1358
+ self,
1359
+ popup_id: str,
1360
+ *,
1361
+ email: str,
1362
+ custom_attributes: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
1363
+ first_name: typing.Optional[str] = OMIT,
1364
+ last_name: typing.Optional[str] = OMIT,
1365
+ phone: typing.Optional[str] = OMIT,
1366
+ website: typing.Optional[str] = OMIT,
1367
+ request_options: typing.Optional[RequestOptions] = None,
1368
+ ) -> HttpResponse[SubmitSavedPopupResponse]:
1369
+ """
1370
+ Submit a saved popup without an API key. The popup's stored content is the source of truth for audience targeting, duplicate handling, custom fields, and success behavior.
1371
+
1372
+ Parameters
1373
+ ----------
1374
+ popup_id : str
1375
+ The saved popup ID
1376
+
1377
+ email : str
1378
+ Subscriber email address
1379
+
1380
+ custom_attributes : typing.Optional[typing.Dict[str, typing.Any]]
1381
+ Subscriber custom attributes for custom fields configured on the popup
1382
+
1383
+ first_name : typing.Optional[str]
1384
+
1385
+ last_name : typing.Optional[str]
1386
+
1387
+ phone : typing.Optional[str]
1388
+ Subscriber phone number in E.164 or US national format, when configured on the popup. Stored on the base subscriber profile and does not grant SMS consent.
1389
+
1390
+ website : typing.Optional[str]
1391
+ Honeypot field. Leave empty.
1392
+
1393
+ request_options : typing.Optional[RequestOptions]
1394
+ Request-specific configuration.
1395
+
1396
+ Returns
1397
+ -------
1398
+ HttpResponse[SubmitSavedPopupResponse]
1399
+ Popup submitted successfully
1400
+ """
1401
+ _response = self._client_wrapper.httpx_client.request(
1402
+ f"forms/popups/{encode_path_param(popup_id)}",
1403
+ method="POST",
1404
+ json={
1405
+ "customAttributes": custom_attributes,
1406
+ "email": email,
1407
+ "firstName": first_name,
1408
+ "lastName": last_name,
1409
+ "phone": phone,
1410
+ "website": website,
1411
+ },
1412
+ headers={
1413
+ "content-type": "application/json",
1414
+ },
1415
+ request_options=request_options,
1416
+ omit=OMIT,
1417
+ )
1418
+ try:
1419
+ if 200 <= _response.status_code < 300:
1420
+ _data = typing.cast(
1421
+ SubmitSavedPopupResponse,
1422
+ parse_obj_as(
1423
+ type_=SubmitSavedPopupResponse, # type: ignore
1424
+ object_=_response.json(),
1425
+ ),
1426
+ )
1427
+ return HttpResponse(response=_response, data=_data)
1428
+ if _response.status_code == 400:
1429
+ raise BadRequestError(
1430
+ headers=dict(_response.headers),
1431
+ body=typing.cast(
1432
+ typing.Any,
1433
+ parse_obj_as(
1434
+ type_=typing.Any, # type: ignore
1435
+ object_=_response.json(),
1436
+ ),
1437
+ ),
1438
+ )
1439
+ if _response.status_code == 404:
1440
+ raise NotFoundError(
1441
+ headers=dict(_response.headers),
1442
+ body=typing.cast(
1443
+ typing.Any,
1444
+ parse_obj_as(
1445
+ type_=typing.Any, # type: ignore
1446
+ object_=_response.json(),
1447
+ ),
1448
+ ),
1449
+ )
1450
+ if _response.status_code == 429:
1451
+ raise TooManyRequestsError(
1452
+ headers=dict(_response.headers),
1453
+ body=typing.cast(
1454
+ typing.Any,
1455
+ parse_obj_as(
1456
+ type_=typing.Any, # type: ignore
1457
+ object_=_response.json(),
1458
+ ),
1459
+ ),
1460
+ )
1461
+ if _response.status_code == 500:
1462
+ raise InternalServerError(
1463
+ headers=dict(_response.headers),
1464
+ body=typing.cast(
1465
+ typing.Any,
1466
+ parse_obj_as(
1467
+ type_=typing.Any, # type: ignore
1468
+ object_=_response.json(),
1469
+ ),
1470
+ ),
1471
+ )
1472
+ _response_json = _response.json()
1473
+ except JSONDecodeError:
1474
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1475
+ except ValidationError as e:
1476
+ raise ParsingError(
1477
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1478
+ )
1479
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1480
+
1481
+ def submit_signup_form(
1482
+ self,
1483
+ company_id_or_form_id: str,
1484
+ *,
1485
+ email: str,
1486
+ duplicate_strategy: typing.Optional[SubmitSignupFormRequestDuplicateStrategy] = None,
1487
+ duplicate_strategy_token: typing.Optional[str] = None,
1488
+ lists: typing.Optional[str] = None,
1489
+ tags: typing.Optional[str] = None,
1490
+ custom_attributes: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
1491
+ body_duplicate_strategy: typing.Optional[SubmitSignupFormRequestDuplicateStrategy] = OMIT,
1492
+ body_duplicate_strategy_token: typing.Optional[str] = OMIT,
1493
+ first_name: typing.Optional[str] = OMIT,
1494
+ last_name: typing.Optional[str] = OMIT,
1495
+ list_ids: typing.Optional[typing.Sequence[str]] = OMIT,
1496
+ phone: typing.Optional[str] = OMIT,
1497
+ redirect_url: typing.Optional[str] = OMIT,
1498
+ tag_ids: typing.Optional[typing.Sequence[str]] = OMIT,
1499
+ website: typing.Optional[str] = OMIT,
1500
+ request_options: typing.Optional[RequestOptions] = None,
1501
+ ) -> HttpResponse[SubmitSignupFormResponse]:
1502
+ """
1503
+ Submit a public signup form. No API key is required.
1504
+
1505
+ When the path value is a saved form ID, the form's stored settings are used for audience targeting and success behavior. When the path value is a company ID, this endpoint uses the legacy company-level form behavior.
1506
+
1507
+ Omit `lists` to use the workspace default lists setting, provide `lists=` to add the subscriber to no lists, or provide comma-separated list IDs for specific lists. Provide stable `tags` IDs to apply existing tags to the subscriber.
1508
+
1509
+ Parameters
1510
+ ----------
1511
+ company_id_or_form_id : str
1512
+ A saved form ID, or a company ID for legacy generated forms
1513
+
1514
+ email : str
1515
+ Subscriber email address
1516
+
1517
+ duplicate_strategy : typing.Optional[SubmitSignupFormRequestDuplicateStrategy]
1518
+ How to handle an existing contact with the submitted email. Use skip to preserve fields, merge to fill missing fields, or overwrite to replace submitted fields. Merge and overwrite require duplicateStrategyToken from the form builder.
1519
+
1520
+ duplicate_strategy_token : typing.Optional[str]
1521
+ Signed token generated by the form builder for the selected duplicateStrategy. Required for merge or overwrite.
1522
+
1523
+ lists : typing.Optional[str]
1524
+ Comma-separated list IDs. Omit for workspace default lists, or provide an empty value for no lists.
1525
+
1526
+ tags : typing.Optional[str]
1527
+ Comma-separated tag IDs to apply to the subscriber.
1528
+
1529
+ custom_attributes : typing.Optional[typing.Dict[str, typing.Any]]
1530
+ Subscriber custom attributes
1531
+
1532
+ body_duplicate_strategy : typing.Optional[SubmitSignupFormRequestDuplicateStrategy]
1533
+ Body alternative to the duplicateStrategy query parameter. Query parameter takes precedence. Merge and overwrite require duplicateStrategyToken.
1534
+
1535
+ body_duplicate_strategy_token : typing.Optional[str]
1536
+ Body alternative to the duplicateStrategyToken query parameter.
1537
+
1538
+ first_name : typing.Optional[str]
1539
+
1540
+ last_name : typing.Optional[str]
1541
+
1542
+ list_ids : typing.Optional[typing.Sequence[str]]
1543
+
1544
+ phone : typing.Optional[str]
1545
+ Subscriber phone number in E.164 or US national format. Stored on the base subscriber profile and does not grant SMS consent.
1546
+
1547
+ redirect_url : typing.Optional[str]
1548
+ Http(s) URL or bare domain to redirect to after successful submission
1549
+
1550
+ tag_ids : typing.Optional[typing.Sequence[str]]
1551
+ Existing tag IDs to apply to the subscriber
1552
+
1553
+ website : typing.Optional[str]
1554
+ Honeypot field. Leave empty.
1555
+
1556
+ request_options : typing.Optional[RequestOptions]
1557
+ Request-specific configuration.
1558
+
1559
+ Returns
1560
+ -------
1561
+ HttpResponse[SubmitSignupFormResponse]
1562
+ Form submitted successfully
1563
+ """
1564
+ _response = self._client_wrapper.httpx_client.request(
1565
+ f"forms/{encode_path_param(company_id_or_form_id)}",
1566
+ method="POST",
1567
+ params={
1568
+ "duplicateStrategy": duplicate_strategy,
1569
+ "duplicateStrategyToken": duplicate_strategy_token,
1570
+ "lists": lists,
1571
+ "tags": tags,
1572
+ },
1573
+ json={
1574
+ "customAttributes": custom_attributes,
1575
+ "duplicateStrategy": body_duplicate_strategy,
1576
+ "duplicateStrategyToken": body_duplicate_strategy_token,
1577
+ "email": email,
1578
+ "firstName": first_name,
1579
+ "lastName": last_name,
1580
+ "listIds": list_ids,
1581
+ "phone": phone,
1582
+ "redirectUrl": redirect_url,
1583
+ "tagIds": tag_ids,
1584
+ "website": website,
1585
+ },
1586
+ headers={
1587
+ "content-type": "application/json",
1588
+ },
1589
+ request_options=request_options,
1590
+ omit=OMIT,
1591
+ )
1592
+ try:
1593
+ if 200 <= _response.status_code < 300:
1594
+ _data = typing.cast(
1595
+ SubmitSignupFormResponse,
1596
+ parse_obj_as(
1597
+ type_=SubmitSignupFormResponse, # type: ignore
1598
+ object_=_response.json(),
1599
+ ),
1600
+ )
1601
+ return HttpResponse(response=_response, data=_data)
1602
+ if _response.status_code == 400:
1603
+ raise BadRequestError(
1604
+ headers=dict(_response.headers),
1605
+ body=typing.cast(
1606
+ typing.Any,
1607
+ parse_obj_as(
1608
+ type_=typing.Any, # type: ignore
1609
+ object_=_response.json(),
1610
+ ),
1611
+ ),
1612
+ )
1613
+ if _response.status_code == 404:
1614
+ raise NotFoundError(
1615
+ headers=dict(_response.headers),
1616
+ body=typing.cast(
1617
+ typing.Any,
1618
+ parse_obj_as(
1619
+ type_=typing.Any, # type: ignore
1620
+ object_=_response.json(),
1621
+ ),
1622
+ ),
1623
+ )
1624
+ if _response.status_code == 429:
1625
+ raise TooManyRequestsError(
1626
+ headers=dict(_response.headers),
1627
+ body=typing.cast(
1628
+ typing.Any,
1629
+ parse_obj_as(
1630
+ type_=typing.Any, # type: ignore
1631
+ object_=_response.json(),
1632
+ ),
1633
+ ),
1634
+ )
1635
+ if _response.status_code == 500:
1636
+ raise InternalServerError(
1637
+ headers=dict(_response.headers),
1638
+ body=typing.cast(
1639
+ typing.Any,
1640
+ parse_obj_as(
1641
+ type_=typing.Any, # type: ignore
1642
+ object_=_response.json(),
1643
+ ),
1644
+ ),
1645
+ )
1646
+ _response_json = _response.json()
1647
+ except JSONDecodeError:
1648
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1649
+ except ValidationError as e:
1650
+ raise ParsingError(
1651
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1652
+ )
1653
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1654
+
1655
+ def update_saved_form(
1656
+ self,
1657
+ company_id_or_form_id: str,
1658
+ *,
1659
+ blocks: typing.Optional[typing.Sequence[typing.Dict[str, typing.Any]]] = OMIT,
1660
+ button_text: typing.Optional[str] = OMIT,
1661
+ description: typing.Optional[str] = OMIT,
1662
+ duplicate_strategy: typing.Optional[UpdateSavedFormRequestDuplicateStrategy] = OMIT,
1663
+ headline: typing.Optional[str] = OMIT,
1664
+ list_ids: typing.Optional[typing.Sequence[str]] = OMIT,
1665
+ name: typing.Optional[str] = OMIT,
1666
+ redirect_url: typing.Optional[str] = OMIT,
1667
+ success_message: typing.Optional[str] = OMIT,
1668
+ tag_ids: typing.Optional[typing.Sequence[str]] = OMIT,
1669
+ theme: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
1670
+ request_options: typing.Optional[RequestOptions] = None,
1671
+ ) -> HttpResponse[UpdateSavedFormResponse]:
1672
+ """
1673
+ Update a saved form's name, audience targeting, copy, visual theme, or content blocks. Every field is optional - send only what should change.
1674
+
1675
+ The `headline`, `description`, `buttonText`, and `successMessage` fields edit the matching content block and fail with 400 when the form has no such block; replace `blocks` for structural changes. The `blocks` array fully replaces the form's content blocks and must keep exactly one required email field and one submit button. An empty `redirectUrl` switches the form back to its confirmation message.
1676
+
1677
+ Blocks render in array order and each needs a unique `id` and a `kind`. Input blocks use `kind: "form-field"` with `fieldType` (text, email, phone, number, textarea, select, radio, checkbox, consent, hidden), `name` (the custom attribute key), `label`, `placeholder`, `required`, `defaultValue`, `showLabel`, `width` (full or half), `mapsTo` (email, firstName, lastName, phone, customAttribute; defaults to customAttribute), and `options` for choice fields (`[{ value, label, id }]`, where label and id default to value). A hidden field with a `defaultValue` stores that server-owned value and ignores submitted values; a hidden field without one stores the value the page submits. Validation errors name the offending property, for example `blocks[3].options[0].value`.
1678
+
1679
+ Parameters
1680
+ ----------
1681
+ company_id_or_form_id : str
1682
+ The saved form ID to update
1683
+
1684
+ blocks : typing.Optional[typing.Sequence[typing.Dict[str, typing.Any]]]
1685
+ Full replacement for the form's content blocks.
1686
+
1687
+ button_text : typing.Optional[str]
1688
+
1689
+ description : typing.Optional[str]
1690
+
1691
+ duplicate_strategy : typing.Optional[UpdateSavedFormRequestDuplicateStrategy]
1692
+
1693
+ headline : typing.Optional[str]
1694
+
1695
+ list_ids : typing.Optional[typing.Sequence[str]]
1696
+
1697
+ name : typing.Optional[str]
1698
+
1699
+ redirect_url : typing.Optional[str]
1700
+ HTTP or HTTPS success redirect. An empty string switches back to the confirmation message.
1701
+
1702
+ success_message : typing.Optional[str]
1703
+
1704
+ tag_ids : typing.Optional[typing.Sequence[str]]
1705
+ Replacement tag IDs. An empty array clears tags.
1706
+
1707
+ theme : typing.Optional[typing.Dict[str, typing.Any]]
1708
+ Visual theme overrides merged into the current theme (accentColor, backgroundColor, textColor, mutedTextColor, cardColor, borderColor as "#rrggbb", borderRadius 0-32, headingFontFamily, bodyFontFamily, density).
1709
+
1710
+ request_options : typing.Optional[RequestOptions]
1711
+ Request-specific configuration.
1712
+
1713
+ Returns
1714
+ -------
1715
+ HttpResponse[UpdateSavedFormResponse]
1716
+ Form updated
1717
+ """
1718
+ _response = self._client_wrapper.httpx_client.request(
1719
+ f"forms/{encode_path_param(company_id_or_form_id)}",
1720
+ method="PATCH",
1721
+ json={
1722
+ "blocks": blocks,
1723
+ "buttonText": button_text,
1724
+ "description": description,
1725
+ "duplicateStrategy": duplicate_strategy,
1726
+ "headline": headline,
1727
+ "listIds": list_ids,
1728
+ "name": name,
1729
+ "redirectUrl": redirect_url,
1730
+ "successMessage": success_message,
1731
+ "tagIds": tag_ids,
1732
+ "theme": theme,
1733
+ },
1734
+ headers={
1735
+ "content-type": "application/json",
1736
+ },
1737
+ request_options=request_options,
1738
+ omit=OMIT,
1739
+ )
1740
+ try:
1741
+ if 200 <= _response.status_code < 300:
1742
+ _data = typing.cast(
1743
+ UpdateSavedFormResponse,
1744
+ parse_obj_as(
1745
+ type_=UpdateSavedFormResponse, # type: ignore
1746
+ object_=_response.json(),
1747
+ ),
1748
+ )
1749
+ return HttpResponse(response=_response, data=_data)
1750
+ if _response.status_code == 400:
1751
+ raise BadRequestError(
1752
+ headers=dict(_response.headers),
1753
+ body=typing.cast(
1754
+ typing.Any,
1755
+ parse_obj_as(
1756
+ type_=typing.Any, # type: ignore
1757
+ object_=_response.json(),
1758
+ ),
1759
+ ),
1760
+ )
1761
+ if _response.status_code == 401:
1762
+ raise UnauthorizedError(
1763
+ headers=dict(_response.headers),
1764
+ body=typing.cast(
1765
+ typing.Any,
1766
+ parse_obj_as(
1767
+ type_=typing.Any, # type: ignore
1768
+ object_=_response.json(),
1769
+ ),
1770
+ ),
1771
+ )
1772
+ if _response.status_code == 403:
1773
+ raise ForbiddenError(
1774
+ headers=dict(_response.headers),
1775
+ body=typing.cast(
1776
+ Error,
1777
+ parse_obj_as(
1778
+ type_=Error, # type: ignore
1779
+ object_=_response.json(),
1780
+ ),
1781
+ ),
1782
+ )
1783
+ if _response.status_code == 404:
1784
+ raise NotFoundError(
1785
+ headers=dict(_response.headers),
1786
+ body=typing.cast(
1787
+ typing.Any,
1788
+ parse_obj_as(
1789
+ type_=typing.Any, # type: ignore
1790
+ object_=_response.json(),
1791
+ ),
1792
+ ),
1793
+ )
1794
+ if _response.status_code == 500:
1795
+ raise InternalServerError(
1796
+ headers=dict(_response.headers),
1797
+ body=typing.cast(
1798
+ typing.Any,
1799
+ parse_obj_as(
1800
+ type_=typing.Any, # type: ignore
1801
+ object_=_response.json(),
1802
+ ),
1803
+ ),
1804
+ )
1805
+ _response_json = _response.json()
1806
+ except JSONDecodeError:
1807
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1808
+ except ValidationError as e:
1809
+ raise ParsingError(
1810
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1811
+ )
1812
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1813
+
1814
+ def update_saved_popup(
1815
+ self,
1816
+ popup_id: str,
1817
+ *,
1818
+ blocks: typing.Optional[typing.Sequence[typing.Dict[str, typing.Any]]] = OMIT,
1819
+ button_text: typing.Optional[str] = OMIT,
1820
+ description: typing.Optional[str] = OMIT,
1821
+ duplicate_strategy: typing.Optional[UpdateSavedPopupRequestDuplicateStrategy] = OMIT,
1822
+ frequency: typing.Optional[SavedPopupFrequency] = OMIT,
1823
+ headline: typing.Optional[str] = OMIT,
1824
+ list_ids: typing.Optional[typing.Sequence[str]] = OMIT,
1825
+ name: typing.Optional[str] = OMIT,
1826
+ placement: typing.Optional[UpdateSavedPopupRequestPlacement] = OMIT,
1827
+ presentation: typing.Optional[UpdateSavedPopupRequestPresentation] = OMIT,
1828
+ redirect_url: typing.Optional[str] = OMIT,
1829
+ schedule: typing.Optional[SavedPopupSchedule] = OMIT,
1830
+ status: typing.Optional[UpdateSavedPopupRequestStatus] = OMIT,
1831
+ success_message: typing.Optional[str] = OMIT,
1832
+ tag_ids: typing.Optional[typing.Sequence[str]] = OMIT,
1833
+ targeting: typing.Optional[SavedPopupTargeting] = OMIT,
1834
+ theme: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
1835
+ trigger: typing.Optional[SavedPopupTrigger] = OMIT,
1836
+ visual: typing.Optional[SavedPopupVisual] = OMIT,
1837
+ request_options: typing.Optional[RequestOptions] = None,
1838
+ ) -> HttpResponse[UpdateSavedPopupResponse]:
1839
+ """
1840
+ Updates a saved popup. Only the fields you send change.
1841
+
1842
+ Set `status` to `published` to make the popup live, or `draft` to stop it showing while keeping the popup, its stats, and its embed script. `trigger`, `targeting`, `schedule`, `frequency`, and `visual` are merged key by key, so patching one key keeps the rest.
1843
+
1844
+ Parameters
1845
+ ----------
1846
+ popup_id : str
1847
+
1848
+ blocks : typing.Optional[typing.Sequence[typing.Dict[str, typing.Any]]]
1849
+ Complete replacement for the popup's content blocks. The popup must keep exactly one required email field and one submit button.
1850
+
1851
+ button_text : typing.Optional[str]
1852
+
1853
+ description : typing.Optional[str]
1854
+ New text for the popup's first paragraph block. Fails when the popup has no paragraph block.
1855
+
1856
+ duplicate_strategy : typing.Optional[UpdateSavedPopupRequestDuplicateStrategy]
1857
+
1858
+ frequency : typing.Optional[SavedPopupFrequency]
1859
+
1860
+ headline : typing.Optional[str]
1861
+ New text for the popup's first heading block. Fails when the popup has no heading block.
1862
+
1863
+ list_ids : typing.Optional[typing.Sequence[str]]
1864
+ Replacement list targeting. Pass an empty array to capture into every list.
1865
+
1866
+ name : typing.Optional[str]
1867
+
1868
+ placement : typing.Optional[UpdateSavedPopupRequestPlacement]
1869
+
1870
+ presentation : typing.Optional[UpdateSavedPopupRequestPresentation]
1871
+
1872
+ redirect_url : typing.Optional[str]
1873
+ HTTP or HTTPS URL for successful signups. Pass an empty string to switch back to the confirmation message.
1874
+
1875
+ schedule : typing.Optional[SavedPopupSchedule]
1876
+
1877
+ status : typing.Optional[UpdateSavedPopupRequestStatus]
1878
+
1879
+ success_message : typing.Optional[str]
1880
+
1881
+ tag_ids : typing.Optional[typing.Sequence[str]]
1882
+ Replacement tag IDs. Pass an empty array to clear tags.
1883
+
1884
+ targeting : typing.Optional[SavedPopupTargeting]
1885
+
1886
+ theme : typing.Optional[typing.Dict[str, typing.Any]]
1887
+ Visual theme overrides merged into the current theme.
1888
+
1889
+ trigger : typing.Optional[SavedPopupTrigger]
1890
+
1891
+ visual : typing.Optional[SavedPopupVisual]
1892
+
1893
+ request_options : typing.Optional[RequestOptions]
1894
+ Request-specific configuration.
1895
+
1896
+ Returns
1897
+ -------
1898
+ HttpResponse[UpdateSavedPopupResponse]
1899
+ Popup updated
1900
+ """
1901
+ _response = self._client_wrapper.httpx_client.request(
1902
+ f"popups/{encode_path_param(popup_id)}",
1903
+ method="PATCH",
1904
+ json={
1905
+ "blocks": blocks,
1906
+ "buttonText": button_text,
1907
+ "description": description,
1908
+ "duplicateStrategy": duplicate_strategy,
1909
+ "frequency": convert_and_respect_annotation_metadata(
1910
+ object_=frequency, annotation=SavedPopupFrequency, direction="write"
1911
+ ),
1912
+ "headline": headline,
1913
+ "listIds": list_ids,
1914
+ "name": name,
1915
+ "placement": placement,
1916
+ "presentation": presentation,
1917
+ "redirectUrl": redirect_url,
1918
+ "schedule": convert_and_respect_annotation_metadata(
1919
+ object_=schedule, annotation=SavedPopupSchedule, direction="write"
1920
+ ),
1921
+ "status": status,
1922
+ "successMessage": success_message,
1923
+ "tagIds": tag_ids,
1924
+ "targeting": convert_and_respect_annotation_metadata(
1925
+ object_=targeting, annotation=SavedPopupTargeting, direction="write"
1926
+ ),
1927
+ "theme": theme,
1928
+ "trigger": convert_and_respect_annotation_metadata(
1929
+ object_=trigger, annotation=SavedPopupTrigger, direction="write"
1930
+ ),
1931
+ "visual": convert_and_respect_annotation_metadata(
1932
+ object_=visual, annotation=SavedPopupVisual, direction="write"
1933
+ ),
1934
+ },
1935
+ headers={
1936
+ "content-type": "application/json",
1937
+ },
1938
+ request_options=request_options,
1939
+ omit=OMIT,
1940
+ )
1941
+ try:
1942
+ if 200 <= _response.status_code < 300:
1943
+ _data = typing.cast(
1944
+ UpdateSavedPopupResponse,
1945
+ parse_obj_as(
1946
+ type_=UpdateSavedPopupResponse, # type: ignore
1947
+ object_=_response.json(),
1948
+ ),
1949
+ )
1950
+ return HttpResponse(response=_response, data=_data)
1951
+ if _response.status_code == 400:
1952
+ raise BadRequestError(
1953
+ headers=dict(_response.headers),
1954
+ body=typing.cast(
1955
+ typing.Any,
1956
+ parse_obj_as(
1957
+ type_=typing.Any, # type: ignore
1958
+ object_=_response.json(),
1959
+ ),
1960
+ ),
1961
+ )
1962
+ if _response.status_code == 401:
1963
+ raise UnauthorizedError(
1964
+ headers=dict(_response.headers),
1965
+ body=typing.cast(
1966
+ typing.Any,
1967
+ parse_obj_as(
1968
+ type_=typing.Any, # type: ignore
1969
+ object_=_response.json(),
1970
+ ),
1971
+ ),
1972
+ )
1973
+ if _response.status_code == 403:
1974
+ raise ForbiddenError(
1975
+ headers=dict(_response.headers),
1976
+ body=typing.cast(
1977
+ Error,
1978
+ parse_obj_as(
1979
+ type_=Error, # type: ignore
1980
+ object_=_response.json(),
1981
+ ),
1982
+ ),
1983
+ )
1984
+ if _response.status_code == 404:
1985
+ raise NotFoundError(
1986
+ headers=dict(_response.headers),
1987
+ body=typing.cast(
1988
+ typing.Any,
1989
+ parse_obj_as(
1990
+ type_=typing.Any, # type: ignore
1991
+ object_=_response.json(),
1992
+ ),
1993
+ ),
1994
+ )
1995
+ if _response.status_code == 500:
1996
+ raise InternalServerError(
1997
+ headers=dict(_response.headers),
1998
+ body=typing.cast(
1999
+ typing.Any,
2000
+ parse_obj_as(
2001
+ type_=typing.Any, # type: ignore
2002
+ object_=_response.json(),
2003
+ ),
2004
+ ),
2005
+ )
2006
+ _response_json = _response.json()
2007
+ except JSONDecodeError:
2008
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
2009
+ except ValidationError as e:
2010
+ raise ParsingError(
2011
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
2012
+ )
2013
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
2014
+
2015
+
2016
+ class AsyncRawWidgetsClient:
2017
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
2018
+ self._client_wrapper = client_wrapper
2019
+
2020
+ async def create_saved_form(
2021
+ self,
2022
+ *,
2023
+ list_ids: typing.Sequence[str],
2024
+ name: str,
2025
+ button_text: typing.Optional[str] = OMIT,
2026
+ description: typing.Optional[str] = OMIT,
2027
+ duplicate_strategy: typing.Optional[CreateSavedFormRequestDuplicateStrategy] = OMIT,
2028
+ headline: typing.Optional[str] = OMIT,
2029
+ redirect_url: typing.Optional[str] = OMIT,
2030
+ show_first_name: typing.Optional[bool] = OMIT,
2031
+ show_last_name: typing.Optional[bool] = OMIT,
2032
+ success_message: typing.Optional[str] = OMIT,
2033
+ tag_ids: typing.Optional[typing.Sequence[str]] = OMIT,
2034
+ theme: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
2035
+ request_options: typing.Optional[RequestOptions] = None,
2036
+ ) -> AsyncHttpResponse[CreateSavedFormResponse]:
2037
+ """
2038
+ Creates and publishes a saved signup form. Its opaque form ID becomes a client-safe public capability while audience and success settings remain server-side.
2039
+
2040
+ Parameters
2041
+ ----------
2042
+ list_ids : typing.Sequence[str]
2043
+
2044
+ name : str
2045
+
2046
+ button_text : typing.Optional[str]
2047
+
2048
+ description : typing.Optional[str]
2049
+
2050
+ duplicate_strategy : typing.Optional[CreateSavedFormRequestDuplicateStrategy]
2051
+
2052
+ headline : typing.Optional[str]
2053
+
2054
+ redirect_url : typing.Optional[str]
2055
+
2056
+ show_first_name : typing.Optional[bool]
2057
+
2058
+ show_last_name : typing.Optional[bool]
2059
+
2060
+ success_message : typing.Optional[str]
2061
+
2062
+ tag_ids : typing.Optional[typing.Sequence[str]]
2063
+
2064
+ theme : typing.Optional[typing.Dict[str, typing.Any]]
2065
+ Optional visual theme overrides (accentColor, backgroundColor, textColor, mutedTextColor, cardColor, borderColor as "#rrggbb", borderRadius 0-32, headingFontFamily, bodyFontFamily, density).
2066
+
2067
+ request_options : typing.Optional[RequestOptions]
2068
+ Request-specific configuration.
2069
+
2070
+ Returns
2071
+ -------
2072
+ AsyncHttpResponse[CreateSavedFormResponse]
2073
+ Form created and published
2074
+ """
2075
+ _response = await self._client_wrapper.httpx_client.request(
2076
+ "forms",
2077
+ method="POST",
2078
+ json={
2079
+ "buttonText": button_text,
2080
+ "description": description,
2081
+ "duplicateStrategy": duplicate_strategy,
2082
+ "headline": headline,
2083
+ "listIds": list_ids,
2084
+ "name": name,
2085
+ "redirectUrl": redirect_url,
2086
+ "showFirstName": show_first_name,
2087
+ "showLastName": show_last_name,
2088
+ "successMessage": success_message,
2089
+ "tagIds": tag_ids,
2090
+ "theme": theme,
2091
+ },
2092
+ headers={
2093
+ "content-type": "application/json",
2094
+ },
2095
+ request_options=request_options,
2096
+ omit=OMIT,
2097
+ )
2098
+ try:
2099
+ if 200 <= _response.status_code < 300:
2100
+ _data = typing.cast(
2101
+ CreateSavedFormResponse,
2102
+ parse_obj_as(
2103
+ type_=CreateSavedFormResponse, # type: ignore
2104
+ object_=_response.json(),
2105
+ ),
2106
+ )
2107
+ return AsyncHttpResponse(response=_response, data=_data)
2108
+ if _response.status_code == 400:
2109
+ raise BadRequestError(
2110
+ headers=dict(_response.headers),
2111
+ body=typing.cast(
2112
+ typing.Any,
2113
+ parse_obj_as(
2114
+ type_=typing.Any, # type: ignore
2115
+ object_=_response.json(),
2116
+ ),
2117
+ ),
2118
+ )
2119
+ if _response.status_code == 401:
2120
+ raise UnauthorizedError(
2121
+ headers=dict(_response.headers),
2122
+ body=typing.cast(
2123
+ typing.Any,
2124
+ parse_obj_as(
2125
+ type_=typing.Any, # type: ignore
2126
+ object_=_response.json(),
2127
+ ),
2128
+ ),
2129
+ )
2130
+ if _response.status_code == 403:
2131
+ raise ForbiddenError(
2132
+ headers=dict(_response.headers),
2133
+ body=typing.cast(
2134
+ Error,
2135
+ parse_obj_as(
2136
+ type_=Error, # type: ignore
2137
+ object_=_response.json(),
2138
+ ),
2139
+ ),
2140
+ )
2141
+ if _response.status_code == 500:
2142
+ raise InternalServerError(
2143
+ headers=dict(_response.headers),
2144
+ body=typing.cast(
2145
+ typing.Any,
2146
+ parse_obj_as(
2147
+ type_=typing.Any, # type: ignore
2148
+ object_=_response.json(),
2149
+ ),
2150
+ ),
2151
+ )
2152
+ _response_json = _response.json()
2153
+ except JSONDecodeError:
2154
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
2155
+ except ValidationError as e:
2156
+ raise ParsingError(
2157
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
2158
+ )
2159
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
2160
+
2161
+ async def create_saved_popup(
2162
+ self,
2163
+ *,
2164
+ name: str,
2165
+ blocks: typing.Optional[typing.Sequence[typing.Dict[str, typing.Any]]] = OMIT,
2166
+ button_text: typing.Optional[str] = OMIT,
2167
+ description: typing.Optional[str] = OMIT,
2168
+ duplicate_strategy: typing.Optional[CreateSavedPopupRequestDuplicateStrategy] = OMIT,
2169
+ frequency: typing.Optional[SavedPopupFrequency] = OMIT,
2170
+ headline: typing.Optional[str] = OMIT,
2171
+ list_ids: typing.Optional[typing.Sequence[str]] = OMIT,
2172
+ placement: typing.Optional[CreateSavedPopupRequestPlacement] = OMIT,
2173
+ presentation: typing.Optional[CreateSavedPopupRequestPresentation] = OMIT,
2174
+ redirect_url: typing.Optional[str] = OMIT,
2175
+ schedule: typing.Optional[SavedPopupSchedule] = OMIT,
2176
+ status: typing.Optional[CreateSavedPopupRequestStatus] = OMIT,
2177
+ success_message: typing.Optional[str] = OMIT,
2178
+ tag_ids: typing.Optional[typing.Sequence[str]] = OMIT,
2179
+ targeting: typing.Optional[SavedPopupTargeting] = OMIT,
2180
+ template: typing.Optional[CreateSavedPopupRequestTemplate] = OMIT,
2181
+ theme: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
2182
+ trigger: typing.Optional[SavedPopupTrigger] = OMIT,
2183
+ visual: typing.Optional[SavedPopupVisual] = OMIT,
2184
+ request_options: typing.Optional[RequestOptions] = None,
2185
+ ) -> AsyncHttpResponse[CreateSavedPopupResponse]:
2186
+ """
2187
+ Creates a saved on-site signup popup and returns the one-line script tag that deploys it. The popup is published by default, so the script is live as soon as it is added to the site. Trigger, targeting, audience, and duplicate handling stay server-side, so the deployed script carries no API key.
2188
+
2189
+ Omit `listIds` to capture into every list, matching the dashboard default.
2190
+
2191
+ Parameters
2192
+ ----------
2193
+ name : str
2194
+
2195
+ blocks : typing.Optional[typing.Sequence[typing.Dict[str, typing.Any]]]
2196
+ Complete replacement for the popup's content blocks. The popup must keep exactly one required email field and one submit button.
2197
+
2198
+ button_text : typing.Optional[str]
2199
+
2200
+ description : typing.Optional[str]
2201
+
2202
+ duplicate_strategy : typing.Optional[CreateSavedPopupRequestDuplicateStrategy]
2203
+
2204
+ frequency : typing.Optional[SavedPopupFrequency]
2205
+
2206
+ headline : typing.Optional[str]
2207
+
2208
+ list_ids : typing.Optional[typing.Sequence[str]]
2209
+ Lists every signup is added to. Omit or pass an empty array to capture into every list.
2210
+
2211
+ placement : typing.Optional[CreateSavedPopupRequestPlacement]
2212
+
2213
+ presentation : typing.Optional[CreateSavedPopupRequestPresentation]
2214
+
2215
+ redirect_url : typing.Optional[str]
2216
+
2217
+ schedule : typing.Optional[SavedPopupSchedule]
2218
+
2219
+ status : typing.Optional[CreateSavedPopupRequestStatus]
2220
+
2221
+ success_message : typing.Optional[str]
2222
+
2223
+ tag_ids : typing.Optional[typing.Sequence[str]]
2224
+
2225
+ targeting : typing.Optional[SavedPopupTargeting]
2226
+
2227
+ template : typing.Optional[CreateSavedPopupRequestTemplate]
2228
+ Starting design for the popup's blocks and theme.
2229
+
2230
+ theme : typing.Optional[typing.Dict[str, typing.Any]]
2231
+ Optional visual theme overrides (accentColor, backgroundColor, textColor, mutedTextColor, cardColor, borderColor as "#rrggbb", borderRadius 0-32, headingFontFamily, bodyFontFamily, density).
2232
+
2233
+ trigger : typing.Optional[SavedPopupTrigger]
2234
+
2235
+ visual : typing.Optional[SavedPopupVisual]
2236
+
2237
+ request_options : typing.Optional[RequestOptions]
2238
+ Request-specific configuration.
2239
+
2240
+ Returns
2241
+ -------
2242
+ AsyncHttpResponse[CreateSavedPopupResponse]
2243
+ Popup created
2244
+ """
2245
+ _response = await self._client_wrapper.httpx_client.request(
2246
+ "popups",
2247
+ method="POST",
2248
+ json={
2249
+ "blocks": blocks,
2250
+ "buttonText": button_text,
2251
+ "description": description,
2252
+ "duplicateStrategy": duplicate_strategy,
2253
+ "frequency": convert_and_respect_annotation_metadata(
2254
+ object_=frequency, annotation=SavedPopupFrequency, direction="write"
2255
+ ),
2256
+ "headline": headline,
2257
+ "listIds": list_ids,
2258
+ "name": name,
2259
+ "placement": placement,
2260
+ "presentation": presentation,
2261
+ "redirectUrl": redirect_url,
2262
+ "schedule": convert_and_respect_annotation_metadata(
2263
+ object_=schedule, annotation=SavedPopupSchedule, direction="write"
2264
+ ),
2265
+ "status": status,
2266
+ "successMessage": success_message,
2267
+ "tagIds": tag_ids,
2268
+ "targeting": convert_and_respect_annotation_metadata(
2269
+ object_=targeting, annotation=SavedPopupTargeting, direction="write"
2270
+ ),
2271
+ "template": template,
2272
+ "theme": theme,
2273
+ "trigger": convert_and_respect_annotation_metadata(
2274
+ object_=trigger, annotation=SavedPopupTrigger, direction="write"
2275
+ ),
2276
+ "visual": convert_and_respect_annotation_metadata(
2277
+ object_=visual, annotation=SavedPopupVisual, direction="write"
2278
+ ),
2279
+ },
2280
+ headers={
2281
+ "content-type": "application/json",
2282
+ },
2283
+ request_options=request_options,
2284
+ omit=OMIT,
2285
+ )
2286
+ try:
2287
+ if 200 <= _response.status_code < 300:
2288
+ _data = typing.cast(
2289
+ CreateSavedPopupResponse,
2290
+ parse_obj_as(
2291
+ type_=CreateSavedPopupResponse, # type: ignore
2292
+ object_=_response.json(),
2293
+ ),
2294
+ )
2295
+ return AsyncHttpResponse(response=_response, data=_data)
2296
+ if _response.status_code == 400:
2297
+ raise BadRequestError(
2298
+ headers=dict(_response.headers),
2299
+ body=typing.cast(
2300
+ typing.Any,
2301
+ parse_obj_as(
2302
+ type_=typing.Any, # type: ignore
2303
+ object_=_response.json(),
2304
+ ),
2305
+ ),
2306
+ )
2307
+ if _response.status_code == 401:
2308
+ raise UnauthorizedError(
2309
+ headers=dict(_response.headers),
2310
+ body=typing.cast(
2311
+ typing.Any,
2312
+ parse_obj_as(
2313
+ type_=typing.Any, # type: ignore
2314
+ object_=_response.json(),
2315
+ ),
2316
+ ),
2317
+ )
2318
+ if _response.status_code == 403:
2319
+ raise ForbiddenError(
2320
+ headers=dict(_response.headers),
2321
+ body=typing.cast(
2322
+ Error,
2323
+ parse_obj_as(
2324
+ type_=Error, # type: ignore
2325
+ object_=_response.json(),
2326
+ ),
2327
+ ),
2328
+ )
2329
+ if _response.status_code == 500:
2330
+ raise InternalServerError(
2331
+ headers=dict(_response.headers),
2332
+ body=typing.cast(
2333
+ typing.Any,
2334
+ parse_obj_as(
2335
+ type_=typing.Any, # type: ignore
2336
+ object_=_response.json(),
2337
+ ),
2338
+ ),
2339
+ )
2340
+ _response_json = _response.json()
2341
+ except JSONDecodeError:
2342
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
2343
+ except ValidationError as e:
2344
+ raise ParsingError(
2345
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
2346
+ )
2347
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
2348
+
2349
+ async def delete_saved_popup(
2350
+ self, popup_id: str, *, request_options: typing.Optional[RequestOptions] = None
2351
+ ) -> AsyncHttpResponse[DeleteSavedPopupResponse]:
2352
+ """
2353
+ Permanently deletes a saved popup along with its view and conversion counts. Subscribers it already captured are not affected. To stop a popup from showing while keeping its stats, set its status to draft instead.
2354
+
2355
+ Parameters
2356
+ ----------
2357
+ popup_id : str
2358
+
2359
+ request_options : typing.Optional[RequestOptions]
2360
+ Request-specific configuration.
2361
+
2362
+ Returns
2363
+ -------
2364
+ AsyncHttpResponse[DeleteSavedPopupResponse]
2365
+ Popup deleted
2366
+ """
2367
+ _response = await self._client_wrapper.httpx_client.request(
2368
+ f"popups/{encode_path_param(popup_id)}",
2369
+ method="DELETE",
2370
+ request_options=request_options,
2371
+ )
2372
+ try:
2373
+ if 200 <= _response.status_code < 300:
2374
+ _data = typing.cast(
2375
+ DeleteSavedPopupResponse,
2376
+ parse_obj_as(
2377
+ type_=DeleteSavedPopupResponse, # type: ignore
2378
+ object_=_response.json(),
2379
+ ),
2380
+ )
2381
+ return AsyncHttpResponse(response=_response, data=_data)
2382
+ if _response.status_code == 401:
2383
+ raise UnauthorizedError(
2384
+ headers=dict(_response.headers),
2385
+ body=typing.cast(
2386
+ typing.Any,
2387
+ parse_obj_as(
2388
+ type_=typing.Any, # type: ignore
2389
+ object_=_response.json(),
2390
+ ),
2391
+ ),
2392
+ )
2393
+ if _response.status_code == 403:
2394
+ raise ForbiddenError(
2395
+ headers=dict(_response.headers),
2396
+ body=typing.cast(
2397
+ Error,
2398
+ parse_obj_as(
2399
+ type_=Error, # type: ignore
2400
+ object_=_response.json(),
2401
+ ),
2402
+ ),
2403
+ )
2404
+ if _response.status_code == 404:
2405
+ raise NotFoundError(
2406
+ headers=dict(_response.headers),
2407
+ body=typing.cast(
2408
+ typing.Any,
2409
+ parse_obj_as(
2410
+ type_=typing.Any, # type: ignore
2411
+ object_=_response.json(),
2412
+ ),
2413
+ ),
2414
+ )
2415
+ if _response.status_code == 503:
2416
+ raise ServiceUnavailableError(
2417
+ headers=dict(_response.headers),
2418
+ body=typing.cast(
2419
+ typing.Any,
2420
+ parse_obj_as(
2421
+ type_=typing.Any, # type: ignore
2422
+ object_=_response.json(),
2423
+ ),
2424
+ ),
2425
+ )
2426
+ _response_json = _response.json()
2427
+ except JSONDecodeError:
2428
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
2429
+ except ValidationError as e:
2430
+ raise ParsingError(
2431
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
2432
+ )
2433
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
2434
+
2435
+ async def duplicate_saved_popup(
2436
+ self,
2437
+ popup_id: str,
2438
+ *,
2439
+ name: typing.Optional[str] = OMIT,
2440
+ request_options: typing.Optional[RequestOptions] = None,
2441
+ ) -> AsyncHttpResponse[DuplicateSavedPopupResponse]:
2442
+ """
2443
+ Copies a saved popup into a new draft with its own view and conversion counts. The original keeps its status and stats, so a live popup carries on showing while the copy is edited.
2444
+
2445
+ Parameters
2446
+ ----------
2447
+ popup_id : str
2448
+
2449
+ name : typing.Optional[str]
2450
+ Name for the copy. Defaults to the original name with " (copy)" appended.
2451
+
2452
+ request_options : typing.Optional[RequestOptions]
2453
+ Request-specific configuration.
2454
+
2455
+ Returns
2456
+ -------
2457
+ AsyncHttpResponse[DuplicateSavedPopupResponse]
2458
+ Popup duplicated as a draft
2459
+ """
2460
+ _response = await self._client_wrapper.httpx_client.request(
2461
+ f"popups/{encode_path_param(popup_id)}/duplicate",
2462
+ method="POST",
2463
+ json={
2464
+ "name": name,
2465
+ },
2466
+ headers={
2467
+ "content-type": "application/json",
2468
+ },
2469
+ request_options=request_options,
2470
+ omit=OMIT,
2471
+ )
2472
+ try:
2473
+ if 200 <= _response.status_code < 300:
2474
+ _data = typing.cast(
2475
+ DuplicateSavedPopupResponse,
2476
+ parse_obj_as(
2477
+ type_=DuplicateSavedPopupResponse, # type: ignore
2478
+ object_=_response.json(),
2479
+ ),
2480
+ )
2481
+ return AsyncHttpResponse(response=_response, data=_data)
2482
+ if _response.status_code == 400:
2483
+ raise BadRequestError(
2484
+ headers=dict(_response.headers),
2485
+ body=typing.cast(
2486
+ typing.Any,
2487
+ parse_obj_as(
2488
+ type_=typing.Any, # type: ignore
2489
+ object_=_response.json(),
2490
+ ),
2491
+ ),
2492
+ )
2493
+ if _response.status_code == 401:
2494
+ raise UnauthorizedError(
2495
+ headers=dict(_response.headers),
2496
+ body=typing.cast(
2497
+ typing.Any,
2498
+ parse_obj_as(
2499
+ type_=typing.Any, # type: ignore
2500
+ object_=_response.json(),
2501
+ ),
2502
+ ),
2503
+ )
2504
+ if _response.status_code == 403:
2505
+ raise ForbiddenError(
2506
+ headers=dict(_response.headers),
2507
+ body=typing.cast(
2508
+ Error,
2509
+ parse_obj_as(
2510
+ type_=Error, # type: ignore
2511
+ object_=_response.json(),
2512
+ ),
2513
+ ),
2514
+ )
2515
+ if _response.status_code == 404:
2516
+ raise NotFoundError(
2517
+ headers=dict(_response.headers),
2518
+ body=typing.cast(
2519
+ typing.Any,
2520
+ parse_obj_as(
2521
+ type_=typing.Any, # type: ignore
2522
+ object_=_response.json(),
2523
+ ),
2524
+ ),
2525
+ )
2526
+ if _response.status_code == 500:
2527
+ raise InternalServerError(
2528
+ headers=dict(_response.headers),
2529
+ body=typing.cast(
2530
+ typing.Any,
2531
+ parse_obj_as(
2532
+ type_=typing.Any, # type: ignore
2533
+ object_=_response.json(),
2534
+ ),
2535
+ ),
2536
+ )
2537
+ _response_json = _response.json()
2538
+ except JSONDecodeError:
2539
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
2540
+ except ValidationError as e:
2541
+ raise ParsingError(
2542
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
2543
+ )
2544
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
2545
+
2546
+ async def get_company_scoped_saved_signup_form_embed_script(
2547
+ self, company_id_or_form_id: str, form_id: str, *, request_options: typing.Optional[RequestOptions] = None
2548
+ ) -> AsyncHttpResponse[None]:
2549
+ """
2550
+ Compatibility path for saved signup form embed scripts. New embeds should use `/forms/{formId}/embed.js`.
2551
+
2552
+ The script renders the current saved form settings when the page loads, so dashboard edits apply to deployed JavaScript embeds without copying new HTML.
2553
+
2554
+ Parameters
2555
+ ----------
2556
+ company_id_or_form_id : str
2557
+ The company ID the form belongs to
2558
+
2559
+ form_id : str
2560
+ The saved form ID
2561
+
2562
+ request_options : typing.Optional[RequestOptions]
2563
+ Request-specific configuration.
2564
+
2565
+ Returns
2566
+ -------
2567
+ AsyncHttpResponse[None]
2568
+ """
2569
+ _response = await self._client_wrapper.httpx_client.request(
2570
+ f"forms/{encode_path_param(company_id_or_form_id)}/{encode_path_param(form_id)}/embed.js",
2571
+ method="GET",
2572
+ request_options=request_options,
2573
+ )
2574
+ try:
2575
+ if 200 <= _response.status_code < 300:
2576
+ return AsyncHttpResponse(response=_response, data=None)
2577
+ if _response.status_code == 404:
2578
+ raise NotFoundError(
2579
+ headers=dict(_response.headers),
2580
+ body=typing.cast(
2581
+ typing.Any,
2582
+ parse_obj_as(
2583
+ type_=typing.Any, # type: ignore
2584
+ object_=_response.json(),
2585
+ ),
2586
+ ),
2587
+ )
2588
+ if _response.status_code == 503:
2589
+ raise ServiceUnavailableError(
2590
+ headers=dict(_response.headers),
2591
+ body=typing.cast(
2592
+ typing.Any,
2593
+ parse_obj_as(
2594
+ type_=typing.Any, # type: ignore
2595
+ object_=_response.json(),
2596
+ ),
2597
+ ),
2598
+ )
2599
+ _response_json = _response.json()
2600
+ except JSONDecodeError:
2601
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
2602
+ except ValidationError as e:
2603
+ raise ParsingError(
2604
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
2605
+ )
2606
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
2607
+
2608
+ async def get_popup_widget_runtime(
2609
+ self, *, request_options: typing.Optional[RequestOptions] = None
2610
+ ) -> AsyncHttpResponse[None]:
2611
+ """
2612
+ Load the hosted JavaScript runtime for popup signup widgets. No API key is required.
2613
+
2614
+ Parameters
2615
+ ----------
2616
+ request_options : typing.Optional[RequestOptions]
2617
+ Request-specific configuration.
2618
+
2619
+ Returns
2620
+ -------
2621
+ AsyncHttpResponse[None]
2622
+ """
2623
+ _response = await self._client_wrapper.httpx_client.request(
2624
+ "widgets/popup.js",
2625
+ method="GET",
2626
+ request_options=request_options,
2627
+ )
2628
+ try:
2629
+ if 200 <= _response.status_code < 300:
2630
+ return AsyncHttpResponse(response=_response, data=None)
2631
+ if _response.status_code == 503:
2632
+ raise ServiceUnavailableError(
2633
+ headers=dict(_response.headers),
2634
+ body=typing.cast(
2635
+ typing.Any,
2636
+ parse_obj_as(
2637
+ type_=typing.Any, # type: ignore
2638
+ object_=_response.json(),
2639
+ ),
2640
+ ),
2641
+ )
2642
+ _response_json = _response.json()
2643
+ except JSONDecodeError:
2644
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
2645
+ except ValidationError as e:
2646
+ raise ParsingError(
2647
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
2648
+ )
2649
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
2650
+
2651
+ async def get_saved_form_embed(
2652
+ self, form_id: str, *, request_options: typing.Optional[RequestOptions] = None
2653
+ ) -> AsyncHttpResponse[GetSavedFormEmbedResponse]:
2654
+ """
2655
+ Returns a published saved form's public action URL, hosted JavaScript, minimal native form, fetch enhancement, and supported static-site platforms.
2656
+
2657
+ Parameters
2658
+ ----------
2659
+ form_id : str
2660
+
2661
+ request_options : typing.Optional[RequestOptions]
2662
+ Request-specific configuration.
2663
+
2664
+ Returns
2665
+ -------
2666
+ AsyncHttpResponse[GetSavedFormEmbedResponse]
2667
+ Embed recipes returned successfully
2668
+ """
2669
+ _response = await self._client_wrapper.httpx_client.request(
2670
+ f"forms/embed/{encode_path_param(form_id)}",
2671
+ method="GET",
2672
+ request_options=request_options,
2673
+ )
2674
+ try:
2675
+ if 200 <= _response.status_code < 300:
2676
+ _data = typing.cast(
2677
+ GetSavedFormEmbedResponse,
2678
+ parse_obj_as(
2679
+ type_=GetSavedFormEmbedResponse, # type: ignore
2680
+ object_=_response.json(),
2681
+ ),
2682
+ )
2683
+ return AsyncHttpResponse(response=_response, data=_data)
2684
+ if _response.status_code == 400:
2685
+ raise BadRequestError(
2686
+ headers=dict(_response.headers),
2687
+ body=typing.cast(
2688
+ typing.Any,
2689
+ parse_obj_as(
2690
+ type_=typing.Any, # type: ignore
2691
+ object_=_response.json(),
2692
+ ),
2693
+ ),
2694
+ )
2695
+ if _response.status_code == 401:
2696
+ raise UnauthorizedError(
2697
+ headers=dict(_response.headers),
2698
+ body=typing.cast(
2699
+ typing.Any,
2700
+ parse_obj_as(
2701
+ type_=typing.Any, # type: ignore
2702
+ object_=_response.json(),
2703
+ ),
2704
+ ),
2705
+ )
2706
+ if _response.status_code == 403:
2707
+ raise ForbiddenError(
2708
+ headers=dict(_response.headers),
2709
+ body=typing.cast(
2710
+ Error,
2711
+ parse_obj_as(
2712
+ type_=Error, # type: ignore
2713
+ object_=_response.json(),
2714
+ ),
2715
+ ),
2716
+ )
2717
+ if _response.status_code == 404:
2718
+ raise NotFoundError(
2719
+ headers=dict(_response.headers),
2720
+ body=typing.cast(
2721
+ typing.Any,
2722
+ parse_obj_as(
2723
+ type_=typing.Any, # type: ignore
2724
+ object_=_response.json(),
2725
+ ),
2726
+ ),
2727
+ )
2728
+ if _response.status_code == 503:
2729
+ raise ServiceUnavailableError(
2730
+ headers=dict(_response.headers),
2731
+ body=typing.cast(
2732
+ typing.Any,
2733
+ parse_obj_as(
2734
+ type_=typing.Any, # type: ignore
2735
+ object_=_response.json(),
2736
+ ),
2737
+ ),
2738
+ )
2739
+ _response_json = _response.json()
2740
+ except JSONDecodeError:
2741
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
2742
+ except ValidationError as e:
2743
+ raise ParsingError(
2744
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
2745
+ )
2746
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
2747
+
2748
+ async def get_saved_popup(
2749
+ self, popup_id: str, *, request_options: typing.Optional[RequestOptions] = None
2750
+ ) -> AsyncHttpResponse[GetSavedPopupResponse]:
2751
+ """
2752
+ Returns one saved popup with its complete content blocks, trigger, targeting, schedule, frequency, and theme. Read this before replacing blocks so the replacement array stays complete.
2753
+
2754
+ Parameters
2755
+ ----------
2756
+ popup_id : str
2757
+
2758
+ request_options : typing.Optional[RequestOptions]
2759
+ Request-specific configuration.
2760
+
2761
+ Returns
2762
+ -------
2763
+ AsyncHttpResponse[GetSavedPopupResponse]
2764
+ Popup returned successfully
2765
+ """
2766
+ _response = await self._client_wrapper.httpx_client.request(
2767
+ f"popups/{encode_path_param(popup_id)}",
2768
+ method="GET",
2769
+ request_options=request_options,
2770
+ )
2771
+ try:
2772
+ if 200 <= _response.status_code < 300:
2773
+ _data = typing.cast(
2774
+ GetSavedPopupResponse,
2775
+ parse_obj_as(
2776
+ type_=GetSavedPopupResponse, # type: ignore
2777
+ object_=_response.json(),
2778
+ ),
2779
+ )
2780
+ return AsyncHttpResponse(response=_response, data=_data)
2781
+ if _response.status_code == 401:
2782
+ raise UnauthorizedError(
2783
+ headers=dict(_response.headers),
2784
+ body=typing.cast(
2785
+ typing.Any,
2786
+ parse_obj_as(
2787
+ type_=typing.Any, # type: ignore
2788
+ object_=_response.json(),
2789
+ ),
2790
+ ),
2791
+ )
2792
+ if _response.status_code == 403:
2793
+ raise ForbiddenError(
2794
+ headers=dict(_response.headers),
2795
+ body=typing.cast(
2796
+ Error,
2797
+ parse_obj_as(
2798
+ type_=Error, # type: ignore
2799
+ object_=_response.json(),
2800
+ ),
2801
+ ),
2802
+ )
2803
+ if _response.status_code == 404:
2804
+ raise NotFoundError(
2805
+ headers=dict(_response.headers),
2806
+ body=typing.cast(
2807
+ typing.Any,
2808
+ parse_obj_as(
2809
+ type_=typing.Any, # type: ignore
2810
+ object_=_response.json(),
2811
+ ),
2812
+ ),
2813
+ )
2814
+ if _response.status_code == 503:
2815
+ raise ServiceUnavailableError(
2816
+ headers=dict(_response.headers),
2817
+ body=typing.cast(
2818
+ typing.Any,
2819
+ parse_obj_as(
2820
+ type_=typing.Any, # type: ignore
2821
+ object_=_response.json(),
2822
+ ),
2823
+ ),
2824
+ )
2825
+ _response_json = _response.json()
2826
+ except JSONDecodeError:
2827
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
2828
+ except ValidationError as e:
2829
+ raise ParsingError(
2830
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
2831
+ )
2832
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
2833
+
2834
+ async def get_saved_popup_embed(
2835
+ self, popup_id: str, *, request_options: typing.Optional[RequestOptions] = None
2836
+ ) -> AsyncHttpResponse[GetSavedPopupEmbedResponse]:
2837
+ """
2838
+ Returns a published popup's script URL plus ready-to-paste snippets for plain HTML, React and Next.js, WordPress, and Shopify. The snippets carry no API key.
2839
+
2840
+ Parameters
2841
+ ----------
2842
+ popup_id : str
2843
+
2844
+ request_options : typing.Optional[RequestOptions]
2845
+ Request-specific configuration.
2846
+
2847
+ Returns
2848
+ -------
2849
+ AsyncHttpResponse[GetSavedPopupEmbedResponse]
2850
+ Embed recipes returned successfully
2851
+ """
2852
+ _response = await self._client_wrapper.httpx_client.request(
2853
+ f"popups/embed/{encode_path_param(popup_id)}",
2854
+ method="GET",
2855
+ request_options=request_options,
2856
+ )
2857
+ try:
2858
+ if 200 <= _response.status_code < 300:
2859
+ _data = typing.cast(
2860
+ GetSavedPopupEmbedResponse,
2861
+ parse_obj_as(
2862
+ type_=GetSavedPopupEmbedResponse, # type: ignore
2863
+ object_=_response.json(),
2864
+ ),
2865
+ )
2866
+ return AsyncHttpResponse(response=_response, data=_data)
2867
+ if _response.status_code == 400:
2868
+ raise BadRequestError(
2869
+ headers=dict(_response.headers),
2870
+ body=typing.cast(
2871
+ typing.Any,
2872
+ parse_obj_as(
2873
+ type_=typing.Any, # type: ignore
2874
+ object_=_response.json(),
2875
+ ),
2876
+ ),
2877
+ )
2878
+ if _response.status_code == 401:
2879
+ raise UnauthorizedError(
2880
+ headers=dict(_response.headers),
2881
+ body=typing.cast(
2882
+ typing.Any,
2883
+ parse_obj_as(
2884
+ type_=typing.Any, # type: ignore
2885
+ object_=_response.json(),
2886
+ ),
2887
+ ),
2888
+ )
2889
+ if _response.status_code == 403:
2890
+ raise ForbiddenError(
2891
+ headers=dict(_response.headers),
2892
+ body=typing.cast(
2893
+ Error,
2894
+ parse_obj_as(
2895
+ type_=Error, # type: ignore
2896
+ object_=_response.json(),
2897
+ ),
2898
+ ),
2899
+ )
2900
+ if _response.status_code == 404:
2901
+ raise NotFoundError(
2902
+ headers=dict(_response.headers),
2903
+ body=typing.cast(
2904
+ typing.Any,
2905
+ parse_obj_as(
2906
+ type_=typing.Any, # type: ignore
2907
+ object_=_response.json(),
2908
+ ),
2909
+ ),
2910
+ )
2911
+ if _response.status_code == 503:
2912
+ raise ServiceUnavailableError(
2913
+ headers=dict(_response.headers),
2914
+ body=typing.cast(
2915
+ typing.Any,
2916
+ parse_obj_as(
2917
+ type_=typing.Any, # type: ignore
2918
+ object_=_response.json(),
2919
+ ),
2920
+ ),
2921
+ )
2922
+ _response_json = _response.json()
2923
+ except JSONDecodeError:
2924
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
2925
+ except ValidationError as e:
2926
+ raise ParsingError(
2927
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
2928
+ )
2929
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
2930
+
2931
+ async def get_saved_signup_form_embed_script(
2932
+ self, company_id_or_form_id: str, *, request_options: typing.Optional[RequestOptions] = None
2933
+ ) -> AsyncHttpResponse[None]:
2934
+ """
2935
+ Load a saved signup form with one line of JavaScript. No API key is required.
2936
+
2937
+ The script renders the current saved form settings when the page loads, so dashboard edits apply to deployed JavaScript embeds without copying new HTML.
2938
+
2939
+ Parameters
2940
+ ----------
2941
+ company_id_or_form_id : str
2942
+ The saved form ID
2943
+
2944
+ request_options : typing.Optional[RequestOptions]
2945
+ Request-specific configuration.
2946
+
2947
+ Returns
2948
+ -------
2949
+ AsyncHttpResponse[None]
2950
+ """
2951
+ _response = await self._client_wrapper.httpx_client.request(
2952
+ f"forms/{encode_path_param(company_id_or_form_id)}/embed.js",
2953
+ method="GET",
2954
+ request_options=request_options,
2955
+ )
2956
+ try:
2957
+ if 200 <= _response.status_code < 300:
2958
+ return AsyncHttpResponse(response=_response, data=None)
2959
+ if _response.status_code == 404:
2960
+ raise NotFoundError(
2961
+ headers=dict(_response.headers),
2962
+ body=typing.cast(
2963
+ typing.Any,
2964
+ parse_obj_as(
2965
+ type_=typing.Any, # type: ignore
2966
+ object_=_response.json(),
2967
+ ),
2968
+ ),
2969
+ )
2970
+ if _response.status_code == 503:
2971
+ raise ServiceUnavailableError(
2972
+ headers=dict(_response.headers),
2973
+ body=typing.cast(
2974
+ typing.Any,
2975
+ parse_obj_as(
2976
+ type_=typing.Any, # type: ignore
2977
+ object_=_response.json(),
2978
+ ),
2979
+ ),
2980
+ )
2981
+ _response_json = _response.json()
2982
+ except JSONDecodeError:
2983
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
2984
+ except ValidationError as e:
2985
+ raise ParsingError(
2986
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
2987
+ )
2988
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
2989
+
2990
+ async def list_saved_forms(
2991
+ self, *, request_options: typing.Optional[RequestOptions] = None
2992
+ ) -> AsyncHttpResponse[ListSavedFormsResponse]:
2993
+ """
2994
+ Lists saved signup forms for the authenticated workspace, including their server-managed audience settings and public action URLs.
2995
+
2996
+ Parameters
2997
+ ----------
2998
+ request_options : typing.Optional[RequestOptions]
2999
+ Request-specific configuration.
3000
+
3001
+ Returns
3002
+ -------
3003
+ AsyncHttpResponse[ListSavedFormsResponse]
3004
+ Saved forms returned successfully
3005
+ """
3006
+ _response = await self._client_wrapper.httpx_client.request(
3007
+ "forms",
3008
+ method="GET",
3009
+ request_options=request_options,
3010
+ )
3011
+ try:
3012
+ if 200 <= _response.status_code < 300:
3013
+ _data = typing.cast(
3014
+ ListSavedFormsResponse,
3015
+ parse_obj_as(
3016
+ type_=ListSavedFormsResponse, # type: ignore
3017
+ object_=_response.json(),
3018
+ ),
3019
+ )
3020
+ return AsyncHttpResponse(response=_response, data=_data)
3021
+ if _response.status_code == 401:
3022
+ raise UnauthorizedError(
3023
+ headers=dict(_response.headers),
3024
+ body=typing.cast(
3025
+ typing.Any,
3026
+ parse_obj_as(
3027
+ type_=typing.Any, # type: ignore
3028
+ object_=_response.json(),
3029
+ ),
3030
+ ),
3031
+ )
3032
+ if _response.status_code == 403:
3033
+ raise ForbiddenError(
3034
+ headers=dict(_response.headers),
3035
+ body=typing.cast(
3036
+ Error,
3037
+ parse_obj_as(
3038
+ type_=Error, # type: ignore
3039
+ object_=_response.json(),
3040
+ ),
3041
+ ),
3042
+ )
3043
+ if _response.status_code == 503:
3044
+ raise ServiceUnavailableError(
3045
+ headers=dict(_response.headers),
3046
+ body=typing.cast(
3047
+ typing.Any,
3048
+ parse_obj_as(
3049
+ type_=typing.Any, # type: ignore
3050
+ object_=_response.json(),
3051
+ ),
3052
+ ),
3053
+ )
3054
+ _response_json = _response.json()
3055
+ except JSONDecodeError:
3056
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
3057
+ except ValidationError as e:
3058
+ raise ParsingError(
3059
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
3060
+ )
3061
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
3062
+
3063
+ async def list_saved_popups(
3064
+ self,
3065
+ *,
3066
+ include_content: typing.Optional[ListSavedPopupsRequestIncludeContent] = None,
3067
+ request_options: typing.Optional[RequestOptions] = None,
3068
+ ) -> AsyncHttpResponse[ListSavedPopupsResponse]:
3069
+ """
3070
+ Lists saved on-site signup popups for the authenticated workspace, including their trigger, targeting, audience settings, and view and conversion counts.
3071
+
3072
+ Parameters
3073
+ ----------
3074
+ include_content : typing.Optional[ListSavedPopupsRequestIncludeContent]
3075
+ Set to `true` to include every popup's full content blocks. Omitted by default because each popup adds roughly 1.8k characters; read one popup with `GET /popups/{popupId}` instead.
3076
+
3077
+ request_options : typing.Optional[RequestOptions]
3078
+ Request-specific configuration.
3079
+
3080
+ Returns
3081
+ -------
3082
+ AsyncHttpResponse[ListSavedPopupsResponse]
3083
+ Saved popups returned successfully
3084
+ """
3085
+ _response = await self._client_wrapper.httpx_client.request(
3086
+ "popups",
3087
+ method="GET",
3088
+ params={
3089
+ "includeContent": include_content,
3090
+ },
3091
+ request_options=request_options,
3092
+ )
3093
+ try:
3094
+ if 200 <= _response.status_code < 300:
3095
+ _data = typing.cast(
3096
+ ListSavedPopupsResponse,
3097
+ parse_obj_as(
3098
+ type_=ListSavedPopupsResponse, # type: ignore
3099
+ object_=_response.json(),
3100
+ ),
3101
+ )
3102
+ return AsyncHttpResponse(response=_response, data=_data)
3103
+ if _response.status_code == 401:
3104
+ raise UnauthorizedError(
3105
+ headers=dict(_response.headers),
3106
+ body=typing.cast(
3107
+ typing.Any,
3108
+ parse_obj_as(
3109
+ type_=typing.Any, # type: ignore
3110
+ object_=_response.json(),
3111
+ ),
3112
+ ),
3113
+ )
3114
+ if _response.status_code == 403:
3115
+ raise ForbiddenError(
3116
+ headers=dict(_response.headers),
3117
+ body=typing.cast(
3118
+ Error,
3119
+ parse_obj_as(
3120
+ type_=Error, # type: ignore
3121
+ object_=_response.json(),
3122
+ ),
3123
+ ),
3124
+ )
3125
+ if _response.status_code == 503:
3126
+ raise ServiceUnavailableError(
3127
+ headers=dict(_response.headers),
3128
+ body=typing.cast(
3129
+ typing.Any,
3130
+ parse_obj_as(
3131
+ type_=typing.Any, # type: ignore
3132
+ object_=_response.json(),
3133
+ ),
3134
+ ),
3135
+ )
3136
+ _response_json = _response.json()
3137
+ except JSONDecodeError:
3138
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
3139
+ except ValidationError as e:
3140
+ raise ParsingError(
3141
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
3142
+ )
3143
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
3144
+
3145
+ async def submit_company_scoped_saved_signup_form(
3146
+ self,
3147
+ company_id_or_form_id: str,
3148
+ form_id: str,
3149
+ *,
3150
+ email: str,
3151
+ custom_attributes: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
3152
+ duplicate_strategy: typing.Optional[SubmitCompanyScopedSavedSignupFormRequestDuplicateStrategy] = OMIT,
3153
+ duplicate_strategy_token: typing.Optional[str] = OMIT,
3154
+ first_name: typing.Optional[str] = OMIT,
3155
+ last_name: typing.Optional[str] = OMIT,
3156
+ list_ids: typing.Optional[typing.Sequence[str]] = OMIT,
3157
+ list_ids_bracketed: typing.Optional[typing.Sequence[str]] = OMIT,
3158
+ phone: typing.Optional[str] = OMIT,
3159
+ redirect_url: typing.Optional[str] = OMIT,
3160
+ tag_ids: typing.Optional[typing.Sequence[str]] = OMIT,
3161
+ tag_ids_bracketed: typing.Optional[typing.Sequence[str]] = OMIT,
3162
+ website: typing.Optional[str] = OMIT,
3163
+ request_options: typing.Optional[RequestOptions] = None,
3164
+ ) -> AsyncHttpResponse[SubmitCompanyScopedSavedSignupFormResponse]:
3165
+ """
3166
+ Compatibility path for saved signup form submissions. New embeds should use `/forms/{formId}`.
3167
+
3168
+ The form's stored settings are the source of truth for audience targeting (lists, tags) and success behavior (success message or redirect URL), so dashboard edits apply to deployed embeds without re-embedding. List, tag, and redirect values in the request are ignored.
3169
+
3170
+ Parameters
3171
+ ----------
3172
+ company_id_or_form_id : str
3173
+ The company ID the form belongs to
3174
+
3175
+ form_id : str
3176
+ The saved form ID
3177
+
3178
+ email : str
3179
+ Subscriber email address
3180
+
3181
+ custom_attributes : typing.Optional[typing.Dict[str, typing.Any]]
3182
+ Subscriber custom attributes for custom fields configured on the saved form
3183
+
3184
+ duplicate_strategy : typing.Optional[SubmitCompanyScopedSavedSignupFormRequestDuplicateStrategy]
3185
+ Ignored for saved forms. Stored form settings are used.
3186
+
3187
+ duplicate_strategy_token : typing.Optional[str]
3188
+ Ignored for saved forms. Stored form settings are used.
3189
+
3190
+ first_name : typing.Optional[str]
3191
+
3192
+ last_name : typing.Optional[str]
3193
+
3194
+ list_ids : typing.Optional[typing.Sequence[str]]
3195
+ Ignored for saved forms. Stored form settings are used.
3196
+
3197
+ list_ids_bracketed : typing.Optional[typing.Sequence[str]]
3198
+ Ignored for saved forms. Stored form settings are used.
3199
+
3200
+ phone : typing.Optional[str]
3201
+ Subscriber phone number in E.164 or US national format, when configured on the saved form. Stored on the base subscriber profile and does not grant SMS consent.
3202
+
3203
+ redirect_url : typing.Optional[str]
3204
+ Ignored for saved forms. Stored form settings are used.
3205
+
3206
+ tag_ids : typing.Optional[typing.Sequence[str]]
3207
+ Ignored for saved forms. Stored form settings are used.
3208
+
3209
+ tag_ids_bracketed : typing.Optional[typing.Sequence[str]]
3210
+ Ignored for saved forms. Stored form settings are used.
3211
+
3212
+ website : typing.Optional[str]
3213
+ Honeypot field. Leave empty.
3214
+
3215
+ request_options : typing.Optional[RequestOptions]
3216
+ Request-specific configuration.
3217
+
3218
+ Returns
3219
+ -------
3220
+ AsyncHttpResponse[SubmitCompanyScopedSavedSignupFormResponse]
3221
+ Form submitted successfully. Native HTML form posts that accept `text/html` receive a hosted confirmation page showing the form's success message instead of JSON.
3222
+ """
3223
+ _response = await self._client_wrapper.httpx_client.request(
3224
+ f"forms/{encode_path_param(company_id_or_form_id)}/{encode_path_param(form_id)}",
3225
+ method="POST",
3226
+ json={
3227
+ "customAttributes": custom_attributes,
3228
+ "duplicateStrategy": duplicate_strategy,
3229
+ "duplicateStrategyToken": duplicate_strategy_token,
3230
+ "email": email,
3231
+ "firstName": first_name,
3232
+ "lastName": last_name,
3233
+ "listIds": list_ids,
3234
+ "listIds[]": list_ids_bracketed,
3235
+ "phone": phone,
3236
+ "redirectUrl": redirect_url,
3237
+ "tagIds": tag_ids,
3238
+ "tagIds[]": tag_ids_bracketed,
3239
+ "website": website,
3240
+ },
3241
+ headers={
3242
+ "content-type": "application/json",
3243
+ },
3244
+ request_options=request_options,
3245
+ omit=OMIT,
3246
+ )
3247
+ try:
3248
+ if 200 <= _response.status_code < 300:
3249
+ _data = typing.cast(
3250
+ SubmitCompanyScopedSavedSignupFormResponse,
3251
+ parse_obj_as(
3252
+ type_=SubmitCompanyScopedSavedSignupFormResponse, # type: ignore
3253
+ object_=_response.json(),
3254
+ ),
3255
+ )
3256
+ return AsyncHttpResponse(response=_response, data=_data)
3257
+ if _response.status_code == 400:
3258
+ raise BadRequestError(
3259
+ headers=dict(_response.headers),
3260
+ body=typing.cast(
3261
+ typing.Any,
3262
+ parse_obj_as(
3263
+ type_=typing.Any, # type: ignore
3264
+ object_=_response.json(),
3265
+ ),
3266
+ ),
3267
+ )
3268
+ if _response.status_code == 404:
3269
+ raise NotFoundError(
3270
+ headers=dict(_response.headers),
3271
+ body=typing.cast(
3272
+ typing.Any,
3273
+ parse_obj_as(
3274
+ type_=typing.Any, # type: ignore
3275
+ object_=_response.json(),
3276
+ ),
3277
+ ),
3278
+ )
3279
+ if _response.status_code == 429:
3280
+ raise TooManyRequestsError(
3281
+ headers=dict(_response.headers),
3282
+ body=typing.cast(
3283
+ typing.Any,
3284
+ parse_obj_as(
3285
+ type_=typing.Any, # type: ignore
3286
+ object_=_response.json(),
3287
+ ),
3288
+ ),
3289
+ )
3290
+ if _response.status_code == 500:
3291
+ raise InternalServerError(
3292
+ headers=dict(_response.headers),
3293
+ body=typing.cast(
3294
+ typing.Any,
3295
+ parse_obj_as(
3296
+ type_=typing.Any, # type: ignore
3297
+ object_=_response.json(),
3298
+ ),
3299
+ ),
3300
+ )
3301
+ _response_json = _response.json()
3302
+ except JSONDecodeError:
3303
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
3304
+ except ValidationError as e:
3305
+ raise ParsingError(
3306
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
3307
+ )
3308
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
3309
+
3310
+ async def submit_saved_popup(
3311
+ self,
3312
+ popup_id: str,
3313
+ *,
3314
+ email: str,
3315
+ custom_attributes: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
3316
+ first_name: typing.Optional[str] = OMIT,
3317
+ last_name: typing.Optional[str] = OMIT,
3318
+ phone: typing.Optional[str] = OMIT,
3319
+ website: typing.Optional[str] = OMIT,
3320
+ request_options: typing.Optional[RequestOptions] = None,
3321
+ ) -> AsyncHttpResponse[SubmitSavedPopupResponse]:
3322
+ """
3323
+ Submit a saved popup without an API key. The popup's stored content is the source of truth for audience targeting, duplicate handling, custom fields, and success behavior.
3324
+
3325
+ Parameters
3326
+ ----------
3327
+ popup_id : str
3328
+ The saved popup ID
3329
+
3330
+ email : str
3331
+ Subscriber email address
3332
+
3333
+ custom_attributes : typing.Optional[typing.Dict[str, typing.Any]]
3334
+ Subscriber custom attributes for custom fields configured on the popup
3335
+
3336
+ first_name : typing.Optional[str]
3337
+
3338
+ last_name : typing.Optional[str]
3339
+
3340
+ phone : typing.Optional[str]
3341
+ Subscriber phone number in E.164 or US national format, when configured on the popup. Stored on the base subscriber profile and does not grant SMS consent.
3342
+
3343
+ website : typing.Optional[str]
3344
+ Honeypot field. Leave empty.
3345
+
3346
+ request_options : typing.Optional[RequestOptions]
3347
+ Request-specific configuration.
3348
+
3349
+ Returns
3350
+ -------
3351
+ AsyncHttpResponse[SubmitSavedPopupResponse]
3352
+ Popup submitted successfully
3353
+ """
3354
+ _response = await self._client_wrapper.httpx_client.request(
3355
+ f"forms/popups/{encode_path_param(popup_id)}",
3356
+ method="POST",
3357
+ json={
3358
+ "customAttributes": custom_attributes,
3359
+ "email": email,
3360
+ "firstName": first_name,
3361
+ "lastName": last_name,
3362
+ "phone": phone,
3363
+ "website": website,
3364
+ },
3365
+ headers={
3366
+ "content-type": "application/json",
3367
+ },
3368
+ request_options=request_options,
3369
+ omit=OMIT,
3370
+ )
3371
+ try:
3372
+ if 200 <= _response.status_code < 300:
3373
+ _data = typing.cast(
3374
+ SubmitSavedPopupResponse,
3375
+ parse_obj_as(
3376
+ type_=SubmitSavedPopupResponse, # type: ignore
3377
+ object_=_response.json(),
3378
+ ),
3379
+ )
3380
+ return AsyncHttpResponse(response=_response, data=_data)
3381
+ if _response.status_code == 400:
3382
+ raise BadRequestError(
3383
+ headers=dict(_response.headers),
3384
+ body=typing.cast(
3385
+ typing.Any,
3386
+ parse_obj_as(
3387
+ type_=typing.Any, # type: ignore
3388
+ object_=_response.json(),
3389
+ ),
3390
+ ),
3391
+ )
3392
+ if _response.status_code == 404:
3393
+ raise NotFoundError(
3394
+ headers=dict(_response.headers),
3395
+ body=typing.cast(
3396
+ typing.Any,
3397
+ parse_obj_as(
3398
+ type_=typing.Any, # type: ignore
3399
+ object_=_response.json(),
3400
+ ),
3401
+ ),
3402
+ )
3403
+ if _response.status_code == 429:
3404
+ raise TooManyRequestsError(
3405
+ headers=dict(_response.headers),
3406
+ body=typing.cast(
3407
+ typing.Any,
3408
+ parse_obj_as(
3409
+ type_=typing.Any, # type: ignore
3410
+ object_=_response.json(),
3411
+ ),
3412
+ ),
3413
+ )
3414
+ if _response.status_code == 500:
3415
+ raise InternalServerError(
3416
+ headers=dict(_response.headers),
3417
+ body=typing.cast(
3418
+ typing.Any,
3419
+ parse_obj_as(
3420
+ type_=typing.Any, # type: ignore
3421
+ object_=_response.json(),
3422
+ ),
3423
+ ),
3424
+ )
3425
+ _response_json = _response.json()
3426
+ except JSONDecodeError:
3427
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
3428
+ except ValidationError as e:
3429
+ raise ParsingError(
3430
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
3431
+ )
3432
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
3433
+
3434
+ async def submit_signup_form(
3435
+ self,
3436
+ company_id_or_form_id: str,
3437
+ *,
3438
+ email: str,
3439
+ duplicate_strategy: typing.Optional[SubmitSignupFormRequestDuplicateStrategy] = None,
3440
+ duplicate_strategy_token: typing.Optional[str] = None,
3441
+ lists: typing.Optional[str] = None,
3442
+ tags: typing.Optional[str] = None,
3443
+ custom_attributes: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
3444
+ body_duplicate_strategy: typing.Optional[SubmitSignupFormRequestDuplicateStrategy] = OMIT,
3445
+ body_duplicate_strategy_token: typing.Optional[str] = OMIT,
3446
+ first_name: typing.Optional[str] = OMIT,
3447
+ last_name: typing.Optional[str] = OMIT,
3448
+ list_ids: typing.Optional[typing.Sequence[str]] = OMIT,
3449
+ phone: typing.Optional[str] = OMIT,
3450
+ redirect_url: typing.Optional[str] = OMIT,
3451
+ tag_ids: typing.Optional[typing.Sequence[str]] = OMIT,
3452
+ website: typing.Optional[str] = OMIT,
3453
+ request_options: typing.Optional[RequestOptions] = None,
3454
+ ) -> AsyncHttpResponse[SubmitSignupFormResponse]:
3455
+ """
3456
+ Submit a public signup form. No API key is required.
3457
+
3458
+ When the path value is a saved form ID, the form's stored settings are used for audience targeting and success behavior. When the path value is a company ID, this endpoint uses the legacy company-level form behavior.
3459
+
3460
+ Omit `lists` to use the workspace default lists setting, provide `lists=` to add the subscriber to no lists, or provide comma-separated list IDs for specific lists. Provide stable `tags` IDs to apply existing tags to the subscriber.
3461
+
3462
+ Parameters
3463
+ ----------
3464
+ company_id_or_form_id : str
3465
+ A saved form ID, or a company ID for legacy generated forms
3466
+
3467
+ email : str
3468
+ Subscriber email address
3469
+
3470
+ duplicate_strategy : typing.Optional[SubmitSignupFormRequestDuplicateStrategy]
3471
+ How to handle an existing contact with the submitted email. Use skip to preserve fields, merge to fill missing fields, or overwrite to replace submitted fields. Merge and overwrite require duplicateStrategyToken from the form builder.
3472
+
3473
+ duplicate_strategy_token : typing.Optional[str]
3474
+ Signed token generated by the form builder for the selected duplicateStrategy. Required for merge or overwrite.
3475
+
3476
+ lists : typing.Optional[str]
3477
+ Comma-separated list IDs. Omit for workspace default lists, or provide an empty value for no lists.
3478
+
3479
+ tags : typing.Optional[str]
3480
+ Comma-separated tag IDs to apply to the subscriber.
3481
+
3482
+ custom_attributes : typing.Optional[typing.Dict[str, typing.Any]]
3483
+ Subscriber custom attributes
3484
+
3485
+ body_duplicate_strategy : typing.Optional[SubmitSignupFormRequestDuplicateStrategy]
3486
+ Body alternative to the duplicateStrategy query parameter. Query parameter takes precedence. Merge and overwrite require duplicateStrategyToken.
3487
+
3488
+ body_duplicate_strategy_token : typing.Optional[str]
3489
+ Body alternative to the duplicateStrategyToken query parameter.
3490
+
3491
+ first_name : typing.Optional[str]
3492
+
3493
+ last_name : typing.Optional[str]
3494
+
3495
+ list_ids : typing.Optional[typing.Sequence[str]]
3496
+
3497
+ phone : typing.Optional[str]
3498
+ Subscriber phone number in E.164 or US national format. Stored on the base subscriber profile and does not grant SMS consent.
3499
+
3500
+ redirect_url : typing.Optional[str]
3501
+ Http(s) URL or bare domain to redirect to after successful submission
3502
+
3503
+ tag_ids : typing.Optional[typing.Sequence[str]]
3504
+ Existing tag IDs to apply to the subscriber
3505
+
3506
+ website : typing.Optional[str]
3507
+ Honeypot field. Leave empty.
3508
+
3509
+ request_options : typing.Optional[RequestOptions]
3510
+ Request-specific configuration.
3511
+
3512
+ Returns
3513
+ -------
3514
+ AsyncHttpResponse[SubmitSignupFormResponse]
3515
+ Form submitted successfully
3516
+ """
3517
+ _response = await self._client_wrapper.httpx_client.request(
3518
+ f"forms/{encode_path_param(company_id_or_form_id)}",
3519
+ method="POST",
3520
+ params={
3521
+ "duplicateStrategy": duplicate_strategy,
3522
+ "duplicateStrategyToken": duplicate_strategy_token,
3523
+ "lists": lists,
3524
+ "tags": tags,
3525
+ },
3526
+ json={
3527
+ "customAttributes": custom_attributes,
3528
+ "duplicateStrategy": body_duplicate_strategy,
3529
+ "duplicateStrategyToken": body_duplicate_strategy_token,
3530
+ "email": email,
3531
+ "firstName": first_name,
3532
+ "lastName": last_name,
3533
+ "listIds": list_ids,
3534
+ "phone": phone,
3535
+ "redirectUrl": redirect_url,
3536
+ "tagIds": tag_ids,
3537
+ "website": website,
3538
+ },
3539
+ headers={
3540
+ "content-type": "application/json",
3541
+ },
3542
+ request_options=request_options,
3543
+ omit=OMIT,
3544
+ )
3545
+ try:
3546
+ if 200 <= _response.status_code < 300:
3547
+ _data = typing.cast(
3548
+ SubmitSignupFormResponse,
3549
+ parse_obj_as(
3550
+ type_=SubmitSignupFormResponse, # type: ignore
3551
+ object_=_response.json(),
3552
+ ),
3553
+ )
3554
+ return AsyncHttpResponse(response=_response, data=_data)
3555
+ if _response.status_code == 400:
3556
+ raise BadRequestError(
3557
+ headers=dict(_response.headers),
3558
+ body=typing.cast(
3559
+ typing.Any,
3560
+ parse_obj_as(
3561
+ type_=typing.Any, # type: ignore
3562
+ object_=_response.json(),
3563
+ ),
3564
+ ),
3565
+ )
3566
+ if _response.status_code == 404:
3567
+ raise NotFoundError(
3568
+ headers=dict(_response.headers),
3569
+ body=typing.cast(
3570
+ typing.Any,
3571
+ parse_obj_as(
3572
+ type_=typing.Any, # type: ignore
3573
+ object_=_response.json(),
3574
+ ),
3575
+ ),
3576
+ )
3577
+ if _response.status_code == 429:
3578
+ raise TooManyRequestsError(
3579
+ headers=dict(_response.headers),
3580
+ body=typing.cast(
3581
+ typing.Any,
3582
+ parse_obj_as(
3583
+ type_=typing.Any, # type: ignore
3584
+ object_=_response.json(),
3585
+ ),
3586
+ ),
3587
+ )
3588
+ if _response.status_code == 500:
3589
+ raise InternalServerError(
3590
+ headers=dict(_response.headers),
3591
+ body=typing.cast(
3592
+ typing.Any,
3593
+ parse_obj_as(
3594
+ type_=typing.Any, # type: ignore
3595
+ object_=_response.json(),
3596
+ ),
3597
+ ),
3598
+ )
3599
+ _response_json = _response.json()
3600
+ except JSONDecodeError:
3601
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
3602
+ except ValidationError as e:
3603
+ raise ParsingError(
3604
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
3605
+ )
3606
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
3607
+
3608
+ async def update_saved_form(
3609
+ self,
3610
+ company_id_or_form_id: str,
3611
+ *,
3612
+ blocks: typing.Optional[typing.Sequence[typing.Dict[str, typing.Any]]] = OMIT,
3613
+ button_text: typing.Optional[str] = OMIT,
3614
+ description: typing.Optional[str] = OMIT,
3615
+ duplicate_strategy: typing.Optional[UpdateSavedFormRequestDuplicateStrategy] = OMIT,
3616
+ headline: typing.Optional[str] = OMIT,
3617
+ list_ids: typing.Optional[typing.Sequence[str]] = OMIT,
3618
+ name: typing.Optional[str] = OMIT,
3619
+ redirect_url: typing.Optional[str] = OMIT,
3620
+ success_message: typing.Optional[str] = OMIT,
3621
+ tag_ids: typing.Optional[typing.Sequence[str]] = OMIT,
3622
+ theme: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
3623
+ request_options: typing.Optional[RequestOptions] = None,
3624
+ ) -> AsyncHttpResponse[UpdateSavedFormResponse]:
3625
+ """
3626
+ Update a saved form's name, audience targeting, copy, visual theme, or content blocks. Every field is optional - send only what should change.
3627
+
3628
+ The `headline`, `description`, `buttonText`, and `successMessage` fields edit the matching content block and fail with 400 when the form has no such block; replace `blocks` for structural changes. The `blocks` array fully replaces the form's content blocks and must keep exactly one required email field and one submit button. An empty `redirectUrl` switches the form back to its confirmation message.
3629
+
3630
+ Blocks render in array order and each needs a unique `id` and a `kind`. Input blocks use `kind: "form-field"` with `fieldType` (text, email, phone, number, textarea, select, radio, checkbox, consent, hidden), `name` (the custom attribute key), `label`, `placeholder`, `required`, `defaultValue`, `showLabel`, `width` (full or half), `mapsTo` (email, firstName, lastName, phone, customAttribute; defaults to customAttribute), and `options` for choice fields (`[{ value, label, id }]`, where label and id default to value). A hidden field with a `defaultValue` stores that server-owned value and ignores submitted values; a hidden field without one stores the value the page submits. Validation errors name the offending property, for example `blocks[3].options[0].value`.
3631
+
3632
+ Parameters
3633
+ ----------
3634
+ company_id_or_form_id : str
3635
+ The saved form ID to update
3636
+
3637
+ blocks : typing.Optional[typing.Sequence[typing.Dict[str, typing.Any]]]
3638
+ Full replacement for the form's content blocks.
3639
+
3640
+ button_text : typing.Optional[str]
3641
+
3642
+ description : typing.Optional[str]
3643
+
3644
+ duplicate_strategy : typing.Optional[UpdateSavedFormRequestDuplicateStrategy]
3645
+
3646
+ headline : typing.Optional[str]
3647
+
3648
+ list_ids : typing.Optional[typing.Sequence[str]]
3649
+
3650
+ name : typing.Optional[str]
3651
+
3652
+ redirect_url : typing.Optional[str]
3653
+ HTTP or HTTPS success redirect. An empty string switches back to the confirmation message.
3654
+
3655
+ success_message : typing.Optional[str]
3656
+
3657
+ tag_ids : typing.Optional[typing.Sequence[str]]
3658
+ Replacement tag IDs. An empty array clears tags.
3659
+
3660
+ theme : typing.Optional[typing.Dict[str, typing.Any]]
3661
+ Visual theme overrides merged into the current theme (accentColor, backgroundColor, textColor, mutedTextColor, cardColor, borderColor as "#rrggbb", borderRadius 0-32, headingFontFamily, bodyFontFamily, density).
3662
+
3663
+ request_options : typing.Optional[RequestOptions]
3664
+ Request-specific configuration.
3665
+
3666
+ Returns
3667
+ -------
3668
+ AsyncHttpResponse[UpdateSavedFormResponse]
3669
+ Form updated
3670
+ """
3671
+ _response = await self._client_wrapper.httpx_client.request(
3672
+ f"forms/{encode_path_param(company_id_or_form_id)}",
3673
+ method="PATCH",
3674
+ json={
3675
+ "blocks": blocks,
3676
+ "buttonText": button_text,
3677
+ "description": description,
3678
+ "duplicateStrategy": duplicate_strategy,
3679
+ "headline": headline,
3680
+ "listIds": list_ids,
3681
+ "name": name,
3682
+ "redirectUrl": redirect_url,
3683
+ "successMessage": success_message,
3684
+ "tagIds": tag_ids,
3685
+ "theme": theme,
3686
+ },
3687
+ headers={
3688
+ "content-type": "application/json",
3689
+ },
3690
+ request_options=request_options,
3691
+ omit=OMIT,
3692
+ )
3693
+ try:
3694
+ if 200 <= _response.status_code < 300:
3695
+ _data = typing.cast(
3696
+ UpdateSavedFormResponse,
3697
+ parse_obj_as(
3698
+ type_=UpdateSavedFormResponse, # type: ignore
3699
+ object_=_response.json(),
3700
+ ),
3701
+ )
3702
+ return AsyncHttpResponse(response=_response, data=_data)
3703
+ if _response.status_code == 400:
3704
+ raise BadRequestError(
3705
+ headers=dict(_response.headers),
3706
+ body=typing.cast(
3707
+ typing.Any,
3708
+ parse_obj_as(
3709
+ type_=typing.Any, # type: ignore
3710
+ object_=_response.json(),
3711
+ ),
3712
+ ),
3713
+ )
3714
+ if _response.status_code == 401:
3715
+ raise UnauthorizedError(
3716
+ headers=dict(_response.headers),
3717
+ body=typing.cast(
3718
+ typing.Any,
3719
+ parse_obj_as(
3720
+ type_=typing.Any, # type: ignore
3721
+ object_=_response.json(),
3722
+ ),
3723
+ ),
3724
+ )
3725
+ if _response.status_code == 403:
3726
+ raise ForbiddenError(
3727
+ headers=dict(_response.headers),
3728
+ body=typing.cast(
3729
+ Error,
3730
+ parse_obj_as(
3731
+ type_=Error, # type: ignore
3732
+ object_=_response.json(),
3733
+ ),
3734
+ ),
3735
+ )
3736
+ if _response.status_code == 404:
3737
+ raise NotFoundError(
3738
+ headers=dict(_response.headers),
3739
+ body=typing.cast(
3740
+ typing.Any,
3741
+ parse_obj_as(
3742
+ type_=typing.Any, # type: ignore
3743
+ object_=_response.json(),
3744
+ ),
3745
+ ),
3746
+ )
3747
+ if _response.status_code == 500:
3748
+ raise InternalServerError(
3749
+ headers=dict(_response.headers),
3750
+ body=typing.cast(
3751
+ typing.Any,
3752
+ parse_obj_as(
3753
+ type_=typing.Any, # type: ignore
3754
+ object_=_response.json(),
3755
+ ),
3756
+ ),
3757
+ )
3758
+ _response_json = _response.json()
3759
+ except JSONDecodeError:
3760
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
3761
+ except ValidationError as e:
3762
+ raise ParsingError(
3763
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
3764
+ )
3765
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
3766
+
3767
+ async def update_saved_popup(
3768
+ self,
3769
+ popup_id: str,
3770
+ *,
3771
+ blocks: typing.Optional[typing.Sequence[typing.Dict[str, typing.Any]]] = OMIT,
3772
+ button_text: typing.Optional[str] = OMIT,
3773
+ description: typing.Optional[str] = OMIT,
3774
+ duplicate_strategy: typing.Optional[UpdateSavedPopupRequestDuplicateStrategy] = OMIT,
3775
+ frequency: typing.Optional[SavedPopupFrequency] = OMIT,
3776
+ headline: typing.Optional[str] = OMIT,
3777
+ list_ids: typing.Optional[typing.Sequence[str]] = OMIT,
3778
+ name: typing.Optional[str] = OMIT,
3779
+ placement: typing.Optional[UpdateSavedPopupRequestPlacement] = OMIT,
3780
+ presentation: typing.Optional[UpdateSavedPopupRequestPresentation] = OMIT,
3781
+ redirect_url: typing.Optional[str] = OMIT,
3782
+ schedule: typing.Optional[SavedPopupSchedule] = OMIT,
3783
+ status: typing.Optional[UpdateSavedPopupRequestStatus] = OMIT,
3784
+ success_message: typing.Optional[str] = OMIT,
3785
+ tag_ids: typing.Optional[typing.Sequence[str]] = OMIT,
3786
+ targeting: typing.Optional[SavedPopupTargeting] = OMIT,
3787
+ theme: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
3788
+ trigger: typing.Optional[SavedPopupTrigger] = OMIT,
3789
+ visual: typing.Optional[SavedPopupVisual] = OMIT,
3790
+ request_options: typing.Optional[RequestOptions] = None,
3791
+ ) -> AsyncHttpResponse[UpdateSavedPopupResponse]:
3792
+ """
3793
+ Updates a saved popup. Only the fields you send change.
3794
+
3795
+ Set `status` to `published` to make the popup live, or `draft` to stop it showing while keeping the popup, its stats, and its embed script. `trigger`, `targeting`, `schedule`, `frequency`, and `visual` are merged key by key, so patching one key keeps the rest.
3796
+
3797
+ Parameters
3798
+ ----------
3799
+ popup_id : str
3800
+
3801
+ blocks : typing.Optional[typing.Sequence[typing.Dict[str, typing.Any]]]
3802
+ Complete replacement for the popup's content blocks. The popup must keep exactly one required email field and one submit button.
3803
+
3804
+ button_text : typing.Optional[str]
3805
+
3806
+ description : typing.Optional[str]
3807
+ New text for the popup's first paragraph block. Fails when the popup has no paragraph block.
3808
+
3809
+ duplicate_strategy : typing.Optional[UpdateSavedPopupRequestDuplicateStrategy]
3810
+
3811
+ frequency : typing.Optional[SavedPopupFrequency]
3812
+
3813
+ headline : typing.Optional[str]
3814
+ New text for the popup's first heading block. Fails when the popup has no heading block.
3815
+
3816
+ list_ids : typing.Optional[typing.Sequence[str]]
3817
+ Replacement list targeting. Pass an empty array to capture into every list.
3818
+
3819
+ name : typing.Optional[str]
3820
+
3821
+ placement : typing.Optional[UpdateSavedPopupRequestPlacement]
3822
+
3823
+ presentation : typing.Optional[UpdateSavedPopupRequestPresentation]
3824
+
3825
+ redirect_url : typing.Optional[str]
3826
+ HTTP or HTTPS URL for successful signups. Pass an empty string to switch back to the confirmation message.
3827
+
3828
+ schedule : typing.Optional[SavedPopupSchedule]
3829
+
3830
+ status : typing.Optional[UpdateSavedPopupRequestStatus]
3831
+
3832
+ success_message : typing.Optional[str]
3833
+
3834
+ tag_ids : typing.Optional[typing.Sequence[str]]
3835
+ Replacement tag IDs. Pass an empty array to clear tags.
3836
+
3837
+ targeting : typing.Optional[SavedPopupTargeting]
3838
+
3839
+ theme : typing.Optional[typing.Dict[str, typing.Any]]
3840
+ Visual theme overrides merged into the current theme.
3841
+
3842
+ trigger : typing.Optional[SavedPopupTrigger]
3843
+
3844
+ visual : typing.Optional[SavedPopupVisual]
3845
+
3846
+ request_options : typing.Optional[RequestOptions]
3847
+ Request-specific configuration.
3848
+
3849
+ Returns
3850
+ -------
3851
+ AsyncHttpResponse[UpdateSavedPopupResponse]
3852
+ Popup updated
3853
+ """
3854
+ _response = await self._client_wrapper.httpx_client.request(
3855
+ f"popups/{encode_path_param(popup_id)}",
3856
+ method="PATCH",
3857
+ json={
3858
+ "blocks": blocks,
3859
+ "buttonText": button_text,
3860
+ "description": description,
3861
+ "duplicateStrategy": duplicate_strategy,
3862
+ "frequency": convert_and_respect_annotation_metadata(
3863
+ object_=frequency, annotation=SavedPopupFrequency, direction="write"
3864
+ ),
3865
+ "headline": headline,
3866
+ "listIds": list_ids,
3867
+ "name": name,
3868
+ "placement": placement,
3869
+ "presentation": presentation,
3870
+ "redirectUrl": redirect_url,
3871
+ "schedule": convert_and_respect_annotation_metadata(
3872
+ object_=schedule, annotation=SavedPopupSchedule, direction="write"
3873
+ ),
3874
+ "status": status,
3875
+ "successMessage": success_message,
3876
+ "tagIds": tag_ids,
3877
+ "targeting": convert_and_respect_annotation_metadata(
3878
+ object_=targeting, annotation=SavedPopupTargeting, direction="write"
3879
+ ),
3880
+ "theme": theme,
3881
+ "trigger": convert_and_respect_annotation_metadata(
3882
+ object_=trigger, annotation=SavedPopupTrigger, direction="write"
3883
+ ),
3884
+ "visual": convert_and_respect_annotation_metadata(
3885
+ object_=visual, annotation=SavedPopupVisual, direction="write"
3886
+ ),
3887
+ },
3888
+ headers={
3889
+ "content-type": "application/json",
3890
+ },
3891
+ request_options=request_options,
3892
+ omit=OMIT,
3893
+ )
3894
+ try:
3895
+ if 200 <= _response.status_code < 300:
3896
+ _data = typing.cast(
3897
+ UpdateSavedPopupResponse,
3898
+ parse_obj_as(
3899
+ type_=UpdateSavedPopupResponse, # type: ignore
3900
+ object_=_response.json(),
3901
+ ),
3902
+ )
3903
+ return AsyncHttpResponse(response=_response, data=_data)
3904
+ if _response.status_code == 400:
3905
+ raise BadRequestError(
3906
+ headers=dict(_response.headers),
3907
+ body=typing.cast(
3908
+ typing.Any,
3909
+ parse_obj_as(
3910
+ type_=typing.Any, # type: ignore
3911
+ object_=_response.json(),
3912
+ ),
3913
+ ),
3914
+ )
3915
+ if _response.status_code == 401:
3916
+ raise UnauthorizedError(
3917
+ headers=dict(_response.headers),
3918
+ body=typing.cast(
3919
+ typing.Any,
3920
+ parse_obj_as(
3921
+ type_=typing.Any, # type: ignore
3922
+ object_=_response.json(),
3923
+ ),
3924
+ ),
3925
+ )
3926
+ if _response.status_code == 403:
3927
+ raise ForbiddenError(
3928
+ headers=dict(_response.headers),
3929
+ body=typing.cast(
3930
+ Error,
3931
+ parse_obj_as(
3932
+ type_=Error, # type: ignore
3933
+ object_=_response.json(),
3934
+ ),
3935
+ ),
3936
+ )
3937
+ if _response.status_code == 404:
3938
+ raise NotFoundError(
3939
+ headers=dict(_response.headers),
3940
+ body=typing.cast(
3941
+ typing.Any,
3942
+ parse_obj_as(
3943
+ type_=typing.Any, # type: ignore
3944
+ object_=_response.json(),
3945
+ ),
3946
+ ),
3947
+ )
3948
+ if _response.status_code == 500:
3949
+ raise InternalServerError(
3950
+ headers=dict(_response.headers),
3951
+ body=typing.cast(
3952
+ typing.Any,
3953
+ parse_obj_as(
3954
+ type_=typing.Any, # type: ignore
3955
+ object_=_response.json(),
3956
+ ),
3957
+ ),
3958
+ )
3959
+ _response_json = _response.json()
3960
+ except JSONDecodeError:
3961
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
3962
+ except ValidationError as e:
3963
+ raise ParsingError(
3964
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
3965
+ )
3966
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)