late-sdk 0.0.871 → 0.0.873

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (514) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +17 -8
  3. data/docs/AccountGroupsApi.md +1 -1
  4. data/docs/AccountWithFollowerStatsAllOfAccountStats.md +2 -2
  5. data/docs/AccountsApi.md +5 -5
  6. data/docs/Ad.md +4 -4
  7. data/docs/AdAccountsApi.md +9 -9
  8. data/docs/AdAudiencesApi.md +4 -4
  9. data/docs/AdCampaignsApi.md +46 -46
  10. data/docs/AdCreative.md +6 -6
  11. data/docs/AdCreativesApi.md +12 -12
  12. data/docs/AdDailyMetrics.md +4 -4
  13. data/docs/AdFunnelCounts.md +3 -3
  14. data/docs/AdInsightsApi.md +3 -3
  15. data/docs/AdKeyword.md +1 -1
  16. data/docs/AdLibraryApi.md +2 -2
  17. data/docs/AdMetrics.md +4 -4
  18. data/docs/AdTargetingApi.md +5 -5
  19. data/docs/AdTreeAdSet.md +1 -1
  20. data/docs/AdTreeCampaign.md +4 -4
  21. data/docs/AddAdKeywordsRequest.md +1 -1
  22. data/docs/AddMessageReactionRequest.md +1 -1
  23. data/docs/AdjustConversionsRequestAdjustmentsInner.md +4 -4
  24. data/docs/AdsTimelineResponseRowsInner.md +1 -1
  25. data/docs/AnalyticsApi.md +22 -22
  26. data/docs/AnalyticsDeltaEntry.md +1 -1
  27. data/docs/AnalyticsListResponse.md +1 -1
  28. data/docs/ApiKey.md +1 -1
  29. data/docs/AppealSmsRegistrationRequest.md +1 -1
  30. data/docs/AssignGoogleBusinessLocation200ResponseAccount.md +1 -1
  31. data/docs/AssignGoogleBusinessLocationRequest.md +2 -2
  32. data/docs/AttachCampaignAssetsRequest.md +2 -2
  33. data/docs/BillingSnapshotPlan.md +1 -1
  34. data/docs/BlockWhatsAppUsersRequest.md +1 -1
  35. data/docs/BookmarkPostRequest.md +1 -1
  36. data/docs/BoostPostRequest.md +5 -5
  37. data/docs/BusinessCenter.md +1 -1
  38. data/docs/CallRecord.md +2 -2
  39. data/docs/CampaignAnalyticsResponseAnalyticsDailyInner.md +4 -4
  40. data/docs/CheckPhoneNumberAvailability200Response.md +1 -1
  41. data/docs/CheckPhoneNumberPortability200ResponseResultsInner.md +2 -2
  42. data/docs/CommentsApi.md +11 -11
  43. data/docs/ConnectApi.md +102 -35
  44. data/docs/ConnectWhatsAppEmbeddedSignupRequest.md +4 -4
  45. data/docs/Conversation.md +34 -0
  46. data/docs/ConversionEvent.md +1 -1
  47. data/docs/ConversionsApi.md +6 -6
  48. data/docs/CreateAdCampaignRequest.md +1 -1
  49. data/docs/CreateAdCreativeRequest.md +1 -1
  50. data/docs/CreateApiKeyRequest.md +1 -1
  51. data/docs/CreateInboxConversation201ResponseData.md +2 -2
  52. data/docs/CreateInboxConversationRequest.md +3 -3
  53. data/docs/CreatePhoneNumberPortInRequestEndUser.md +2 -2
  54. data/docs/CreateStandaloneAdRequest.md +22 -22
  55. data/docs/CreateStandaloneAdRequestVideo.md +2 -2
  56. data/docs/CreateWhatsAppFlowRequest.md +1 -1
  57. data/docs/CreateWhatsAppGroupChatRequest.md +1 -1
  58. data/docs/CreateWhatsAppTemplateRequest.md +1 -1
  59. data/docs/CtwaAdRequestBodyVideo.md +1 -1
  60. data/docs/CustomConversion.md +1 -1
  61. data/docs/DeleteWhatsappBusinessUsernameRequest.md +1 -1
  62. data/docs/DiscordApi.md +9 -9
  63. data/docs/DiscordScheduledEvent.md +1 -1
  64. data/docs/EditInboxCommentRequest.md +1 -1
  65. data/docs/EditInboxMessageRequest.md +1 -1
  66. data/docs/EnableSmsOnNumber200Response.md +1 -1
  67. data/docs/ErrorResponse.md +1 -1
  68. data/docs/EstimateAdReachRequest.md +1 -1
  69. data/docs/ExternalPostWebhookPost.md +2 -2
  70. data/docs/FollowUserRequest.md +2 -2
  71. data/docs/GMBAttributesApi.md +3 -3
  72. data/docs/GMBFoodMenusApi.md +2 -2
  73. data/docs/GMBLocationDetailsApi.md +2 -2
  74. data/docs/GMBMediaApi.md +1 -1
  75. data/docs/GMBPlaceActionsApi.md +1 -1
  76. data/docs/GMBReviewsApi.md +4 -4
  77. data/docs/GetAdComments200ResponseMeta.md +4 -4
  78. data/docs/GetAdMedia200Response.md +1 -1
  79. data/docs/GetAdMedia200ResponseMediaInner.md +1 -1
  80. data/docs/GetAdsSearchTerms200ResponseDataInner.md +1 -1
  81. data/docs/GetGoogleBusinessLocationDetails200ResponseLocation.md +1 -1
  82. data/docs/GetInboxConversation200ResponseData.md +1 -1
  83. data/docs/GetInboxConversationMessages200ResponseMessagesInner.md +1 -1
  84. data/docs/GetInboxPostComments200ResponseCommentsInner.md +2 -2
  85. data/docs/GetInboxPostComments200ResponseCommentsInnerFrom.md +1 -1
  86. data/docs/GetInboxTopAccounts200ResponseAccountsInner.md +1 -1
  87. data/docs/GetLinkedInBidPricingRequest.md +1 -1
  88. data/docs/GetPhoneNumber200ResponsePhoneNumber.md +1 -1
  89. data/docs/GetPhoneNumberKycForm200ResponseReusable.md +1 -1
  90. data/docs/GetPhoneNumberKycForm200ResponseReusableOptionsInner.md +2 -2
  91. data/docs/GetPhoneNumberKycForm200ResponseReusableOptionsInnerDetailsInner.md +1 -1
  92. data/docs/GetPhoneNumberPortInRequirements200Response.md +1 -1
  93. data/docs/GetWhatsAppNumberKycForm200ResponseFieldsInner.md +1 -1
  94. data/docs/GetWhatsAppSdkConfig200Response.md +22 -0
  95. data/docs/GoogleBusinessPlatformData.md +1 -1
  96. data/docs/HideInboxCommentRequest.md +1 -1
  97. data/docs/InboxAnalyticsApi.md +5 -5
  98. data/docs/InboxWebhookAccount.md +3 -3
  99. data/docs/InboxWebhookConversation.md +1 -1
  100. data/docs/InboxWebhookMessageSender.md +3 -3
  101. data/docs/InstagramApi.md +1 -1
  102. data/docs/LeadGenApi.md +2 -2
  103. data/docs/LikeInboxCommentRequest.md +1 -1
  104. data/docs/LikePostRequest.md +1 -1
  105. data/docs/LinkedInMentionsApi.md +1 -1
  106. data/docs/LinkedInPlatformData.md +1 -1
  107. data/docs/ListAdAudiences200ResponseAudiencesInner.md +1 -1
  108. data/docs/ListCalls200ResponseCallsInner.md +2 -2
  109. data/docs/ListGoogleBusinessLocations200ResponseLocationsInner.md +1 -1
  110. data/docs/ListInboxComments200ResponseDataInner.md +3 -3
  111. data/docs/ListInboxConversations200ResponseDataInner.md +3 -1
  112. data/docs/ListInboxReviews200ResponseDataInner.md +6 -6
  113. data/docs/ListPhoneNumbers200Response.md +1 -1
  114. data/docs/ListPhoneNumbers200ResponseNumbersInner.md +3 -3
  115. data/docs/ListSipTrunks200Response.md +1 -1
  116. data/docs/ListWhatsAppAccountEvents200ResponseEventsInner.md +1 -1
  117. data/docs/LogsApi.md +2 -2
  118. data/docs/MediaItem.md +1 -1
  119. data/docs/MentionsApi.md +3 -3
  120. data/docs/MessagesApi.md +95 -23
  121. data/docs/MessagingAdsApi.md +1 -1
  122. data/docs/PhoneNumbersApi.md +14 -14
  123. data/docs/PinterestPlatformData.md +1 -1
  124. data/docs/PostAnalytics.md +1 -1
  125. data/docs/PostsApi.md +5 -5
  126. data/docs/ProfilesApi.md +1 -1
  127. data/docs/PurchasePhoneNumberRequest.md +1 -1
  128. data/docs/PurchaseWhatsAppPhoneNumberRequest.md +1 -1
  129. data/docs/ReachAndFrequencyApi.md +2 -2
  130. data/docs/RecyclingConfig.md +1 -1
  131. data/docs/ReplyToMentionRequest.md +1 -1
  132. data/docs/RetweetPostRequest.md +1 -1
  133. data/docs/ReviewWebhookReview.md +1 -1
  134. data/docs/ReviewWebhookReviewReviewer.md +1 -1
  135. data/docs/ReviewsApi.md +6 -6
  136. data/docs/SMSApi.md +11 -11
  137. data/docs/SavedTargetingAudience.md +1 -1
  138. data/docs/SelectGoogleBusinessLocation200ResponseAccount.md +1 -1
  139. data/docs/SelectGoogleBusinessLocationRequest.md +2 -2
  140. data/docs/SendDiscordDirectMessage200Response.md +1 -1
  141. data/docs/SendInboxMessage200ResponseData.md +1 -1
  142. data/docs/SendInboxMessageRequest.md +3 -3
  143. data/docs/SendPrivateReplyToCommentRequest.md +2 -2
  144. data/docs/SendTypingIndicatorRequest.md +1 -1
  145. data/docs/SendWhatsAppFlowMessageRequest.md +1 -1
  146. data/docs/SetCommentModerationRequest.md +1 -1
  147. data/docs/SetConversationThreadControl200Response.md +20 -0
  148. data/docs/SetConversationThreadControl200ResponseControl.md +18 -0
  149. data/docs/SetConversationThreadControlRequest.md +24 -0
  150. data/docs/SetWhatsAppFlowsEncryptionKeyRequest.md +1 -1
  151. data/docs/SetWhatsappBusinessUsernameRequest.md +1 -1
  152. data/docs/StartSmsRegistrationRequest.md +1 -1
  153. data/docs/StartSmsRegistrationRequestCampaign.md +1 -1
  154. data/docs/SubmitPhoneNumberKycRequest.md +1 -1
  155. data/docs/SubmitWhatsAppNumberKycRequest.md +1 -1
  156. data/docs/SyncExternalPosts200Response.md +1 -1
  157. data/docs/SyncExternalPostsRequest.md +1 -1
  158. data/docs/TrackingTag.md +2 -2
  159. data/docs/TrackingTagsApi.md +6 -6
  160. data/docs/TwitterEngagementApi.md +9 -9
  161. data/docs/UnblockWhatsAppUsersRequest.md +1 -1
  162. data/docs/UpdateAccountRequestXCapabilities.md +1 -1
  163. data/docs/UpdateAdAccountRequest.md +1 -1
  164. data/docs/UpdateAdSetRequestPlatformSpecificData.md +1 -1
  165. data/docs/UpdateConversionDestinationRequest.md +1 -1
  166. data/docs/UpdateGmbLocationRequest.md +1 -1
  167. data/docs/UpdateInboxConversationRequest.md +1 -1
  168. data/docs/UpdatePostMetadataRequest.md +1 -1
  169. data/docs/UpdateWhatsAppBusinessProfileRequest.md +1 -1
  170. data/docs/UpdateWhatsAppDisplayNameRequest.md +1 -1
  171. data/docs/UpdateWhatsAppFlowRequest.md +1 -1
  172. data/docs/UpdateWhatsAppTemplateByIdRequest.md +1 -1
  173. data/docs/UpdateWhatsAppTemplateRequest.md +1 -1
  174. data/docs/UpdateWorkflowRequest.md +1 -1
  175. data/docs/UploadWhatsAppFlowJsonRequest.md +1 -1
  176. data/docs/UploadWhatsAppProfilePhotoRequest1.md +1 -1
  177. data/docs/UploadedOrDerivedAudience.md +2 -2
  178. data/docs/UsageApi.md +12 -12
  179. data/docs/UsageMetering.md +1 -1
  180. data/docs/UsageStats.md +1 -1
  181. data/docs/UsageStatsSpend.md +1 -1
  182. data/docs/UsageStatsUsage.md +2 -2
  183. data/docs/UsersApi.md +1 -1
  184. data/docs/ValidateApi.md +3 -3
  185. data/docs/VerifyApi.md +1 -1
  186. data/docs/VoiceApi.md +2 -2
  187. data/docs/WebhookEventsApi.md +76 -7
  188. data/docs/WebhookPayloadAdStatusChangedError.md +3 -3
  189. data/docs/WebhookPayloadAdStatusChangedStatus.md +1 -1
  190. data/docs/WebhookPayloadCommentAccount.md +2 -2
  191. data/docs/WebhookPayloadCommentPost.md +1 -1
  192. data/docs/WebhookPayloadConversationControlChanged.md +30 -0
  193. data/docs/WebhookPayloadConversationControlChangedControl.md +22 -0
  194. data/docs/WebhookPayloadLeadAccount.md +2 -2
  195. data/docs/WebhookPayloadMessageMessageSender.md +3 -3
  196. data/docs/WebhookPayloadMessageMetadata.md +3 -1
  197. data/docs/WebhookPayloadMessageSentMessage.md +1 -1
  198. data/docs/WebhookPayloadReviewNewAccount.md +1 -1
  199. data/docs/WhatsAppApi.md +51 -51
  200. data/docs/WhatsAppCallingApi.md +3 -3
  201. data/docs/WhatsAppFlowsApi.md +18 -18
  202. data/docs/WhatsAppPhoneNumbersApi.md +12 -12
  203. data/docs/WhatsAppSandboxApi.md +2 -2
  204. data/docs/WhatsAppTemplatesApi.md +2 -2
  205. data/docs/WorkflowEdge.md +1 -1
  206. data/docs/WorkflowExecutionEvent.md +1 -1
  207. data/docs/WorkflowsApi.md +3 -3
  208. data/docs/XApiOperation.md +2 -2
  209. data/docs/XApiOperationTriggeredByInner.md +1 -1
  210. data/docs/XApiPricing.md +1 -1
  211. data/lib/zernio-sdk/api/account_groups_api.rb +2 -2
  212. data/lib/zernio-sdk/api/accounts_api.rb +10 -10
  213. data/lib/zernio-sdk/api/ad_accounts_api.rb +12 -12
  214. data/lib/zernio-sdk/api/ad_audiences_api.rb +6 -6
  215. data/lib/zernio-sdk/api/ad_campaigns_api.rb +60 -60
  216. data/lib/zernio-sdk/api/ad_creatives_api.rb +20 -20
  217. data/lib/zernio-sdk/api/ad_insights_api.rb +4 -4
  218. data/lib/zernio-sdk/api/ad_library_api.rb +2 -2
  219. data/lib/zernio-sdk/api/ad_targeting_api.rb +6 -6
  220. data/lib/zernio-sdk/api/analytics_api.rb +22 -22
  221. data/lib/zernio-sdk/api/comments_api.rb +20 -20
  222. data/lib/zernio-sdk/api/connect_api.rb +91 -34
  223. data/lib/zernio-sdk/api/conversions_api.rb +12 -12
  224. data/lib/zernio-sdk/api/discord_api.rb +18 -18
  225. data/lib/zernio-sdk/api/gmb_attributes_api.rb +4 -4
  226. data/lib/zernio-sdk/api/gmb_food_menus_api.rb +4 -4
  227. data/lib/zernio-sdk/api/gmb_location_details_api.rb +4 -4
  228. data/lib/zernio-sdk/api/gmb_media_api.rb +2 -2
  229. data/lib/zernio-sdk/api/gmb_place_actions_api.rb +2 -2
  230. data/lib/zernio-sdk/api/gmb_reviews_api.rb +8 -8
  231. data/lib/zernio-sdk/api/inbox_analytics_api.rb +10 -10
  232. data/lib/zernio-sdk/api/instagram_api.rb +2 -2
  233. data/lib/zernio-sdk/api/lead_gen_api.rb +4 -4
  234. data/lib/zernio-sdk/api/linked_in_mentions_api.rb +2 -2
  235. data/lib/zernio-sdk/api/logs_api.rb +2 -2
  236. data/lib/zernio-sdk/api/mentions_api.rb +4 -4
  237. data/lib/zernio-sdk/api/messages_api.rb +104 -30
  238. data/lib/zernio-sdk/api/messaging_ads_api.rb +2 -2
  239. data/lib/zernio-sdk/api/phone_numbers_api.rb +24 -24
  240. data/lib/zernio-sdk/api/posts_api.rb +8 -8
  241. data/lib/zernio-sdk/api/profiles_api.rb +2 -2
  242. data/lib/zernio-sdk/api/reach_and_frequency_api.rb +4 -4
  243. data/lib/zernio-sdk/api/reviews_api.rb +8 -8
  244. data/lib/zernio-sdk/api/sms_api.rb +20 -20
  245. data/lib/zernio-sdk/api/tracking_tags_api.rb +12 -12
  246. data/lib/zernio-sdk/api/twitter_engagement_api.rb +12 -12
  247. data/lib/zernio-sdk/api/usage_api.rb +14 -14
  248. data/lib/zernio-sdk/api/users_api.rb +2 -2
  249. data/lib/zernio-sdk/api/validate_api.rb +4 -4
  250. data/lib/zernio-sdk/api/verify_api.rb +2 -2
  251. data/lib/zernio-sdk/api/voice_api.rb +4 -4
  252. data/lib/zernio-sdk/api/webhook_events_api.rb +80 -14
  253. data/lib/zernio-sdk/api/whats_app_api.rb +54 -54
  254. data/lib/zernio-sdk/api/whats_app_calling_api.rb +4 -4
  255. data/lib/zernio-sdk/api/whats_app_flows_api.rb +20 -20
  256. data/lib/zernio-sdk/api/whats_app_phone_numbers_api.rb +20 -20
  257. data/lib/zernio-sdk/api/whats_app_sandbox_api.rb +4 -4
  258. data/lib/zernio-sdk/api/whats_app_templates_api.rb +2 -2
  259. data/lib/zernio-sdk/api/workflows_api.rb +6 -6
  260. data/lib/zernio-sdk/models/account_with_follower_stats_all_of_account_stats.rb +2 -2
  261. data/lib/zernio-sdk/models/ad.rb +4 -4
  262. data/lib/zernio-sdk/models/ad_creative.rb +6 -6
  263. data/lib/zernio-sdk/models/ad_daily_metrics.rb +4 -4
  264. data/lib/zernio-sdk/models/ad_engagement_counts.rb +1 -1
  265. data/lib/zernio-sdk/models/ad_funnel_counts.rb +4 -4
  266. data/lib/zernio-sdk/models/ad_keyword.rb +1 -1
  267. data/lib/zernio-sdk/models/ad_metrics.rb +4 -4
  268. data/lib/zernio-sdk/models/ad_tree_ad_set.rb +1 -1
  269. data/lib/zernio-sdk/models/ad_tree_campaign.rb +4 -4
  270. data/lib/zernio-sdk/models/add_ad_keywords_request.rb +1 -1
  271. data/lib/zernio-sdk/models/add_message_reaction_request.rb +1 -1
  272. data/lib/zernio-sdk/models/adjust_conversions_request_adjustments_inner.rb +4 -4
  273. data/lib/zernio-sdk/models/adjust_conversions_request_adjustments_inner_user.rb +1 -1
  274. data/lib/zernio-sdk/models/ads_timeline_response_rows_inner.rb +1 -1
  275. data/lib/zernio-sdk/models/analytics_delta_entry.rb +1 -1
  276. data/lib/zernio-sdk/models/analytics_list_response.rb +1 -1
  277. data/lib/zernio-sdk/models/api_key.rb +1 -1
  278. data/lib/zernio-sdk/models/appeal_sms_registration_request.rb +1 -1
  279. data/lib/zernio-sdk/models/assign_google_business_location200_response_account.rb +1 -1
  280. data/lib/zernio-sdk/models/assign_google_business_location_request.rb +2 -2
  281. data/lib/zernio-sdk/models/attach_campaign_assets_request.rb +2 -2
  282. data/lib/zernio-sdk/models/billing_snapshot.rb +1 -1
  283. data/lib/zernio-sdk/models/billing_snapshot_plan.rb +1 -1
  284. data/lib/zernio-sdk/models/block_whats_app_users_request.rb +1 -1
  285. data/lib/zernio-sdk/models/bookmark_post_request.rb +1 -1
  286. data/lib/zernio-sdk/models/boost_post_request.rb +5 -5
  287. data/lib/zernio-sdk/models/boost_post_request_platform_specific_data.rb +1 -1
  288. data/lib/zernio-sdk/models/business_center.rb +2 -2
  289. data/lib/zernio-sdk/models/call_record.rb +2 -2
  290. data/lib/zernio-sdk/models/campaign_analytics_response_analytics_daily_inner.rb +4 -4
  291. data/lib/zernio-sdk/models/check_phone_number_availability200_response.rb +1 -1
  292. data/lib/zernio-sdk/models/check_phone_number_portability200_response_results_inner.rb +2 -2
  293. data/lib/zernio-sdk/models/connect_whats_app_embedded_signup_request.rb +4 -3
  294. data/lib/zernio-sdk/models/conversation.rb +334 -0
  295. data/lib/zernio-sdk/models/conversion_destination.rb +1 -1
  296. data/lib/zernio-sdk/models/conversion_event.rb +1 -1
  297. data/lib/zernio-sdk/models/create_ad_campaign_request.rb +1 -1
  298. data/lib/zernio-sdk/models/create_ad_creative_request.rb +1 -1
  299. data/lib/zernio-sdk/models/create_api_key_request.rb +1 -1
  300. data/lib/zernio-sdk/models/create_inbox_conversation201_response_data.rb +2 -2
  301. data/lib/zernio-sdk/models/create_inbox_conversation_request.rb +3 -3
  302. data/lib/zernio-sdk/models/create_phone_number_port_in_request_end_user.rb +3 -3
  303. data/lib/zernio-sdk/models/create_standalone_ad201_response_one_of.rb +1 -1
  304. data/lib/zernio-sdk/models/create_standalone_ad201_response_one_of1.rb +1 -1
  305. data/lib/zernio-sdk/models/create_standalone_ad_request.rb +22 -22
  306. data/lib/zernio-sdk/models/create_standalone_ad_request_placement_assets.rb +1 -1
  307. data/lib/zernio-sdk/models/create_standalone_ad_request_placement_assets_rules_inner_placements.rb +1 -1
  308. data/lib/zernio-sdk/models/create_standalone_ad_request_placements.rb +1 -1
  309. data/lib/zernio-sdk/models/create_standalone_ad_request_platform_specific_data.rb +1 -1
  310. data/lib/zernio-sdk/models/create_standalone_ad_request_video.rb +3 -3
  311. data/lib/zernio-sdk/models/create_whats_app_flow_request.rb +1 -1
  312. data/lib/zernio-sdk/models/create_whats_app_group_chat_request.rb +1 -1
  313. data/lib/zernio-sdk/models/create_whats_app_template_request.rb +1 -1
  314. data/lib/zernio-sdk/models/ctwa_ad_request_body_video.rb +1 -1
  315. data/lib/zernio-sdk/models/custom_conversion.rb +1 -1
  316. data/lib/zernio-sdk/models/delete_whatsapp_business_username_request.rb +1 -1
  317. data/lib/zernio-sdk/models/discord_scheduled_event.rb +2 -2
  318. data/lib/zernio-sdk/models/edit_inbox_comment_request.rb +1 -1
  319. data/lib/zernio-sdk/models/edit_inbox_message_request.rb +1 -1
  320. data/lib/zernio-sdk/models/enable_sms_on_number200_response.rb +1 -1
  321. data/lib/zernio-sdk/models/error_response.rb +1 -1
  322. data/lib/zernio-sdk/models/estimate_ad_reach_request.rb +1 -1
  323. data/lib/zernio-sdk/models/external_post_webhook_post.rb +2 -2
  324. data/lib/zernio-sdk/models/follow_user_request.rb +2 -2
  325. data/lib/zernio-sdk/models/geo_restriction.rb +1 -1
  326. data/lib/zernio-sdk/models/get_ad_comments200_response_meta.rb +4 -4
  327. data/lib/zernio-sdk/models/get_ad_media200_response.rb +1 -1
  328. data/lib/zernio-sdk/models/get_ad_media200_response_media_inner.rb +1 -1
  329. data/lib/zernio-sdk/models/get_ads_search_terms200_response_data_inner.rb +1 -1
  330. data/lib/zernio-sdk/models/get_google_business_location_details200_response_location.rb +1 -1
  331. data/lib/zernio-sdk/models/get_inbox_conversation200_response_data.rb +1 -1
  332. data/lib/zernio-sdk/models/get_inbox_conversation_messages200_response_messages_inner.rb +1 -1
  333. data/lib/zernio-sdk/models/get_inbox_post_comments200_response_comments_inner.rb +2 -2
  334. data/lib/zernio-sdk/models/get_inbox_post_comments200_response_comments_inner_from.rb +1 -1
  335. data/lib/zernio-sdk/models/get_inbox_post_comments200_response_meta_ad_comments.rb +1 -1
  336. data/lib/zernio-sdk/models/get_inbox_top_accounts200_response_accounts_inner.rb +1 -1
  337. data/lib/zernio-sdk/models/get_linked_in_bid_pricing_request.rb +1 -1
  338. data/lib/zernio-sdk/models/get_phone_number200_response_phone_number.rb +1 -1
  339. data/lib/zernio-sdk/models/get_phone_number_kyc_form200_response_reusable.rb +1 -1
  340. data/lib/zernio-sdk/models/get_phone_number_kyc_form200_response_reusable_options_inner.rb +2 -2
  341. data/lib/zernio-sdk/models/get_phone_number_kyc_form200_response_reusable_options_inner_details_inner.rb +1 -1
  342. data/lib/zernio-sdk/models/get_phone_number_port_in_requirements200_response.rb +1 -1
  343. data/lib/zernio-sdk/models/get_whats_app_number_kyc_form200_response_fields_inner.rb +1 -1
  344. data/lib/zernio-sdk/models/get_whats_app_sdk_config200_response.rb +219 -0
  345. data/lib/zernio-sdk/models/google_business_platform_data.rb +2 -2
  346. data/lib/zernio-sdk/models/hide_inbox_comment_request.rb +1 -1
  347. data/lib/zernio-sdk/models/inbox_webhook_account.rb +3 -3
  348. data/lib/zernio-sdk/models/inbox_webhook_conversation.rb +1 -1
  349. data/lib/zernio-sdk/models/inbox_webhook_message_sender.rb +3 -3
  350. data/lib/zernio-sdk/models/like_inbox_comment_request.rb +1 -1
  351. data/lib/zernio-sdk/models/like_post_request.rb +1 -1
  352. data/lib/zernio-sdk/models/linked_in_ads_platform_data_thought_leader.rb +1 -1
  353. data/lib/zernio-sdk/models/linked_in_platform_data.rb +1 -1
  354. data/lib/zernio-sdk/models/list_ad_audiences200_response_audiences_inner.rb +1 -1
  355. data/lib/zernio-sdk/models/list_calls200_response_calls_inner.rb +2 -2
  356. data/lib/zernio-sdk/models/list_discord_pinned_messages200_response_data_inner.rb +1 -1
  357. data/lib/zernio-sdk/models/list_google_business_locations200_response_locations_inner.rb +1 -1
  358. data/lib/zernio-sdk/models/list_inbox_comments200_response_data_inner.rb +3 -3
  359. data/lib/zernio-sdk/models/list_inbox_conversations200_response_data_inner.rb +24 -2
  360. data/lib/zernio-sdk/models/list_inbox_reviews200_response_data_inner.rb +6 -6
  361. data/lib/zernio-sdk/models/list_phone_numbers200_response.rb +1 -1
  362. data/lib/zernio-sdk/models/list_phone_numbers200_response_numbers_inner.rb +3 -3
  363. data/lib/zernio-sdk/models/list_sip_trunks200_response.rb +1 -1
  364. data/lib/zernio-sdk/models/list_sms_sender_ids200_response_budget.rb +1 -1
  365. data/lib/zernio-sdk/models/list_whats_app_account_events200_response_events_inner.rb +1 -1
  366. data/lib/zernio-sdk/models/media_item.rb +1 -1
  367. data/lib/zernio-sdk/models/pinterest_platform_data.rb +1 -1
  368. data/lib/zernio-sdk/models/post_analytics.rb +1 -1
  369. data/lib/zernio-sdk/models/purchase_phone_number_request.rb +1 -1
  370. data/lib/zernio-sdk/models/purchase_whats_app_phone_number_request.rb +1 -1
  371. data/lib/zernio-sdk/models/recycling_config.rb +2 -2
  372. data/lib/zernio-sdk/models/reply_to_mention_request.rb +1 -1
  373. data/lib/zernio-sdk/models/retweet_post_request.rb +1 -1
  374. data/lib/zernio-sdk/models/review_webhook_review.rb +1 -1
  375. data/lib/zernio-sdk/models/review_webhook_review_reviewer.rb +1 -1
  376. data/lib/zernio-sdk/models/saved_targeting_audience.rb +1 -1
  377. data/lib/zernio-sdk/models/select_google_business_location200_response_account.rb +1 -1
  378. data/lib/zernio-sdk/models/select_google_business_location_request.rb +2 -2
  379. data/lib/zernio-sdk/models/send_discord_direct_message200_response.rb +1 -1
  380. data/lib/zernio-sdk/models/send_inbox_message200_response_data.rb +1 -1
  381. data/lib/zernio-sdk/models/send_inbox_message_request.rb +3 -3
  382. data/lib/zernio-sdk/models/send_private_reply_to_comment_request.rb +2 -2
  383. data/lib/zernio-sdk/models/send_typing_indicator_request.rb +1 -1
  384. data/lib/zernio-sdk/models/send_whats_app_flow_message_request.rb +1 -1
  385. data/lib/zernio-sdk/models/set_comment_moderation_request.rb +1 -1
  386. data/lib/zernio-sdk/models/set_conversation_thread_control200_response.rb +156 -0
  387. data/lib/zernio-sdk/models/set_conversation_thread_control200_response_control.rb +181 -0
  388. data/lib/zernio-sdk/models/set_conversation_thread_control_request.rb +266 -0
  389. data/lib/zernio-sdk/models/set_whats_app_flows_encryption_key_request.rb +1 -1
  390. data/lib/zernio-sdk/models/set_whatsapp_business_username_request.rb +1 -1
  391. data/lib/zernio-sdk/models/slack_platform_data.rb +1 -1
  392. data/lib/zernio-sdk/models/start_sms_registration_request.rb +1 -1
  393. data/lib/zernio-sdk/models/start_sms_registration_request_campaign.rb +2 -2
  394. data/lib/zernio-sdk/models/submit_phone_number_kyc_request.rb +1 -1
  395. data/lib/zernio-sdk/models/submit_whats_app_number_kyc_request.rb +1 -1
  396. data/lib/zernio-sdk/models/sync_external_posts200_response.rb +1 -1
  397. data/lib/zernio-sdk/models/sync_external_posts_request.rb +1 -1
  398. data/lib/zernio-sdk/models/tracking_tag.rb +3 -3
  399. data/lib/zernio-sdk/models/unblock_whats_app_users_request.rb +1 -1
  400. data/lib/zernio-sdk/models/update_account_request_x_capabilities.rb +2 -2
  401. data/lib/zernio-sdk/models/update_ad_account_request.rb +1 -1
  402. data/lib/zernio-sdk/models/update_ad_request_creative.rb +1 -1
  403. data/lib/zernio-sdk/models/update_ad_set_request_platform_specific_data.rb +1 -1
  404. data/lib/zernio-sdk/models/update_ad_tracking_tags_request_creative.rb +1 -1
  405. data/lib/zernio-sdk/models/update_conversion_destination_request.rb +1 -1
  406. data/lib/zernio-sdk/models/update_gmb_location_request.rb +1 -1
  407. data/lib/zernio-sdk/models/update_inbox_conversation_request.rb +1 -1
  408. data/lib/zernio-sdk/models/update_post_metadata_request.rb +1 -1
  409. data/lib/zernio-sdk/models/update_whats_app_business_profile_request.rb +1 -1
  410. data/lib/zernio-sdk/models/update_whats_app_display_name_request.rb +1 -1
  411. data/lib/zernio-sdk/models/update_whats_app_flow_request.rb +1 -1
  412. data/lib/zernio-sdk/models/update_whats_app_template_by_id_request.rb +1 -1
  413. data/lib/zernio-sdk/models/update_whats_app_template_request.rb +1 -1
  414. data/lib/zernio-sdk/models/update_workflow_request.rb +1 -1
  415. data/lib/zernio-sdk/models/upload_whats_app_flow_json_request.rb +1 -1
  416. data/lib/zernio-sdk/models/upload_whats_app_profile_photo_request1.rb +1 -1
  417. data/lib/zernio-sdk/models/uploaded_or_derived_audience.rb +2 -2
  418. data/lib/zernio-sdk/models/usage_metering.rb +2 -2
  419. data/lib/zernio-sdk/models/usage_metering_peaks.rb +1 -1
  420. data/lib/zernio-sdk/models/usage_stats.rb +2 -2
  421. data/lib/zernio-sdk/models/usage_stats_limits.rb +1 -1
  422. data/lib/zernio-sdk/models/usage_stats_spend.rb +2 -2
  423. data/lib/zernio-sdk/models/usage_stats_usage.rb +3 -3
  424. data/lib/zernio-sdk/models/usage_stats_usage_x_api_calls.rb +1 -1
  425. data/lib/zernio-sdk/models/webhook_payload_ad_status_changed_error.rb +3 -3
  426. data/lib/zernio-sdk/models/webhook_payload_ad_status_changed_status.rb +1 -1
  427. data/lib/zernio-sdk/models/webhook_payload_analytics_synced.rb +1 -1
  428. data/lib/zernio-sdk/models/webhook_payload_analytics_synced_sync.rb +1 -1
  429. data/lib/zernio-sdk/models/webhook_payload_comment.rb +1 -1
  430. data/lib/zernio-sdk/models/webhook_payload_comment_account.rb +2 -2
  431. data/lib/zernio-sdk/models/webhook_payload_comment_post.rb +1 -1
  432. data/lib/zernio-sdk/models/webhook_payload_conversation_control_changed.rb +347 -0
  433. data/lib/zernio-sdk/models/webhook_payload_conversation_control_changed_control.rb +224 -0
  434. data/lib/zernio-sdk/models/webhook_payload_conversation_started.rb +1 -1
  435. data/lib/zernio-sdk/models/webhook_payload_lead_account.rb +2 -2
  436. data/lib/zernio-sdk/models/webhook_payload_message_message_sender.rb +3 -3
  437. data/lib/zernio-sdk/models/webhook_payload_message_metadata.rb +13 -3
  438. data/lib/zernio-sdk/models/webhook_payload_message_sent_message.rb +3 -3
  439. data/lib/zernio-sdk/models/webhook_payload_post_platform.rb +1 -1
  440. data/lib/zernio-sdk/models/webhook_payload_post_platform_account.rb +1 -1
  441. data/lib/zernio-sdk/models/webhook_payload_post_platform_platform.rb +1 -1
  442. data/lib/zernio-sdk/models/webhook_payload_review_new_account.rb +1 -1
  443. data/lib/zernio-sdk/models/workflow_edge.rb +1 -1
  444. data/lib/zernio-sdk/models/workflow_execution_event.rb +1 -1
  445. data/lib/zernio-sdk/models/x_api_operation.rb +2 -2
  446. data/lib/zernio-sdk/models/x_api_operation_triggered_by_inner.rb +1 -1
  447. data/lib/zernio-sdk/models/x_api_pricing.rb +2 -2
  448. data/lib/zernio-sdk/version.rb +1 -1
  449. data/lib/zernio-sdk.rb +7 -0
  450. data/openapi.yaml +1073 -853
  451. data/spec/api/account_groups_api_spec.rb +1 -1
  452. data/spec/api/accounts_api_spec.rb +5 -5
  453. data/spec/api/ad_accounts_api_spec.rb +6 -6
  454. data/spec/api/ad_audiences_api_spec.rb +3 -3
  455. data/spec/api/ad_campaigns_api_spec.rb +30 -30
  456. data/spec/api/ad_creatives_api_spec.rb +10 -10
  457. data/spec/api/ad_insights_api_spec.rb +2 -2
  458. data/spec/api/ad_library_api_spec.rb +1 -1
  459. data/spec/api/ad_targeting_api_spec.rb +3 -3
  460. data/spec/api/analytics_api_spec.rb +11 -11
  461. data/spec/api/comments_api_spec.rb +10 -10
  462. data/spec/api/connect_api_spec.rb +28 -17
  463. data/spec/api/conversions_api_spec.rb +6 -6
  464. data/spec/api/discord_api_spec.rb +9 -9
  465. data/spec/api/gmb_attributes_api_spec.rb +2 -2
  466. data/spec/api/gmb_food_menus_api_spec.rb +2 -2
  467. data/spec/api/gmb_location_details_api_spec.rb +2 -2
  468. data/spec/api/gmb_media_api_spec.rb +1 -1
  469. data/spec/api/gmb_place_actions_api_spec.rb +1 -1
  470. data/spec/api/gmb_reviews_api_spec.rb +4 -4
  471. data/spec/api/inbox_analytics_api_spec.rb +5 -5
  472. data/spec/api/instagram_api_spec.rb +1 -1
  473. data/spec/api/lead_gen_api_spec.rb +2 -2
  474. data/spec/api/linked_in_mentions_api_spec.rb +1 -1
  475. data/spec/api/logs_api_spec.rb +1 -1
  476. data/spec/api/mentions_api_spec.rb +2 -2
  477. data/spec/api/messages_api_spec.rb +28 -15
  478. data/spec/api/messaging_ads_api_spec.rb +1 -1
  479. data/spec/api/phone_numbers_api_spec.rb +12 -12
  480. data/spec/api/posts_api_spec.rb +4 -4
  481. data/spec/api/profiles_api_spec.rb +1 -1
  482. data/spec/api/reach_and_frequency_api_spec.rb +2 -2
  483. data/spec/api/reviews_api_spec.rb +4 -4
  484. data/spec/api/sms_api_spec.rb +10 -10
  485. data/spec/api/tracking_tags_api_spec.rb +6 -6
  486. data/spec/api/twitter_engagement_api_spec.rb +6 -6
  487. data/spec/api/usage_api_spec.rb +7 -7
  488. data/spec/api/users_api_spec.rb +1 -1
  489. data/spec/api/validate_api_spec.rb +2 -2
  490. data/spec/api/verify_api_spec.rb +1 -1
  491. data/spec/api/voice_api_spec.rb +2 -2
  492. data/spec/api/whats_app_api_spec.rb +27 -27
  493. data/spec/api/whats_app_calling_api_spec.rb +2 -2
  494. data/spec/api/whats_app_flows_api_spec.rb +10 -10
  495. data/spec/api/whats_app_phone_numbers_api_spec.rb +10 -10
  496. data/spec/api/whats_app_sandbox_api_spec.rb +2 -2
  497. data/spec/api/whats_app_templates_api_spec.rb +1 -1
  498. data/spec/api/workflows_api_spec.rb +3 -3
  499. data/spec/models/conversation_spec.rb +92 -0
  500. data/spec/models/create_webhook_settings_request_spec.rb +1 -1
  501. data/spec/models/get_whats_app_sdk_config200_response_spec.rb +48 -0
  502. data/spec/models/list_inbox_conversations200_response_data_inner_spec.rb +10 -0
  503. data/spec/models/set_conversation_thread_control200_response_control_spec.rb +40 -0
  504. data/spec/models/set_conversation_thread_control200_response_spec.rb +42 -0
  505. data/spec/models/set_conversation_thread_control_request_spec.rb +62 -0
  506. data/spec/models/update_webhook_settings_request_spec.rb +1 -1
  507. data/spec/models/webhook_payload_conversation_control_changed_control_spec.rb +56 -0
  508. data/spec/models/webhook_payload_conversation_control_changed_spec.rb +76 -0
  509. data/spec/models/webhook_payload_message_metadata_spec.rb +6 -0
  510. data/spec/models/webhook_payload_message_sent_message_spec.rb +1 -1
  511. data/spec/models/webhook_spec.rb +1 -1
  512. data/zernio-sdk-0.0.873.gem +0 -0
  513. metadata +30 -2
  514. data/zernio-sdk-0.0.871.gem +0 -0
