diff --git a/facebook_business/__init__.py b/facebook_business/__init__.py index 1da9f34b..12ba84a6 100644 --- a/facebook_business/__init__.py +++ b/facebook_business/__init__.py @@ -7,7 +7,7 @@ from facebook_business.session import FacebookSession from facebook_business.api import FacebookAdsApi -__version__ = '18.0.3' +__version__ = '18.0.4' __all__ = [ 'session', 'objects', diff --git a/facebook_business/adobjects/ad.py b/facebook_business/adobjects/ad.py index ba98715c..f392b10c 100644 --- a/facebook_business/adobjects/ad.py +++ b/facebook_business/adobjects/ad.py @@ -55,7 +55,6 @@ class Field(AbstractObject.Field): id = 'id' issues_info = 'issues_info' last_updated_by_app_id = 'last_updated_by_app_id' - meta_reward_adgroup_status = 'meta_reward_adgroup_status' name = 'name' preview_shareable_link = 'preview_shareable_link' priority = 'priority' @@ -135,10 +134,6 @@ class ExecutionOptions: synchronous_ad_review = 'synchronous_ad_review' validate_only = 'validate_only' - class MetaRewardAdgroupStatus: - active = 'ACTIVE' - inactive = 'INACTIVE' - class Operator: all = 'ALL' any = 'ANY' @@ -263,7 +258,6 @@ def api_update(self, fields=None, params=None, batch=None, success=None, failure 'engagement_audience': 'bool', 'execution_options': 'list', 'include_demolink_hashes': 'bool', - 'meta_reward_adgroup_status': 'meta_reward_adgroup_status_enum', 'name': 'string', 'priority': 'unsigned int', 'status': 'status_enum', @@ -271,7 +265,6 @@ def api_update(self, fields=None, params=None, batch=None, success=None, failure } enums = { 'execution_options_enum': Ad.ExecutionOptions.__dict__.values(), - 'meta_reward_adgroup_status_enum': Ad.MetaRewardAdgroupStatus.__dict__.values(), 'status_enum': Ad.Status.__dict__.values(), } request = FacebookRequest( @@ -725,7 +718,6 @@ def get_targeting_sentence_lines(self, fields=None, params=None, batch=None, suc 'id': 'string', 'issues_info': 'list', 'last_updated_by_app_id': 'string', - 'meta_reward_adgroup_status': 'string', 'name': 'string', 'preview_shareable_link': 'string', 'priority': 'unsigned int', @@ -754,7 +746,6 @@ def _get_field_enum_info(cls): field_enum_info['Status'] = Ad.Status.__dict__.values() field_enum_info['DatePreset'] = Ad.DatePreset.__dict__.values() field_enum_info['ExecutionOptions'] = Ad.ExecutionOptions.__dict__.values() - field_enum_info['MetaRewardAdgroupStatus'] = Ad.MetaRewardAdgroupStatus.__dict__.values() field_enum_info['Operator'] = Ad.Operator.__dict__.values() field_enum_info['StatusOption'] = Ad.StatusOption.__dict__.values() return field_enum_info diff --git a/facebook_business/adobjects/adaccount.py b/facebook_business/adobjects/adaccount.py index b5057efd..da479eec 100644 --- a/facebook_business/adobjects/adaccount.py +++ b/facebook_business/adobjects/adaccount.py @@ -1154,7 +1154,6 @@ def create_ad(self, fields=None, params=None, batch=None, success=None, failure= 'engagement_audience': 'bool', 'execution_options': 'list', 'include_demolink_hashes': 'bool', - 'meta_reward_adgroup_status': 'meta_reward_adgroup_status_enum', 'name': 'string', 'priority': 'unsigned int', 'source_ad_id': 'string', @@ -1163,7 +1162,6 @@ def create_ad(self, fields=None, params=None, batch=None, success=None, failure= } enums = { 'execution_options_enum': Ad.ExecutionOptions.__dict__.values(), - 'meta_reward_adgroup_status_enum': Ad.MetaRewardAdgroupStatus.__dict__.values(), 'status_enum': Ad.Status.__dict__.values(), } request = FacebookRequest( @@ -2517,6 +2515,7 @@ def create_custom_audience(self, fields=None, params=None, batch=None, success=N 'subtype': 'subtype_enum', 'use_in_campaigns': 'bool', 'video_group_ids': 'list', + 'whats_app_business_phone_number_id': 'string', } enums = { 'claim_objective_enum': CustomAudience.ClaimObjective.__dict__.values(), diff --git a/facebook_business/adobjects/adaccountadvolume.py b/facebook_business/adobjects/adaccountadvolume.py index 04fc55b6..b8b80b71 100644 --- a/facebook_business/adobjects/adaccountadvolume.py +++ b/facebook_business/adobjects/adaccountadvolume.py @@ -39,9 +39,11 @@ class Field(AbstractObject.Field): class RecommendationType: ab_test = 'AB_TEST' + account_spend_limit = 'ACCOUNT_SPEND_LIMIT' aco_toggle = 'ACO_TOGGLE' ads_reporting = 'ADS_REPORTING' advanced_campaign_budget = 'ADVANCED_CAMPAIGN_BUDGET' + advantage_custom_audience = 'ADVANTAGE_CUSTOM_AUDIENCE' advantage_custom_audience_upsell = 'ADVANTAGE_CUSTOM_AUDIENCE_UPSELL' advantage_plus_audience_friction = 'ADVANTAGE_PLUS_AUDIENCE_FRICTION' advantage_plus_audience_toggle = 'ADVANTAGE_PLUS_AUDIENCE_TOGGLE' @@ -54,10 +56,16 @@ class RecommendationType: aggregated_bid_limited = 'AGGREGATED_BID_LIMITED' aggregated_budget_limited = 'AGGREGATED_BUDGET_LIMITED' aggregated_cost_limited = 'AGGREGATED_COST_LIMITED' + app_aem_v2_installation_promotion = 'APP_AEM_V2_INSTALLATION_PROMOTION' + asc_budget_optimization = 'ASC_BUDGET_OPTIMIZATION' + asc_budget_optimization_pfr = 'ASC_BUDGET_OPTIMIZATION_PFR' + aspect_ratio = 'ASPECT_RATIO' + atleast_6_placements = 'ATLEAST_6_PLACEMENTS' auction_overlap = 'AUCTION_OVERLAP' auction_overlap_consolidation = 'AUCTION_OVERLAP_CONSOLIDATION' audience_expansion = 'AUDIENCE_EXPANSION' audience_expansion_retargeting = 'AUDIENCE_EXPANSION_RETARGETING' + audience_learning_limited = 'AUDIENCE_LEARNING_LIMITED' autoflow_opt_in = 'AUTOFLOW_OPT_IN' autoflow_opt_in_fallback_duplication_flow = 'AUTOFLOW_OPT_IN_FALLBACK_DUPLICATION_FLOW' automatic_placements = 'AUTOMATIC_PLACEMENTS' @@ -73,7 +81,9 @@ class RecommendationType: cost_goal_cpa_limited = 'COST_GOAL_CPA_LIMITED' cost_per_result = 'COST_PER_RESULT' creation_package_upgrade_to_asc = 'CREATION_PACKAGE_UPGRADE_TO_ASC' + creation_package_upgrade_to_tla = 'CREATION_PACKAGE_UPGRADE_TO_TLA' creative_badge = 'CREATIVE_BADGE' + creative_diversity = 'CREATIVE_DIVERSITY' creative_fatigue = 'CREATIVE_FATIGUE' creative_fatigue_hourly = 'CREATIVE_FATIGUE_HOURLY' creative_limited = 'CREATIVE_LIMITED' @@ -87,8 +97,11 @@ class RecommendationType: fragmentation = 'FRAGMENTATION' ges_test = 'GES_TEST' guidance_center_code_gen = 'GUIDANCE_CENTER_CODE_GEN' + high_cost = 'HIGH_COST' + historical_benchmark = 'HISTORICAL_BENCHMARK' learning_limited = 'LEARNING_LIMITED' learning_pause_friction = 'LEARNING_PAUSE_FRICTION' + learning_phase_budget_edits = 'LEARNING_PHASE_BUDGET_EDITS' low_outcome = 'LOW_OUTCOME' merlin_guidance = 'MERLIN_GUIDANCE' mixed_pa_combine_adsets = 'MIXED_PA_COMBINE_ADSETS' @@ -97,6 +110,7 @@ class RecommendationType: mr_aemv2sub_kconsolidation = 'MR_AEMV2SUB_KCONSOLIDATION' multi_text = 'MULTI_TEXT' music = 'MUSIC' + not_applicable = 'NOT_APPLICABLE' optimal_bau = 'OPTIMAL_BAU' payment_method = 'PAYMENT_METHOD' performant_creative_reels_opt_in = 'PERFORMANT_CREATIVE_REELS_OPT_IN' @@ -104,6 +118,8 @@ class RecommendationType: predictive_creative_limited = 'PREDICTIVE_CREATIVE_LIMITED' predictive_creative_limited_hourly = 'PREDICTIVE_CREATIVE_LIMITED_HOURLY' rapid_learning_limited = 'RAPID_LEARNING_LIMITED' + rapid_learning_phase = 'RAPID_LEARNING_PHASE' + reels_duplication_upsell = 'REELS_DUPLICATION_UPSELL' revert = 'REVERT' scale_good_campaign = 'SCALE_GOOD_CAMPAIGN' semantic_based_audience_expansion = 'SEMANTIC_BASED_AUDIENCE_EXPANSION' @@ -116,10 +132,15 @@ class RecommendationType: syd_test_mode = 'SYD_TEST_MODE' top_adsets_with_ads_under_cap = 'TOP_ADSETS_WITH_ADS_UNDER_CAP' top_campaigns_with_ads_under_cap = 'TOP_CAMPAIGNS_WITH_ADS_UNDER_CAP' + two_p_guidance_card_aaa = 'TWO_P_GUIDANCE_CARD_AAA' + two_p_guidance_card_auto_placement = 'TWO_P_GUIDANCE_CARD_AUTO_PLACEMENT' + two_p_guidance_card_cbo_off = 'TWO_P_GUIDANCE_CARD_CBO_OFF' + two_p_guidance_card_ctm_preflight = 'TWO_P_GUIDANCE_CARD_CTM_PREFLIGHT' uncrop_image = 'UNCROP_IMAGE' uneconomical_ads_throttling = 'UNECONOMICAL_ADS_THROTTLING' unused_budget = 'UNUSED_BUDGET' video_length = 'VIDEO_LENGTH' + zero_conversion = 'ZERO_CONVERSION' zero_impression = 'ZERO_IMPRESSION' _field_types = { diff --git a/facebook_business/adobjects/adassetfeedspec.py b/facebook_business/adobjects/adassetfeedspec.py index 467e00bf..a30d8ee6 100644 --- a/facebook_business/adobjects/adassetfeedspec.py +++ b/facebook_business/adobjects/adassetfeedspec.py @@ -40,7 +40,10 @@ class Field(AbstractObject.Field): images = 'images' link_urls = 'link_urls' message_extensions = 'message_extensions' + onsite_destinations = 'onsite_destinations' optimization_type = 'optimization_type' + reasons_to_shop = 'reasons_to_shop' + shops_bundle = 'shops_bundle' titles = 'titles' videos = 'videos' @@ -84,7 +87,6 @@ class CallToActionTypes: listen_now = 'LISTEN_NOW' message_page = 'MESSAGE_PAGE' mobile_download = 'MOBILE_DOWNLOAD' - moments = 'MOMENTS' no_button = 'NO_BUTTON' open_instant_app = 'OPEN_INSTANT_APP' open_link = 'OPEN_LINK' @@ -139,7 +141,10 @@ class CallToActionTypes: 'images': 'list', 'link_urls': 'list', 'message_extensions': 'list', + 'onsite_destinations': 'list', 'optimization_type': 'string', + 'reasons_to_shop': 'bool', + 'shops_bundle': 'bool', 'titles': 'list', 'videos': 'list', } diff --git a/facebook_business/adobjects/adcreative.py b/facebook_business/adobjects/adcreative.py index 430656c0..c90a3dee 100644 --- a/facebook_business/adobjects/adcreative.py +++ b/facebook_business/adobjects/adcreative.py @@ -78,6 +78,7 @@ class Field(AbstractObject.Field): object_type = 'object_type' object_url = 'object_url' omnichannel_link_spec = 'omnichannel_link_spec' + photo_album_source_object_story_id = 'photo_album_source_object_story_id' place_page_set_id = 'place_page_set_id' platform_customizations = 'platform_customizations' playable_asset_id = 'playable_asset_id' @@ -138,7 +139,6 @@ class CallToActionType: listen_now = 'LISTEN_NOW' message_page = 'MESSAGE_PAGE' mobile_download = 'MOBILE_DOWNLOAD' - moments = 'MOMENTS' no_button = 'NO_BUTTON' open_instant_app = 'OPEN_INSTANT_APP' open_link = 'OPEN_LINK' @@ -498,6 +498,7 @@ def get_previews(self, fields=None, params=None, batch=None, success=None, failu 'object_type': 'ObjectType', 'object_url': 'string', 'omnichannel_link_spec': 'AdCreativeOmnichannelLinkSpec', + 'photo_album_source_object_story_id': 'string', 'place_page_set_id': 'string', 'platform_customizations': 'AdCreativePlatformCustomization', 'playable_asset_id': 'string', diff --git a/facebook_business/adobjects/adcreativebrandedcontentads.py b/facebook_business/adobjects/adcreativebrandedcontentads.py index f178f3b4..6f2b92e3 100644 --- a/facebook_business/adobjects/adcreativebrandedcontentads.py +++ b/facebook_business/adobjects/adcreativebrandedcontentads.py @@ -27,6 +27,7 @@ class Field(AbstractObject.Field): ad_format = 'ad_format' creator_ad_permission_type = 'creator_ad_permission_type' instagram_boost_post_access_token = 'instagram_boost_post_access_token' + is_mca_internal = 'is_mca_internal' partners = 'partners' ui_version = 'ui_version' @@ -34,6 +35,7 @@ class Field(AbstractObject.Field): 'ad_format': 'int', 'creator_ad_permission_type': 'string', 'instagram_boost_post_access_token': 'string', + 'is_mca_internal': 'bool', 'partners': 'list', 'ui_version': 'int', } diff --git a/facebook_business/adobjects/adcreativelinkdata.py b/facebook_business/adobjects/adcreativelinkdata.py index 8ee9ce4b..6075357f 100644 --- a/facebook_business/adobjects/adcreativelinkdata.py +++ b/facebook_business/adobjects/adcreativelinkdata.py @@ -28,6 +28,7 @@ class Field(AbstractObject.Field): additional_image_index = 'additional_image_index' app_link_spec = 'app_link_spec' attachment_style = 'attachment_style' + automated_product_tags = 'automated_product_tags' branded_content_shared_to_sponsor_status = 'branded_content_shared_to_sponsor_status' branded_content_sponsor_page_id = 'branded_content_sponsor_page_id' call_to_action = 'call_to_action' @@ -70,6 +71,7 @@ class FormatOption: 'additional_image_index': 'int', 'app_link_spec': 'AdCreativeLinkDataAppLinkSpec', 'attachment_style': 'string', + 'automated_product_tags': 'bool', 'branded_content_shared_to_sponsor_status': 'string', 'branded_content_sponsor_page_id': 'string', 'call_to_action': 'AdCreativeLinkDataCallToAction', diff --git a/facebook_business/adobjects/adcreativelinkdatacalltoaction.py b/facebook_business/adobjects/adcreativelinkdatacalltoaction.py index 978abb38..e0df65d3 100644 --- a/facebook_business/adobjects/adcreativelinkdatacalltoaction.py +++ b/facebook_business/adobjects/adcreativelinkdatacalltoaction.py @@ -67,7 +67,6 @@ class Type: listen_now = 'LISTEN_NOW' message_page = 'MESSAGE_PAGE' mobile_download = 'MOBILE_DOWNLOAD' - moments = 'MOMENTS' no_button = 'NO_BUTTON' open_instant_app = 'OPEN_INSTANT_APP' open_link = 'OPEN_LINK' diff --git a/facebook_business/adobjects/adpromotedobject.py b/facebook_business/adobjects/adpromotedobject.py index 33b02ded..6c6f556b 100644 --- a/facebook_business/adobjects/adpromotedobject.py +++ b/facebook_business/adobjects/adpromotedobject.py @@ -53,6 +53,7 @@ class CustomEventType: add_payment_info = 'ADD_PAYMENT_INFO' add_to_cart = 'ADD_TO_CART' add_to_wishlist = 'ADD_TO_WISHLIST' + ad_impression = 'AD_IMPRESSION' complete_registration = 'COMPLETE_REGISTRATION' contact = 'CONTACT' content_view = 'CONTENT_VIEW' diff --git a/facebook_business/adobjects/adset.py b/facebook_business/adobjects/adset.py index 0d045b3b..64ab50e6 100644 --- a/facebook_business/adobjects/adset.py +++ b/facebook_business/adobjects/adset.py @@ -691,6 +691,42 @@ def get_async_ad_requests(self, fields=None, params=None, batch=None, success=No self.assure_call() return request.execute() + def create_budget_schedule(self, fields=None, params=None, batch=None, success=None, failure=None, pending=False): + from facebook_business.utils import api_utils + if batch is None and (success is not None or failure is not None): + api_utils.warning('`success` and `failure` callback only work for batch call.') + from facebook_business.adobjects.highdemandperiod import HighDemandPeriod + param_types = { + 'budget_value': 'unsigned int', + 'budget_value_type': 'budget_value_type_enum', + 'time_end': 'unsigned int', + 'time_start': 'unsigned int', + } + enums = { + 'budget_value_type_enum': HighDemandPeriod.BudgetValueType.__dict__.values(), + } + request = FacebookRequest( + node_id=self['id'], + method='POST', + endpoint='/budget_schedules', + api=self._api, + param_checker=TypeChecker(param_types, enums), + target_class=HighDemandPeriod, + api_type='EDGE', + response_parser=ObjectParser(target_class=HighDemandPeriod, api=self._api), + ) + request.add_params(params) + request.add_fields(fields) + + if batch is not None: + request.add_to_batch(batch, success=success, failure=failure) + return request + elif pending: + return request + else: + self.assure_call() + return request.execute() + def get_copies(self, fields=None, params=None, batch=None, success=None, failure=None, pending=False): from facebook_business.utils import api_utils if batch is None and (success is not None or failure is not None): diff --git a/facebook_business/adobjects/adsinsights.py b/facebook_business/adobjects/adsinsights.py index 057ee0eb..218d0810 100644 --- a/facebook_business/adobjects/adsinsights.py +++ b/facebook_business/adobjects/adsinsights.py @@ -55,6 +55,7 @@ class Field(AbstractObject.Field): catalog_segment_value_omni_purchase_roas = 'catalog_segment_value_omni_purchase_roas' catalog_segment_value_website_purchase_roas = 'catalog_segment_value_website_purchase_roas' clicks = 'clicks' + conversion_lead_rate = 'conversion_lead_rate' conversion_rate_ranking = 'conversion_rate_ranking' conversion_values = 'conversion_values' conversions = 'conversions' @@ -65,6 +66,7 @@ class Field(AbstractObject.Field): cost_per_action_type = 'cost_per_action_type' cost_per_ad_click = 'cost_per_ad_click' cost_per_conversion = 'cost_per_conversion' + cost_per_conversion_lead = 'cost_per_conversion_lead' cost_per_dda_countby_convs = 'cost_per_dda_countby_convs' cost_per_estimated_ad_recallers = 'cost_per_estimated_ad_recallers' cost_per_inline_link_click = 'cost_per_inline_link_click' @@ -310,6 +312,7 @@ def get_endpoint(cls): 'catalog_segment_value_omni_purchase_roas': 'list', 'catalog_segment_value_website_purchase_roas': 'list', 'clicks': 'string', + 'conversion_lead_rate': 'string', 'conversion_rate_ranking': 'string', 'conversion_values': 'list', 'conversions': 'list', @@ -320,6 +323,7 @@ def get_endpoint(cls): 'cost_per_action_type': 'list', 'cost_per_ad_click': 'list', 'cost_per_conversion': 'list', + 'cost_per_conversion_lead': 'string', 'cost_per_dda_countby_convs': 'string', 'cost_per_estimated_ad_recallers': 'string', 'cost_per_inline_link_click': 'string', diff --git a/facebook_business/adobjects/application.py b/facebook_business/adobjects/application.py index 129e1c2d..30b28829 100644 --- a/facebook_business/adobjects/application.py +++ b/facebook_business/adobjects/application.py @@ -109,6 +109,8 @@ class Field(AbstractObject.Field): restrictions = 'restrictions' restrictive_data_filter_params = 'restrictive_data_filter_params' restrictive_data_filter_rules = 'restrictive_data_filter_rules' + sdk_auto_logging_default_value = 'sdk_auto_logging_default_value' + sdk_auto_logging_override_value = 'sdk_auto_logging_override_value' sdk_update_message = 'sdk_update_message' seamless_login = 'seamless_login' secure_canvas_url = 'secure_canvas_url' @@ -2304,6 +2306,8 @@ def create_upload(self, fields=None, params=None, batch=None, success=None, fail 'restrictions': 'Object', 'restrictive_data_filter_params': 'string', 'restrictive_data_filter_rules': 'string', + 'sdk_auto_logging_default_value': 'bool', + 'sdk_auto_logging_override_value': 'bool', 'sdk_update_message': 'string', 'seamless_login': 'int', 'secure_canvas_url': 'string', diff --git a/facebook_business/adobjects/business.py b/facebook_business/adobjects/business.py index 7037601f..757ccc73 100644 --- a/facebook_business/adobjects/business.py +++ b/facebook_business/adobjects/business.py @@ -2389,6 +2389,7 @@ def create_managed_partner_business(self, fields=None, params=None, batch=None, 'sales_rep_email': 'string', 'seller_external_website_url': 'string', 'seller_targeting_countries': 'list', + 'skip_partner_page_creation': 'bool', 'survey_business_type': 'survey_business_type_enum', 'survey_num_assets': 'unsigned int', 'survey_num_people': 'unsigned int', diff --git a/facebook_business/adobjects/campaign.py b/facebook_business/adobjects/campaign.py index b393f9c4..a663fe02 100644 --- a/facebook_business/adobjects/campaign.py +++ b/facebook_business/adobjects/campaign.py @@ -756,6 +756,42 @@ def get_ad_sets(self, fields=None, params=None, batch=None, success=None, failur self.assure_call() return request.execute() + def create_budget_schedule(self, fields=None, params=None, batch=None, success=None, failure=None, pending=False): + from facebook_business.utils import api_utils + if batch is None and (success is not None or failure is not None): + api_utils.warning('`success` and `failure` callback only work for batch call.') + from facebook_business.adobjects.highdemandperiod import HighDemandPeriod + param_types = { + 'budget_value': 'unsigned int', + 'budget_value_type': 'budget_value_type_enum', + 'time_end': 'unsigned int', + 'time_start': 'unsigned int', + } + enums = { + 'budget_value_type_enum': HighDemandPeriod.BudgetValueType.__dict__.values(), + } + request = FacebookRequest( + node_id=self['id'], + method='POST', + endpoint='/budget_schedules', + api=self._api, + param_checker=TypeChecker(param_types, enums), + target_class=HighDemandPeriod, + api_type='EDGE', + response_parser=ObjectParser(target_class=HighDemandPeriod, api=self._api), + ) + request.add_params(params) + request.add_fields(fields) + + if batch is not None: + request.add_to_batch(batch, success=success, failure=failure) + return request + elif pending: + return request + else: + self.assure_call() + return request.execute() + def get_copies(self, fields=None, params=None, batch=None, success=None, failure=None, pending=False): from facebook_business.utils import api_utils if batch is None and (success is not None or failure is not None): diff --git a/facebook_business/adobjects/ctxpartnerappwelcomemessageflow.py b/facebook_business/adobjects/ctxpartnerappwelcomemessageflow.py new file mode 100644 index 00000000..581d04cd --- /dev/null +++ b/facebook_business/adobjects/ctxpartnerappwelcomemessageflow.py @@ -0,0 +1,82 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from facebook_business.adobjects.abstractobject import AbstractObject +from facebook_business.adobjects.abstractcrudobject import AbstractCrudObject +from facebook_business.adobjects.objectparser import ObjectParser +from facebook_business.api import FacebookRequest +from facebook_business.typechecker import TypeChecker + +""" +This class is auto-generated. + +For any issues or feature requests related to this class, please let us know on +github and we'll fix in our codegen framework. We'll not be able to accept +pull request for this class. +""" + +class CTXPartnerAppWelcomeMessageFlow( + AbstractCrudObject, +): + + def __init__(self, fbid=None, parent_id=None, api=None): + self._isCTXPartnerAppWelcomeMessageFlow = True + super(CTXPartnerAppWelcomeMessageFlow, self).__init__(fbid, parent_id, api) + + class Field(AbstractObject.Field): + compatible_platforms = 'compatible_platforms' + eligible_platforms = 'eligible_platforms' + id = 'id' + is_used_in_ad = 'is_used_in_ad' + last_update_time = 'last_update_time' + name = 'name' + welcome_message_flow = 'welcome_message_flow' + + def api_get(self, fields=None, params=None, batch=None, success=None, failure=None, pending=False): + from facebook_business.utils import api_utils + if batch is None and (success is not None or failure is not None): + api_utils.warning('`success` and `failure` callback only work for batch call.') + param_types = { + } + enums = { + } + request = FacebookRequest( + node_id=self['id'], + method='GET', + endpoint='/', + api=self._api, + param_checker=TypeChecker(param_types, enums), + target_class=CTXPartnerAppWelcomeMessageFlow, + api_type='NODE', + response_parser=ObjectParser(reuse_object=self), + ) + request.add_params(params) + request.add_fields(fields) + + if batch is not None: + request.add_to_batch(batch, success=success, failure=failure) + return request + elif pending: + return request + else: + self.assure_call() + return request.execute() + + _field_types = { + 'compatible_platforms': 'list', + 'eligible_platforms': 'list', + 'id': 'string', + 'is_used_in_ad': 'bool', + 'last_update_time': 'datetime', + 'name': 'string', + 'welcome_message_flow': 'string', + } + @classmethod + def _get_field_enum_info(cls): + field_enum_info = {} + return field_enum_info + + diff --git a/facebook_business/adobjects/customaudience.py b/facebook_business/adobjects/customaudience.py index 5f5ad23e..70f9eaa2 100644 --- a/facebook_business/adobjects/customaudience.py +++ b/facebook_business/adobjects/customaudience.py @@ -88,6 +88,7 @@ class Field(AbstractObject.Field): product_set_id = 'product_set_id' use_in_campaigns = 'use_in_campaigns' video_group_ids = 'video_group_ids' + whats_app_business_phone_number_id = 'whats_app_business_phone_number_id' class ClaimObjective: automotive_model = 'AUTOMOTIVE_MODEL' @@ -622,6 +623,7 @@ def create_users_replace(self, fields=None, params=None, batch=None, success=Non 'product_set_id': 'string', 'use_in_campaigns': 'bool', 'video_group_ids': 'list', + 'whats_app_business_phone_number_id': 'string', } @classmethod def _get_field_enum_info(cls): diff --git a/facebook_business/adobjects/customaudiencedatasource.py b/facebook_business/adobjects/customaudiencedatasource.py index de36b2cc..a3d763aa 100644 --- a/facebook_business/adobjects/customaudiencedatasource.py +++ b/facebook_business/adobjects/customaudiencedatasource.py @@ -58,6 +58,7 @@ class SubType: instant_article_events = 'INSTANT_ARTICLE_EVENTS' lookalike_platform = 'LOOKALIKE_PLATFORM' mail_chimp_email_hashes = 'MAIL_CHIMP_EMAIL_HASHES' + messenger_onsite_subscription = 'MESSENGER_ONSITE_SUBSCRIPTION' mobile_advertiser_ids = 'MOBILE_ADVERTISER_IDS' mobile_app_combination_events = 'MOBILE_APP_COMBINATION_EVENTS' mobile_app_custom_audience_users = 'MOBILE_APP_CUSTOM_AUDIENCE_USERS' diff --git a/facebook_business/adobjects/hasleadaccess.py b/facebook_business/adobjects/hasleadaccess.py new file mode 100644 index 00000000..5d8a6c4d --- /dev/null +++ b/facebook_business/adobjects/hasleadaccess.py @@ -0,0 +1,53 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from facebook_business.adobjects.abstractobject import AbstractObject + +""" +This class is auto-generated. + +For any issues or feature requests related to this class, please let us know on +github and we'll fix in our codegen framework. We'll not be able to accept +pull request for this class. +""" + +class HasLeadAccess( + AbstractObject, +): + + def __init__(self, api=None): + super(HasLeadAccess, self).__init__() + self._isHasLeadAccess = True + self._api = api + + class Field(AbstractObject.Field): + app_has_leads_permission = 'app_has_leads_permission' + can_access_lead = 'can_access_lead' + enabled_lead_access_manager = 'enabled_lead_access_manager' + failure_reason = 'failure_reason' + failure_resolution = 'failure_resolution' + is_page_admin = 'is_page_admin' + page_id = 'page_id' + user_has_leads_permission = 'user_has_leads_permission' + user_id = 'user_id' + + _field_types = { + 'app_has_leads_permission': 'bool', + 'can_access_lead': 'bool', + 'enabled_lead_access_manager': 'bool', + 'failure_reason': 'string', + 'failure_resolution': 'string', + 'is_page_admin': 'bool', + 'page_id': 'string', + 'user_has_leads_permission': 'bool', + 'user_id': 'string', + } + @classmethod + def _get_field_enum_info(cls): + field_enum_info = {} + return field_enum_info + + diff --git a/facebook_business/adobjects/managedpartnerbusiness.py b/facebook_business/adobjects/managedpartnerbusiness.py index cb509ef3..19bea08b 100644 --- a/facebook_business/adobjects/managedpartnerbusiness.py +++ b/facebook_business/adobjects/managedpartnerbusiness.py @@ -35,7 +35,7 @@ class Field(AbstractObject.Field): _field_types = { 'ad_account': 'AdAccount', 'catalog_segment': 'ProductCatalog', - 'extended_credit': 'ExtendedCredit', + 'extended_credit': 'ManagedPartnerExtendedCredit', 'page': 'Page', 'seller_business_info': 'Object', 'seller_business_status': 'string', diff --git a/facebook_business/adobjects/managedpartnerextendedcredit.py b/facebook_business/adobjects/managedpartnerextendedcredit.py new file mode 100644 index 00000000..ddbaf7bc --- /dev/null +++ b/facebook_business/adobjects/managedpartnerextendedcredit.py @@ -0,0 +1,44 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from facebook_business.adobjects.abstractobject import AbstractObject +from facebook_business.adobjects.abstractcrudobject import AbstractCrudObject +from facebook_business.adobjects.objectparser import ObjectParser +from facebook_business.api import FacebookRequest +from facebook_business.typechecker import TypeChecker + +""" +This class is auto-generated. + +For any issues or feature requests related to this class, please let us know on +github and we'll fix in our codegen framework. We'll not be able to accept +pull request for this class. +""" + +class ManagedPartnerExtendedCredit( + AbstractCrudObject, +): + + def __init__(self, fbid=None, parent_id=None, api=None): + self._isManagedPartnerExtendedCredit = True + super(ManagedPartnerExtendedCredit, self).__init__(fbid, parent_id, api) + + class Field(AbstractObject.Field): + id = 'id' + max_balance = 'max_balance' + receiving_credit_allocation_config = 'receiving_credit_allocation_config' + + _field_types = { + 'id': 'string', + 'max_balance': 'CurrencyAmount', + 'receiving_credit_allocation_config': 'ExtendedCreditAllocationConfig', + } + @classmethod + def _get_field_enum_info(cls): + field_enum_info = {} + return field_enum_info + + diff --git a/facebook_business/adobjects/page.py b/facebook_business/adobjects/page.py index 30d08cbe..8dce4fb6 100644 --- a/facebook_business/adobjects/page.py +++ b/facebook_business/adobjects/page.py @@ -79,6 +79,7 @@ class Field(AbstractObject.Field): global_brand_page_name = 'global_brand_page_name' global_brand_root_id = 'global_brand_root_id' has_added_app = 'has_added_app' + has_lead_access = 'has_lead_access' has_transitioned_to_new_page_experience = 'has_transitioned_to_new_page_experience' has_whatsapp_business_number = 'has_whatsapp_business_number' has_whatsapp_enterprise_number_using_cloud_api = 'has_whatsapp_enterprise_number_using_cloud_api' @@ -672,6 +673,45 @@ def get_ab_tests(self, fields=None, params=None, batch=None, success=None, failu self.assure_call() return request.execute() + def create_ab_test(self, fields=None, params=None, batch=None, success=None, failure=None, pending=False): + from facebook_business.utils import api_utils + if batch is None and (success is not None or failure is not None): + api_utils.warning('`success` and `failure` callback only work for batch call.') + from facebook_business.adobjects.pagepostexperiment import PagePostExperiment + param_types = { + 'control_video_id': 'string', + 'description': 'string', + 'duration': 'unsigned int', + 'experiment_video_ids': 'list', + 'name': 'string', + 'optimization_goal': 'optimization_goal_enum', + 'scheduled_experiment_timestamp': 'unsigned int', + } + enums = { + 'optimization_goal_enum': PagePostExperiment.OptimizationGoal.__dict__.values(), + } + request = FacebookRequest( + node_id=self['id'], + method='POST', + endpoint='/ab_tests', + api=self._api, + param_checker=TypeChecker(param_types, enums), + target_class=PagePostExperiment, + api_type='EDGE', + response_parser=ObjectParser(target_class=PagePostExperiment, api=self._api), + ) + request.add_params(params) + request.add_fields(fields) + + if batch is not None: + request.add_to_batch(batch, success=success, failure=failure) + return request + elif pending: + return request + else: + self.assure_call() + return request.execute() + def create_acknowledge_order(self, fields=None, params=None, batch=None, success=None, failure=None, pending=False): from facebook_business.utils import api_utils if batch is None and (success is not None or failure is not None): @@ -3037,6 +3077,8 @@ def delete_messenger_profile(self, fields=None, params=None, batch=None, success enums = { 'fields_enum': [ 'ACCOUNT_LINKING_URL', + 'COMMANDS', + 'DESCRIPTION', 'GET_STARTED', 'GREETING', 'HOME_URL', @@ -3046,6 +3088,7 @@ def delete_messenger_profile(self, fields=None, params=None, batch=None, success 'PLATFORM', 'SUBJECT_TO_NEW_EU_PRIVACY_RULES', 'TARGET_AUDIENCE', + 'TITLE', 'WHITELISTED_DOMAINS', ], 'platform_enum': Page.Platform.__dict__.values(), @@ -3111,6 +3154,8 @@ def create_messenger_profile(self, fields=None, params=None, batch=None, success api_utils.warning('`success` and `failure` callback only work for batch call.') param_types = { 'account_linking_url': 'string', + 'commands': 'list', + 'description': 'list', 'get_started': 'Object', 'greeting': 'list', 'ice_breakers': 'list', @@ -3118,6 +3163,7 @@ def create_messenger_profile(self, fields=None, params=None, batch=None, success 'persistent_menu': 'list', 'platform': 'platform_enum', 'target_audience': 'Object', + 'title': 'list', 'whitelisted_domains': 'list', } enums = { @@ -4929,10 +4975,42 @@ def get_visitor_posts(self, fields=None, params=None, batch=None, success=None, self.assure_call() return request.execute() + def delete_welcome_message_flows(self, fields=None, params=None, batch=None, success=None, failure=None, pending=False): + from facebook_business.utils import api_utils + if batch is None and (success is not None or failure is not None): + api_utils.warning('`success` and `failure` callback only work for batch call.') + param_types = { + 'flow_id': 'string', + } + enums = { + } + request = FacebookRequest( + node_id=self['id'], + method='DELETE', + endpoint='/welcome_message_flows', + api=self._api, + param_checker=TypeChecker(param_types, enums), + target_class=AbstractCrudObject, + api_type='EDGE', + response_parser=ObjectParser(target_class=AbstractCrudObject, api=self._api), + ) + request.add_params(params) + request.add_fields(fields) + + if batch is not None: + request.add_to_batch(batch, success=success, failure=failure) + return request + elif pending: + return request + else: + self.assure_call() + return request.execute() + def get_welcome_message_flows(self, fields=None, params=None, batch=None, success=None, failure=None, pending=False): from facebook_business.utils import api_utils if batch is None and (success is not None or failure is not None): api_utils.warning('`success` and `failure` callback only work for batch call.') + from facebook_business.adobjects.ctxpartnerappwelcomemessageflow import CTXPartnerAppWelcomeMessageFlow param_types = { 'app_id': 'string', 'flow_id': 'string', @@ -4945,6 +5023,44 @@ def get_welcome_message_flows(self, fields=None, params=None, batch=None, succes endpoint='/welcome_message_flows', api=self._api, param_checker=TypeChecker(param_types, enums), + target_class=CTXPartnerAppWelcomeMessageFlow, + api_type='EDGE', + response_parser=ObjectParser(target_class=CTXPartnerAppWelcomeMessageFlow, api=self._api), + ) + request.add_params(params) + request.add_fields(fields) + + if batch is not None: + request.add_to_batch(batch, success=success, failure=failure) + return request + elif pending: + return request + else: + self.assure_call() + return request.execute() + + def create_welcome_message_flow(self, fields=None, params=None, batch=None, success=None, failure=None, pending=False): + from facebook_business.utils import api_utils + if batch is None and (success is not None or failure is not None): + api_utils.warning('`success` and `failure` callback only work for batch call.') + param_types = { + 'eligible_platforms': 'list', + 'flow_id': 'string', + 'name': 'string', + 'welcome_message_flow': 'list', + } + enums = { + 'eligible_platforms_enum': [ + 'INSTAGRAM', + 'MESSENGER', + ], + } + request = FacebookRequest( + node_id=self['id'], + method='POST', + endpoint='/welcome_message_flows', + api=self._api, + param_checker=TypeChecker(param_types, enums), target_class=AbstractCrudObject, api_type='EDGE', response_parser=ObjectParser(target_class=AbstractCrudObject, api=self._api), @@ -5014,6 +5130,7 @@ def get_welcome_message_flows(self, fields=None, params=None, batch=None, succes 'global_brand_page_name': 'string', 'global_brand_root_id': 'string', 'has_added_app': 'bool', + 'has_lead_access': 'HasLeadAccess', 'has_transitioned_to_new_page_experience': 'bool', 'has_whatsapp_business_number': 'bool', 'has_whatsapp_enterprise_number_using_cloud_api': 'bool', diff --git a/facebook_business/adobjects/pagepostexperiment.py b/facebook_business/adobjects/pagepostexperiment.py index 0e438187..79b03a5b 100644 --- a/facebook_business/adobjects/pagepostexperiment.py +++ b/facebook_business/adobjects/pagepostexperiment.py @@ -45,6 +45,49 @@ class Field(AbstractObject.Field): scheduled_experiment_timestamp = 'scheduled_experiment_timestamp' updated_time = 'updated_time' + class OptimizationGoal: + auto_resolve_to_control = 'AUTO_RESOLVE_TO_CONTROL' + avg_time_watched = 'AVG_TIME_WATCHED' + comments = 'COMMENTS' + impressions = 'IMPRESSIONS' + impressions_unique = 'IMPRESSIONS_UNIQUE' + link_clicks = 'LINK_CLICKS' + other = 'OTHER' + reactions = 'REACTIONS' + reels_plays = 'REELS_PLAYS' + shares = 'SHARES' + video_views_60s = 'VIDEO_VIEWS_60S' + + def api_delete(self, fields=None, params=None, batch=None, success=None, failure=None, pending=False): + from facebook_business.utils import api_utils + if batch is None and (success is not None or failure is not None): + api_utils.warning('`success` and `failure` callback only work for batch call.') + param_types = { + } + enums = { + } + request = FacebookRequest( + node_id=self['id'], + method='DELETE', + endpoint='/', + api=self._api, + param_checker=TypeChecker(param_types, enums), + target_class=AbstractCrudObject, + api_type='NODE', + response_parser=ObjectParser(reuse_object=self), + ) + request.add_params(params) + request.add_fields(fields) + + if batch is not None: + request.add_to_batch(batch, success=success, failure=failure) + return request + elif pending: + return request + else: + self.assure_call() + return request.execute() + def api_get(self, fields=None, params=None, batch=None, success=None, failure=None, pending=False): from facebook_business.utils import api_utils if batch is None and (success is not None or failure is not None): @@ -127,6 +170,7 @@ def get_video_insights(self, fields=None, params=None, batch=None, success=None, @classmethod def _get_field_enum_info(cls): field_enum_info = {} + field_enum_info['OptimizationGoal'] = PagePostExperiment.OptimizationGoal.__dict__.values() return field_enum_info diff --git a/facebook_business/adobjects/productcatalogdiagnosticgroup.py b/facebook_business/adobjects/productcatalogdiagnosticgroup.py index 99126271..18750f1a 100644 --- a/facebook_business/adobjects/productcatalogdiagnosticgroup.py +++ b/facebook_business/adobjects/productcatalogdiagnosticgroup.py @@ -62,6 +62,7 @@ class Type: attributes_missing = 'ATTRIBUTES_MISSING' category = 'CATEGORY' checkout = 'CHECKOUT' + da_visibility_issues = 'DA_VISIBILITY_ISSUES' image_quality = 'IMAGE_QUALITY' low_quality_title_and_description = 'LOW_QUALITY_TITLE_AND_DESCRIPTION' policy_violation = 'POLICY_VIOLATION' @@ -82,6 +83,7 @@ class Types: attributes_missing = 'ATTRIBUTES_MISSING' category = 'CATEGORY' checkout = 'CHECKOUT' + da_visibility_issues = 'DA_VISIBILITY_ISSUES' image_quality = 'IMAGE_QUALITY' low_quality_title_and_description = 'LOW_QUALITY_TITLE_AND_DESCRIPTION' policy_violation = 'POLICY_VIOLATION' diff --git a/facebook_business/adobjects/productitem.py b/facebook_business/adobjects/productitem.py index 759c7a25..e49753ce 100644 --- a/facebook_business/adobjects/productitem.py +++ b/facebook_business/adobjects/productitem.py @@ -409,6 +409,7 @@ class ErrorType: available = 'AVAILABLE' bad_quality_image = 'BAD_QUALITY_IMAGE' cannot_edit_subscription_products = 'CANNOT_EDIT_SUBSCRIPTION_PRODUCTS' + commerce_account_not_legally_compliant = 'COMMERCE_ACCOUNT_NOT_LEGALLY_COMPLIANT' crawled_availability_mismatch = 'CRAWLED_AVAILABILITY_MISMATCH' da_disabled_by_user = 'DA_DISABLED_BY_USER' da_policy_violation = 'DA_POLICY_VIOLATION' @@ -420,6 +421,7 @@ class ErrorType: empty_description = 'EMPTY_DESCRIPTION' empty_product_url = 'EMPTY_PRODUCT_URL' empty_seller_description = 'EMPTY_SELLER_DESCRIPTION' + external_merchant_id_mismatch = 'EXTERNAL_MERCHANT_ID_MISMATCH' generic_invalid_field = 'GENERIC_INVALID_FIELD' hidden_until_product_launch = 'HIDDEN_UNTIL_PRODUCT_LAUNCH' image_fetch_failed = 'IMAGE_FETCH_FAILED' @@ -457,9 +459,11 @@ class ErrorType: missing_tax_category = 'MISSING_TAX_CATEGORY' negative_community_feedback = 'NEGATIVE_COMMUNITY_FEEDBACK' not_enough_images = 'NOT_ENOUGH_IMAGES' + not_enough_unique_products = 'NOT_ENOUGH_UNIQUE_PRODUCTS' part_of_product_launch = 'PART_OF_PRODUCT_LAUNCH' product_expired = 'PRODUCT_EXPIRED' product_item_hidden_from_all_shops = 'PRODUCT_ITEM_HIDDEN_FROM_ALL_SHOPS' + product_item_invalid_partner_tokens = 'PRODUCT_ITEM_INVALID_PARTNER_TOKENS' product_item_not_included_in_any_shop = 'PRODUCT_ITEM_NOT_INCLUDED_IN_ANY_SHOP' product_item_not_visible = 'PRODUCT_ITEM_NOT_VISIBLE' product_not_approved = 'PRODUCT_NOT_APPROVED' @@ -484,6 +488,7 @@ class ErrorType: quality_item_link_broken = 'QUALITY_ITEM_LINK_BROKEN' quality_item_link_redirecting = 'QUALITY_ITEM_LINK_REDIRECTING' retailer_id_not_provided = 'RETAILER_ID_NOT_PROVIDED' + shopify_invalid_retailer_id = 'SHOPIFY_INVALID_RETAILER_ID' shopify_item_missing_shipping_profile = 'SHOPIFY_ITEM_MISSING_SHIPPING_PROFILE' shops_policy_violation = 'SHOPS_POLICY_VIOLATION' subscription_info_not_enabled_for_feed = 'SUBSCRIPTION_INFO_NOT_ENABLED_FOR_FEED' diff --git a/facebook_business/adobjects/shop.py b/facebook_business/adobjects/shop.py index 7903d35b..9c1ea84f 100644 --- a/facebook_business/adobjects/shop.py +++ b/facebook_business/adobjects/shop.py @@ -30,6 +30,8 @@ class Field(AbstractObject.Field): fb_sales_channel = 'fb_sales_channel' id = 'id' ig_sales_channel = 'ig_sales_channel' + is_onsite_enabled = 'is_onsite_enabled' + shop_status = 'shop_status' workspace = 'workspace' def api_get(self, fields=None, params=None, batch=None, success=None, failure=None, pending=False): @@ -66,6 +68,8 @@ def api_get(self, fields=None, params=None, batch=None, success=None, failure=No 'fb_sales_channel': 'Object', 'id': 'string', 'ig_sales_channel': 'Object', + 'is_onsite_enabled': 'bool', + 'shop_status': 'string', 'workspace': 'Object', } @classmethod diff --git a/facebook_business/adobjects/whatsappbusinessaccount.py b/facebook_business/adobjects/whatsappbusinessaccount.py index a575460c..673c324d 100644 --- a/facebook_business/adobjects/whatsappbusinessaccount.py +++ b/facebook_business/adobjects/whatsappbusinessaccount.py @@ -33,6 +33,7 @@ class Field(AbstractObject.Field): country = 'country' creation_time = 'creation_time' currency = 'currency' + health_status = 'health_status' id = 'id' is_enabled_for_insights = 'is_enabled_for_insights' message_template_namespace = 'message_template_namespace' @@ -331,81 +332,6 @@ def get_conversation_analytics(self, fields=None, params=None, batch=None, succe self.assure_call() return request.execute() - def get_extensions(self, fields=None, params=None, batch=None, success=None, failure=None, pending=False): - from facebook_business.utils import api_utils - if batch is None and (success is not None or failure is not None): - api_utils.warning('`success` and `failure` callback only work for batch call.') - param_types = { - } - enums = { - } - request = FacebookRequest( - node_id=self['id'], - method='GET', - endpoint='/extensions', - api=self._api, - param_checker=TypeChecker(param_types, enums), - target_class=AbstractCrudObject, - api_type='EDGE', - response_parser=ObjectParser(target_class=AbstractCrudObject, api=self._api), - ) - request.add_params(params) - request.add_fields(fields) - - if batch is not None: - request.add_to_batch(batch, success=success, failure=failure) - return request - elif pending: - return request - else: - self.assure_call() - return request.execute() - - def create_extension(self, fields=None, params=None, batch=None, success=None, failure=None, pending=False): - from facebook_business.utils import api_utils - if batch is None and (success is not None or failure is not None): - api_utils.warning('`success` and `failure` callback only work for batch call.') - param_types = { - 'categories': 'list', - 'clone_extension_id': 'string', - 'clone_template': 'string', - 'data_channel_uri': 'string', - 'name': 'string', - } - enums = { - 'categories_enum': [ - 'APPOINTMENT_BOOKING', - 'CONTACT_US', - 'CUSTOMER_SUPPORT', - 'LEAD_GENERATION', - 'OTHER', - 'SIGN_IN', - 'SIGN_UP', - 'SURVEY', - ], - } - request = FacebookRequest( - node_id=self['id'], - method='POST', - endpoint='/extensions', - api=self._api, - param_checker=TypeChecker(param_types, enums), - target_class=AbstractCrudObject, - api_type='EDGE', - response_parser=ObjectParser(target_class=AbstractCrudObject, api=self._api), - ) - request.add_params(params) - request.add_fields(fields) - - if batch is not None: - request.add_to_batch(batch, success=success, failure=failure) - return request - elif pending: - return request - else: - self.assure_call() - return request.execute() - def get_flows(self, fields=None, params=None, batch=None, success=None, failure=None, pending=False): from facebook_business.utils import api_utils if batch is None and (success is not None or failure is not None): @@ -1111,6 +1037,7 @@ def create_upsert_message_template(self, fields=None, params=None, batch=None, s 'country': 'string', 'creation_time': 'int', 'currency': 'string', + 'health_status': 'Object', 'id': 'string', 'is_enabled_for_insights': 'bool', 'message_template_namespace': 'string', diff --git a/facebook_business/apiconfig.py b/facebook_business/apiconfig.py index b296800f..9c74ad14 100644 --- a/facebook_business/apiconfig.py +++ b/facebook_business/apiconfig.py @@ -6,6 +6,6 @@ ads_api_config = { 'API_VERSION': 'v18.0', - 'SDK_VERSION': 'v18.0.3', + 'SDK_VERSION': 'v18.0.4', 'STRICT_MODE': False } diff --git a/setup.py b/setup.py index dece0284..945cedae 100644 --- a/setup.py +++ b/setup.py @@ -29,7 +29,7 @@ requirements_filename = os.path.join(this_dir, 'requirements.txt') PACKAGE_NAME = 'facebook_business' -PACKAGE_VERSION = '18.0.3' +PACKAGE_VERSION = '18.0.4' PACKAGE_AUTHOR = 'Facebook' PACKAGE_AUTHOR_EMAIL = 'shuotian@meta.com' PACKAGE_URL = 'https://github.com/facebook/facebook-python-business-sdk'