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.
- sequenzy/.fern/metadata.json +12 -0
- sequenzy/__init__.py +3017 -0
- sequenzy/_default_clients.py +30 -0
- sequenzy/ab_tests/__init__.py +91 -0
- sequenzy/ab_tests/client.py +1229 -0
- sequenzy/ab_tests/raw_client.py +2275 -0
- sequenzy/ab_tests/types/__init__.py +89 -0
- sequenzy/ab_tests/types/add_variant_ab_tests_response.py +32 -0
- sequenzy/ab_tests/types/create_ab_tests_request_test_type.py +5 -0
- sequenzy/ab_tests/types/create_ab_tests_request_variants_item.py +32 -0
- sequenzy/ab_tests/types/create_ab_tests_request_winner_criteria.py +5 -0
- sequenzy/ab_tests/types/create_ab_tests_response.py +50 -0
- sequenzy/ab_tests/types/delete_ab_tests_response.py +19 -0
- sequenzy/ab_tests/types/delete_variant_ab_tests_response.py +30 -0
- sequenzy/ab_tests/types/get_ab_tests_response.py +30 -0
- sequenzy/ab_tests/types/get_stats_ab_tests_request_period.py +5 -0
- sequenzy/ab_tests/types/get_stats_ab_tests_response.py +31 -0
- sequenzy/ab_tests/types/get_stats_ab_tests_response_variants_item.py +27 -0
- sequenzy/ab_tests/types/list_ab_tests_response.py +30 -0
- sequenzy/ab_tests/types/restart_ab_tests_request_test_type.py +5 -0
- sequenzy/ab_tests/types/restart_ab_tests_response.py +41 -0
- sequenzy/ab_tests/types/update_ab_tests_request_test_type.py +5 -0
- sequenzy/ab_tests/types/update_ab_tests_request_winner_criteria.py +5 -0
- sequenzy/ab_tests/types/update_ab_tests_response.py +30 -0
- sequenzy/ab_tests/types/update_variant_ab_tests_response.py +28 -0
- sequenzy/account/__init__.py +103 -0
- sequenzy/account/client.py +646 -0
- sequenzy/account/raw_client.py +1257 -0
- sequenzy/account/types/__init__.py +103 -0
- sequenzy/account/types/create_api_key_request_preset.py +17 -0
- sequenzy/account/types/create_api_key_response.py +27 -0
- sequenzy/account/types/create_api_key_response_api_key.py +42 -0
- sequenzy/account/types/create_api_key_response_api_key_permissions.py +39 -0
- sequenzy/account/types/get_account_response.py +42 -0
- sequenzy/account/types/get_account_response_api_key_permissions.py +136 -0
- sequenzy/account/types/get_account_response_api_key_permissions_active_key.py +31 -0
- sequenzy/account/types/get_account_response_api_key_permissions_active_key_type.py +5 -0
- sequenzy/account/types/get_account_response_api_key_permissions_preset.py +18 -0
- sequenzy/account/types/get_account_response_companies_item.py +25 -0
- sequenzy/account/types/get_account_response_companies_item_role.py +5 -0
- sequenzy/account/types/get_account_response_user.py +19 -0
- sequenzy/account/types/get_integration_guide_response.py +23 -0
- sequenzy/account/types/list_api_keys_response.py +25 -0
- sequenzy/account/types/request_api_key_handoff_request_preset.py +17 -0
- sequenzy/account/types/request_api_key_handoff_response.py +27 -0
- sequenzy/account/types/request_api_key_handoff_response_handoff.py +81 -0
- sequenzy/account/types/request_api_key_handoff_response_handoff_key_type.py +5 -0
- sequenzy/account/types/request_api_key_handoff_response_handoff_replaces.py +30 -0
- sequenzy/account/types/revoke_api_key_response.py +24 -0
- sequenzy/account/types/update_api_key_request_preset.py +17 -0
- sequenzy/account/types/update_api_key_response.py +24 -0
- sequenzy/analytics/__init__.py +163 -0
- sequenzy/analytics/client.py +1896 -0
- sequenzy/analytics/raw_client.py +3036 -0
- sequenzy/analytics/types/__init__.py +167 -0
- sequenzy/analytics/types/get_campaign_metrics_request_period.py +5 -0
- sequenzy/analytics/types/get_campaign_metrics_response.py +67 -0
- sequenzy/analytics/types/get_campaign_stats_legacy_request_period.py +5 -0
- sequenzy/analytics/types/get_campaign_stats_legacy_response.py +63 -0
- sequenzy/analytics/types/get_metrics_request_email_type.py +5 -0
- sequenzy/analytics/types/get_metrics_request_period.py +5 -0
- sequenzy/analytics/types/get_metrics_response.py +76 -0
- sequenzy/analytics/types/get_metrics_response_email_type.py +5 -0
- sequenzy/analytics/types/get_recipients_request_period.py +5 -0
- sequenzy/analytics/types/get_recipients_response.py +23 -0
- sequenzy/analytics/types/get_recipients_response_recipients_item.py +24 -0
- sequenzy/analytics/types/get_recipients_response_recipients_item_clicked_item.py +41 -0
- sequenzy/analytics/types/get_recipients_response_recipients_item_clicked_item_engagement_quality.py +7 -0
- sequenzy/analytics/types/get_recipients_response_recipients_item_opened_item.py +40 -0
- sequenzy/analytics/types/get_recipients_response_recipients_item_opened_item_engagement_quality.py +7 -0
- sequenzy/analytics/types/get_sequence_metrics_request_period.py +5 -0
- sequenzy/analytics/types/get_sequence_metrics_response.py +58 -0
- sequenzy/analytics/types/get_sequence_metrics_response_enrollment_skipped.py +37 -0
- sequenzy/analytics/types/get_sequence_metrics_response_steps_item.py +61 -0
- sequenzy/analytics/types/get_sequence_metrics_response_steps_item_failed_subscribers_item.py +52 -0
- sequenzy/analytics/types/get_stats_legacy_request_email_type.py +5 -0
- sequenzy/analytics/types/get_stats_legacy_request_period.py +5 -0
- sequenzy/analytics/types/get_stats_legacy_response.py +52 -0
- sequenzy/analytics/types/get_stats_legacy_response_email_type.py +5 -0
- sequenzy/analytics/types/get_transactional_metrics_legacy_request_period.py +5 -0
- sequenzy/analytics/types/get_transactional_metrics_request_period.py +5 -0
- sequenzy/analytics/types/list_campaign_events_request_event_type.py +10 -0
- sequenzy/analytics/types/list_campaign_events_request_period.py +5 -0
- sequenzy/analytics/types/list_campaign_events_response.py +31 -0
- sequenzy/analytics/types/list_campaign_poll_responses_legacy_response.py +31 -0
- sequenzy/analytics/types/list_campaign_poll_responses_response.py +37 -0
- sequenzy/analytics/types/list_email_metrics_request_email_type.py +5 -0
- sequenzy/analytics/types/list_email_metrics_request_order.py +5 -0
- sequenzy/analytics/types/list_email_metrics_request_period.py +5 -0
- sequenzy/analytics/types/list_email_metrics_request_sort.py +20 -0
- sequenzy/analytics/types/list_email_metrics_response.py +55 -0
- sequenzy/analytics/types/list_email_metrics_response_email_type.py +5 -0
- sequenzy/analytics/types/list_email_metrics_response_emails_item.py +63 -0
- sequenzy/analytics/types/list_email_metrics_response_emails_item_email_type.py +5 -0
- sequenzy/analytics/types/list_sequence_events_request_event_type.py +10 -0
- sequenzy/analytics/types/list_sequence_events_request_period.py +5 -0
- sequenzy/analytics/types/list_sequence_events_response.py +36 -0
- sequenzy/audience_syncs/__init__.py +64 -0
- sequenzy/audience_syncs/client.py +484 -0
- sequenzy/audience_syncs/raw_client.py +954 -0
- sequenzy/audience_syncs/types/__init__.py +62 -0
- sequenzy/audience_syncs/types/create_audience_syncs_request.py +5 -0
- sequenzy/audience_syncs/types/create_audience_syncs_request_frequency.py +5 -0
- sequenzy/audience_syncs/types/create_audience_syncs_response.py +25 -0
- sequenzy/audience_syncs/types/delete_audience_syncs_response.py +19 -0
- sequenzy/audience_syncs/types/list_ad_accounts_response.py +25 -0
- sequenzy/audience_syncs/types/list_audience_syncs_response.py +27 -0
- sequenzy/audience_syncs/types/run_now_audience_syncs_response.py +20 -0
- sequenzy/audience_syncs/types/update_audience_syncs_request_frequency.py +5 -0
- sequenzy/audience_syncs/types/update_audience_syncs_response.py +25 -0
- sequenzy/campaigns/__init__.py +145 -0
- sequenzy/campaigns/client.py +2788 -0
- sequenzy/campaigns/raw_client.py +4803 -0
- sequenzy/campaigns/types/__init__.py +143 -0
- sequenzy/campaigns/types/cancel_campaigns_response.py +26 -0
- sequenzy/campaigns/types/create_campaigns_request_email_preset.py +5 -0
- sequenzy/campaigns/types/create_campaigns_request_status.py +5 -0
- sequenzy/campaigns/types/create_campaigns_response.py +23 -0
- sequenzy/campaigns/types/create_campaigns_response_campaign.py +98 -0
- sequenzy/campaigns/types/create_goal_campaigns_response.py +21 -0
- sequenzy/campaigns/types/create_share_link_campaigns_response.py +44 -0
- sequenzy/campaigns/types/delete_campaigns_response.py +19 -0
- sequenzy/campaigns/types/delete_goal_campaigns_response.py +24 -0
- sequenzy/campaigns/types/duplicate_campaigns_request_mode.py +5 -0
- sequenzy/campaigns/types/duplicate_campaigns_response.py +26 -0
- sequenzy/campaigns/types/duplicate_campaigns_response_campaign.py +245 -0
- sequenzy/campaigns/types/get_audience_campaigns_response.py +51 -0
- sequenzy/campaigns/types/get_campaigns_response.py +26 -0
- sequenzy/campaigns/types/list_campaigns_request_status.py +8 -0
- sequenzy/campaigns/types/list_campaigns_response.py +23 -0
- sequenzy/campaigns/types/list_campaigns_response_pagination.py +27 -0
- sequenzy/campaigns/types/list_goals_campaigns_response.py +21 -0
- sequenzy/campaigns/types/pause_campaigns_response.py +26 -0
- sequenzy/campaigns/types/preview_computed_data_campaigns_request_subscriber.py +36 -0
- sequenzy/campaigns/types/preview_computed_data_campaigns_response.py +22 -0
- sequenzy/campaigns/types/preview_computed_data_campaigns_response_lists_item.py +21 -0
- sequenzy/campaigns/types/resend_to_non_openers_campaigns_response.py +40 -0
- sequenzy/campaigns/types/resend_to_non_openers_campaigns_response_campaign.py +245 -0
- sequenzy/campaigns/types/resume_campaigns_response.py +26 -0
- sequenzy/campaigns/types/revoke_share_link_campaigns_response.py +24 -0
- sequenzy/campaigns/types/schedule_campaigns_request_recurring_interval.py +5 -0
- sequenzy/campaigns/types/schedule_campaigns_response.py +36 -0
- sequenzy/campaigns/types/schedule_campaigns_response_campaign.py +60 -0
- sequenzy/campaigns/types/schedule_campaigns_response_campaign_status.py +5 -0
- sequenzy/campaigns/types/send_test_campaigns_response.py +48 -0
- sequenzy/campaigns/types/unschedule_campaigns_response.py +26 -0
- sequenzy/campaigns/types/update_campaigns_request_email_preset.py +5 -0
- sequenzy/campaigns/types/update_campaigns_response.py +23 -0
- sequenzy/campaigns/types/update_campaigns_response_campaign.py +71 -0
- sequenzy/campaigns/types/update_goal_campaigns_response.py +21 -0
- sequenzy/client.py +974 -0
- sequenzy/companies/__init__.py +79 -0
- sequenzy/companies/client.py +624 -0
- sequenzy/companies/raw_client.py +962 -0
- sequenzy/companies/types/__init__.py +77 -0
- sequenzy/companies/types/create_companies_response.py +22 -0
- sequenzy/companies/types/create_companies_response_company.py +26 -0
- sequenzy/companies/types/get_companies_response.py +21 -0
- sequenzy/companies/types/list_companies_response.py +26 -0
- sequenzy/companies/types/update_companies_request_email_direction.py +5 -0
- sequenzy/companies/types/update_companies_request_email_length_preference.py +7 -0
- sequenzy/companies/types/update_companies_request_email_theme.py +60 -0
- sequenzy/companies/types/update_companies_request_email_theme_button_style.py +5 -0
- sequenzy/companies/types/update_companies_request_email_theme_colors.py +46 -0
- sequenzy/companies/types/update_companies_request_email_theme_layout.py +53 -0
- sequenzy/companies/types/update_companies_request_email_theme_preset_id.py +7 -0
- sequenzy/companies/types/update_companies_request_email_theme_typography.py +90 -0
- sequenzy/companies/types/update_companies_request_reply_tracking_domain_mode.py +5 -0
- sequenzy/companies/types/update_companies_response.py +21 -0
- sequenzy/conversations/__init__.py +70 -0
- sequenzy/conversations/client.py +529 -0
- sequenzy/conversations/raw_client.py +938 -0
- sequenzy/conversations/types/__init__.py +70 -0
- sequenzy/conversations/types/get_conversations_response.py +24 -0
- sequenzy/conversations/types/list_conversations_request_status.py +5 -0
- sequenzy/conversations/types/list_conversations_request_unread.py +5 -0
- sequenzy/conversations/types/list_conversations_response.py +23 -0
- sequenzy/conversations/types/mark_read_conversations_response.py +23 -0
- sequenzy/conversations/types/send_message_conversations_request_type.py +5 -0
- sequenzy/conversations/types/send_message_conversations_response.py +21 -0
- sequenzy/conversations/types/update_status_conversations_request_status.py +5 -0
- sequenzy/conversations/types/update_status_conversations_response.py +21 -0
- sequenzy/conversations/types/update_status_conversations_response_conversation.py +23 -0
- sequenzy/conversations/types/update_status_conversations_response_conversation_status.py +5 -0
- sequenzy/core/__init__.py +127 -0
- sequenzy/core/api_error.py +23 -0
- sequenzy/core/client_wrapper.py +146 -0
- sequenzy/core/datetime_utils.py +70 -0
- sequenzy/core/file.py +67 -0
- sequenzy/core/force_multipart.py +18 -0
- sequenzy/core/http_client.py +940 -0
- sequenzy/core/http_response.py +63 -0
- sequenzy/core/http_sse/__init__.py +42 -0
- sequenzy/core/http_sse/_api.py +455 -0
- sequenzy/core/http_sse/_decoders.py +74 -0
- sequenzy/core/http_sse/_exceptions.py +7 -0
- sequenzy/core/http_sse/_models.py +17 -0
- sequenzy/core/jsonable_encoder.py +133 -0
- sequenzy/core/logging.py +107 -0
- sequenzy/core/parse_error.py +36 -0
- sequenzy/core/pydantic_utilities.py +508 -0
- sequenzy/core/query_encoder.py +58 -0
- sequenzy/core/remove_none_from_dict.py +11 -0
- sequenzy/core/request_options.py +40 -0
- sequenzy/core/serialization.py +347 -0
- sequenzy/email_blocks/__init__.py +49 -0
- sequenzy/email_blocks/client.py +207 -0
- sequenzy/email_blocks/raw_client.py +344 -0
- sequenzy/email_blocks/types/__init__.py +47 -0
- sequenzy/email_blocks/types/get_email_blocks_request_condition_fields.py +5 -0
- sequenzy/email_blocks/types/get_email_blocks_response.py +55 -0
- sequenzy/email_blocks/types/list_email_blocks_request_creatable_only.py +5 -0
- sequenzy/email_blocks/types/list_email_blocks_response.py +45 -0
- sequenzy/email_components/__init__.py +79 -0
- sequenzy/email_components/client.py +717 -0
- sequenzy/email_components/raw_client.py +1373 -0
- sequenzy/email_components/types/__init__.py +77 -0
- sequenzy/email_components/types/create_email_components_request_component_type.py +5 -0
- sequenzy/email_components/types/create_email_components_response.py +28 -0
- sequenzy/email_components/types/delete_email_components_response.py +20 -0
- sequenzy/email_components/types/get_default_email_components_request_slot.py +5 -0
- sequenzy/email_components/types/get_default_email_components_response.py +26 -0
- sequenzy/email_components/types/get_email_components_response.py +26 -0
- sequenzy/email_components/types/list_email_components_request_defaults_only.py +5 -0
- sequenzy/email_components/types/list_email_components_request_slot.py +5 -0
- sequenzy/email_components/types/list_email_components_request_type.py +5 -0
- sequenzy/email_components/types/list_email_components_response.py +26 -0
- sequenzy/email_components/types/set_default_email_components_request_slot.py +5 -0
- sequenzy/email_components/types/set_default_email_components_response.py +28 -0
- sequenzy/email_components/types/update_email_components_request_component_type.py +5 -0
- sequenzy/email_components/types/update_email_components_response.py +28 -0
- sequenzy/email_sends/__init__.py +64 -0
- sequenzy/email_sends/client.py +342 -0
- sequenzy/email_sends/raw_client.py +559 -0
- sequenzy/email_sends/types/__init__.py +62 -0
- sequenzy/email_sends/types/get_email_sends_response.py +30 -0
- sequenzy/email_sends/types/get_email_sends_response_source.py +5 -0
- sequenzy/email_sends/types/list_email_sends_request_bounce_type.py +5 -0
- sequenzy/email_sends/types/list_email_sends_request_email_type.py +5 -0
- sequenzy/email_sends/types/list_email_sends_request_sort_field.py +7 -0
- sequenzy/email_sends/types/list_email_sends_request_sort_order.py +5 -0
- sequenzy/email_sends/types/list_email_sends_request_status.py +10 -0
- sequenzy/email_sends/types/list_email_sends_response.py +32 -0
- sequenzy/email_sends/types/list_email_sends_response_email_sends_item.py +27 -0
- sequenzy/emails/__init__.py +49 -0
- sequenzy/emails/client.py +435 -0
- sequenzy/emails/raw_client.py +800 -0
- sequenzy/emails/types/__init__.py +47 -0
- sequenzy/emails/types/create_emails_response.py +28 -0
- sequenzy/emails/types/update_blocks_emails_request_type.py +5 -0
- sequenzy/emails/types/update_blocks_emails_response.py +28 -0
- sequenzy/emails/types/update_emails_response.py +28 -0
- sequenzy/environment.py +7 -0
- sequenzy/errors/__init__.py +62 -0
- sequenzy/errors/bad_request_error.py +10 -0
- sequenzy/errors/conflict_error.py +10 -0
- sequenzy/errors/forbidden_error.py +11 -0
- sequenzy/errors/internal_server_error.py +10 -0
- sequenzy/errors/not_found_error.py +10 -0
- sequenzy/errors/service_unavailable_error.py +10 -0
- sequenzy/errors/too_many_requests_error.py +10 -0
- sequenzy/errors/unauthorized_error.py +10 -0
- sequenzy/errors/unprocessable_entity_error.py +10 -0
- sequenzy/events/__init__.py +37 -0
- sequenzy/events/client.py +129 -0
- sequenzy/events/raw_client.py +201 -0
- sequenzy/events/types/__init__.py +38 -0
- sequenzy/events/types/get_schemas_events_request_provider.py +7 -0
- sequenzy/events/types/get_schemas_events_response.py +40 -0
- sequenzy/feedback/__init__.py +49 -0
- sequenzy/feedback/client.py +212 -0
- sequenzy/feedback/raw_client.py +317 -0
- sequenzy/feedback/types/__init__.py +47 -0
- sequenzy/feedback/types/submit_feedback_request_category.py +7 -0
- sequenzy/feedback/types/submit_feedback_request_source.py +5 -0
- sequenzy/feedback/types/submit_feedback_request_tool_calls_item.py +32 -0
- sequenzy/feedback/types/submit_feedback_response.py +20 -0
- sequenzy/generation/__init__.py +55 -0
- sequenzy/generation/client.py +352 -0
- sequenzy/generation/raw_client.py +676 -0
- sequenzy/generation/types/__init__.py +53 -0
- sequenzy/generation/types/generate_email_request_email_type.py +5 -0
- sequenzy/generation/types/generate_email_response.py +38 -0
- sequenzy/generation/types/generate_sms_messages_response.py +22 -0
- sequenzy/generation/types/generate_sms_messages_response_messages_item.py +27 -0
- sequenzy/generation/types/generate_sms_messages_response_messages_item_encoding.py +5 -0
- sequenzy/generation/types/generate_subject_lines_response.py +21 -0
- sequenzy/integrations/__init__.py +82 -0
- sequenzy/integrations/client.py +851 -0
- sequenzy/integrations/raw_client.py +1689 -0
- sequenzy/integrations/types/__init__.py +80 -0
- sequenzy/integrations/types/activate_pixel_integrations_response.py +33 -0
- sequenzy/integrations/types/connect_integrations_request_history_import.py +61 -0
- sequenzy/integrations/types/connect_integrations_request_history_import_region.py +5 -0
- sequenzy/integrations/types/connect_integrations_request_provider.py +8 -0
- sequenzy/integrations/types/connect_integrations_request_settings.py +30 -0
- sequenzy/integrations/types/connect_integrations_response.py +60 -0
- sequenzy/integrations/types/connect_integrations_response_history.py +25 -0
- sequenzy/integrations/types/list_activity_integrations_request_status.py +7 -0
- sequenzy/integrations/types/list_activity_integrations_response.py +27 -0
- sequenzy/integrations/types/list_capabilities_integrations_response.py +21 -0
- sequenzy/integrations/types/list_integrations_response.py +21 -0
- sequenzy/integrations/types/sync_integrations_response.py +44 -0
- sequenzy/integrations/types/sync_integrations_response_sync_target.py +31 -0
- sequenzy/integrations/types/update_sync_integrations_response.py +73 -0
- sequenzy/integrations/types/update_sync_integrations_response_list_targeting.py +7 -0
- sequenzy/landing_pages/__init__.py +88 -0
- sequenzy/landing_pages/client.py +1368 -0
- sequenzy/landing_pages/raw_client.py +2615 -0
- sequenzy/landing_pages/types/__init__.py +86 -0
- sequenzy/landing_pages/types/connect_dedicated_domain_landing_pages_response.py +22 -0
- sequenzy/landing_pages/types/connect_domain_landing_pages_response.py +22 -0
- sequenzy/landing_pages/types/create_landing_pages_request_template.py +20 -0
- sequenzy/landing_pages/types/create_landing_pages_response.py +26 -0
- sequenzy/landing_pages/types/delete_landing_pages_response.py +25 -0
- sequenzy/landing_pages/types/duplicate_landing_pages_response.py +26 -0
- sequenzy/landing_pages/types/get_dedicated_domain_landing_pages_response.py +21 -0
- sequenzy/landing_pages/types/get_domain_landing_pages_response.py +21 -0
- sequenzy/landing_pages/types/get_landing_pages_response.py +25 -0
- sequenzy/landing_pages/types/list_landing_pages_response.py +31 -0
- sequenzy/landing_pages/types/publish_landing_pages_response.py +25 -0
- sequenzy/landing_pages/types/remove_dedicated_domain_landing_pages_response.py +21 -0
- sequenzy/landing_pages/types/unpublish_landing_pages_response.py +25 -0
- sequenzy/landing_pages/types/update_domain_settings_landing_pages_response.py +21 -0
- sequenzy/landing_pages/types/update_landing_pages_response.py +25 -0
- sequenzy/landing_pages/types/verify_dedicated_domain_landing_pages_response.py +21 -0
- sequenzy/landing_pages/types/verify_domain_landing_pages_response.py +21 -0
- sequenzy/lists/__init__.py +64 -0
- sequenzy/lists/client.py +608 -0
- sequenzy/lists/raw_client.py +1095 -0
- sequenzy/lists/types/__init__.py +62 -0
- sequenzy/lists/types/add_subscribers_lists_request_duplicate_strategy.py +5 -0
- sequenzy/lists/types/add_subscribers_lists_request_opt_in_mode.py +5 -0
- sequenzy/lists/types/add_subscribers_lists_response.py +41 -0
- sequenzy/lists/types/add_subscribers_lists_response_results_item.py +29 -0
- sequenzy/lists/types/create_lists_response.py +25 -0
- sequenzy/lists/types/delete_lists_response.py +30 -0
- sequenzy/lists/types/list_lists_response.py +21 -0
- sequenzy/lists/types/remove_subscribers_lists_response.py +35 -0
- sequenzy/lists/types/update_lists_response.py +25 -0
- sequenzy/media/__init__.py +49 -0
- sequenzy/media/client.py +375 -0
- sequenzy/media/raw_client.py +682 -0
- sequenzy/media/types/__init__.py +47 -0
- sequenzy/media/types/complete_email_image_upload_response.py +21 -0
- sequenzy/media/types/complete_email_image_upload_response_asset.py +39 -0
- sequenzy/media/types/create_email_image_upload_url_response.py +31 -0
- sequenzy/media/types/upload_email_image_bytes_response.py +25 -0
- sequenzy/migrations/__init__.py +58 -0
- sequenzy/migrations/client.py +645 -0
- sequenzy/migrations/raw_client.py +1250 -0
- sequenzy/migrations/types/__init__.py +56 -0
- sequenzy/migrations/types/approve_plan_migrations_response.py +20 -0
- sequenzy/migrations/types/cancel_migrations_response.py +20 -0
- sequenzy/migrations/types/connect_source_migrations_response.py +20 -0
- sequenzy/migrations/types/discover_source_migrations_response.py +20 -0
- sequenzy/migrations/types/get_agent_package_migrations_response.py +20 -0
- sequenzy/migrations/types/get_run_migrations_response.py +20 -0
- sequenzy/migrations/types/start_migrations_response.py +20 -0
- sequenzy/notification_preferences/__init__.py +4 -0
- sequenzy/notification_preferences/client.py +198 -0
- sequenzy/notification_preferences/raw_client.py +311 -0
- sequenzy/orders/__init__.py +49 -0
- sequenzy/orders/client.py +393 -0
- sequenzy/orders/raw_client.py +539 -0
- sequenzy/orders/types/__init__.py +47 -0
- sequenzy/orders/types/push_orders_request_customer_totals.py +30 -0
- sequenzy/orders/types/push_orders_request_status.py +5 -0
- sequenzy/orders/types/push_orders_response.py +29 -0
- sequenzy/orders/types/track_checkout_started_response.py +30 -0
- sequenzy/products/__init__.py +82 -0
- sequenzy/products/client.py +905 -0
- sequenzy/products/raw_client.py +1642 -0
- sequenzy/products/types/__init__.py +82 -0
- sequenzy/products/types/attach_delivery_products_request_source.py +5 -0
- sequenzy/products/types/attach_delivery_products_response.py +21 -0
- sequenzy/products/types/create_delivery_upload_url_products_response.py +30 -0
- sequenzy/products/types/delete_products_response.py +20 -0
- sequenzy/products/types/get_products_response.py +21 -0
- sequenzy/products/types/list_products_request_provider.py +7 -0
- sequenzy/products/types/list_products_response.py +23 -0
- sequenzy/products/types/list_products_response_pagination.py +40 -0
- sequenzy/products/types/register_back_in_stock_response.py +24 -0
- sequenzy/products/types/remove_delivery_products_response.py +21 -0
- sequenzy/products/types/sync_stripe_products_response.py +24 -0
- sequenzy/products/types/upsert_products_request_products_item.py +89 -0
- sequenzy/products/types/upsert_products_request_products_item_variants_item.py +53 -0
- sequenzy/products/types/upsert_products_request_products_item_variants_item_options_item.py +20 -0
- sequenzy/products/types/upsert_products_response.py +36 -0
- sequenzy/reference.md +27269 -0
- sequenzy/segments/__init__.py +61 -0
- sequenzy/segments/client.py +445 -0
- sequenzy/segments/raw_client.py +831 -0
- sequenzy/segments/types/__init__.py +59 -0
- sequenzy/segments/types/create_segments_request.py +5 -0
- sequenzy/segments/types/create_segments_request_filter_join_operator.py +5 -0
- sequenzy/segments/types/create_segments_response.py +30 -0
- sequenzy/segments/types/delete_segments_response.py +19 -0
- sequenzy/segments/types/get_count_segments_response.py +25 -0
- sequenzy/segments/types/list_segments_response.py +26 -0
- sequenzy/segments/types/update_segments_request_filter_join_operator.py +5 -0
- sequenzy/segments/types/update_segments_response.py +30 -0
- sequenzy/sender_profiles/__init__.py +38 -0
- sequenzy/sender_profiles/client.py +269 -0
- sequenzy/sender_profiles/raw_client.py +524 -0
- sequenzy/sender_profiles/types/__init__.py +40 -0
- sequenzy/sender_profiles/types/list_sender_profiles_response.py +43 -0
- sequenzy/sender_profiles/types/update_reply_profile_response.py +30 -0
- sequenzy/sender_profiles/types/update_sender_profiles_response.py +32 -0
- sequenzy/sending_status/__init__.py +34 -0
- sequenzy/sending_status/client.py +182 -0
- sequenzy/sending_status/raw_client.py +363 -0
- sequenzy/sending_status/types/__init__.py +34 -0
- sequenzy/sending_status/types/resume_sending_status_response.py +28 -0
- sequenzy/sequences/__init__.py +139 -0
- sequenzy/sequences/client.py +4043 -0
- sequenzy/sequences/raw_client.py +6760 -0
- sequenzy/sequences/types/__init__.py +139 -0
- sequenzy/sequences/types/archive_sequences_response.py +21 -0
- sequenzy/sequences/types/configure_inbound_webhook_sequences_response.py +21 -0
- sequenzy/sequences/types/create_goal_sequences_response.py +21 -0
- sequenzy/sequences/types/delete_goal_sequences_response.py +24 -0
- sequenzy/sequences/types/duplicate_sequences_response.py +25 -0
- sequenzy/sequences/types/enroll_subscribers_in_sequences_response.py +58 -0
- sequenzy/sequences/types/generate_sequences_response.py +25 -0
- sequenzy/sequences/types/get_inbound_webhook_sequences_response.py +21 -0
- sequenzy/sequences/types/get_sequences_response.py +26 -0
- sequenzy/sequences/types/get_stats_sequences_request_period.py +5 -0
- sequenzy/sequences/types/get_stats_sequences_response.py +58 -0
- sequenzy/sequences/types/get_stats_sequences_response_enrollment_skipped.py +37 -0
- sequenzy/sequences/types/get_stats_sequences_response_steps_item.py +61 -0
- sequenzy/sequences/types/get_stats_sequences_response_steps_item_failed_subscribers_item.py +31 -0
- sequenzy/sequences/types/list_enrollments_sequences_request_sort.py +7 -0
- sequenzy/sequences/types/list_goals_sequences_response.py +21 -0
- sequenzy/sequences/types/list_sequences_response.py +23 -0
- sequenzy/sequences/types/list_sequences_response_pagination.py +31 -0
- sequenzy/sequences/types/rotate_inbound_webhook_secret_sequences_response.py +21 -0
- sequenzy/sequences/types/send_test_email_sequences_response.py +26 -0
- sequenzy/sequences/types/send_test_email_sequences_response_results_item.py +43 -0
- sequenzy/sequences/types/sequence_create_request_email_style.py +5 -0
- sequenzy/sequences/types/sequence_create_request_inactivity_baseline.py +7 -0
- sequenzy/sequences/types/sequence_create_request_list_scope.py +5 -0
- sequenzy/sequences/types/sequence_enrollment_move_request_sort.py +7 -0
- sequenzy/sequences/types/sequence_update_request_inactivity_baseline.py +7 -0
- sequenzy/sequences/types/sequence_update_request_list_scope.py +5 -0
- sequenzy/sequences/types/simulate_sequences_response.py +43 -0
- sequenzy/sequences/types/simulate_sequences_response_readiness.py +25 -0
- sequenzy/sequences/types/unarchive_sequences_response.py +21 -0
- sequenzy/sequences/types/update_goal_sequences_response.py +21 -0
- sequenzy/sequences/types/update_sequences_response.py +23 -0
- sequenzy/sequences/types/update_sequences_response_sequence.py +162 -0
- sequenzy/sequences/types/update_sequences_response_sequence_graph_edit_action.py +7 -0
- sequenzy/shopify/__init__.py +37 -0
- sequenzy/shopify/client.py +215 -0
- sequenzy/shopify/raw_client.py +432 -0
- sequenzy/shopify/types/__init__.py +38 -0
- sequenzy/shopify/types/get_automation_settings_shopify_response.py +43 -0
- sequenzy/shopify/types/update_automation_settings_shopify_response.py +44 -0
- sequenzy/sms/__init__.py +55 -0
- sequenzy/sms/client.py +313 -0
- sequenzy/sms/raw_client.py +663 -0
- sequenzy/sms/types/__init__.py +53 -0
- sequenzy/sms/types/get_settings_sms_response.py +22 -0
- sequenzy/sms/types/get_settings_sms_response_sms.py +35 -0
- sequenzy/sms/types/get_settings_sms_response_sms_numbers_item.py +39 -0
- sequenzy/sms/types/send_test_sms_response.py +28 -0
- sequenzy/sms/types/update_number_label_sms_response.py +22 -0
- sequenzy/sms/types/update_number_label_sms_response_number.py +25 -0
- sequenzy/subscribers/__init__.py +229 -0
- sequenzy/subscribers/client.py +2872 -0
- sequenzy/subscribers/events/__init__.py +67 -0
- sequenzy/subscribers/events/client.py +352 -0
- sequenzy/subscribers/events/raw_client.py +460 -0
- sequenzy/subscribers/events/types/__init__.py +65 -0
- sequenzy/subscribers/events/types/trigger_bulk_events_request_events_item.py +47 -0
- sequenzy/subscribers/events/types/trigger_bulk_events_response.py +38 -0
- sequenzy/subscribers/events/types/trigger_bulk_events_response_events_item.py +41 -0
- sequenzy/subscribers/events/types/trigger_bulk_events_response_opt_in.py +28 -0
- sequenzy/subscribers/events/types/trigger_bulk_events_response_subscriber.py +25 -0
- sequenzy/subscribers/events/types/trigger_events_response.py +76 -0
- sequenzy/subscribers/events/types/trigger_events_response_event.py +35 -0
- sequenzy/subscribers/events/types/trigger_events_response_events_item.py +26 -0
- sequenzy/subscribers/events/types/trigger_events_response_opt_in.py +28 -0
- sequenzy/subscribers/events/types/trigger_events_response_subscriber.py +25 -0
- sequenzy/subscribers/raw_client.py +4840 -0
- sequenzy/subscribers/tags/__init__.py +58 -0
- sequenzy/subscribers/tags/client.py +302 -0
- sequenzy/subscribers/tags/raw_client.py +415 -0
- sequenzy/subscribers/tags/types/__init__.py +56 -0
- sequenzy/subscribers/tags/types/add_tags_response.py +38 -0
- sequenzy/subscribers/tags/types/add_tags_response_opt_in.py +28 -0
- sequenzy/subscribers/tags/types/add_tags_response_subscriber.py +30 -0
- sequenzy/subscribers/tags/types/add_tags_response_tag.py +25 -0
- sequenzy/subscribers/tags/types/remove_tags_response.py +23 -0
- sequenzy/subscribers/tags/types/remove_tags_response_subscriber.py +30 -0
- sequenzy/subscribers/tags/types/remove_tags_response_tag.py +23 -0
- sequenzy/subscribers/types/__init__.py +173 -0
- sequenzy/subscribers/types/add_tags_bulk_response.py +38 -0
- sequenzy/subscribers/types/add_tags_bulk_response_opt_in.py +28 -0
- sequenzy/subscribers/types/add_tags_bulk_response_subscriber.py +26 -0
- sequenzy/subscribers/types/add_tags_bulk_response_tags.py +27 -0
- sequenzy/subscribers/types/create_import_subscribers_request_duplicate_strategy.py +5 -0
- sequenzy/subscribers/types/create_import_subscribers_request_opt_in_mode.py +7 -0
- sequenzy/subscribers/types/create_import_subscribers_response.py +27 -0
- sequenzy/subscribers/types/create_note_by_external_id_subscribers_response.py +21 -0
- sequenzy/subscribers/types/create_note_subscribers_response.py +21 -0
- sequenzy/subscribers/types/create_subscribers_request_duplicate_strategy.py +5 -0
- sequenzy/subscribers/types/create_subscribers_request_opt_in_mode.py +5 -0
- sequenzy/subscribers/types/create_subscribers_request_status.py +5 -0
- sequenzy/subscribers/types/create_subscribers_response.py +35 -0
- sequenzy/subscribers/types/create_subscribers_response_opt_in.py +28 -0
- sequenzy/subscribers/types/create_subscribers_response_subscriber.py +33 -0
- sequenzy/subscribers/types/delete_by_external_id_path_subscribers_response.py +20 -0
- sequenzy/subscribers/types/delete_by_external_id_subscribers_response.py +20 -0
- sequenzy/subscribers/types/delete_note_subscribers_response.py +26 -0
- sequenzy/subscribers/types/delete_subscribers_response.py +20 -0
- sequenzy/subscribers/types/get_account_info_response.py +21 -0
- sequenzy/subscribers/types/get_account_info_response_account.py +26 -0
- sequenzy/subscribers/types/get_by_external_id_path_subscribers_response.py +21 -0
- sequenzy/subscribers/types/get_by_external_id_subscribers_response.py +21 -0
- sequenzy/subscribers/types/get_import_subscribers_response.py +25 -0
- sequenzy/subscribers/types/get_subscribers_response.py +21 -0
- sequenzy/subscribers/types/import_events_subscribers_request_events_item.py +71 -0
- sequenzy/subscribers/types/import_events_subscribers_response.py +83 -0
- sequenzy/subscribers/types/import_events_subscribers_response_failures_item.py +20 -0
- sequenzy/subscribers/types/import_events_subscribers_response_side_effect_failures_item.py +21 -0
- sequenzy/subscribers/types/list_notes_by_external_id_subscribers_response.py +21 -0
- sequenzy/subscribers/types/list_notes_subscribers_response.py +21 -0
- sequenzy/subscribers/types/list_subscribers_request_attribute_operator.py +7 -0
- sequenzy/subscribers/types/list_subscribers_request_include_total.py +5 -0
- sequenzy/subscribers/types/list_subscribers_request_status.py +5 -0
- sequenzy/subscribers/types/list_subscribers_response.py +23 -0
- sequenzy/subscribers/types/update_by_external_id_path_subscribers_request_custom_attributes_strategy.py +7 -0
- sequenzy/subscribers/types/update_by_external_id_path_subscribers_request_status.py +7 -0
- sequenzy/subscribers/types/update_by_external_id_path_subscribers_response.py +21 -0
- sequenzy/subscribers/types/update_by_external_id_subscribers_request_custom_attributes_strategy.py +7 -0
- sequenzy/subscribers/types/update_by_external_id_subscribers_request_status.py +7 -0
- sequenzy/subscribers/types/update_by_external_id_subscribers_response.py +21 -0
- sequenzy/subscribers/types/update_subscribers_request_custom_attributes_strategy.py +5 -0
- sequenzy/subscribers/types/update_subscribers_request_status.py +5 -0
- sequenzy/subscribers/types/update_subscribers_response.py +21 -0
- sequenzy/suppressions/__init__.py +94 -0
- sequenzy/suppressions/client.py +358 -0
- sequenzy/suppressions/raw_client.py +760 -0
- sequenzy/suppressions/types/__init__.py +98 -0
- sequenzy/suppressions/types/get_suppressions_response.py +21 -0
- sequenzy/suppressions/types/get_suppressions_response_suppression.py +29 -0
- sequenzy/suppressions/types/get_suppressions_response_suppression_local.py +51 -0
- sequenzy/suppressions/types/get_suppressions_response_suppression_local_scope.py +5 -0
- sequenzy/suppressions/types/get_suppressions_response_suppression_local_suppression_type.py +7 -0
- sequenzy/suppressions/types/get_suppressions_response_suppression_ses.py +25 -0
- sequenzy/suppressions/types/get_suppressions_response_suppression_ses_entries_item.py +36 -0
- sequenzy/suppressions/types/get_suppressions_response_suppression_ses_entries_item_reason.py +5 -0
- sequenzy/suppressions/types/list_suppressions_request_order.py +5 -0
- sequenzy/suppressions/types/list_suppressions_request_sort.py +5 -0
- sequenzy/suppressions/types/list_suppressions_response.py +49 -0
- sequenzy/suppressions/types/list_suppressions_response_sort_by.py +5 -0
- sequenzy/suppressions/types/list_suppressions_response_sort_order.py +5 -0
- sequenzy/suppressions/types/list_suppressions_response_suppressions_item.py +63 -0
- sequenzy/suppressions/types/list_suppressions_response_suppressions_item_reason.py +5 -0
- sequenzy/suppressions/types/list_suppressions_response_suppressions_item_scope.py +5 -0
- sequenzy/suppressions/types/list_suppressions_response_suppressions_item_source.py +7 -0
- sequenzy/suppressions/types/list_suppressions_response_suppressions_item_suppression_type.py +7 -0
- sequenzy/suppressions/types/remove_suppressions_response.py +52 -0
- sequenzy/sync_rules/__init__.py +34 -0
- sequenzy/sync_rules/client.py +223 -0
- sequenzy/sync_rules/raw_client.py +330 -0
- sequenzy/sync_rules/types/__init__.py +38 -0
- sequenzy/sync_rules/types/get_sync_rules_response.py +34 -0
- sequenzy/sync_rules/types/update_sync_rules_response.py +29 -0
- sequenzy/tags/__init__.py +39 -0
- sequenzy/tags/client.py +340 -0
- sequenzy/tags/raw_client.py +746 -0
- sequenzy/tags/types/__init__.py +42 -0
- sequenzy/tags/types/create_tags_response.py +21 -0
- sequenzy/tags/types/delete_tags_response.py +19 -0
- sequenzy/tags/types/list_tags_response.py +21 -0
- sequenzy/tags/types/update_tags_response.py +21 -0
- sequenzy/team/__init__.py +55 -0
- sequenzy/team/client.py +282 -0
- sequenzy/team/raw_client.py +658 -0
- sequenzy/team/types/__init__.py +53 -0
- sequenzy/team/types/cancel_invitation_team_response.py +19 -0
- sequenzy/team/types/invite_team_request_role.py +5 -0
- sequenzy/team/types/invite_team_response.py +23 -0
- sequenzy/team/types/invite_team_response_invitation.py +35 -0
- sequenzy/team/types/invite_team_response_invitation_role.py +5 -0
- sequenzy/team/types/list_team_response.py +21 -0
- sequenzy/templates/__init__.py +73 -0
- sequenzy/templates/client.py +1152 -0
- sequenzy/templates/raw_client.py +2088 -0
- sequenzy/templates/types/__init__.py +71 -0
- sequenzy/templates/types/create_share_link_templates_response.py +44 -0
- sequenzy/templates/types/create_templates_response.py +23 -0
- sequenzy/templates/types/create_templates_response_template.py +22 -0
- sequenzy/templates/types/delete_templates_response.py +25 -0
- sequenzy/templates/types/get_templates_response.py +27 -0
- sequenzy/templates/types/list_templates_response.py +33 -0
- sequenzy/templates/types/list_templates_response_pagination.py +34 -0
- sequenzy/templates/types/revoke_share_link_templates_response.py +24 -0
- sequenzy/templates/types/set_localization_templates_response.py +33 -0
- sequenzy/templates/types/sync_localizations_templates_response.py +30 -0
- sequenzy/templates/types/update_templates_response.py +24 -0
- sequenzy/templates/types/update_templates_response_template.py +27 -0
- sequenzy/tests/conftest.py +21 -0
- sequenzy/tests/test_aiohttp_autodetect.py +113 -0
- sequenzy/tracking_settings/__init__.py +37 -0
- sequenzy/tracking_settings/client.py +267 -0
- sequenzy/tracking_settings/raw_client.py +415 -0
- sequenzy/tracking_settings/types/__init__.py +38 -0
- sequenzy/tracking_settings/types/update_tracking_settings_request_auto_utm_settings.py +27 -0
- sequenzy/tracking_settings/types/update_tracking_settings_response.py +20 -0
- sequenzy/transactional/__init__.py +103 -0
- sequenzy/transactional/client.py +968 -0
- sequenzy/transactional/raw_client.py +1678 -0
- sequenzy/transactional/types/__init__.py +103 -0
- sequenzy/transactional/types/create_transactional_response.py +28 -0
- sequenzy/transactional/types/delete_transactional_response.py +22 -0
- sequenzy/transactional/types/delete_transactional_response_deleted.py +35 -0
- sequenzy/transactional/types/get_transactional_response.py +26 -0
- sequenzy/transactional/types/list_transactional_request_order.py +5 -0
- sequenzy/transactional/types/list_transactional_request_sort.py +7 -0
- sequenzy/transactional/types/list_transactional_request_status.py +5 -0
- sequenzy/transactional/types/list_transactional_response.py +21 -0
- sequenzy/transactional/types/send_transactional_request_bcc.py +5 -0
- sequenzy/transactional/types/send_transactional_request_cc.py +5 -0
- sequenzy/transactional/types/send_transactional_request_email_type.py +5 -0
- sequenzy/transactional/types/send_transactional_request_to.py +5 -0
- sequenzy/transactional/types/send_transactional_request_tracking_settings.py +46 -0
- sequenzy/transactional/types/send_transactional_response.py +8 -0
- sequenzy/transactional/types/send_transactional_response_one.py +67 -0
- sequenzy/transactional/types/send_transactional_response_one_email_type.py +5 -0
- sequenzy/transactional/types/send_transactional_response_one_to.py +5 -0
- sequenzy/transactional/types/send_transactional_response_transactional.py +69 -0
- sequenzy/transactional/types/send_transactional_response_transactional_email_type.py +5 -0
- sequenzy/transactional/types/send_transactional_response_transactional_to.py +5 -0
- sequenzy/transactional/types/send_transactional_response_transactional_transactional.py +21 -0
- sequenzy/transactional/types/update_transactional_response.py +28 -0
- sequenzy/types/__init__.py +1409 -0
- sequenzy/types/ab_test.py +119 -0
- sequenzy/types/ab_test_content_editing.py +30 -0
- sequenzy/types/ab_test_kind.py +5 -0
- sequenzy/types/ab_test_test_type.py +5 -0
- sequenzy/types/ab_test_variant.py +63 -0
- sequenzy/types/ad_account.py +20 -0
- sequenzy/types/agent_friendly_error.py +55 -0
- sequenzy/types/api_key_metadata.py +65 -0
- sequenzy/types/api_key_metadata_type.py +5 -0
- sequenzy/types/attachment.py +58 -0
- sequenzy/types/audience_sync.py +72 -0
- sequenzy/types/audience_sync_frequency.py +5 -0
- sequenzy/types/bad_request_error_body.py +21 -0
- sequenzy/types/bad_request_error_body_error.py +20 -0
- sequenzy/types/block_field_warnings.py +8 -0
- sequenzy/types/bulk_subscriber_tag_request.py +63 -0
- sequenzy/types/bulk_subscriber_tag_response.py +76 -0
- sequenzy/types/bulk_subscriber_tag_response_failures_item.py +25 -0
- sequenzy/types/bulk_subscriber_tag_response_not_found.py +31 -0
- sequenzy/types/campaign_channel.py +5 -0
- sequenzy/types/campaign_detail.py +108 -0
- sequenzy/types/campaign_goal.py +71 -0
- sequenzy/types/campaign_goal_attribute_condition.py +5 -0
- sequenzy/types/campaign_goal_input.py +65 -0
- sequenzy/types/campaign_goal_input_attribute_condition.py +7 -0
- sequenzy/types/campaign_goal_input_trigger_type.py +5 -0
- sequenzy/types/campaign_goal_metrics.py +33 -0
- sequenzy/types/campaign_goal_scope.py +5 -0
- sequenzy/types/campaign_goal_trigger_type.py +5 -0
- sequenzy/types/campaign_status.py +8 -0
- sequenzy/types/campaign_summary.py +160 -0
- sequenzy/types/clicked_link.py +36 -0
- sequenzy/types/commerce_customer.py +41 -0
- sequenzy/types/commerce_forecast_range.py +26 -0
- sequenzy/types/commerce_order_item.py +55 -0
- sequenzy/types/commerce_product.py +99 -0
- sequenzy/types/commerce_product_provider.py +5 -0
- sequenzy/types/commerce_product_variants_item.py +47 -0
- sequenzy/types/commerce_product_variants_item_options_item.py +20 -0
- sequenzy/types/commerce_value_forecast.py +47 -0
- sequenzy/types/commerce_value_forecast_actual.py +33 -0
- sequenzy/types/commerce_value_forecast_confidence.py +5 -0
- sequenzy/types/commerce_value_forecast_eligibility.py +20 -0
- sequenzy/types/commerce_value_forecast_eligibility_reasons_item.py +22 -0
- sequenzy/types/commerce_value_forecast_forecast.py +56 -0
- sequenzy/types/commerce_value_forecast_history.py +40 -0
- sequenzy/types/commerce_value_forecast_status.py +5 -0
- sequenzy/types/company.py +204 -0
- sequenzy/types/company_email_length_preference.py +5 -0
- sequenzy/types/company_reply_tracking_domain_mode.py +5 -0
- sequenzy/types/conversation_message.py +61 -0
- sequenzy/types/conversation_message_type.py +5 -0
- sequenzy/types/conversation_summary.py +51 -0
- sequenzy/types/conversation_summary_context.py +27 -0
- sequenzy/types/conversation_summary_status.py +5 -0
- sequenzy/types/detailed_subscriber.py +37 -0
- sequenzy/types/email.py +44 -0
- sequenzy/types/email_block.py +108 -0
- sequenzy/types/email_block_condition_field_reference.py +74 -0
- sequenzy/types/email_block_condition_field_reference_preview_support.py +7 -0
- sequenzy/types/email_block_conditions_item.py +31 -0
- sequenzy/types/email_block_conditions_item_field.py +7 -0
- sequenzy/types/email_block_conditions_item_operator.py +8 -0
- sequenzy/types/email_block_field_reference.py +53 -0
- sequenzy/types/email_block_layout.py +5 -0
- sequenzy/types/email_block_overlay_position.py +5 -0
- sequenzy/types/email_block_styles.py +69 -0
- sequenzy/types/email_block_styles_text_align.py +5 -0
- sequenzy/types/email_block_type.py +47 -0
- sequenzy/types/email_block_type_reference.py +49 -0
- sequenzy/types/email_body_input.py +34 -0
- sequenzy/types/email_component.py +64 -0
- sequenzy/types/email_component_component_type.py +5 -0
- sequenzy/types/email_component_default_slot.py +5 -0
- sequenzy/types/email_event.py +89 -0
- sequenzy/types/email_event_email_type.py +5 -0
- sequenzy/types/email_event_event_type.py +10 -0
- sequenzy/types/email_preset.py +5 -0
- sequenzy/types/email_send.py +250 -0
- sequenzy/types/email_send_additional_recipients.py +25 -0
- sequenzy/types/email_send_automation.py +20 -0
- sequenzy/types/email_send_campaign.py +20 -0
- sequenzy/types/email_send_email_type.py +5 -0
- sequenzy/types/email_send_event.py +101 -0
- sequenzy/types/email_send_event_delivery_policy.py +5 -0
- sequenzy/types/email_send_event_email_type.py +5 -0
- sequenzy/types/email_send_internal_failure_code.py +7 -0
- sequenzy/types/email_send_status.py +10 -0
- sequenzy/types/email_send_subscriber.py +28 -0
- sequenzy/types/email_send_suppression_reason.py +5 -0
- sequenzy/types/email_send_type.py +5 -0
- sequenzy/types/email_theme_patch.py +40 -0
- sequenzy/types/email_theme_patch_button_style.py +5 -0
- sequenzy/types/email_theme_patch_colors.py +33 -0
- sequenzy/types/email_theme_patch_layout.py +52 -0
- sequenzy/types/email_theme_patch_preset_id.py +5 -0
- sequenzy/types/email_theme_patch_typography.py +55 -0
- sequenzy/types/engagement_stats.py +143 -0
- sequenzy/types/engagement_stats_rate_denominator_basis.py +5 -0
- sequenzy/types/error.py +30 -0
- sequenzy/types/event_schema.py +71 -0
- sequenzy/types/event_schema_documented_providers_item.py +7 -0
- sequenzy/types/event_schema_providers_item.py +33 -0
- sequenzy/types/event_schema_providers_item_properties_item.py +43 -0
- sequenzy/types/event_schema_providers_item_provider.py +7 -0
- sequenzy/types/filter_group.py +39 -0
- sequenzy/types/filter_group_children_item.py +54 -0
- sequenzy/types/filter_group_join_operator.py +5 -0
- sequenzy/types/filter_group_kind.py +5 -0
- sequenzy/types/filter_leaf.py +41 -0
- sequenzy/types/filter_leaf_field.py +33 -0
- sequenzy/types/filter_leaf_kind.py +5 -0
- sequenzy/types/filter_leaf_operator.py +25 -0
- sequenzy/types/integration_activity_entry.py +86 -0
- sequenzy/types/integration_activity_entry_status.py +7 -0
- sequenzy/types/integration_detail.py +74 -0
- sequenzy/types/integration_detail_activity.py +42 -0
- sequenzy/types/integration_detail_activity_recent_failures_item.py +30 -0
- sequenzy/types/integration_detail_ingestion.py +88 -0
- sequenzy/types/integration_detail_ingestion_list_targeting.py +7 -0
- sequenzy/types/integration_detail_ingestion_lists_item.py +20 -0
- sequenzy/types/integration_detail_integration.py +91 -0
- sequenzy/types/integration_detail_integration_category.py +7 -0
- sequenzy/types/integration_detail_pixel.py +40 -0
- sequenzy/types/integration_detail_recommendations_item.py +23 -0
- sequenzy/types/integration_detail_recommendations_item_severity.py +5 -0
- sequenzy/types/integration_event_wiring.py +81 -0
- sequenzy/types/integration_event_wiring_listeners_item.py +37 -0
- sequenzy/types/integration_event_wiring_rule_source.py +5 -0
- sequenzy/types/integration_event_wiring_rules_item.py +27 -0
- sequenzy/types/integration_pixel_state.py +47 -0
- sequenzy/types/integration_pixel_state_pixel.py +68 -0
- sequenzy/types/integration_provider_capability.py +78 -0
- sequenzy/types/integration_provider_capability_actions_item.py +10 -0
- sequenzy/types/integration_provider_capability_availability.py +5 -0
- sequenzy/types/integration_provider_capability_category.py +7 -0
- sequenzy/types/integration_provider_capability_connect_fields_item.py +26 -0
- sequenzy/types/integration_provider_capability_connect_fields_item_key.py +7 -0
- sequenzy/types/integration_provider_capability_connect_method.py +7 -0
- sequenzy/types/integration_provider_capability_emits_item.py +27 -0
- sequenzy/types/integration_provider_capability_writes_attributes_item.py +20 -0
- sequenzy/types/integration_summary.py +91 -0
- sequenzy/types/integration_summary_category.py +7 -0
- sequenzy/types/integration_sync_skip_summary.py +47 -0
- sequenzy/types/integration_sync_skip_summary_records_item.py +27 -0
- sequenzy/types/integration_sync_skip_summary_records_item_outcome.py +5 -0
- sequenzy/types/internal_server_error_body.py +20 -0
- sequenzy/types/landing_page_content.py +41 -0
- sequenzy/types/landing_page_content_seo.py +50 -0
- sequenzy/types/landing_page_content_theme.py +46 -0
- sequenzy/types/landing_page_content_theme_section_animation.py +7 -0
- sequenzy/types/landing_page_content_theme_section_animation_speed.py +5 -0
- sequenzy/types/landing_page_domain.py +125 -0
- sequenzy/types/landing_page_domain_dns_record_type.py +5 -0
- sequenzy/types/landing_page_domain_domain_scope.py +5 -0
- sequenzy/types/landing_page_summary.py +94 -0
- sequenzy/types/landing_page_summary_custom_domain_scope.py +5 -0
- sequenzy/types/landing_page_summary_status.py +5 -0
- sequenzy/types/not_found_error_body.py +21 -0
- sequenzy/types/not_found_error_body_error.py +20 -0
- sequenzy/types/notification_preference.py +29 -0
- sequenzy/types/notification_preference_event.py +7 -0
- sequenzy/types/notification_preference_mode.py +5 -0
- sequenzy/types/notification_preferences.py +47 -0
- sequenzy/types/outbound_webhook_delivery.py +56 -0
- sequenzy/types/outbound_webhook_delivery_attempt.py +40 -0
- sequenzy/types/outbound_webhook_delivery_attempt_status.py +5 -0
- sequenzy/types/outbound_webhook_delivery_status.py +7 -0
- sequenzy/types/outbound_webhook_endpoint.py +80 -0
- sequenzy/types/outbound_webhook_endpoint_signing_secrets_item.py +26 -0
- sequenzy/types/outbound_webhook_endpoint_status.py +5 -0
- sequenzy/types/outbound_webhook_event_type.py +34 -0
- sequenzy/types/pagination.py +26 -0
- sequenzy/types/poll_response.py +85 -0
- sequenzy/types/poll_response_variant.py +5 -0
- sequenzy/types/poll_results_summary.py +84 -0
- sequenzy/types/poll_results_summary_answers_item.py +33 -0
- sequenzy/types/poll_results_summary_nps.py +30 -0
- sequenzy/types/poll_results_summary_variant.py +5 -0
- sequenzy/types/product.py +60 -0
- sequenzy/types/product_digital_delivery.py +40 -0
- sequenzy/types/product_digital_delivery_source.py +5 -0
- sequenzy/types/product_provider.py +5 -0
- sequenzy/types/recommendation_metrics.py +83 -0
- sequenzy/types/recommendation_metrics_revenue_by_currency_item.py +33 -0
- sequenzy/types/recommendation_metrics_top_products_item.py +35 -0
- sequenzy/types/render_email_request.py +65 -0
- sequenzy/types/render_email_request_subscriber.py +40 -0
- sequenzy/types/render_email_response.py +86 -0
- sequenzy/types/render_email_response_entity.py +26 -0
- sequenzy/types/render_email_response_entity_type.py +5 -0
- sequenzy/types/render_email_response_unevaluated_conditions_item.py +41 -0
- sequenzy/types/render_email_response_unevaluated_conditions_item_reason.py +7 -0
- sequenzy/types/render_email_response_unresolved_merge_tags_item.py +28 -0
- sequenzy/types/render_email_response_unresolved_merge_tags_item_reason.py +5 -0
- sequenzy/types/reply_profile_summary.py +30 -0
- sequenzy/types/resolved_audience_entity.py +28 -0
- sequenzy/types/resolved_audience_rule.py +24 -0
- sequenzy/types/resolved_audience_rule_type.py +5 -0
- sequenzy/types/resolved_campaign_audience.py +67 -0
- sequenzy/types/resolved_campaign_audience_filter_join_operator.py +5 -0
- sequenzy/types/resolved_campaign_audience_type.py +7 -0
- sequenzy/types/saved_popup.py +81 -0
- sequenzy/types/saved_popup_embed.py +36 -0
- sequenzy/types/saved_popup_frequency.py +30 -0
- sequenzy/types/saved_popup_schedule.py +37 -0
- sequenzy/types/saved_popup_stats.py +58 -0
- sequenzy/types/saved_popup_status.py +5 -0
- sequenzy/types/saved_popup_targeting.py +31 -0
- sequenzy/types/saved_popup_targeting_device.py +5 -0
- sequenzy/types/saved_popup_trigger.py +56 -0
- sequenzy/types/saved_popup_trigger_type.py +5 -0
- sequenzy/types/saved_popup_visual.py +37 -0
- sequenzy/types/saved_popup_visual_placement.py +5 -0
- sequenzy/types/saved_popup_visual_style.py +7 -0
- sequenzy/types/segment.py +53 -0
- sequenzy/types/segment_filter_join_operator.py +5 -0
- sequenzy/types/segment_format.py +5 -0
- sequenzy/types/sender_health_metric.py +37 -0
- sequenzy/types/sender_health_threshold_bound.py +24 -0
- sequenzy/types/sender_profile_summary.py +55 -0
- sequenzy/types/sending_status.py +85 -0
- sequenzy/types/sending_status_metrics_window.py +42 -0
- sequenzy/types/sending_status_metrics_window_kind.py +5 -0
- sequenzy/types/sending_status_pause_reason_kind.py +10 -0
- sequenzy/types/sending_status_remediation.py +37 -0
- sequenzy/types/sending_status_self_resume.py +78 -0
- sequenzy/types/sending_status_self_resume_ai_review_status.py +7 -0
- sequenzy/types/sending_status_self_resume_unavailable_reason.py +8 -0
- sequenzy/types/sending_status_sender_health.py +71 -0
- sequenzy/types/sending_status_sender_health_enforcement_mode.py +5 -0
- sequenzy/types/sending_status_status.py +5 -0
- sequenzy/types/sequence_ab_test_step_summary.py +53 -0
- sequenzy/types/sequence_ab_test_step_summary_test_type.py +5 -0
- sequenzy/types/sequence_ab_test_step_variant.py +54 -0
- sequenzy/types/sequence_action_response.py +79 -0
- sequenzy/types/sequence_branch_condition_input.py +155 -0
- sequenzy/types/sequence_branch_condition_input_activity_scope.py +7 -0
- sequenzy/types/sequence_branch_condition_input_condition_type.py +21 -0
- sequenzy/types/sequence_branch_input.py +102 -0
- sequenzy/types/sequence_branch_input_split_mode.py +5 -0
- sequenzy/types/sequence_branch_path_step_input.py +210 -0
- sequenzy/types/sequence_branch_path_step_input_ineligible_action.py +5 -0
- sequenzy/types/sequence_branch_path_step_input_node_type.py +22 -0
- sequenzy/types/sequence_branch_path_step_input_type.py +10 -0
- sequenzy/types/sequence_create_response.py +51 -0
- sequenzy/types/sequence_create_response_event_tracking.py +72 -0
- sequenzy/types/sequence_create_response_event_tracking_integration_guide.py +20 -0
- sequenzy/types/sequence_create_response_event_tracking_payload_contract.py +42 -0
- sequenzy/types/sequence_create_response_sequence.py +107 -0
- sequenzy/types/sequence_delay_input.py +134 -0
- sequenzy/types/sequence_delay_input_direction.py +5 -0
- sequenzy/types/sequence_delay_input_missing_action.py +5 -0
- sequenzy/types/sequence_delay_input_mode.py +5 -0
- sequenzy/types/sequence_delay_input_until_missing_action.py +5 -0
- sequenzy/types/sequence_delay_input_until_offset_direction.py +5 -0
- sequenzy/types/sequence_delay_offset_input.py +25 -0
- sequenzy/types/sequence_details.py +91 -0
- sequenzy/types/sequence_details_enrichment_status.py +5 -0
- sequenzy/types/sequence_discount_input.py +173 -0
- sequenzy/types/sequence_discount_input_discount_type.py +5 -0
- sequenzy/types/sequence_discount_input_duration.py +5 -0
- sequenzy/types/sequence_discount_input_provider.py +5 -0
- sequenzy/types/sequence_effective_status.py +7 -0
- sequenzy/types/sequence_email.py +206 -0
- sequenzy/types/sequence_email_delay_mode.py +5 -0
- sequenzy/types/sequence_email_email_preset.py +5 -0
- sequenzy/types/sequence_email_node_type.py +5 -0
- sequenzy/types/sequence_email_update_input.py +203 -0
- sequenzy/types/sequence_email_update_input_email_preset.py +5 -0
- sequenzy/types/sequence_enrollment_cancel_response.py +70 -0
- sequenzy/types/sequence_enrollment_cancel_response_enrollments_item.py +33 -0
- sequenzy/types/sequence_enrollment_counts.py +50 -0
- sequenzy/types/sequence_enrollment_counts_by_current_node_item.py +77 -0
- sequenzy/types/sequence_enrollment_list_response.py +61 -0
- sequenzy/types/sequence_enrollment_list_response_enrollments_item.py +203 -0
- sequenzy/types/sequence_enrollment_list_response_enrollments_item_entered_via.py +44 -0
- sequenzy/types/sequence_enrollment_list_response_enrollments_item_entered_via_kind.py +8 -0
- sequenzy/types/sequence_enrollment_list_response_enrollments_item_status.py +7 -0
- sequenzy/types/sequence_enrollment_list_response_pagination.py +27 -0
- sequenzy/types/sequence_enrollment_mode.py +5 -0
- sequenzy/types/sequence_enrollment_move_response.py +133 -0
- sequenzy/types/sequence_enrollment_move_response_enqueue_errors_item.py +24 -0
- sequenzy/types/sequence_enrollment_move_response_enrollments_item.py +33 -0
- sequenzy/types/sequence_enrollment_realign_job_response.py +36 -0
- sequenzy/types/sequence_enrollment_realign_job_response_status.py +7 -0
- sequenzy/types/sequence_enrollment_realign_queued_response.py +30 -0
- sequenzy/types/sequence_enrollment_realign_queued_response_status.py +5 -0
- sequenzy/types/sequence_enrollment_realign_response.py +125 -0
- sequenzy/types/sequence_enrollment_realign_response_changes_item.py +42 -0
- sequenzy/types/sequence_goal.py +69 -0
- sequenzy/types/sequence_goal_attribute_condition.py +5 -0
- sequenzy/types/sequence_goal_input.py +65 -0
- sequenzy/types/sequence_goal_input_attribute_condition.py +7 -0
- sequenzy/types/sequence_goal_input_trigger_type.py +5 -0
- sequenzy/types/sequence_goal_trigger_type.py +5 -0
- sequenzy/types/sequence_graph_edge_input.py +42 -0
- sequenzy/types/sequence_graph_edit_input.py +76 -0
- sequenzy/types/sequence_graph_edit_input_action.py +7 -0
- sequenzy/types/sequence_inbound_webhook.py +50 -0
- sequenzy/types/sequence_inbound_webhook_field_mapping.py +32 -0
- sequenzy/types/sequence_inbound_webhook_status.py +5 -0
- sequenzy/types/sequence_linear_step_insertion_input.py +42 -0
- sequenzy/types/sequence_node.py +64 -0
- sequenzy/types/sequence_node_update_hints.py +45 -0
- sequenzy/types/sequence_node_update_input.py +47 -0
- sequenzy/types/sequence_node_update_input_changes.py +49 -0
- sequenzy/types/sequence_node_update_input_changes_email_preset.py +5 -0
- sequenzy/types/sequence_path_step_config.py +329 -0
- sequenzy/types/sequence_path_step_config_activity_scope.py +7 -0
- sequenzy/types/sequence_path_step_config_condition_type.py +21 -0
- sequenzy/types/sequence_path_step_config_method.py +5 -0
- sequenzy/types/sequence_path_step_config_on_error.py +5 -0
- sequenzy/types/sequence_path_step_config_output_fields_item.py +46 -0
- sequenzy/types/sequence_path_step_config_timeout_action.py +5 -0
- sequenzy/types/sequence_position.py +20 -0
- sequenzy/types/sequence_sending_window.py +56 -0
- sequenzy/types/sequence_sending_window_days_item.py +7 -0
- sequenzy/types/sequence_sms_step_update_input.py +64 -0
- sequenzy/types/sequence_sms_step_update_input_ineligible_action.py +5 -0
- sequenzy/types/sequence_status.py +5 -0
- sequenzy/types/sequence_step_input.py +388 -0
- sequenzy/types/sequence_step_input_discount_type.py +5 -0
- sequenzy/types/sequence_step_input_duration.py +5 -0
- sequenzy/types/sequence_step_input_ineligible_action.py +5 -0
- sequenzy/types/sequence_step_input_node_type.py +7 -0
- sequenzy/types/sequence_step_input_provider.py +5 -0
- sequenzy/types/sequence_step_input_type.py +7 -0
- sequenzy/types/sequence_stop_condition.py +43 -0
- sequenzy/types/sequence_stop_condition_match_config.py +110 -0
- sequenzy/types/sequence_stop_condition_match_config_entry_audience.py +25 -0
- sequenzy/types/sequence_stop_condition_match_config_entry_audience_audience.py +5 -0
- sequenzy/types/sequence_stop_condition_match_config_event_property.py +22 -0
- sequenzy/types/sequence_stop_condition_match_config_event_property_filter.py +34 -0
- sequenzy/types/sequence_stop_condition_match_config_event_property_filter_property_filters_item.py +31 -0
- sequenzy/types/sequence_stop_condition_match_config_event_property_filter_property_filters_item_operator.py +8 -0
- sequenzy/types/sequence_stop_condition_match_config_event_property_rules_item.py +26 -0
- sequenzy/types/sequence_stop_condition_match_config_field_value.py +23 -0
- sequenzy/types/sequence_stop_condition_match_config_field_value_operator.py +7 -0
- sequenzy/types/sequence_stop_condition_type.py +17 -0
- sequenzy/types/sequence_subscriber_update_step_update_input.py +30 -0
- sequenzy/types/sequence_summary.py +151 -0
- sequenzy/types/sequence_summary_paused_by_user.py +21 -0
- sequenzy/types/sequence_trigger_property_filter.py +34 -0
- sequenzy/types/sequence_trigger_property_filter_operator.py +8 -0
- sequenzy/types/sequence_trigger_property_filter_value.py +9 -0
- sequenzy/types/sequence_trigger_property_filter_value_three_item.py +5 -0
- sequenzy/types/sequence_trigger_type.py +10 -0
- sequenzy/types/sequence_wait_until_input.py +93 -0
- sequenzy/types/sequence_wait_until_input_direction.py +5 -0
- sequenzy/types/sequence_wait_until_input_missing_action.py +5 -0
- sequenzy/types/sequence_wait_until_input_until_missing_action.py +5 -0
- sequenzy/types/sequence_wait_until_input_until_offset_direction.py +5 -0
- sequenzy/types/sequence_wait_until_weekday_input.py +86 -0
- sequenzy/types/service_unavailable_error_body.py +26 -0
- sequenzy/types/shopify_browse_abandonment_settings.py +48 -0
- sequenzy/types/shopify_cart_abandonment_settings.py +60 -0
- sequenzy/types/shopify_price_drop_settings.py +59 -0
- sequenzy/types/subscriber.py +91 -0
- sequenzy/types/subscriber_activity_event.py +108 -0
- sequenzy/types/subscriber_activity_event_engagement_quality.py +5 -0
- sequenzy/types/subscriber_email_stats.py +25 -0
- sequenzy/types/subscriber_import.py +96 -0
- sequenzy/types/subscriber_import_record.py +69 -0
- sequenzy/types/subscriber_import_record_custom_attributes_value.py +11 -0
- sequenzy/types/subscriber_import_record_custom_attributes_value_three_item.py +5 -0
- sequenzy/types/subscriber_import_record_status.py +5 -0
- sequenzy/types/subscriber_import_status.py +5 -0
- sequenzy/types/subscriber_list.py +62 -0
- sequenzy/types/subscriber_list_membership.py +42 -0
- sequenzy/types/subscriber_list_pagination.py +54 -0
- sequenzy/types/subscriber_note.py +40 -0
- sequenzy/types/subscriber_note_author.py +21 -0
- sequenzy/types/subscriber_sequence_enrollment.py +54 -0
- sequenzy/types/subscriber_sms_status.py +7 -0
- sequenzy/types/subscriber_status.py +5 -0
- sequenzy/types/subscriber_update_config.py +39 -0
- sequenzy/types/subscriber_update_config_custom_attribute_updates_item.py +37 -0
- sequenzy/types/subscriber_update_config_custom_attribute_updates_item_value.py +5 -0
- sequenzy/types/subscriber_update_config_custom_attribute_updates_item_value_type.py +7 -0
- sequenzy/types/subscriber_update_config_status.py +5 -0
- sequenzy/types/sync_rule.py +36 -0
- sequenzy/types/sync_rule_actions.py +26 -0
- sequenzy/types/sync_rule_conditions.py +56 -0
- sequenzy/types/sync_rule_conditions_purchased_product.py +32 -0
- sequenzy/types/tag_definition.py +26 -0
- sequenzy/types/team_member.py +53 -0
- sequenzy/types/team_member_invited_by.py +21 -0
- sequenzy/types/team_member_kind.py +5 -0
- sequenzy/types/team_member_role.py +5 -0
- sequenzy/types/team_member_status.py +5 -0
- sequenzy/types/team_member_user.py +22 -0
- sequenzy/types/template_detail.py +52 -0
- sequenzy/types/template_localization.py +51 -0
- sequenzy/types/template_localization_status.py +5 -0
- sequenzy/types/template_summary.py +43 -0
- sequenzy/types/too_many_requests_error_body.py +20 -0
- sequenzy/types/tracking_settings.py +50 -0
- sequenzy/types/tracking_settings_auto_utm.py +20 -0
- sequenzy/types/tracking_settings_consent.py +59 -0
- sequenzy/types/tracking_settings_reply_tracking.py +31 -0
- sequenzy/types/tracking_settings_tracking.py +48 -0
- sequenzy/types/tracking_settings_tracking_domain.py +37 -0
- sequenzy/types/transactional_email.py +34 -0
- sequenzy/types/transactional_email_details.py +40 -0
- sequenzy/types/transactional_email_list_item.py +28 -0
- sequenzy/types/transactional_email_list_item_stats.py +31 -0
- sequenzy/types/transactional_metrics_response.py +49 -0
- sequenzy/types/transactional_metrics_response_bounce_breakdown.py +25 -0
- sequenzy/types/transactional_metrics_response_bounce_breakdown_subtypes_item.py +28 -0
- sequenzy/types/transactional_metrics_response_bounce_breakdown_subtypes_item_type.py +7 -0
- sequenzy/types/transactional_metrics_response_clicked_links_item.py +21 -0
- sequenzy/types/transactional_metrics_response_complaints.py +20 -0
- sequenzy/types/transactional_metrics_response_engagement_breakdown.py +26 -0
- sequenzy/types/transactional_metrics_response_engagement_breakdown_human.py +20 -0
- sequenzy/types/transactional_metrics_response_engagement_breakdown_machine.py +20 -0
- sequenzy/types/transactional_metrics_response_stats.py +25 -0
- sequenzy/types/transactional_metrics_response_transactional.py +21 -0
- sequenzy/types/transactional_send_diagnostics.py +41 -0
- sequenzy/types/transactional_send_diagnostics_missing_required_variables_item.py +34 -0
- sequenzy/types/transactional_send_diagnostics_missing_required_variables_item_used_in_item.py +31 -0
- sequenzy/types/transactional_send_diagnostics_missing_required_variables_item_used_in_item_surface.py +7 -0
- sequenzy/types/transactional_send_diagnostics_status.py +5 -0
- sequenzy/types/transactional_send_diagnostics_unused_variables_item.py +21 -0
- sequenzy/types/unauthorized_error_body.py +21 -0
- sequenzy/types/unauthorized_error_body_error.py +20 -0
- sequenzy/types/unprocessable_entity_error_body.py +26 -0
- sequenzy/types/url_attachment.py +31 -0
- sequenzy/types/web_tracking_key.py +100 -0
- sequenzy/types/website.py +102 -0
- sequenzy/types/website_readiness.py +26 -0
- sequenzy/types/website_readiness_reason.py +10 -0
- sequenzy/types/website_readiness_status.py +7 -0
- sequenzy/types/website_status.py +7 -0
- sequenzy/web_tracking_keys/__init__.py +55 -0
- sequenzy/web_tracking_keys/client.py +554 -0
- sequenzy/web_tracking_keys/raw_client.py +1087 -0
- sequenzy/web_tracking_keys/types/__init__.py +53 -0
- sequenzy/web_tracking_keys/types/create_web_tracking_keys_response.py +22 -0
- sequenzy/web_tracking_keys/types/delete_web_tracking_keys_response.py +20 -0
- sequenzy/web_tracking_keys/types/get_web_tracking_keys_response.py +21 -0
- sequenzy/web_tracking_keys/types/list_web_tracking_keys_response.py +21 -0
- sequenzy/web_tracking_keys/types/mint_identity_web_tracking_keys_response.py +47 -0
- sequenzy/web_tracking_keys/types/update_web_tracking_keys_response.py +21 -0
- sequenzy/webhooks/__init__.py +70 -0
- sequenzy/webhooks/client.py +834 -0
- sequenzy/webhooks/raw_client.py +1602 -0
- sequenzy/webhooks/types/__init__.py +68 -0
- sequenzy/webhooks/types/add_signing_secret_webhooks_response.py +21 -0
- sequenzy/webhooks/types/create_webhooks_response.py +21 -0
- sequenzy/webhooks/types/delete_webhooks_response.py +21 -0
- sequenzy/webhooks/types/list_deliveries_webhooks_response.py +21 -0
- sequenzy/webhooks/types/list_delivery_attempts_webhooks_response.py +21 -0
- sequenzy/webhooks/types/list_webhooks_response.py +21 -0
- sequenzy/webhooks/types/remove_signing_secret_webhooks_response.py +21 -0
- sequenzy/webhooks/types/replay_delivery_webhooks_response.py +21 -0
- sequenzy/webhooks/types/test_webhooks_response.py +29 -0
- sequenzy/webhooks/types/update_webhooks_request_status.py +5 -0
- sequenzy/webhooks/types/update_webhooks_response.py +21 -0
- sequenzy/websites/__init__.py +39 -0
- sequenzy/websites/client.py +320 -0
- sequenzy/websites/raw_client.py +696 -0
- sequenzy/websites/types/__init__.py +42 -0
- sequenzy/websites/types/add_websites_response.py +21 -0
- sequenzy/websites/types/get_websites_response.py +21 -0
- sequenzy/websites/types/list_websites_response.py +21 -0
- sequenzy/websites/types/verify_sending_domain_response.py +42 -0
- sequenzy/widgets/__init__.py +133 -0
- sequenzy/widgets/client.py +2327 -0
- sequenzy/widgets/preferences/__init__.py +34 -0
- sequenzy/widgets/preferences/client.py +123 -0
- sequenzy/widgets/preferences/raw_client.py +224 -0
- sequenzy/widgets/preferences/types/__init__.py +34 -0
- sequenzy/widgets/preferences/types/generate_token_preferences_response.py +23 -0
- sequenzy/widgets/raw_client.py +3966 -0
- sequenzy/widgets/types/__init__.py +127 -0
- sequenzy/widgets/types/create_saved_form_request_duplicate_strategy.py +5 -0
- sequenzy/widgets/types/create_saved_form_response.py +21 -0
- sequenzy/widgets/types/create_saved_popup_request_duplicate_strategy.py +5 -0
- sequenzy/widgets/types/create_saved_popup_request_placement.py +5 -0
- sequenzy/widgets/types/create_saved_popup_request_presentation.py +7 -0
- sequenzy/widgets/types/create_saved_popup_request_status.py +5 -0
- sequenzy/widgets/types/create_saved_popup_request_template.py +21 -0
- sequenzy/widgets/types/create_saved_popup_response.py +24 -0
- sequenzy/widgets/types/delete_saved_popup_response.py +25 -0
- sequenzy/widgets/types/duplicate_saved_popup_response.py +22 -0
- sequenzy/widgets/types/get_saved_form_embed_response.py +22 -0
- sequenzy/widgets/types/get_saved_form_embed_response_embed.py +36 -0
- sequenzy/widgets/types/get_saved_popup_embed_response.py +23 -0
- sequenzy/widgets/types/get_saved_popup_response.py +23 -0
- sequenzy/widgets/types/list_saved_forms_response.py +24 -0
- sequenzy/widgets/types/list_saved_forms_response_forms_item.py +27 -0
- sequenzy/widgets/types/list_saved_popups_request_include_content.py +5 -0
- sequenzy/widgets/types/list_saved_popups_response.py +30 -0
- sequenzy/widgets/types/submit_company_scoped_saved_signup_form_request_duplicate_strategy.py +7 -0
- sequenzy/widgets/types/submit_company_scoped_saved_signup_form_response.py +19 -0
- sequenzy/widgets/types/submit_saved_popup_response.py +32 -0
- sequenzy/widgets/types/submit_signup_form_request_duplicate_strategy.py +5 -0
- sequenzy/widgets/types/submit_signup_form_response.py +19 -0
- sequenzy/widgets/types/update_saved_form_request_duplicate_strategy.py +5 -0
- sequenzy/widgets/types/update_saved_form_response.py +26 -0
- sequenzy/widgets/types/update_saved_popup_request_duplicate_strategy.py +5 -0
- sequenzy/widgets/types/update_saved_popup_request_placement.py +5 -0
- sequenzy/widgets/types/update_saved_popup_request_presentation.py +7 -0
- sequenzy/widgets/types/update_saved_popup_request_status.py +5 -0
- sequenzy/widgets/types/update_saved_popup_response.py +24 -0
- sequenzy-2.0.0.dist-info/METADATA +204 -0
- sequenzy-2.0.0.dist-info/RECORD +1149 -0
- sequenzy-2.0.0.dist-info/WHEEL +4 -0
- 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)
|