@@ -88,7 +88,7 @@ module Zernio
88
88
  end
89
89
 
90
90
  # Attach extension assets to a Google Search campaign
91
- # Attach sitelinks, callouts and/or structured snippets to an already-existing Google Search campaign — the same builders POST /v1/ads/create uses, but without rebuilding the hierarchy. At least one of sitelinks, callouts or structuredSnippets is required. Google-only. Other platforms have no equivalent extension surface and return 501. Approval status is Google-async; poll `asset.policy_summary` after review. Assets stay in the account library even if the campaign is later deleted.
91
+ # Attach sitelinks, callouts and/or structured snippets to an already-existing Google Search campaign. These are the same builders POST /v1/ads/create uses, but without rebuilding the hierarchy. At least one of sitelinks, callouts or structuredSnippets is required. Google-only. Other platforms have no equivalent extension surface and return 501. Approval status is Google-async; poll `asset.policy_summary` after review. Assets stay in the account library even if the campaign is later deleted.
92
92
  # @param campaign_id [String] Numeric Google platform campaign id.
93
93
  # @param attach_campaign_assets_request [AttachCampaignAssetsRequest]
94
94
  # @param [Hash] opts the optional parameters
@@ -99,7 +99,7 @@ module Zernio
99
99
  end
100
100
 
101
101
  # Attach extension assets to a Google Search campaign
102
- # Attach sitelinks, callouts and/or structured snippets to an already-existing Google Search campaign — the same builders POST /v1/ads/create uses, but without rebuilding the hierarchy. At least one of sitelinks, callouts or structuredSnippets is required. Google-only. Other platforms have no equivalent extension surface and return 501. Approval status is Google-async; poll `asset.policy_summary` after review. Assets stay in the account library even if the campaign is later deleted.
102
+ # Attach sitelinks, callouts and/or structured snippets to an already-existing Google Search campaign. These are the same builders POST /v1/ads/create uses, but without rebuilding the hierarchy. At least one of sitelinks, callouts or structuredSnippets is required. Google-only. Other platforms have no equivalent extension surface and return 501. Approval status is Google-async; poll `asset.policy_summary` after review. Assets stay in the account library even if the campaign is later deleted.
103
103
  # @param campaign_id [String] Numeric Google platform campaign id.
104
104
  # @param attach_campaign_assets_request [AttachCampaignAssetsRequest]
105
105
  # @param [Hash] opts the optional parameters
@@ -523,7 +523,7 @@ module Zernio
523
523
  end
524
524
 
525
525
  # Create standalone ad
526
- # Creates a paid ad with custom creative across Meta, Google Ads, Pinterest, TikTok, X/Twitter, LinkedIn, and OpenAI Ads (ChatGPT Ads). Supports three mutually-exclusive request shapes selected by the body, a legacy single-creative shape (all platforms, default), a Meta-only multi-creative shape via the creatives array (one ad set with N ads sharing budget and targeting), and an attach shape via adSetId that adds one new ad to an existing ad set, inheriting its budget, targeting, and schedule (Meta, TikTok, and LinkedIn; on LinkedIn adSetId is the existing Campaign id, and the budget, schedule, targeting and bidding fields must be omitted). Per-platform required fields, budget minimums, and video-ad rules are documented on each property below. LinkedIn creates a Single Image or Single Video Ad backed by a Direct Sponsored Content \"dark post\" authored by a Company Page (see `organizationId`); supported goals are engagement, traffic, awareness, and video_views (video ads use the `video` field; video_views requires a video), and traffic ads require `linkUrl`. **Idempotency:** this endpoint is not idempotent at the platform level (a blind retry creates a second campaign/ad set/ad). Send an `Idempotency-Key` header to make retries safe: the first request with a given key creates the ad and we store the response; a retry with the same key replays that exact response (with `Idempotent-Replayed: true`) instead of creating duplicates. Reusing a key with a different body returns 422; a key whose first request is still in flight returns 409 (retry after a short backoff). Keys are scoped to your credential and expire after 24h.
526
+ # Create a paid ad with custom creative across Meta, Google Ads, Pinterest, TikTok, X, LinkedIn, and OpenAI Ads (ChatGPT Ads). Three mutually-exclusive request shapes are selected by the body: - Legacy single-creative shape (all platforms, the default). - Meta-only multi-creative shape via the creatives array: one ad set with N ads sharing budget and targeting. - Attach shape via adSetId: adds one new ad to an existing ad set, inheriting its budget, targeting, and schedule (Meta, TikTok, and LinkedIn). On LinkedIn adSetId is the existing Campaign id, and the budget, schedule, targeting and bidding fields must be omitted. Per-platform required fields, budget minimums, and video-ad rules are documented on each property below. LinkedIn creates a Single Image or Single Video Ad backed by a Direct Sponsored Content \"dark post\" authored by a Company Page (see `organizationId`). Supported goals are engagement, traffic, awareness, and video_views (video ads use the `video` field; video_views requires a video), and traffic ads require `linkUrl`. **Idempotency:** this endpoint is not idempotent at the platform level (a blind retry creates a second campaign/ad set/ad). Send an `Idempotency-Key` header to make retries safe: the first request with a given key creates the ad and we store the response; a retry with the same key replays that exact response (with `Idempotent-Replayed: true`) instead of creating duplicates. Reusing a key with a different body returns 422; a key whose first request is still in flight returns 409 (retry after a short backoff). Keys are scoped to your credential and expire after 24h.
527
527
  # @param create_standalone_ad_request [CreateStandaloneAdRequest]
528
528
  # @param [Hash] opts the optional parameters
529
529
  # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
@@ -534,7 +534,7 @@ module Zernio
534
534
  end
535
535
 
536
536
  # Create standalone ad
537
- # Creates a paid ad with custom creative across Meta, Google Ads, Pinterest, TikTok, X/Twitter, LinkedIn, and OpenAI Ads (ChatGPT Ads). Supports three mutually-exclusive request shapes selected by the body, a legacy single-creative shape (all platforms, default), a Meta-only multi-creative shape via the creatives array (one ad set with N ads sharing budget and targeting), and an attach shape via adSetId that adds one new ad to an existing ad set, inheriting its budget, targeting, and schedule (Meta, TikTok, and LinkedIn; on LinkedIn adSetId is the existing Campaign id, and the budget, schedule, targeting and bidding fields must be omitted). Per-platform required fields, budget minimums, and video-ad rules are documented on each property below. LinkedIn creates a Single Image or Single Video Ad backed by a Direct Sponsored Content \"dark post\" authored by a Company Page (see `organizationId`); supported goals are engagement, traffic, awareness, and video_views (video ads use the `video` field; video_views requires a video), and traffic ads require `linkUrl`. **Idempotency:** this endpoint is not idempotent at the platform level (a blind retry creates a second campaign/ad set/ad). Send an `Idempotency-Key` header to make retries safe: the first request with a given key creates the ad and we store the response; a retry with the same key replays that exact response (with `Idempotent-Replayed: true`) instead of creating duplicates. Reusing a key with a different body returns 422; a key whose first request is still in flight returns 409 (retry after a short backoff). Keys are scoped to your credential and expire after 24h.
537
+ # Create a paid ad with custom creative across Meta, Google Ads, Pinterest, TikTok, X, LinkedIn, and OpenAI Ads (ChatGPT Ads). Three mutually-exclusive request shapes are selected by the body: - Legacy single-creative shape (all platforms, the default). - Meta-only multi-creative shape via the creatives array: one ad set with N ads sharing budget and targeting. - Attach shape via adSetId: adds one new ad to an existing ad set, inheriting its budget, targeting, and schedule (Meta, TikTok, and LinkedIn). On LinkedIn adSetId is the existing Campaign id, and the budget, schedule, targeting and bidding fields must be omitted. Per-platform required fields, budget minimums, and video-ad rules are documented on each property below. LinkedIn creates a Single Image or Single Video Ad backed by a Direct Sponsored Content \"dark post\" authored by a Company Page (see `organizationId`). Supported goals are engagement, traffic, awareness, and video_views (video ads use the `video` field; video_views requires a video), and traffic ads require `linkUrl`. **Idempotency:** this endpoint is not idempotent at the platform level (a blind retry creates a second campaign/ad set/ad). Send an `Idempotency-Key` header to make retries safe: the first request with a given key creates the ad and we store the response; a retry with the same key replays that exact response (with `Idempotent-Replayed: true`) instead of creating duplicates. Reusing a key with a different body returns 422; a key whose first request is still in flight returns 409 (retry after a short backoff). Keys are scoped to your credential and expire after 24h.
538
538
  # @param create_standalone_ad_request [CreateStandaloneAdRequest]
539
539
  # @param [Hash] opts the optional parameters
540
540
  # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
@@ -875,7 +875,7 @@ module Zernio
875
875
  end
876
876
 
877
877
  # Duplicate a campaign
878
- # Duplicates a campaign, including its ad sets, ads, creatives, and targeting by default (`deepCopy: true`). The copy is created paused so callers can review before launching. Per-platform implementation: - **Meta** uses the native `POST /{campaign-id}/copies` endpoint. - **TikTok** has no native copy primitive; Zernio walks the source graph (`/v2/campaign/get/`, `/v2/adgroup/get/`, `/v2/ad/get/`) and recreates each entity via the corresponding `/create/` endpoints, carrying over budget / targeting / bid_type / bid_price / deep_bid_type / creative fields. Spark Ad linkage (`tiktok_item_id`) is preserved. - **LinkedIn** has no native copy primitive; Zernio walks the source CampaignGroup → Campaigns → Creatives and recreates each entity, carrying over `type` / `costType` / `unitCost` / `optimizationTargetType` / `creativeSelection` / `objectiveType` / `format` / `dailyBudget` / `totalBudget` / `targetingCriteria` / `runSchedule` and every Creative's `content` object verbatim. `statusOption: INHERITED_FROM_SOURCE` is evaluated **per entity**: any Group / Campaign / Creative whose source is `ACTIVE` gets its clone activated too. Duplicating an ACTIVE campaign with `INHERITED_FROM_SOURCE` starts a second front of spend the moment the clone activates — the safe default is `PAUSED`. The new hierarchy is asynchronous to materialize in our DB — we trigger sync discovery automatically. Set `syncAfter: false` to skip and poll `/v1/ads/tree` on your own cadence. Other platforms return 501 Not Implemented.
878
+ # Duplicates a campaign, including its ad sets, ads, creatives, and targeting by default (`deepCopy: true`). The copy is created paused so callers can review before launching. Per-platform implementation: - **Meta** uses the native `POST /{campaign-id}/copies` endpoint. - **TikTok** has no native copy primitive; Zernio walks the source graph (`/v2/campaign/get/`, `/v2/adgroup/get/`, `/v2/ad/get/`) and recreates each entity via the corresponding `/create/` endpoints, carrying over budget / targeting / bid_type / bid_price / deep_bid_type / creative fields. Spark Ad linkage (`tiktok_item_id`) is preserved. - **LinkedIn** has no native copy primitive; Zernio walks the source CampaignGroup → Campaigns → Creatives and recreates each entity, carrying over `type` / `costType` / `unitCost` / `optimizationTargetType` / `creativeSelection` / `objectiveType` / `format` / `dailyBudget` / `totalBudget` / `targetingCriteria` / `runSchedule` and every Creative's `content` object verbatim. `statusOption: INHERITED_FROM_SOURCE` is evaluated **per entity**: any Group / Campaign / Creative whose source is `ACTIVE` gets its clone activated too. Duplicating an ACTIVE campaign with `INHERITED_FROM_SOURCE` starts a second front of spend the moment the clone activates. The safe default is `PAUSED`. The new hierarchy is asynchronous to materialize in our DB, and we trigger sync discovery automatically. Set `syncAfter: false` to skip and poll `/v1/ads/tree` on your own cadence. Other platforms return 501 Not Implemented.
879
879
  # @param campaign_id [String] Source platform campaign ID
880
880
  # @param duplicate_ad_campaign_request [DuplicateAdCampaignRequest]
881
881
  # @param [Hash] opts the optional parameters
@@ -887,7 +887,7 @@ module Zernio
887
887
  end
888
888
 
889
889
  # Duplicate a campaign
890
- # Duplicates a campaign, including its ad sets, ads, creatives, and targeting by default (`deepCopy: true`). The copy is created paused so callers can review before launching. Per-platform implementation: - **Meta** uses the native `POST /{campaign-id}/copies` endpoint. - **TikTok** has no native copy primitive; Zernio walks the source graph (`/v2/campaign/get/`, `/v2/adgroup/get/`, `/v2/ad/get/`) and recreates each entity via the corresponding `/create/` endpoints, carrying over budget / targeting / bid_type / bid_price / deep_bid_type / creative fields. Spark Ad linkage (`tiktok_item_id`) is preserved. - **LinkedIn** has no native copy primitive; Zernio walks the source CampaignGroup → Campaigns → Creatives and recreates each entity, carrying over `type` / `costType` / `unitCost` / `optimizationTargetType` / `creativeSelection` / `objectiveType` / `format` / `dailyBudget` / `totalBudget` / `targetingCriteria` / `runSchedule` and every Creative's `content` object verbatim. `statusOption: INHERITED_FROM_SOURCE` is evaluated **per entity**: any Group / Campaign / Creative whose source is `ACTIVE` gets its clone activated too. Duplicating an ACTIVE campaign with `INHERITED_FROM_SOURCE` starts a second front of spend the moment the clone activates — the safe default is `PAUSED`. The new hierarchy is asynchronous to materialize in our DB — we trigger sync discovery automatically. Set `syncAfter: false` to skip and poll `/v1/ads/tree` on your own cadence. Other platforms return 501 Not Implemented.
890
+ # Duplicates a campaign, including its ad sets, ads, creatives, and targeting by default (`deepCopy: true`). The copy is created paused so callers can review before launching. Per-platform implementation: - **Meta** uses the native `POST /{campaign-id}/copies` endpoint. - **TikTok** has no native copy primitive; Zernio walks the source graph (`/v2/campaign/get/`, `/v2/adgroup/get/`, `/v2/ad/get/`) and recreates each entity via the corresponding `/create/` endpoints, carrying over budget / targeting / bid_type / bid_price / deep_bid_type / creative fields. Spark Ad linkage (`tiktok_item_id`) is preserved. - **LinkedIn** has no native copy primitive; Zernio walks the source CampaignGroup → Campaigns → Creatives and recreates each entity, carrying over `type` / `costType` / `unitCost` / `optimizationTargetType` / `creativeSelection` / `objectiveType` / `format` / `dailyBudget` / `totalBudget` / `targetingCriteria` / `runSchedule` and every Creative's `content` object verbatim. `statusOption: INHERITED_FROM_SOURCE` is evaluated **per entity**: any Group / Campaign / Creative whose source is `ACTIVE` gets its clone activated too. Duplicating an ACTIVE campaign with `INHERITED_FROM_SOURCE` starts a second front of spend the moment the clone activates. The safe default is `PAUSED`. The new hierarchy is asynchronous to materialize in our DB, and we trigger sync discovery automatically. Set `syncAfter: false` to skip and poll `/v1/ads/tree` on your own cadence. Other platforms return 501 Not Implemented.
891
891
  # @param campaign_id [String] Source platform campaign ID
892
892
  # @param duplicate_ad_campaign_request [DuplicateAdCampaignRequest]
893
893
  # @param [Hash] opts the optional parameters
@@ -956,7 +956,7 @@ module Zernio
956
956
  end
957
957
 
958
958
  # Duplicate an ad set
959
- # Duplicates an ad set, including its ads and creatives by default (`deepCopy: true`), via Meta's native `POST /{adset-id}/copies`. The copy is created paused so callers can review before launching. `campaignId` retargets the copy into another campaign; omitted = the source's own campaign. The new hierarchy materializes asynchronously — sync discovery is triggered automatically (`syncAfter: false` to skip).
959
+ # Duplicates an ad set, including its ads and creatives by default (`deepCopy: true`), via Meta's native `POST /{adset-id}/copies`. The copy is created paused so callers can review before launching. `campaignId` retargets the copy into another campaign; omitted = the source's own campaign. The new hierarchy materializes asynchronously, and sync discovery is triggered automatically (`syncAfter: false` to skip).
960
960
  # @param ad_set_id [String] Source platform ad set ID
961
961
  # @param duplicate_ad_set_request [DuplicateAdSetRequest]
962
962
  # @param [Hash] opts the optional parameters
@@ -968,7 +968,7 @@ module Zernio
968
968
  end
969
969
 
970
970
  # Duplicate an ad set
971
- # Duplicates an ad set, including its ads and creatives by default (`deepCopy: true`), via Meta's native `POST /{adset-id}/copies`. The copy is created paused so callers can review before launching. `campaignId` retargets the copy into another campaign; omitted = the source's own campaign. The new hierarchy materializes asynchronously — sync discovery is triggered automatically (`syncAfter: false` to skip).
971
+ # Duplicates an ad set, including its ads and creatives by default (`deepCopy: true`), via Meta's native `POST /{adset-id}/copies`. The copy is created paused so callers can review before launching. `campaignId` retargets the copy into another campaign; omitted = the source's own campaign. The new hierarchy materializes asynchronously, and sync discovery is triggered automatically (`syncAfter: false` to skip).
972
972
  # @param ad_set_id [String] Source platform ad set ID
973
973
  # @param duplicate_ad_set_request [DuplicateAdSetRequest]
974
974
  # @param [Hash] opts the optional parameters
@@ -1100,7 +1100,7 @@ module Zernio
1100
1100
  end
1101
1101
 
1102
1102
  # Live ad-set details incl. learning phase
1103
- # Reads the ad set live from Meta, returned verbatim. The default projection includes `learning_stage_info` (learning-phase status: LEARNING / SUCCESS / FAIL / WAIVING — Meta omits its `status` key on paused ad sets), delivery settings, budgets, schedule and targeting. `fields` is a raw-passthrough override; unknown fields return Meta's 400 verbatim.
1103
+ # Reads the ad set live from Meta, returned verbatim. The default projection includes `learning_stage_info` (learning-phase status: LEARNING / SUCCESS / FAIL / WAIVING; Meta omits its `status` key on paused ad sets), delivery settings, budgets, schedule and targeting. `fields` is a raw-passthrough override; unknown fields return Meta's 400 verbatim.
1104
1104
  # @param ad_set_id [String] Meta ad set id (platformAdSetId).
1105
1105
  # @param account_id [String] Zernio SocialAccount id (posting or ads variant) used to resolve the Meta token.
1106
1106
  # @param [Hash] opts the optional parameters
@@ -1112,7 +1112,7 @@ module Zernio
1112
1112
  end
1113
1113
 
1114
1114
  # Live ad-set details incl. learning phase
1115
- # Reads the ad set live from Meta, returned verbatim. The default projection includes `learning_stage_info` (learning-phase status: LEARNING / SUCCESS / FAIL / WAIVING — Meta omits its `status` key on paused ad sets), delivery settings, budgets, schedule and targeting. `fields` is a raw-passthrough override; unknown fields return Meta's 400 verbatim.
1115
+ # Reads the ad set live from Meta, returned verbatim. The default projection includes `learning_stage_info` (learning-phase status: LEARNING / SUCCESS / FAIL / WAIVING; Meta omits its `status` key on paused ad sets), delivery settings, budgets, schedule and targeting. `fields` is a raw-passthrough override; unknown fields return Meta's 400 verbatim.
1116
1116
  # @param ad_set_id [String] Meta ad set id (platformAdSetId).
1117
1117
  # @param account_id [String] Zernio SocialAccount id (posting or ads variant) used to resolve the Meta token.
1118
1118
  # @param [Hash] opts the optional parameters
@@ -1177,21 +1177,21 @@ module Zernio
1177
1177
  # @param [Hash] opts the optional parameters
1178
1178
  # @option opts [Integer] :page Page number (1-based) (default to 1)
1179
1179
  # @option opts [Integer] :limit Campaigns per page (default to 20)
1180
- # @option opts [String] :source `all` (default) returns both Zernio-created ads and those discovered from the platform's ad manager — matches the web UI's default view. Pass `zernio` to restrict to isExternal=false only. Status is NOT filtered by default — use the `status` param for that. (default to 'all')
1180
+ # @option opts [String] :source `all` (default) returns both Zernio-created ads and those discovered from the platform's ad manager. Matches the web UI's default view. Pass `zernio` to restrict to isExternal=false only. Status is NOT filtered by default; use the `status` param for that. (default to 'all')
1181
1181
  # @option opts [String] :platform
1182
1182
  # @option opts [AdStatus] :status Filter by derived campaign status (post-aggregation)
1183
- # @option opts [String] :ad_account_id One or more platform ad account IDs to scope the tree to (agency profiles connect a whole Business Manager but a workspace usually cares about a subset). Comma-separate for multiple (`?adAccountId=act_1,act_2,act_3`); single value keeps its old shape. Max 50 accounts per request; the plural aliases `adAccountIds` and `platformAdAccountIds` are rejected with a 400 to stop them from silently returning the unfiltered fleet.
1184
- # @option opts [String] :page_id Meta only: Facebook Page ID. Prunes the tree to ads whose creative is backed by this Page — campaigns and ad sets with no ad on the Page drop out, and rolled-up metrics cover only the Page's ads. Mirrors the same filter on /v1/ads and /v1/ads/campaigns.
1185
- # @option opts [String] :account_id Social account ID
1183
+ # @option opts [String] :ad_account_id One or more platform ad account IDs to scope the tree to (agency profiles connect a whole Business Manager but a team usually cares about a subset). Comma-separate for multiple (`?adAccountId=act_1,act_2,act_3`); single value keeps its old shape. Max 50 accounts per request; the plural aliases `adAccountIds` and `platformAdAccountIds` are rejected with a 400 to stop them from silently returning the unfiltered fleet.
1184
+ # @option opts [String] :page_id Meta only: Facebook Page ID. Prunes the tree to ads whose creative is backed by this Page: campaigns and ad sets with no ad on the Page drop out, and rolled-up metrics cover only the Page's ads. Mirrors the same filter on /v1/ads and /v1/ads/campaigns.
1185
+ # @option opts [String] :account_id Account ID
1186
1186
  # @option opts [String] :profile_id Profile ID
1187
- # @option opts [String] :campaign_id Restrict the tree to a single campaign by its platform campaign id (the id the platform assigns, e.g. Meta's numeric campaign id). Filters the campaign set itself, so it works regardless of account size and pagination — pass this when you already hold a campaign id instead of paging the tree to find it. Mirrors the `campaignId` filter on GET /v1/ads.
1188
- # @option opts [Date] :from_date Start of the METRICS date range (YYYY-MM-DD). On its own it affects only the spend/impression numbers overlaid on each node, not which campaigns are returned — pass `hasDelivery` or `minSpend` to also filter the campaign set to this window. Defaults to 90 days ago.
1187
+ # @option opts [String] :campaign_id Restrict the tree to a single campaign by its platform campaign id (the id the platform assigns, e.g. Meta's numeric campaign id). Filters the campaign set itself, so it works regardless of account size and pagination. Pass this when you already hold a campaign id instead of paging the tree to find it. Mirrors the `campaignId` filter on GET /v1/ads.
1188
+ # @option opts [Date] :from_date Start of the METRICS date range (YYYY-MM-DD). On its own it affects only the spend/impression numbers overlaid on each node, not which campaigns are returned. Pass `hasDelivery` or `minSpend` to also filter the campaign set to this window. Defaults to 90 days ago.
1189
1189
  # @option opts [Date] :to_date End of metrics date range (YYYY-MM-DD). Defaults to today. Max 730-day range.
1190
- # @option opts [Boolean] :has_delivery Return only campaigns that delivered between `fromDate` and `toDate` — spend above zero, or impressions served at zero spend. Unlike `status`, which reads a campaign's CURRENT state, this filters on what happened inside the window, so a campaign that spent then and is paused today is still returned. Filters the campaign set itself, so `pagination.total` counts only matching campaigns.
1190
+ # @option opts [Boolean] :has_delivery Return only campaigns that delivered between `fromDate` and `toDate`: spend above zero, or impressions served at zero spend. Unlike `status`, which reads a campaign's CURRENT state, this filters on what happened inside the window, so a campaign that spent then and is paused today is still returned. Filters the campaign set itself, so `pagination.total` counts only matching campaigns.
1191
1191
  # @option opts [Float] :min_spend Return only campaigns whose spend between `fromDate` and `toDate` reaches this amount. Expressed in each campaign's OWN currency (the `currency` field on the campaign node): spend is stored per ad account in its native currency and one response can span several. Implies `hasDelivery`; `minSpend=0` applies no filter.
1192
1192
  # @option opts [String] :sort Campaign-level sort order. `newest` (default) / `oldest` order by the campaign's newest-ad createdAt. `spend_desc` / `spend_asc` order by aggregated spend in the requested date range; campaigns with no spend land at the end. (default to 'newest')
1193
1193
  # @option opts [Integer] :time_increment Set to `1` to also return a daily breakdown. Mirrors Meta Insights' `time_increment=1`: each node gains a `daily[]` array of per-day metrics (same fields as the aggregated `metrics`) alongside the range total, so you get per-entity daily trends in ONE call instead of calling the tree once per day. Only `1` (daily) is supported. The daily series covers the same date range and uses the same source data as `metrics`, except `reach` on Meta and TikTok: the range total is the platform's de-duplicated value, so daily reach does not sum to it. See `dailyLevel` to control which levels carry it.
1194
- # @option opts [String] :daily_level Which tree levels get the `daily[]` series when `timeIncrement=1`. `campaign` (default) attaches it on campaign nodes only — the common per-campaign-trend case, and the smallest payload. `adset` adds it on ad sets too; `ad` adds it on every ad in `ads[]` as well (heaviest — a long range × up to 100 ads per ad set). Scope with `campaignId` to keep `ad`-level responses small. Ignored when `timeIncrement` is unset. (default to 'campaign')
1194
+ # @option opts [String] :daily_level Which tree levels get the `daily[]` series when `timeIncrement=1`. `campaign` (default) attaches it on campaign nodes only: the common per-campaign-trend case, and the smallest payload. `adset` adds it on ad sets too; `ad` adds it on every ad in `ads[]` as well (heaviest: a long range × up to 100 ads per ad set). Scope with `campaignId` to keep `ad`-level responses small. Ignored when `timeIncrement` is unset. (default to 'campaign')
1195
1195
  # @return [AdTreeResponse]
1196
1196
  def get_ad_tree(opts = {})
1197
1197
  data, _status_code, _headers = get_ad_tree_with_http_info(opts)
@@ -1203,21 +1203,21 @@ module Zernio
1203
1203
  # @param [Hash] opts the optional parameters
1204
1204
  # @option opts [Integer] :page Page number (1-based) (default to 1)
1205
1205
  # @option opts [Integer] :limit Campaigns per page (default to 20)
1206
- # @option opts [String] :source `all` (default) returns both Zernio-created ads and those discovered from the platform's ad manager — matches the web UI's default view. Pass `zernio` to restrict to isExternal=false only. Status is NOT filtered by default — use the `status` param for that. (default to 'all')
1206
+ # @option opts [String] :source `all` (default) returns both Zernio-created ads and those discovered from the platform's ad manager. Matches the web UI's default view. Pass `zernio` to restrict to isExternal=false only. Status is NOT filtered by default; use the `status` param for that. (default to 'all')
1207
1207
  # @option opts [String] :platform
1208
1208
  # @option opts [AdStatus] :status Filter by derived campaign status (post-aggregation)
1209
- # @option opts [String] :ad_account_id One or more platform ad account IDs to scope the tree to (agency profiles connect a whole Business Manager but a workspace usually cares about a subset). Comma-separate for multiple (`?adAccountId=act_1,act_2,act_3`); single value keeps its old shape. Max 50 accounts per request; the plural aliases `adAccountIds` and `platformAdAccountIds` are rejected with a 400 to stop them from silently returning the unfiltered fleet.
1210
- # @option opts [String] :page_id Meta only: Facebook Page ID. Prunes the tree to ads whose creative is backed by this Page — campaigns and ad sets with no ad on the Page drop out, and rolled-up metrics cover only the Page's ads. Mirrors the same filter on /v1/ads and /v1/ads/campaigns.
1211
- # @option opts [String] :account_id Social account ID
1209
+ # @option opts [String] :ad_account_id One or more platform ad account IDs to scope the tree to (agency profiles connect a whole Business Manager but a team usually cares about a subset). Comma-separate for multiple (`?adAccountId=act_1,act_2,act_3`); single value keeps its old shape. Max 50 accounts per request; the plural aliases `adAccountIds` and `platformAdAccountIds` are rejected with a 400 to stop them from silently returning the unfiltered fleet.
1210
+ # @option opts [String] :page_id Meta only: Facebook Page ID. Prunes the tree to ads whose creative is backed by this Page: campaigns and ad sets with no ad on the Page drop out, and rolled-up metrics cover only the Page's ads. Mirrors the same filter on /v1/ads and /v1/ads/campaigns.
1211
+ # @option opts [String] :account_id Account ID
1212
1212
  # @option opts [String] :profile_id Profile ID
1213
- # @option opts [String] :campaign_id Restrict the tree to a single campaign by its platform campaign id (the id the platform assigns, e.g. Meta's numeric campaign id). Filters the campaign set itself, so it works regardless of account size and pagination — pass this when you already hold a campaign id instead of paging the tree to find it. Mirrors the `campaignId` filter on GET /v1/ads.
1214
- # @option opts [Date] :from_date Start of the METRICS date range (YYYY-MM-DD). On its own it affects only the spend/impression numbers overlaid on each node, not which campaigns are returned — pass `hasDelivery` or `minSpend` to also filter the campaign set to this window. Defaults to 90 days ago.
1213
+ # @option opts [String] :campaign_id Restrict the tree to a single campaign by its platform campaign id (the id the platform assigns, e.g. Meta's numeric campaign id). Filters the campaign set itself, so it works regardless of account size and pagination. Pass this when you already hold a campaign id instead of paging the tree to find it. Mirrors the `campaignId` filter on GET /v1/ads.
1214
+ # @option opts [Date] :from_date Start of the METRICS date range (YYYY-MM-DD). On its own it affects only the spend/impression numbers overlaid on each node, not which campaigns are returned. Pass `hasDelivery` or `minSpend` to also filter the campaign set to this window. Defaults to 90 days ago.
1215
1215
  # @option opts [Date] :to_date End of metrics date range (YYYY-MM-DD). Defaults to today. Max 730-day range.
1216
- # @option opts [Boolean] :has_delivery Return only campaigns that delivered between `fromDate` and `toDate` — spend above zero, or impressions served at zero spend. Unlike `status`, which reads a campaign's CURRENT state, this filters on what happened inside the window, so a campaign that spent then and is paused today is still returned. Filters the campaign set itself, so `pagination.total` counts only matching campaigns.
1216
+ # @option opts [Boolean] :has_delivery Return only campaigns that delivered between `fromDate` and `toDate`: spend above zero, or impressions served at zero spend. Unlike `status`, which reads a campaign's CURRENT state, this filters on what happened inside the window, so a campaign that spent then and is paused today is still returned. Filters the campaign set itself, so `pagination.total` counts only matching campaigns.
1217
1217
  # @option opts [Float] :min_spend Return only campaigns whose spend between `fromDate` and `toDate` reaches this amount. Expressed in each campaign's OWN currency (the `currency` field on the campaign node): spend is stored per ad account in its native currency and one response can span several. Implies `hasDelivery`; `minSpend=0` applies no filter.
1218
1218
  # @option opts [String] :sort Campaign-level sort order. `newest` (default) / `oldest` order by the campaign's newest-ad createdAt. `spend_desc` / `spend_asc` order by aggregated spend in the requested date range; campaigns with no spend land at the end. (default to 'newest')
1219
1219
  # @option opts [Integer] :time_increment Set to `1` to also return a daily breakdown. Mirrors Meta Insights' `time_increment=1`: each node gains a `daily[]` array of per-day metrics (same fields as the aggregated `metrics`) alongside the range total, so you get per-entity daily trends in ONE call instead of calling the tree once per day. Only `1` (daily) is supported. The daily series covers the same date range and uses the same source data as `metrics`, except `reach` on Meta and TikTok: the range total is the platform's de-duplicated value, so daily reach does not sum to it. See `dailyLevel` to control which levels carry it.
1220
- # @option opts [String] :daily_level Which tree levels get the `daily[]` series when `timeIncrement=1`. `campaign` (default) attaches it on campaign nodes only — the common per-campaign-trend case, and the smallest payload. `adset` adds it on ad sets too; `ad` adds it on every ad in `ads[]` as well (heaviest — a long range × up to 100 ads per ad set). Scope with `campaignId` to keep `ad`-level responses small. Ignored when `timeIncrement` is unset. (default to 'campaign')
1220
+ # @option opts [String] :daily_level Which tree levels get the `daily[]` series when `timeIncrement=1`. `campaign` (default) attaches it on campaign nodes only: the common per-campaign-trend case, and the smallest payload. `adset` adds it on ad sets too; `ad` adds it on every ad in `ads[]` as well (heaviest: a long range × up to 100 ads per ad set). Scope with `campaignId` to keep `ad`-level responses small. Ignored when `timeIncrement` is unset. (default to 'campaign')
1221
1221
  # @return [Array<(AdTreeResponse, Integer, Hash)>] AdTreeResponse data, response status code and response headers
1222
1222
  def get_ad_tree_with_http_info(opts = {})
1223
1223
  if @api_client.config.debugging
@@ -1317,8 +1317,8 @@ module Zernio
1317
1317
  end
1318
1318
 
1319
1319
  # Get daily account metrics
1320
- # Returns daily aggregate metrics across all ads in a SocialAccount as a single time series — one row per calendar day in the requested range. Use this for dashboards that draw a daily-spend or daily-conversions chart, instead of calling `/v1/ads/tree` once per day. `accountId` is required. The lookup is sibling-expanded so passing the `metaads` ID also includes ads under the linked `facebook` / `instagram` posting account (and vice-versa) — same convention as `/v1/ads/tree` and `/v1/ads`. Date range defaults to the last 90 days. Capped at 730 days. Ranges older than the ingested history return a `202` immediately with the covered part and `backfillPending: true` while the rest is backfilled in the background; repeat the request shortly until it returns 200 with full data. With adAccountId set to a Google customer id this is the customer-level performance report (clicks, cost, impressions, conversions, all conversions per day).
1321
- # @param account_id [String] Social account ID. Sibling-expanded to its linked posting↔ads pair.
1320
+ # Returns daily aggregate metrics across all ads in a SocialAccount as a single time series, one row per calendar day in the requested range. Use this for dashboards that draw a daily-spend or daily-conversions chart, instead of calling `/v1/ads/tree` once per day. `accountId` is required. The lookup is sibling-expanded so passing the `metaads` ID also includes ads under the linked `facebook` / `instagram` posting account (and vice-versa), the same convention as `/v1/ads/tree` and `/v1/ads`. Date range defaults to the last 90 days. Capped at 730 days. Ranges older than the ingested history return a `202` immediately with the covered part and `backfillPending: true` while the rest is backfilled in the background; repeat the request shortly until it returns 200 with full data. With adAccountId set to a Google customer id this is the customer-level performance report (clicks, cost, impressions, conversions, all conversions per day).
1321
+ # @param account_id [String] Account ID. Sibling-expanded to its linked posting↔ads pair.
1322
1322
  # @param [Hash] opts the optional parameters
1323
1323
  # @option opts [String] :ad_account_id Optional platform-native ad account ID (e.g. Meta &#x60;act_…&#x60;, TikTok advertiser ID). Use when the connection wraps multiple platform ad accounts and the chart should show one only. Note: rows ingested before 2026-05-13 don&#39;t carry this column; the recurring 7-day re-sync repopulates them naturally.
1324
1324
  # @option opts [Date] :from_date Inclusive start of metrics range (YYYY-MM-DD). Defaults to 90 days ago.
@@ -1331,8 +1331,8 @@ module Zernio
1331
1331
  end
1332
1332
 
1333
1333
  # Get daily account metrics
1334
- # Returns daily aggregate metrics across all ads in a SocialAccount as a single time series — one row per calendar day in the requested range. Use this for dashboards that draw a daily-spend or daily-conversions chart, instead of calling &#x60;/v1/ads/tree&#x60; once per day. &#x60;accountId&#x60; is required. The lookup is sibling-expanded so passing the &#x60;metaads&#x60; ID also includes ads under the linked &#x60;facebook&#x60; / &#x60;instagram&#x60; posting account (and vice-versa) — same convention as &#x60;/v1/ads/tree&#x60; and &#x60;/v1/ads&#x60;. Date range defaults to the last 90 days. Capped at 730 days. Ranges older than the ingested history return a &#x60;202&#x60; immediately with the covered part and &#x60;backfillPending: true&#x60; while the rest is backfilled in the background; repeat the request shortly until it returns 200 with full data. With adAccountId set to a Google customer id this is the customer-level performance report (clicks, cost, impressions, conversions, all conversions per day).
1335
- # @param account_id [String] Social account ID. Sibling-expanded to its linked posting↔ads pair.
1334
+ # Returns daily aggregate metrics across all ads in a SocialAccount as a single time series, one row per calendar day in the requested range. Use this for dashboards that draw a daily-spend or daily-conversions chart, instead of calling &#x60;/v1/ads/tree&#x60; once per day. &#x60;accountId&#x60; is required. The lookup is sibling-expanded so passing the &#x60;metaads&#x60; ID also includes ads under the linked &#x60;facebook&#x60; / &#x60;instagram&#x60; posting account (and vice-versa), the same convention as &#x60;/v1/ads/tree&#x60; and &#x60;/v1/ads&#x60;. Date range defaults to the last 90 days. Capped at 730 days. Ranges older than the ingested history return a &#x60;202&#x60; immediately with the covered part and &#x60;backfillPending: true&#x60; while the rest is backfilled in the background; repeat the request shortly until it returns 200 with full data. With adAccountId set to a Google customer id this is the customer-level performance report (clicks, cost, impressions, conversions, all conversions per day).
1335
+ # @param account_id [String] Account ID. Sibling-expanded to its linked posting↔ads pair.
1336
1336
  # @param [Hash] opts the optional parameters
1337
1337
  # @option opts [String] :ad_account_id Optional platform-native ad account ID (e.g. Meta &#x60;act_…&#x60;, TikTok advertiser ID). Use when the connection wraps multiple platform ad accounts and the chart should show one only. Note: rows ingested before 2026-05-13 don&#39;t carry this column; the recurring 7-day re-sync repopulates them naturally.
1338
1338
  # @option opts [Date] :from_date Inclusive start of metrics range (YYYY-MM-DD). Defaults to 90 days ago.
@@ -1554,19 +1554,19 @@ module Zernio
1554
1554
  # List campaigns
1555
1555
  # Returns campaigns as virtual aggregations over ad documents grouped by platform campaign ID. Metrics (spend, impressions, clicks, etc.) are summed across all ads in each campaign. Campaign status is derived from child ad statuses (active > pending_review > paused > error > completed > cancelled > rejected).
1556
1556
  # @param [Hash] opts the optional parameters
1557
- # @option opts [Boolean] :include_empty Meta only. Campaign reads aggregate over ad documents, so a campaign with ZERO ads is normally invisible here — the state the two-step create (campaign, then ads via &#x60;existingCampaignId&#x60;) leaves behind whenever Meta rejects the ad step. Set true to list those too, with &#x60;adCount: 0&#x60; and zeroed metrics. Requires &#x60;accountId&#x60; and &#x60;adAccountId&#x60;, since an empty campaign has no ad row to resolve a token or ad account from.
1557
+ # @option opts [Boolean] :include_empty Meta only. Campaign reads aggregate over ad documents, so a campaign with ZERO ads is normally invisible here, the state the two-step create (campaign, then ads via &#x60;existingCampaignId&#x60;) leaves behind whenever Meta rejects the ad step. Set true to list those too, with &#x60;adCount: 0&#x60; and zeroed metrics. Requires &#x60;accountId&#x60; and &#x60;adAccountId&#x60;, since an empty campaign has no ad row to resolve a token or ad account from.
1558
1558
  # @option opts [Integer] :page Page number (1-based) (default to 1)
1559
1559
  # @option opts [Integer] :limit (default to 20)
1560
- # @option opts [String] :source &#x60;all&#x60; (default) returns both Zernio-created ads and those discovered from the platform&#39;s ad manager — matches the web UI&#39;s default view. Pass &#x60;zernio&#x60; to restrict to isExternal&#x3D;false only. Status is NOT filtered by default — use the &#x60;status&#x60; param for that. (default to 'all')
1560
+ # @option opts [String] :source &#x60;all&#x60; (default) returns both Zernio-created ads and those discovered from the platform&#39;s ad manager. Matches the web UI&#39;s default view. Pass &#x60;zernio&#x60; to restrict to isExternal&#x3D;false only. Status is NOT filtered by default; use the &#x60;status&#x60; param for that. (default to 'all')
1561
1561
  # @option opts [String] :platform
1562
1562
  # @option opts [AdStatus] :status Filter by derived campaign status (post-aggregation)
1563
1563
  # @option opts [String] :ad_account_id Platform ad account ID (e.g. act_123 for Meta)
1564
1564
  # @option opts [String] :page_id Meta only: Facebook Page ID. Campaigns have no Page of their own, so this keeps campaigns having at least one ad backed by this Page, with adCount and metrics computed over those ads only. Mirrors the same filter on /v1/ads and /v1/ads/tree.
1565
- # @option opts [String] :account_id Social account ID
1565
+ # @option opts [String] :account_id Account ID
1566
1566
  # @option opts [String] :profile_id Profile ID
1567
1567
  # @option opts [Date] :from_date Start of metrics date range (YYYY-MM-DD, inclusive). Defaults to 90 days ago when both date params are omitted.
1568
1568
  # @option opts [Date] :to_date End of metrics date range (YYYY-MM-DD, inclusive). Defaults to today. Max 730-day range.
1569
- # @option opts [Boolean] :has_delivery Return only campaigns that delivered between &#x60;fromDate&#x60; and &#x60;toDate&#x60; — spend above zero, or impressions served at zero spend. Unlike &#x60;status&#x60;, which reads a campaign&#39;s CURRENT state, this filters on what happened inside the window. Filters the campaign set itself, so &#x60;pagination.total&#x60; counts only matching campaigns. Mirrors the same filter on /v1/ads/tree.
1569
+ # @option opts [Boolean] :has_delivery Return only campaigns that delivered between &#x60;fromDate&#x60; and &#x60;toDate&#x60;: spend above zero, or impressions served at zero spend. Unlike &#x60;status&#x60;, which reads a campaign&#39;s CURRENT state, this filters on what happened inside the window. Filters the campaign set itself, so &#x60;pagination.total&#x60; counts only matching campaigns. Mirrors the same filter on /v1/ads/tree.
1570
1570
  # @option opts [Float] :min_spend Return only campaigns whose spend between &#x60;fromDate&#x60; and &#x60;toDate&#x60; reaches this amount, in each campaign&#39;s OWN currency (the &#x60;currency&#x60; field on the campaign). Implies &#x60;hasDelivery&#x60;; &#x60;minSpend&#x3D;0&#x60; applies no filter. Mirrors the same filter on /v1/ads/tree.
1571
1571
  # @return [ListAdCampaigns200Response]
1572
1572
  def list_ad_campaigns(opts = {})
@@ -1577,19 +1577,19 @@ module Zernio
1577
1577
  # List campaigns
1578
1578
  # Returns campaigns as virtual aggregations over ad documents grouped by platform campaign ID. Metrics (spend, impressions, clicks, etc.) are summed across all ads in each campaign. Campaign status is derived from child ad statuses (active &gt; pending_review &gt; paused &gt; error &gt; completed &gt; cancelled &gt; rejected).
1579
1579
  # @param [Hash] opts the optional parameters
1580
- # @option opts [Boolean] :include_empty Meta only. Campaign reads aggregate over ad documents, so a campaign with ZERO ads is normally invisible here — the state the two-step create (campaign, then ads via &#x60;existingCampaignId&#x60;) leaves behind whenever Meta rejects the ad step. Set true to list those too, with &#x60;adCount: 0&#x60; and zeroed metrics. Requires &#x60;accountId&#x60; and &#x60;adAccountId&#x60;, since an empty campaign has no ad row to resolve a token or ad account from.
1580
+ # @option opts [Boolean] :include_empty Meta only. Campaign reads aggregate over ad documents, so a campaign with ZERO ads is normally invisible here, the state the two-step create (campaign, then ads via &#x60;existingCampaignId&#x60;) leaves behind whenever Meta rejects the ad step. Set true to list those too, with &#x60;adCount: 0&#x60; and zeroed metrics. Requires &#x60;accountId&#x60; and &#x60;adAccountId&#x60;, since an empty campaign has no ad row to resolve a token or ad account from.
1581
1581
  # @option opts [Integer] :page Page number (1-based) (default to 1)
1582
1582
  # @option opts [Integer] :limit (default to 20)
1583
- # @option opts [String] :source &#x60;all&#x60; (default) returns both Zernio-created ads and those discovered from the platform&#39;s ad manager — matches the web UI&#39;s default view. Pass &#x60;zernio&#x60; to restrict to isExternal&#x3D;false only. Status is NOT filtered by default — use the &#x60;status&#x60; param for that. (default to 'all')
1583
+ # @option opts [String] :source &#x60;all&#x60; (default) returns both Zernio-created ads and those discovered from the platform&#39;s ad manager. Matches the web UI&#39;s default view. Pass &#x60;zernio&#x60; to restrict to isExternal&#x3D;false only. Status is NOT filtered by default; use the &#x60;status&#x60; param for that. (default to 'all')
1584
1584
  # @option opts [String] :platform
1585
1585
  # @option opts [AdStatus] :status Filter by derived campaign status (post-aggregation)
1586
1586
  # @option opts [String] :ad_account_id Platform ad account ID (e.g. act_123 for Meta)
1587
1587
  # @option opts [String] :page_id Meta only: Facebook Page ID. Campaigns have no Page of their own, so this keeps campaigns having at least one ad backed by this Page, with adCount and metrics computed over those ads only. Mirrors the same filter on /v1/ads and /v1/ads/tree.
1588
- # @option opts [String] :account_id Social account ID
1588
+ # @option opts [String] :account_id Account ID
1589
1589
  # @option opts [String] :profile_id Profile ID
1590
1590
  # @option opts [Date] :from_date Start of metrics date range (YYYY-MM-DD, inclusive). Defaults to 90 days ago when both date params are omitted.
1591
1591
  # @option opts [Date] :to_date End of metrics date range (YYYY-MM-DD, inclusive). Defaults to today. Max 730-day range.
1592
- # @option opts [Boolean] :has_delivery Return only campaigns that delivered between &#x60;fromDate&#x60; and &#x60;toDate&#x60; — spend above zero, or impressions served at zero spend. Unlike &#x60;status&#x60;, which reads a campaign&#39;s CURRENT state, this filters on what happened inside the window. Filters the campaign set itself, so &#x60;pagination.total&#x60; counts only matching campaigns. Mirrors the same filter on /v1/ads/tree.
1592
+ # @option opts [Boolean] :has_delivery Return only campaigns that delivered between &#x60;fromDate&#x60; and &#x60;toDate&#x60;: spend above zero, or impressions served at zero spend. Unlike &#x60;status&#x60;, which reads a campaign&#39;s CURRENT state, this filters on what happened inside the window. Filters the campaign set itself, so &#x60;pagination.total&#x60; counts only matching campaigns. Mirrors the same filter on /v1/ads/tree.
1593
1593
  # @option opts [Float] :min_spend Return only campaigns whose spend between &#x60;fromDate&#x60; and &#x60;toDate&#x60; reaches this amount, in each campaign&#39;s OWN currency (the &#x60;currency&#x60; field on the campaign). Implies &#x60;hasDelivery&#x60;; &#x60;minSpend&#x3D;0&#x60; applies no filter. Mirrors the same filter on /v1/ads/tree.
1594
1594
  # @return [Array<(ListAdCampaigns200Response, Integer, Hash)>] ListAdCampaigns200Response data, response status code and response headers
1595
1595
  def list_ad_campaigns_with_http_info(opts = {})
@@ -1679,7 +1679,7 @@ module Zernio
1679
1679
  # @param [Hash] opts the optional parameters
1680
1680
  # @option opts [Integer] :page Page number (1-based) (default to 1)
1681
1681
  # @option opts [Integer] :limit (default to 50)
1682
- # @option opts [String] :account_id Social account ID
1682
+ # @option opts [String] :account_id Account ID
1683
1683
  # @option opts [String] :ad_account_id Platform ad account ID (Google customer ID). Mirrors the same filter on /v1/ads.
1684
1684
  # @option opts [String] :profile_id Profile ID
1685
1685
  # @option opts [String] :campaign_id Platform campaign ID
@@ -1699,7 +1699,7 @@ module Zernio
1699
1699
  # @param [Hash] opts the optional parameters
1700
1700
  # @option opts [Integer] :page Page number (1-based) (default to 1)
1701
1701
  # @option opts [Integer] :limit (default to 50)
1702
- # @option opts [String] :account_id Social account ID
1702
+ # @option opts [String] :account_id Account ID
1703
1703
  # @option opts [String] :ad_account_id Platform ad account ID (Google customer ID). Mirrors the same filter on /v1/ads.
1704
1704
  # @option opts [String] :profile_id Profile ID
1705
1705
  # @option opts [String] :campaign_id Platform campaign ID
@@ -1789,9 +1789,9 @@ module Zernio
1789
1789
  end
1790
1790
 
1791
1791
  # List ad sets
1792
- # Ad sets (Google ad groups) synced for the connection, optionally filtered by platform and campaignId. Reads the `ad_sets` table directly, independent of the `ads` rollup GET /v1/ads/tree uses, so a just-created standalone ad group with no ad yet (POST /v1/ads/ad-sets, Google only) is visible here even though it is invisible in the tree until an ad joins it via `existingAdGroupId`. Returns at most 500 rows, newest first.
1792
+ # Ad sets (Google ad groups) synced for the connection, optionally filtered by platform and campaignId. Reads the `ad_sets` table directly, independent of the `ads` rollup GET /v1/ads/tree uses, so a newly created standalone ad group with no ad yet (POST /v1/ads/ad-sets, Google only) is visible here even though it is invisible in the tree until an ad joins it via `existingAdGroupId`. Returns at most 500 rows, newest first.
1793
1793
  # @param [Hash] opts the optional parameters
1794
- # @option opts [String] :account_id Social account ID
1794
+ # @option opts [String] :account_id Account ID
1795
1795
  # @option opts [String] :campaign_id Platform campaign ID
1796
1796
  # @option opts [String] :platform
1797
1797
  # @return [ListAdSets200Response]
@@ -1801,9 +1801,9 @@ module Zernio
1801
1801
  end
1802
1802
 
1803
1803
  # List ad sets
1804
- # Ad sets (Google ad groups) synced for the connection, optionally filtered by platform and campaignId. Reads the &#x60;ad_sets&#x60; table directly, independent of the &#x60;ads&#x60; rollup GET /v1/ads/tree uses, so a just-created standalone ad group with no ad yet (POST /v1/ads/ad-sets, Google only) is visible here even though it is invisible in the tree until an ad joins it via &#x60;existingAdGroupId&#x60;. Returns at most 500 rows, newest first.
1804
+ # Ad sets (Google ad groups) synced for the connection, optionally filtered by platform and campaignId. Reads the &#x60;ad_sets&#x60; table directly, independent of the &#x60;ads&#x60; rollup GET /v1/ads/tree uses, so a newly created standalone ad group with no ad yet (POST /v1/ads/ad-sets, Google only) is visible here even though it is invisible in the tree until an ad joins it via &#x60;existingAdGroupId&#x60;. Returns at most 500 rows, newest first.
1805
1805
  # @param [Hash] opts the optional parameters
1806
- # @option opts [String] :account_id Social account ID
1806
+ # @option opts [String] :account_id Account ID
1807
1807
  # @option opts [String] :campaign_id Platform campaign ID
1808
1808
  # @option opts [String] :platform
1809
1809
  # @return [Array<(ListAdSets200Response, Integer, Hash)>] ListAdSets200Response data, response status code and response headers
@@ -1859,14 +1859,14 @@ module Zernio
1859
1859
  end
1860
1860
 
1861
1861
  # List ads
1862
- # Returns a paginated list of ads with metrics computed over an optional date range. Use source=all to include externally-synced ads from platform ad managers. If no date range is provided, defaults to the last 90 days. Date range is capped at 730 days max. To find the Zernio ad behind a comment you see in Meta Business Manager, filter by platformAdId (the Meta ad ID), effectiveObjectStoryId (Facebook), or effectiveInstagramMediaId (Instagram) — those are the post/media the ad's engagement lives on, and are also returned on each ad's `creative` object. Then call GET /v1/ads/{adId}/comments with the returned ad id.
1862
+ # Returns a paginated list of ads with metrics computed over an optional date range. Use source=all to include externally-synced ads from platform ad managers. If no date range is provided, defaults to the last 90 days. Date range is capped at 730 days max. To find the Zernio ad behind a comment you see in Meta Business Manager, filter by platformAdId (the Meta ad ID), effectiveObjectStoryId (Facebook), or effectiveInstagramMediaId (Instagram). Those are the post/media the ad's engagement lives on, and are also returned on each ad's `creative` object. Then call GET /v1/ads/{adId}/comments with the returned ad id.
1863
1863
  # @param [Hash] opts the optional parameters
1864
1864
  # @option opts [Integer] :page Page number (1-based) (default to 1)
1865
1865
  # @option opts [Integer] :limit (default to 50)
1866
1866
  # @option opts [String] :source all (default) &#x3D; Zernio-created + platform-discovered ads. zernio &#x3D; restrict to Zernio-created only. (default to 'all')
1867
1867
  # @option opts [AdStatus] :status
1868
1868
  # @option opts [String] :platform
1869
- # @option opts [String] :account_id Social account ID
1869
+ # @option opts [String] :account_id Account ID
1870
1870
  # @option opts [String] :ad_account_id Platform ad account ID (e.g. act_123 for Meta). Mirrors the same filter on /v1/ads/campaigns and /v1/ads/tree.
1871
1871
  # @option opts [String] :page_id Meta only: Facebook Page ID. Returns only ads whose creative is backed by this Page (a Meta ad account serves ads for every Page in the Business Manager). Matches each ad&#39;s &#x60;creative.pageId&#x60;; ads with no page signal (rare IG-only creatives) never match. Mirrors the same filter on /v1/ads/campaigns and /v1/ads/tree.
1872
1872
  # @option opts [String] :profile_id Profile ID
@@ -1884,14 +1884,14 @@ module Zernio
1884
1884
  end
1885
1885
 
1886
1886
  # List ads
1887
- # Returns a paginated list of ads with metrics computed over an optional date range. Use source&#x3D;all to include externally-synced ads from platform ad managers. If no date range is provided, defaults to the last 90 days. Date range is capped at 730 days max. To find the Zernio ad behind a comment you see in Meta Business Manager, filter by platformAdId (the Meta ad ID), effectiveObjectStoryId (Facebook), or effectiveInstagramMediaId (Instagram) — those are the post/media the ad&#39;s engagement lives on, and are also returned on each ad&#39;s &#x60;creative&#x60; object. Then call GET /v1/ads/{adId}/comments with the returned ad id.
1887
+ # Returns a paginated list of ads with metrics computed over an optional date range. Use source&#x3D;all to include externally-synced ads from platform ad managers. If no date range is provided, defaults to the last 90 days. Date range is capped at 730 days max. To find the Zernio ad behind a comment you see in Meta Business Manager, filter by platformAdId (the Meta ad ID), effectiveObjectStoryId (Facebook), or effectiveInstagramMediaId (Instagram). Those are the post/media the ad&#39;s engagement lives on, and are also returned on each ad&#39;s &#x60;creative&#x60; object. Then call GET /v1/ads/{adId}/comments with the returned ad id.
1888
1888
  # @param [Hash] opts the optional parameters
1889
1889
  # @option opts [Integer] :page Page number (1-based) (default to 1)
1890
1890
  # @option opts [Integer] :limit (default to 50)
1891
1891
  # @option opts [String] :source all (default) &#x3D; Zernio-created + platform-discovered ads. zernio &#x3D; restrict to Zernio-created only. (default to 'all')
1892
1892
  # @option opts [AdStatus] :status
1893
1893
  # @option opts [String] :platform
1894
- # @option opts [String] :account_id Social account ID
1894
+ # @option opts [String] :account_id Account ID
1895
1895
  # @option opts [String] :ad_account_id Platform ad account ID (e.g. act_123 for Meta). Mirrors the same filter on /v1/ads/campaigns and /v1/ads/tree.
1896
1896
  # @option opts [String] :page_id Meta only: Facebook Page ID. Returns only ads whose creative is backed by this Page (a Meta ad account serves ads for every Page in the Business Manager). Matches each ad&#39;s &#x60;creative.pageId&#x60;; ads with no page signal (rare IG-only creatives) never match. Mirrors the same filter on /v1/ads/campaigns and /v1/ads/tree.
1897
1897
  # @option opts [String] :profile_id Profile ID
@@ -2264,7 +2264,7 @@ module Zernio
2264
2264
  end
2265
2265
 
2266
2266
  # Update ad
2267
- # Patch one or more fields on an ad. Status, budget, targeting, and creative changes are propagated to the platform. Per-platform support: - **Meta** (Facebook + Instagram): all fields supported. - **TikTok**: status, budget, targeting (via `/v2/adgroup/update/`), and creative (via `/v2/ad/update/` patch-style — `headline` is ignored, `body` becomes `ad_text`). - **Google**: status, budget, KEYWORD edits via `targeting.keywords` / `targeting.negativeKeywords`, and DEVICE bid adjustments via `targeting.devices` — each list you send becomes the FULL new set of its kind (criteria not in the list are removed); a kind left out is untouched. Any other `targeting` field returns 400: Google cannot mutate broad targeting post-create without recreating the campaign. `creative` returns 501. - **LinkedIn**: status, budget, targeting (geo countries only, applied to the LinkedIn Campaign via PARTIAL_UPDATE), and creative (uploads new media, creates a replacement inline creative on the same campaign, pauses the old one). - **Pinterest / X / OpenAI Ads**: status + budget only. Sending `targeting` or `creative` returns 501 with code `unsupported_platform_operation`. OpenAI Ads budget is lifetime-only (see `budget.type` below). **Google keyword replacement:** These edits affect the ad's entire ad group, including sibling ads. Positive (`targeting.keywords`) and negative (`targeting.negativeKeywords`) sets are independent: omit a field to leave that set unchanged, or send `[]` to remove every keyword of that kind. Zernio compares each supplied set with Google's live criteria by case-insensitive keyword text and match type. A matching criterion is left untouched, retaining its criterion ID, enabled/paused status, keyword-level bid overrides, labels, and criterion-associated history/statistics. Zernio does not reset its quality score; Google continues to calculate scores and statistics normally. Text comparison does not trim whitespace. A bare string or an object without `matchType` means `broad`, not the existing criterion's match type. For example, resending an existing `{ \"text\": \"plumber\", \"matchType\": \"exact\" }` preserves it; sending `\"plumber\"` instead removes that EXACT criterion and requests a BROAD one. Changing text or match type removes criteria no longer requested and creates any missing criteria. New criteria get new IDs and do not inherit removed criteria's bid overrides, labels, or history. Historical reporting for a removed criterion is not transferred to its replacement. To add keywords without replacing a set, use [POST /v1/ads/keywords](https://docs.zernio.com/ad-campaigns/add-ad-keywords). Use `PATCH /v1/ads/keywords/{keywordId}` to pause/enable one keyword, or `DELETE /v1/ads/keywords/{keywordId}` to remove it.
2267
+ # Patch one or more fields on an ad. Status, budget, targeting, and creative changes are propagated to the platform. Per-platform support: - **Meta** (Facebook + Instagram): all fields supported. - **TikTok**: status, budget, targeting (via `/v2/adgroup/update/`), and creative (via `/v2/ad/update/` patch-style: `headline` is ignored, `body` becomes `ad_text`). - **Google**: status, budget, KEYWORD edits via `targeting.keywords` / `targeting.negativeKeywords`, and DEVICE bid adjustments via `targeting.devices`. Each list you send becomes the FULL new set of its kind (criteria not in the list are removed); a kind left out is untouched. Any other `targeting` field returns 400: Google cannot mutate broad targeting post-create without recreating the campaign. `creative` returns 501. - **LinkedIn**: status, budget, targeting (geo countries only, applied to the LinkedIn Campaign via PARTIAL_UPDATE), and creative (uploads new media, creates a replacement inline creative on the same campaign, pauses the old one). - **Pinterest / X / OpenAI Ads**: status + budget only. Sending `targeting` or `creative` returns 501 with code `unsupported_platform_operation`. OpenAI Ads budget is lifetime-only (see `budget.type` below). **Google keyword replacement:** These edits affect the ad's entire ad group, including sibling ads. Positive (`targeting.keywords`) and negative (`targeting.negativeKeywords`) sets are independent: omit a field to leave that set unchanged, or send `[]` to remove every keyword of that kind. Zernio compares each supplied set with Google's live criteria by case-insensitive keyword text and match type. A matching criterion is left untouched, retaining its criterion ID, enabled/paused status, keyword-level bid overrides, labels, and criterion-associated history/statistics. Zernio does not reset its quality score; Google continues to calculate scores and statistics normally. Text comparison does not trim whitespace. A bare string or an object without `matchType` means `broad`, not the existing criterion's match type. For example, resending an existing `{ \"text\": \"plumber\", \"matchType\": \"exact\" }` preserves it; sending `\"plumber\"` instead removes that EXACT criterion and requests a BROAD one. Changing text or match type removes criteria no longer requested and creates any missing criteria. New criteria get new IDs and do not inherit removed criteria's bid overrides, labels, or history. Historical reporting for a removed criterion is not transferred to its replacement. To add keywords without replacing a set, use [POST /v1/ads/keywords](https://docs.zernio.com/ad-campaigns/add-ad-keywords). Use `PATCH /v1/ads/keywords/{keywordId}` to pause/enable one keyword, or `DELETE /v1/ads/keywords/{keywordId}` to remove it.
2268
2268
  # @param ad_id [String]
2269
2269
  # @param update_ad_request [UpdateAdRequest]
2270
2270
  # @param [Hash] opts the optional parameters
@@ -2275,7 +2275,7 @@ module Zernio
2275
2275
  end
2276
2276
 
2277
2277
  # Update ad
2278
- # Patch one or more fields on an ad. Status, budget, targeting, and creative changes are propagated to the platform. Per-platform support: - **Meta** (Facebook + Instagram): all fields supported. - **TikTok**: status, budget, targeting (via &#x60;/v2/adgroup/update/&#x60;), and creative (via &#x60;/v2/ad/update/&#x60; patch-style — &#x60;headline&#x60; is ignored, &#x60;body&#x60; becomes &#x60;ad_text&#x60;). - **Google**: status, budget, KEYWORD edits via &#x60;targeting.keywords&#x60; / &#x60;targeting.negativeKeywords&#x60;, and DEVICE bid adjustments via &#x60;targeting.devices&#x60; — each list you send becomes the FULL new set of its kind (criteria not in the list are removed); a kind left out is untouched. Any other &#x60;targeting&#x60; field returns 400: Google cannot mutate broad targeting post-create without recreating the campaign. &#x60;creative&#x60; returns 501. - **LinkedIn**: status, budget, targeting (geo countries only, applied to the LinkedIn Campaign via PARTIAL_UPDATE), and creative (uploads new media, creates a replacement inline creative on the same campaign, pauses the old one). - **Pinterest / X / OpenAI Ads**: status + budget only. Sending &#x60;targeting&#x60; or &#x60;creative&#x60; returns 501 with code &#x60;unsupported_platform_operation&#x60;. OpenAI Ads budget is lifetime-only (see &#x60;budget.type&#x60; below). **Google keyword replacement:** These edits affect the ad&#39;s entire ad group, including sibling ads. Positive (&#x60;targeting.keywords&#x60;) and negative (&#x60;targeting.negativeKeywords&#x60;) sets are independent: omit a field to leave that set unchanged, or send &#x60;[]&#x60; to remove every keyword of that kind. Zernio compares each supplied set with Google&#39;s live criteria by case-insensitive keyword text and match type. A matching criterion is left untouched, retaining its criterion ID, enabled/paused status, keyword-level bid overrides, labels, and criterion-associated history/statistics. Zernio does not reset its quality score; Google continues to calculate scores and statistics normally. Text comparison does not trim whitespace. A bare string or an object without &#x60;matchType&#x60; means &#x60;broad&#x60;, not the existing criterion&#39;s match type. For example, resending an existing &#x60;{ \&quot;text\&quot;: \&quot;plumber\&quot;, \&quot;matchType\&quot;: \&quot;exact\&quot; }&#x60; preserves it; sending &#x60;\&quot;plumber\&quot;&#x60; instead removes that EXACT criterion and requests a BROAD one. Changing text or match type removes criteria no longer requested and creates any missing criteria. New criteria get new IDs and do not inherit removed criteria&#39;s bid overrides, labels, or history. Historical reporting for a removed criterion is not transferred to its replacement. To add keywords without replacing a set, use [POST /v1/ads/keywords](https://docs.zernio.com/ad-campaigns/add-ad-keywords). Use &#x60;PATCH /v1/ads/keywords/{keywordId}&#x60; to pause/enable one keyword, or &#x60;DELETE /v1/ads/keywords/{keywordId}&#x60; to remove it.
2278
+ # Patch one or more fields on an ad. Status, budget, targeting, and creative changes are propagated to the platform. Per-platform support: - **Meta** (Facebook + Instagram): all fields supported. - **TikTok**: status, budget, targeting (via &#x60;/v2/adgroup/update/&#x60;), and creative (via &#x60;/v2/ad/update/&#x60; patch-style: &#x60;headline&#x60; is ignored, &#x60;body&#x60; becomes &#x60;ad_text&#x60;). - **Google**: status, budget, KEYWORD edits via &#x60;targeting.keywords&#x60; / &#x60;targeting.negativeKeywords&#x60;, and DEVICE bid adjustments via &#x60;targeting.devices&#x60;. Each list you send becomes the FULL new set of its kind (criteria not in the list are removed); a kind left out is untouched. Any other &#x60;targeting&#x60; field returns 400: Google cannot mutate broad targeting post-create without recreating the campaign. &#x60;creative&#x60; returns 501. - **LinkedIn**: status, budget, targeting (geo countries only, applied to the LinkedIn Campaign via PARTIAL_UPDATE), and creative (uploads new media, creates a replacement inline creative on the same campaign, pauses the old one). - **Pinterest / X / OpenAI Ads**: status + budget only. Sending &#x60;targeting&#x60; or &#x60;creative&#x60; returns 501 with code &#x60;unsupported_platform_operation&#x60;. OpenAI Ads budget is lifetime-only (see &#x60;budget.type&#x60; below). **Google keyword replacement:** These edits affect the ad&#39;s entire ad group, including sibling ads. Positive (&#x60;targeting.keywords&#x60;) and negative (&#x60;targeting.negativeKeywords&#x60;) sets are independent: omit a field to leave that set unchanged, or send &#x60;[]&#x60; to remove every keyword of that kind. Zernio compares each supplied set with Google&#39;s live criteria by case-insensitive keyword text and match type. A matching criterion is left untouched, retaining its criterion ID, enabled/paused status, keyword-level bid overrides, labels, and criterion-associated history/statistics. Zernio does not reset its quality score; Google continues to calculate scores and statistics normally. Text comparison does not trim whitespace. A bare string or an object without &#x60;matchType&#x60; means &#x60;broad&#x60;, not the existing criterion&#39;s match type. For example, resending an existing &#x60;{ \&quot;text\&quot;: \&quot;plumber\&quot;, \&quot;matchType\&quot;: \&quot;exact\&quot; }&#x60; preserves it; sending &#x60;\&quot;plumber\&quot;&#x60; instead removes that EXACT criterion and requests a BROAD one. Changing text or match type removes criteria no longer requested and creates any missing criteria. New criteria get new IDs and do not inherit removed criteria&#39;s bid overrides, labels, or history. Historical reporting for a removed criterion is not transferred to its replacement. To add keywords without replacing a set, use [POST /v1/ads/keywords](https://docs.zernio.com/ad-campaigns/add-ad-keywords). Use &#x60;PATCH /v1/ads/keywords/{keywordId}&#x60; to pause/enable one keyword, or &#x60;DELETE /v1/ads/keywords/{keywordId}&#x60; to remove it.
2279
2279
  # @param ad_id [String]
2280
2280
  # @param update_ad_request [UpdateAdRequest]
2281
2281
  # @param [Hash] opts the optional parameters
@@ -2338,7 +2338,7 @@ module Zernio
2338
2338
  end
2339
2339
 
2340
2340
  # Update a campaign
2341
- # Campaign-level edits. Send at least one of `budget`, `bidStrategy`, `portfolioBidStrategyId`, `name` or `platformSpecificData`. An unsupported field is always an error, never a silent drop. | Body field | Meta | Google | Others | |---|---|---|---| | `bidStrategy` | Yes | Yes | 501 | | `bidAmount`, `roasAverageFloor` | 400 — ad-set level | Yes | 400 | | `portfolioBidStrategyId` | 400 | Yes | 400 | | `budget` (CBO; ABO returns 409) | Yes | 501 | 501 | | `name` | Yes | 501 | 501 | | `platformSpecificData.spendCap` | Yes | 400 | 400 | | `accountId` (empty campaigns) | Yes | - | - | On Google: `LOWEST_COST_WITHOUT_CAP` = Maximize Conversions, `COST_CAP` + `bidAmount` = Target CPA, `LOWEST_COST_WITH_MIN_ROAS` + `roasAverageFloor` = Target ROAS, `LOWEST_COST_WITH_BID_CAP` + `bidAmount` = Maximize Clicks with a CPC ceiling; `portfolioBidStrategyId` attaches a portfolio strategy instead (exclusive with `bidStrategy`). Setting the standard triplet on a campaign that is currently on a PORTFOLIO strategy is rejected: detach it in Google Ads first, since it is shared across campaigns. `accountId` forwards the update straight to Meta for a campaign with zero ads, which would otherwise 404; the response then carries `updated: 0`.
2341
+ # Campaign-level edits. Send at least one of `budget`, `bidStrategy`, `portfolioBidStrategyId`, `name` or `platformSpecificData`. An unsupported field is always an error, never a silent drop. | Body field | Meta | Google | Others | |---|---|---|---| | `bidStrategy` | Yes | Yes | 501 | | `bidAmount`, `roasAverageFloor` | 400 (ad-set level) | Yes | 400 | | `portfolioBidStrategyId` | 400 | Yes | 400 | | `budget` (CBO; ABO returns 409) | Yes | 501 | 501 | | `name` | Yes | 501 | 501 | | `platformSpecificData.spendCap` | Yes | 400 | 400 | | `accountId` (empty campaigns) | Yes | - | - | On Google: `LOWEST_COST_WITHOUT_CAP` = Maximize Conversions, `COST_CAP` + `bidAmount` = Target CPA, `LOWEST_COST_WITH_MIN_ROAS` + `roasAverageFloor` = Target ROAS, `LOWEST_COST_WITH_BID_CAP` + `bidAmount` = Maximize Clicks with a CPC ceiling; `portfolioBidStrategyId` attaches a portfolio strategy instead (exclusive with `bidStrategy`). Setting the standard triplet on a campaign that is currently on a PORTFOLIO strategy is rejected: detach it in Google Ads first, since it is shared across campaigns. `accountId` forwards the update straight to Meta for a campaign with zero ads, which would otherwise 404; the response then carries `updated: 0`.
2342
2342
  # @param campaign_id [String] Platform campaign ID
2343
2343
  # @param update_ad_campaign_request [UpdateAdCampaignRequest]
2344
2344
  # @param [Hash] opts the optional parameters
@@ -2349,7 +2349,7 @@ module Zernio
2349
2349
  end
2350
2350
 
2351
2351
  # Update a campaign
2352
- # Campaign-level edits. Send at least one of &#x60;budget&#x60;, &#x60;bidStrategy&#x60;, &#x60;portfolioBidStrategyId&#x60;, &#x60;name&#x60; or &#x60;platformSpecificData&#x60;. An unsupported field is always an error, never a silent drop. | Body field | Meta | Google | Others | |---|---|---|---| | &#x60;bidStrategy&#x60; | Yes | Yes | 501 | | &#x60;bidAmount&#x60;, &#x60;roasAverageFloor&#x60; | 400 — ad-set level | Yes | 400 | | &#x60;portfolioBidStrategyId&#x60; | 400 | Yes | 400 | | &#x60;budget&#x60; (CBO; ABO returns 409) | Yes | 501 | 501 | | &#x60;name&#x60; | Yes | 501 | 501 | | &#x60;platformSpecificData.spendCap&#x60; | Yes | 400 | 400 | | &#x60;accountId&#x60; (empty campaigns) | Yes | - | - | On Google: &#x60;LOWEST_COST_WITHOUT_CAP&#x60; &#x3D; Maximize Conversions, &#x60;COST_CAP&#x60; + &#x60;bidAmount&#x60; &#x3D; Target CPA, &#x60;LOWEST_COST_WITH_MIN_ROAS&#x60; + &#x60;roasAverageFloor&#x60; &#x3D; Target ROAS, &#x60;LOWEST_COST_WITH_BID_CAP&#x60; + &#x60;bidAmount&#x60; &#x3D; Maximize Clicks with a CPC ceiling; &#x60;portfolioBidStrategyId&#x60; attaches a portfolio strategy instead (exclusive with &#x60;bidStrategy&#x60;). Setting the standard triplet on a campaign that is currently on a PORTFOLIO strategy is rejected: detach it in Google Ads first, since it is shared across campaigns. &#x60;accountId&#x60; forwards the update straight to Meta for a campaign with zero ads, which would otherwise 404; the response then carries &#x60;updated: 0&#x60;.
2352
+ # Campaign-level edits. Send at least one of &#x60;budget&#x60;, &#x60;bidStrategy&#x60;, &#x60;portfolioBidStrategyId&#x60;, &#x60;name&#x60; or &#x60;platformSpecificData&#x60;. An unsupported field is always an error, never a silent drop. | Body field | Meta | Google | Others | |---|---|---|---| | &#x60;bidStrategy&#x60; | Yes | Yes | 501 | | &#x60;bidAmount&#x60;, &#x60;roasAverageFloor&#x60; | 400 (ad-set level) | Yes | 400 | | &#x60;portfolioBidStrategyId&#x60; | 400 | Yes | 400 | | &#x60;budget&#x60; (CBO; ABO returns 409) | Yes | 501 | 501 | | &#x60;name&#x60; | Yes | 501 | 501 | | &#x60;platformSpecificData.spendCap&#x60; | Yes | 400 | 400 | | &#x60;accountId&#x60; (empty campaigns) | Yes | - | - | On Google: &#x60;LOWEST_COST_WITHOUT_CAP&#x60; &#x3D; Maximize Conversions, &#x60;COST_CAP&#x60; + &#x60;bidAmount&#x60; &#x3D; Target CPA, &#x60;LOWEST_COST_WITH_MIN_ROAS&#x60; + &#x60;roasAverageFloor&#x60; &#x3D; Target ROAS, &#x60;LOWEST_COST_WITH_BID_CAP&#x60; + &#x60;bidAmount&#x60; &#x3D; Maximize Clicks with a CPC ceiling; &#x60;portfolioBidStrategyId&#x60; attaches a portfolio strategy instead (exclusive with &#x60;bidStrategy&#x60;). Setting the standard triplet on a campaign that is currently on a PORTFOLIO strategy is rejected: detach it in Google Ads first, since it is shared across campaigns. &#x60;accountId&#x60; forwards the update straight to Meta for a campaign with zero ads, which would otherwise 404; the response then carries &#x60;updated: 0&#x60;.
2353
2353
  # @param campaign_id [String] Platform campaign ID
2354
2354
  # @param update_ad_campaign_request [UpdateAdCampaignRequest]
2355
2355
  # @param [Hash] opts the optional parameters
@@ -2412,7 +2412,7 @@ module Zernio
2412
2412
  end
2413
2413
 
2414
2414
  # Pause or resume a campaign
2415
- # Writes the campaign's own on/off switch, then lets the platform cascade delivery to its ad sets and ads. Makes one platform API call, not one per ad. The switch is always written, whatever delivery status the ads underneath report: an ad still in review does not block resuming its campaign. The echoed `status` is the confirmation that it landed. `updated` / `skipped` describe only the ads whose own stored status CHANGED alongside it, so `updated: 0` is a normal successful response, not a no-op. Ads are skipped when they are in a terminal status (rejected, completed, cancelled), already in the target state, or switched on but not yet delivering — the last group keeps its `pending_review` / `error` status until the platform reports what it became. `skippedReasons` names which case applies. On Meta this flips the campaign only. An ad set paused in its own right stays paused, so pair this with PUT /v1/ads/ad-sets/{adSetId}/status when you also need the ad set switched back on.
2415
+ # Writes the campaign's own on/off switch, then lets the platform cascade delivery to its ad sets and ads. Makes one platform API call, not one per ad. The switch is always written, whatever delivery status the ads underneath report: an ad still in review does not block resuming its campaign. The echoed `status` is the confirmation that it landed. `updated` / `skipped` describe only the ads whose own stored status CHANGED alongside it, so `updated: 0` is a normal successful response, not a no-op. Ads are skipped when they are in a terminal status (rejected, completed, cancelled), already in the target state, or switched on but not yet delivering. The last group keeps its `pending_review` / `error` status until the platform reports what it became. `skippedReasons` names which case applies. On Meta this flips the campaign only. An ad set paused in its own right stays paused, so pair this with PUT /v1/ads/ad-sets/{adSetId}/status when you also need the ad set switched back on.
2416
2416
  # @param campaign_id [String] Platform campaign ID
2417
2417
  # @param update_ad_campaign_status_request [UpdateAdCampaignStatusRequest]
2418
2418
  # @param [Hash] opts the optional parameters
@@ -2423,7 +2423,7 @@ module Zernio
2423
2423
  end
2424
2424
 
2425
2425
  # Pause or resume a campaign
2426
- # Writes the campaign&#39;s own on/off switch, then lets the platform cascade delivery to its ad sets and ads. Makes one platform API call, not one per ad. The switch is always written, whatever delivery status the ads underneath report: an ad still in review does not block resuming its campaign. The echoed &#x60;status&#x60; is the confirmation that it landed. &#x60;updated&#x60; / &#x60;skipped&#x60; describe only the ads whose own stored status CHANGED alongside it, so &#x60;updated: 0&#x60; is a normal successful response, not a no-op. Ads are skipped when they are in a terminal status (rejected, completed, cancelled), already in the target state, or switched on but not yet delivering — the last group keeps its &#x60;pending_review&#x60; / &#x60;error&#x60; status until the platform reports what it became. &#x60;skippedReasons&#x60; names which case applies. On Meta this flips the campaign only. An ad set paused in its own right stays paused, so pair this with PUT /v1/ads/ad-sets/{adSetId}/status when you also need the ad set switched back on.
2426
+ # Writes the campaign&#39;s own on/off switch, then lets the platform cascade delivery to its ad sets and ads. Makes one platform API call, not one per ad. The switch is always written, whatever delivery status the ads underneath report: an ad still in review does not block resuming its campaign. The echoed &#x60;status&#x60; is the confirmation that it landed. &#x60;updated&#x60; / &#x60;skipped&#x60; describe only the ads whose own stored status CHANGED alongside it, so &#x60;updated: 0&#x60; is a normal successful response, not a no-op. Ads are skipped when they are in a terminal status (rejected, completed, cancelled), already in the target state, or switched on but not yet delivering. The last group keeps its &#x60;pending_review&#x60; / &#x60;error&#x60; status until the platform reports what it became. &#x60;skippedReasons&#x60; names which case applies. On Meta this flips the campaign only. An ad set paused in its own right stays paused, so pair this with PUT /v1/ads/ad-sets/{adSetId}/status when you also need the ad set switched back on.
2427
2427
  # @param campaign_id [String] Platform campaign ID
2428
2428
  # @param update_ad_campaign_status_request [UpdateAdCampaignStatusRequest]
2429
2429
  # @param [Hash] opts the optional parameters
@@ -2560,7 +2560,7 @@ module Zernio
2560
2560
  end
2561
2561
 
2562
2562
  # Update an ad set
2563
- # Ad-set-level writes. Use this for ABO budget updates, ad-set-scoped pause/resume, bid-strategy edits, Meta value-rule-set attach/detach, and Meta-only post-launch delivery settings via `platformSpecificData`. At least one updatable field is required. Value rule sets (Meta only, see `/v1/ads/value-rule-sets`): - ATTACH or REPLACE: send `valueRuleSetId`. Attachment is driven by the id's presence, so `valueRulesApplied: true` is optional. Sending a different id replaces the previous association; there is no separate replace call. - DETACH: send `valueRulesApplied: false` and OMIT `valueRuleSetId`. - Sending `valueRulesApplied: false` TOGETHER with `valueRuleSetId` returns 400 `mutually_exclusive_fields`. This is deliberate: Meta attaches the rule set whenever `value_rule_set_id` is present, even with `value_rules_applied` false, so echoing stored state while asking to detach would silently keep the bid adjustments live. - Eligibility: only ad sets on `LOWEST_COST_WITHOUT_CAP` or `COST_CAP`. Meta rejects the rest server-side. - Read back with `GET /v1/ads/ad-sets/{adSetId}?fields=value_rule_set_id`. Meta does not document `value_rules_applied` as a readable ad-set field, so the boolean cannot be read back. Bid strategy compatibility (per Meta's spec): - `LOWEST_COST_WITHOUT_CAP`: no `bidAmount`, no `roasAverageFloor`. - `LOWEST_COST_WITH_BID_CAP` / `COST_CAP`: `bidAmount` REQUIRED (whole currency units). - `LOWEST_COST_WITH_MIN_ROAS`: `roasAverageFloor` REQUIRED (decimal multiplier, e.g. 2.0 = 2.0x ROAS). - Meta only: send `bidAmount` WITHOUT `bidStrategy` to change the cap amount on an ad set under a COST_CAP / LOWEST_COST_WITH_BID_CAP parent campaign, leaving the strategy itself (inherited from the campaign) untouched. `roasAverageFloor` without `bidStrategy` is rejected (it has no meaning outside LOWEST_COST_WITH_MIN_ROAS). Delivery settings are validated by Meta against the campaign objective; incompatible combinations (e.g. a billingEvent the optimization goal doesn't allow) surface as 400s from Meta. When updating `budget` on an ABO campaign: if the parent campaign is CBO, the response is 409 with code BUDGET_LEVEL_MISMATCH — route to PUT /v1/ads/campaigns/{campaignId} instead.
2563
+ # Ad-set-level writes. Use this for ABO budget updates, ad-set-scoped pause/resume, bid-strategy edits, Meta value-rule-set attach/detach, and Meta-only post-launch delivery settings via `platformSpecificData`. At least one updatable field is required. Value rule sets (Meta only, see `/v1/ads/value-rule-sets`): - ATTACH or REPLACE: send `valueRuleSetId`. Attachment is driven by the id's presence, so `valueRulesApplied: true` is optional. Sending a different id replaces the previous association; there is no separate replace call. - DETACH: send `valueRulesApplied: false` and OMIT `valueRuleSetId`. - Sending `valueRulesApplied: false` TOGETHER with `valueRuleSetId` returns 400 `mutually_exclusive_fields`. This is deliberate: Meta attaches the rule set whenever `value_rule_set_id` is present, even with `value_rules_applied` false, so echoing stored state while asking to detach would silently keep the bid adjustments live. - Eligibility: only ad sets on `LOWEST_COST_WITHOUT_CAP` or `COST_CAP`. Meta rejects the rest server-side. - Read back with `GET /v1/ads/ad-sets/{adSetId}?fields=value_rule_set_id`. Meta does not document `value_rules_applied` as a readable ad-set field, so the boolean cannot be read back. Bid strategy compatibility (per Meta's spec): - `LOWEST_COST_WITHOUT_CAP`: no `bidAmount`, no `roasAverageFloor`. - `LOWEST_COST_WITH_BID_CAP` / `COST_CAP`: `bidAmount` REQUIRED (whole currency units). - `LOWEST_COST_WITH_MIN_ROAS`: `roasAverageFloor` REQUIRED (decimal multiplier, e.g. 2.0 = 2.0x ROAS). - Meta only: send `bidAmount` WITHOUT `bidStrategy` to change the cap amount on an ad set under a COST_CAP / LOWEST_COST_WITH_BID_CAP parent campaign, leaving the strategy itself (inherited from the campaign) untouched. `roasAverageFloor` without `bidStrategy` is rejected (it has no meaning outside LOWEST_COST_WITH_MIN_ROAS). Delivery settings are validated by Meta against the campaign objective; incompatible combinations (e.g. a billingEvent the optimization goal doesn't allow) surface as 400s from Meta. When updating `budget` on an ABO campaign: if the parent campaign is CBO, the response is 409 with code BUDGET_LEVEL_MISMATCH. Route to PUT /v1/ads/campaigns/{campaignId} instead.
2564
2564
  # @param ad_set_id [String] Platform ad set ID
2565
2565
  # @param update_ad_set_request [UpdateAdSetRequest]
2566
2566
  # @param [Hash] opts the optional parameters
@@ -2571,7 +2571,7 @@ module Zernio
2571
2571
  end
2572
2572
 
2573
2573
  # Update an ad set
2574
- # Ad-set-level writes. Use this for ABO budget updates, ad-set-scoped pause/resume, bid-strategy edits, Meta value-rule-set attach/detach, and Meta-only post-launch delivery settings via &#x60;platformSpecificData&#x60;. At least one updatable field is required. Value rule sets (Meta only, see &#x60;/v1/ads/value-rule-sets&#x60;): - ATTACH or REPLACE: send &#x60;valueRuleSetId&#x60;. Attachment is driven by the id&#39;s presence, so &#x60;valueRulesApplied: true&#x60; is optional. Sending a different id replaces the previous association; there is no separate replace call. - DETACH: send &#x60;valueRulesApplied: false&#x60; and OMIT &#x60;valueRuleSetId&#x60;. - Sending &#x60;valueRulesApplied: false&#x60; TOGETHER with &#x60;valueRuleSetId&#x60; returns 400 &#x60;mutually_exclusive_fields&#x60;. This is deliberate: Meta attaches the rule set whenever &#x60;value_rule_set_id&#x60; is present, even with &#x60;value_rules_applied&#x60; false, so echoing stored state while asking to detach would silently keep the bid adjustments live. - Eligibility: only ad sets on &#x60;LOWEST_COST_WITHOUT_CAP&#x60; or &#x60;COST_CAP&#x60;. Meta rejects the rest server-side. - Read back with &#x60;GET /v1/ads/ad-sets/{adSetId}?fields&#x3D;value_rule_set_id&#x60;. Meta does not document &#x60;value_rules_applied&#x60; as a readable ad-set field, so the boolean cannot be read back. Bid strategy compatibility (per Meta&#39;s spec): - &#x60;LOWEST_COST_WITHOUT_CAP&#x60;: no &#x60;bidAmount&#x60;, no &#x60;roasAverageFloor&#x60;. - &#x60;LOWEST_COST_WITH_BID_CAP&#x60; / &#x60;COST_CAP&#x60;: &#x60;bidAmount&#x60; REQUIRED (whole currency units). - &#x60;LOWEST_COST_WITH_MIN_ROAS&#x60;: &#x60;roasAverageFloor&#x60; REQUIRED (decimal multiplier, e.g. 2.0 &#x3D; 2.0x ROAS). - Meta only: send &#x60;bidAmount&#x60; WITHOUT &#x60;bidStrategy&#x60; to change the cap amount on an ad set under a COST_CAP / LOWEST_COST_WITH_BID_CAP parent campaign, leaving the strategy itself (inherited from the campaign) untouched. &#x60;roasAverageFloor&#x60; without &#x60;bidStrategy&#x60; is rejected (it has no meaning outside LOWEST_COST_WITH_MIN_ROAS). Delivery settings are validated by Meta against the campaign objective; incompatible combinations (e.g. a billingEvent the optimization goal doesn&#39;t allow) surface as 400s from Meta. When updating &#x60;budget&#x60; on an ABO campaign: if the parent campaign is CBO, the response is 409 with code BUDGET_LEVEL_MISMATCH — route to PUT /v1/ads/campaigns/{campaignId} instead.
2574
+ # Ad-set-level writes. Use this for ABO budget updates, ad-set-scoped pause/resume, bid-strategy edits, Meta value-rule-set attach/detach, and Meta-only post-launch delivery settings via &#x60;platformSpecificData&#x60;. At least one updatable field is required. Value rule sets (Meta only, see &#x60;/v1/ads/value-rule-sets&#x60;): - ATTACH or REPLACE: send &#x60;valueRuleSetId&#x60;. Attachment is driven by the id&#39;s presence, so &#x60;valueRulesApplied: true&#x60; is optional. Sending a different id replaces the previous association; there is no separate replace call. - DETACH: send &#x60;valueRulesApplied: false&#x60; and OMIT &#x60;valueRuleSetId&#x60;. - Sending &#x60;valueRulesApplied: false&#x60; TOGETHER with &#x60;valueRuleSetId&#x60; returns 400 &#x60;mutually_exclusive_fields&#x60;. This is deliberate: Meta attaches the rule set whenever &#x60;value_rule_set_id&#x60; is present, even with &#x60;value_rules_applied&#x60; false, so echoing stored state while asking to detach would silently keep the bid adjustments live. - Eligibility: only ad sets on &#x60;LOWEST_COST_WITHOUT_CAP&#x60; or &#x60;COST_CAP&#x60;. Meta rejects the rest server-side. - Read back with &#x60;GET /v1/ads/ad-sets/{adSetId}?fields&#x3D;value_rule_set_id&#x60;. Meta does not document &#x60;value_rules_applied&#x60; as a readable ad-set field, so the boolean cannot be read back. Bid strategy compatibility (per Meta&#39;s spec): - &#x60;LOWEST_COST_WITHOUT_CAP&#x60;: no &#x60;bidAmount&#x60;, no &#x60;roasAverageFloor&#x60;. - &#x60;LOWEST_COST_WITH_BID_CAP&#x60; / &#x60;COST_CAP&#x60;: &#x60;bidAmount&#x60; REQUIRED (whole currency units). - &#x60;LOWEST_COST_WITH_MIN_ROAS&#x60;: &#x60;roasAverageFloor&#x60; REQUIRED (decimal multiplier, e.g. 2.0 &#x3D; 2.0x ROAS). - Meta only: send &#x60;bidAmount&#x60; WITHOUT &#x60;bidStrategy&#x60; to change the cap amount on an ad set under a COST_CAP / LOWEST_COST_WITH_BID_CAP parent campaign, leaving the strategy itself (inherited from the campaign) untouched. &#x60;roasAverageFloor&#x60; without &#x60;bidStrategy&#x60; is rejected (it has no meaning outside LOWEST_COST_WITH_MIN_ROAS). Delivery settings are validated by Meta against the campaign objective; incompatible combinations (e.g. a billingEvent the optimization goal doesn&#39;t allow) surface as 400s from Meta. When updating &#x60;budget&#x60; on an ABO campaign: if the parent campaign is CBO, the response is 409 with code BUDGET_LEVEL_MISMATCH. Route to PUT /v1/ads/campaigns/{campaignId} instead.
2575
2575
  # @param ad_set_id [String] Platform ad set ID
2576
2576
  # @param update_ad_set_request [UpdateAdSetRequest]
2577
2577
  # @param [Hash] opts the optional parameters
@@ -2634,7 +2634,7 @@ module Zernio
2634
2634
  end
2635
2635
 
2636
2636
  # Pause or resume a single ad set
2637
- # Ad-set-scoped pause/resume (doesn't touch sibling ad sets). Thin wrapper over PUT /v1/ads/ad-sets/{adSetId} for callers that only want the status toggle and prefer a symmetric URL to /v1/ads/campaigns/{campaignId}/status. On Meta and LinkedIn this writes the ad set's own on/off switch (Meta: `configured_status`), whatever delivery status its ads report — an ad still in review does not block resuming its ad set. The echoed `status` is the confirmation that it landed. Where the platform has no ad-set switch (TikTok and others) the toggle is emulated by flipping the child ads; a call with no actionable ad then writes nothing and returns a `message` with no `status`. `updated` / `skipped` describe only the ads whose own stored status CHANGED alongside the switch, so `updated: 0` is a normal successful response. See `skippedReasons` for which of the three cases applies (terminal, already in the target state, or switched on but not yet delivering). A campaign created paused needs its campaign resumed as well: pair this with PUT /v1/ads/campaigns/{campaignId}/status.
2637
+ # Ad-set-scoped pause/resume (doesn't touch sibling ad sets). Thin wrapper over PUT /v1/ads/ad-sets/{adSetId} for callers that only want the status toggle and prefer a symmetric URL to /v1/ads/campaigns/{campaignId}/status. On Meta and LinkedIn this writes the ad set's own on/off switch (Meta: `configured_status`), whatever delivery status its ads report: an ad still in review does not block resuming its ad set. The echoed `status` is the confirmation that it landed. Where the platform has no ad-set switch (TikTok and others) the toggle is emulated by flipping the child ads; a call with no actionable ad then writes nothing and returns a `message` with no `status`. `updated` / `skipped` describe only the ads whose own stored status CHANGED alongside the switch, so `updated: 0` is a normal successful response. See `skippedReasons` for which of the three cases applies (terminal, already in the target state, or switched on but not yet delivering). A campaign created paused needs its campaign resumed as well: pair this with PUT /v1/ads/campaigns/{campaignId}/status.
2638
2638
  # @param ad_set_id [String] Platform ad set ID
2639
2639
  # @param update_ad_campaign_status_request [UpdateAdCampaignStatusRequest]
2640
2640
  # @param [Hash] opts the optional parameters
@@ -2645,7 +2645,7 @@ module Zernio
2645
2645
  end
2646
2646
 
2647
2647
  # Pause or resume a single ad set
2648
- # Ad-set-scoped pause/resume (doesn&#39;t touch sibling ad sets). Thin wrapper over PUT /v1/ads/ad-sets/{adSetId} for callers that only want the status toggle and prefer a symmetric URL to /v1/ads/campaigns/{campaignId}/status. On Meta and LinkedIn this writes the ad set&#39;s own on/off switch (Meta: &#x60;configured_status&#x60;), whatever delivery status its ads report — an ad still in review does not block resuming its ad set. The echoed &#x60;status&#x60; is the confirmation that it landed. Where the platform has no ad-set switch (TikTok and others) the toggle is emulated by flipping the child ads; a call with no actionable ad then writes nothing and returns a &#x60;message&#x60; with no &#x60;status&#x60;. &#x60;updated&#x60; / &#x60;skipped&#x60; describe only the ads whose own stored status CHANGED alongside the switch, so &#x60;updated: 0&#x60; is a normal successful response. See &#x60;skippedReasons&#x60; for which of the three cases applies (terminal, already in the target state, or switched on but not yet delivering). A campaign created paused needs its campaign resumed as well: pair this with PUT /v1/ads/campaigns/{campaignId}/status.
2648
+ # Ad-set-scoped pause/resume (doesn&#39;t touch sibling ad sets). Thin wrapper over PUT /v1/ads/ad-sets/{adSetId} for callers that only want the status toggle and prefer a symmetric URL to /v1/ads/campaigns/{campaignId}/status. On Meta and LinkedIn this writes the ad set&#39;s own on/off switch (Meta: &#x60;configured_status&#x60;), whatever delivery status its ads report: an ad still in review does not block resuming its ad set. The echoed &#x60;status&#x60; is the confirmation that it landed. Where the platform has no ad-set switch (TikTok and others) the toggle is emulated by flipping the child ads; a call with no actionable ad then writes nothing and returns a &#x60;message&#x60; with no &#x60;status&#x60;. &#x60;updated&#x60; / &#x60;skipped&#x60; describe only the ads whose own stored status CHANGED alongside the switch, so &#x60;updated: 0&#x60; is a normal successful response. See &#x60;skippedReasons&#x60; for which of the three cases applies (terminal, already in the target state, or switched on but not yet delivering). A campaign created paused needs its campaign resumed as well: pair this with PUT /v1/ads/campaigns/{campaignId}/status.
2649
2649
  # @param ad_set_id [String] Platform ad set ID
2650
2650
  # @param update_ad_campaign_status_request [UpdateAdCampaignStatusRequest]
2651
2651
  # @param [Hash] opts the optional parameters
@@ -2708,7 +2708,7 @@ module Zernio
2708
2708
  end
2709
2709
 
2710
2710
  # Pause or resume a single ad
2711
- # Ad-scoped pause/resume — touches ONLY this ad, never its parent ad set or campaign (so sibling ads keep running). Thin wrapper over the `status` field of PUT /v1/ads/{adId}, for callers that want a URL symmetric to /v1/ads/campaigns/{campaignId}/status and /v1/ads/ad-sets/{adSetId}/status. `{adId}` accepts the same identifier dialects as GET/PUT /v1/ads/{adId} (Zernio hex `_id`, Meta numeric `platformAdId`, or the creative's effective story/media IDs). `platform` is inferred from the ad, so it's not required in the body. Ads in terminal statuses (rejected, completed, cancelled) and no-op flips (already in the target state) are skipped.
2711
+ # Ad-scoped pause/resume: touches ONLY this ad, never its parent ad set or campaign (so sibling ads keep running). Thin wrapper over the `status` field of PUT /v1/ads/{adId}, for callers that want a URL symmetric to /v1/ads/campaigns/{campaignId}/status and /v1/ads/ad-sets/{adSetId}/status. `{adId}` accepts the same identifier dialects as GET/PUT /v1/ads/{adId} (Zernio hex `_id`, Meta numeric `platformAdId`, or the creative's effective story/media IDs). `platform` is inferred from the ad, so it's not required in the body. Ads in terminal statuses (rejected, completed, cancelled) and no-op flips (already in the target state) are skipped.
2712
2712
  # @param ad_id [String] Zernio &#x60;_id&#x60; (hex), Meta &#x60;platformAdId&#x60; (numeric), or one of the creative&#39;s effective story/media IDs.
2713
2713
  # @param update_ad_keyword_request [UpdateAdKeywordRequest]
2714
2714
  # @param [Hash] opts the optional parameters
@@ -2719,7 +2719,7 @@ module Zernio
2719
2719
  end
2720
2720
 
2721
2721
  # Pause or resume a single ad
2722
- # Ad-scoped pause/resume — touches ONLY this ad, never its parent ad set or campaign (so sibling ads keep running). Thin wrapper over the &#x60;status&#x60; field of PUT /v1/ads/{adId}, for callers that want a URL symmetric to /v1/ads/campaigns/{campaignId}/status and /v1/ads/ad-sets/{adSetId}/status. &#x60;{adId}&#x60; accepts the same identifier dialects as GET/PUT /v1/ads/{adId} (Zernio hex &#x60;_id&#x60;, Meta numeric &#x60;platformAdId&#x60;, or the creative&#39;s effective story/media IDs). &#x60;platform&#x60; is inferred from the ad, so it&#39;s not required in the body. Ads in terminal statuses (rejected, completed, cancelled) and no-op flips (already in the target state) are skipped.
2722
+ # Ad-scoped pause/resume: touches ONLY this ad, never its parent ad set or campaign (so sibling ads keep running). Thin wrapper over the &#x60;status&#x60; field of PUT /v1/ads/{adId}, for callers that want a URL symmetric to /v1/ads/campaigns/{campaignId}/status and /v1/ads/ad-sets/{adSetId}/status. &#x60;{adId}&#x60; accepts the same identifier dialects as GET/PUT /v1/ads/{adId} (Zernio hex &#x60;_id&#x60;, Meta numeric &#x60;platformAdId&#x60;, or the creative&#39;s effective story/media IDs). &#x60;platform&#x60; is inferred from the ad, so it&#39;s not required in the body. Ads in terminal statuses (rejected, completed, cancelled) and no-op flips (already in the target state) are skipped.
2723
2723
  # @param ad_id [String] Zernio &#x60;_id&#x60; (hex), Meta &#x60;platformAdId&#x60; (numeric), or one of the creative&#39;s effective story/media IDs.
2724
2724
  # @param update_ad_keyword_request [UpdateAdKeywordRequest]
2725
2725
  # @param [Hash] opts the optional parameters