late-sdk 0.0.715 → 0.0.717

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 (508) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +96 -10
  3. data/docs/AccountsApi.md +142 -1
  4. data/docs/AdAnalyticsResponse.md +22 -0
  5. data/docs/{GetAdAnalytics200ResponseAd.md → AdAnalyticsResponseAd.md} +2 -4
  6. data/docs/AdCampaignsApi.md +34 -22
  7. data/docs/AdCreative.md +2 -0
  8. data/docs/AdDailyMetrics.md +1 -1
  9. data/docs/AdEngagementCounts.md +4 -4
  10. data/docs/AdInsightsApi.md +172 -8
  11. data/docs/AdMetrics.md +1 -1
  12. data/docs/AdTargetingApi.md +3 -3
  13. data/docs/AdTreeCampaign.md +1 -1
  14. data/docs/AdTreeResponse.md +22 -0
  15. data/docs/AddBroadcastRecipientsRequest.md +1 -1
  16. data/docs/AdsListResponse.md +22 -0
  17. data/docs/AdsTimelineResponse.md +20 -0
  18. data/docs/{GetAdsTimeline200ResponseRowsInner.md → AdsTimelineResponseRowsInner.md} +2 -2
  19. data/docs/AnalyticsListResponsePostsInner.md +1 -1
  20. data/docs/AnalyticsListResponsePostsInnerMediaItemsInner.md +24 -0
  21. data/docs/AnalyticsSinglePostResponseMediaItemsInner.md +7 -3
  22. data/docs/BillingSnapshot.md +2 -0
  23. data/docs/BillingSnapshotPlan.md +3 -1
  24. data/docs/Blog.md +24 -0
  25. data/docs/BlogArticle.md +44 -0
  26. data/docs/BlogArticleImage.md +20 -0
  27. data/docs/BlogsApi.md +747 -0
  28. data/docs/BlueskyPlatformData.md +2 -0
  29. data/docs/BoostPostRequest.md +2 -2
  30. data/docs/CampaignAnalyticsResponse.md +22 -0
  31. data/docs/{GetCampaignAnalytics200ResponseAnalytics.md → CampaignAnalyticsResponseAnalytics.md} +3 -3
  32. data/docs/{GetCampaignAnalytics200ResponseAnalyticsDailyInner.md → CampaignAnalyticsResponseAnalyticsDailyInner.md} +3 -3
  33. data/docs/{GetCampaignAnalytics200ResponseCampaign.md → CampaignAnalyticsResponseCampaign.md} +2 -2
  34. data/docs/CommentsApi.md +8 -8
  35. data/docs/ConnectApi.md +149 -1
  36. data/docs/ConnectShopifyWithToken200Response.md +18 -0
  37. data/docs/ConnectShopifyWithToken200ResponseAccount.md +26 -0
  38. data/docs/ConnectShopifyWithTokenRequest.md +22 -0
  39. data/docs/CreateBlog201Response.md +20 -0
  40. data/docs/CreateBlogArticle201Response.md +20 -0
  41. data/docs/CreateBlogArticleRequest.md +36 -0
  42. data/docs/CreateBlogArticleRequestImage.md +20 -0
  43. data/docs/CreateBlogArticleRequestSeo.md +20 -0
  44. data/docs/CreateBlogRequest.md +20 -0
  45. data/docs/CreateCallAdRequest.md +1 -1
  46. data/docs/CreateInboxConversationRequest.md +2 -0
  47. data/docs/CreateMessagingAdRequest.md +1 -1
  48. data/docs/CreatePostRequest.md +1 -1
  49. data/docs/CreateStandaloneAdRequest.md +10 -6
  50. data/docs/CreateStandaloneAdRequestPromotedObject.md +2 -2
  51. data/docs/CreateStandaloneAdRequestVideo.md +1 -1
  52. data/docs/CtwaAdRequestBody.md +1 -1
  53. data/docs/ExternalPostMediaItem.md +7 -3
  54. data/docs/ExternalPostSummary.md +0 -2
  55. data/docs/ExternalPostSummaryAnalytics.md +1 -1
  56. data/docs/GetAccountHealth200Response.md +3 -1
  57. data/docs/GetAccountHealth200ResponsePlatformConnection.md +24 -0
  58. data/docs/GetAccountHealth200ResponsePlatformConnectionMetaError.md +22 -0
  59. data/docs/GetAdAnalytics202Response.md +22 -0
  60. data/docs/GetAdTree202Response.md +22 -0
  61. data/docs/GetAdsTimeline202Response.md +20 -0
  62. data/docs/GetBlueskySettings200Response.md +18 -0
  63. data/docs/GetCampaignAnalytics202Response.md +22 -0
  64. data/docs/GetInboxPostComments200ResponseCommentsInner.md +4 -2
  65. data/docs/GetLinkedInPostAnalytics200ResponseAnalytics.md +1 -1
  66. data/docs/GetPhoneNumberKycForm200Response.md +3 -1
  67. data/docs/GetWhatsAppNumberKycForm200Response.md +3 -1
  68. data/docs/LinkedInAggregateAnalyticsTotalResponseAnalytics.md +1 -1
  69. data/docs/LinkedInPlatformData.md +4 -2
  70. data/docs/LinkedInPlatformDataPoll.md +22 -0
  71. data/docs/ListAds202Response.md +22 -0
  72. data/docs/ListBlogArticles200Response.md +22 -0
  73. data/docs/ListBlogs200Response.md +22 -0
  74. data/docs/ListInboxConversations200ResponseDataInnerMetadata.md +3 -3
  75. data/docs/ListLeads200ResponseLeadsInner.md +3 -3
  76. data/docs/ListLocalServicesLeadConversations200Response.md +22 -0
  77. data/docs/ListLocalServicesLeadConversations200ResponseDataInner.md +28 -0
  78. data/docs/ListLocalServicesLeadConversations200ResponseDataInnerMessage.md +20 -0
  79. data/docs/ListLocalServicesLeadConversations200ResponseDataInnerPhoneCall.md +20 -0
  80. data/docs/ListLocalServicesLeads200Response.md +22 -0
  81. data/docs/ListLocalServicesLeads200ResponseDataInner.md +38 -0
  82. data/docs/ListLocalServicesLeads200ResponseDataInnerContact.md +22 -0
  83. data/docs/ListPhoneNumbers200ResponseConnectedInner.md +3 -1
  84. data/docs/ListPhoneNumbers200ResponseNumbersInner.md +2 -0
  85. data/docs/ListWhatsAppAccountEvents200Response.md +18 -0
  86. data/docs/ListWhatsAppAccountEvents200ResponseEventsInner.md +28 -0
  87. data/docs/MessagesApi.md +4 -4
  88. data/docs/OnVerificationApprovedRequest.md +1 -1
  89. data/docs/OnVerificationFailedRequest.md +1 -1
  90. data/docs/OnWhatsAppAutomaticEventRequest.md +1 -1
  91. data/docs/OnWhatsAppNumberActionRequiredRequest.md +1 -1
  92. data/docs/OnWhatsAppNumberActivatedRequest.md +1 -1
  93. data/docs/OnWhatsAppNumberDeclinedRequest.md +1 -1
  94. data/docs/OnWhatsAppNumberKycSubmittedRequest.md +1 -1
  95. data/docs/OnWhatsAppNumberReactivatedRequest.md +1 -1
  96. data/docs/OnWhatsAppNumberReleasedRequest.md +1 -1
  97. data/docs/OnWhatsAppNumberSuspendedRequest.md +1 -1
  98. data/docs/OnWhatsAppNumberVerificationRequiredRequest.md +1 -1
  99. data/docs/PlatformTarget.md +2 -2
  100. data/docs/PostAnalytics.md +3 -3
  101. data/docs/PostsApi.md +1 -1
  102. data/docs/SMSApi.md +1 -1
  103. data/docs/SearchAdTargeting200ResponseResultsInner.md +1 -1
  104. data/docs/SendInboxMessageRequest.md +4 -2
  105. data/docs/SubmitPhoneNumberKycRequest.md +1 -1
  106. data/docs/SubmitPhoneNumberKycRequestAddress.md +2 -0
  107. data/docs/SubmitWhatsAppNumberKycRequest.md +1 -1
  108. data/docs/TwitterPlatformData.md +2 -0
  109. data/docs/UpdateAdCampaignStatus200Response.md +6 -6
  110. data/docs/UpdateAdSet200Response.md +7 -3
  111. data/docs/UpdateAdSetRequest.md +1 -1
  112. data/docs/UpdateAdSetStatus200Response.md +9 -3
  113. data/docs/UpdateBlogArticleRequest.md +36 -0
  114. data/docs/UpdateBlogRequest.md +20 -0
  115. data/docs/UpdateBlueskySettingsRequest.md +18 -0
  116. data/docs/ValidatePhoneNumberKycAddressRequest.md +2 -0
  117. data/docs/WebhookEventsApi.md +138 -0
  118. data/docs/WebhookPayloadAccountAdsInitialSyncCompleted.md +1 -1
  119. data/docs/WebhookPayloadAccountConnected.md +1 -1
  120. data/docs/WebhookPayloadAccountDisconnected.md +1 -1
  121. data/docs/WebhookPayloadAdStatusChanged.md +1 -1
  122. data/docs/WebhookPayloadCallEnded.md +1 -1
  123. data/docs/WebhookPayloadCallEndedCall.md +4 -0
  124. data/docs/WebhookPayloadCallFailed.md +1 -1
  125. data/docs/WebhookPayloadCallPermissionRequest.md +1 -1
  126. data/docs/WebhookPayloadCallReceived.md +1 -1
  127. data/docs/WebhookPayloadComment.md +1 -1
  128. data/docs/WebhookPayloadCommentCommentAuthor.md +2 -0
  129. data/docs/WebhookPayloadConversationStarted.md +1 -1
  130. data/docs/WebhookPayloadExternalPost.md +1 -1
  131. data/docs/WebhookPayloadLead.md +1 -1
  132. data/docs/WebhookPayloadMessage.md +1 -1
  133. data/docs/WebhookPayloadMessageDeleted.md +1 -1
  134. data/docs/WebhookPayloadMessageDeliveryStatus.md +1 -1
  135. data/docs/WebhookPayloadMessageEdited.md +1 -1
  136. data/docs/WebhookPayloadMessageMetadata.md +5 -1
  137. data/docs/WebhookPayloadMessageMetadataReferral.md +5 -3
  138. data/docs/WebhookPayloadMessageMetadataUnsupported.md +22 -0
  139. data/docs/WebhookPayloadMessageSent.md +1 -1
  140. data/docs/WebhookPayloadPost.md +1 -1
  141. data/docs/WebhookPayloadPostPlatform.md +1 -1
  142. data/docs/WebhookPayloadReaction.md +1 -1
  143. data/docs/WebhookPayloadReferral.md +30 -0
  144. data/docs/WebhookPayloadReferralReferral.md +28 -0
  145. data/docs/WebhookPayloadReferralReferralAdsContextData.md +28 -0
  146. data/docs/WebhookPayloadReferralSender.md +20 -0
  147. data/docs/WebhookPayloadReviewNew.md +1 -1
  148. data/docs/WebhookPayloadReviewUpdated.md +1 -1
  149. data/docs/WebhookPayloadTest.md +1 -1
  150. data/docs/WebhookPayloadWhatsAppTemplateCategoryUpdated.md +26 -0
  151. data/docs/WebhookPayloadWhatsAppTemplateCategoryUpdatedTemplate.md +32 -0
  152. data/docs/WebhookPayloadWhatsAppTemplateStatusUpdated.md +1 -1
  153. data/docs/WhatsAppApi.md +74 -0
  154. data/docs/WorkflowNode.md +3 -1
  155. data/docs/XArticle.md +24 -0
  156. data/docs/XArticleBlock.md +28 -0
  157. data/docs/XArticleBlockData.md +24 -0
  158. data/docs/XArticleContentState.md +20 -0
  159. data/docs/XArticleCover.md +20 -0
  160. data/docs/XArticleEntity.md +57 -0
  161. data/docs/XArticleEntityOneOf.md +20 -0
  162. data/docs/XArticleEntityOneOf1.md +20 -0
  163. data/docs/XArticleEntityOneOf1Value.md +22 -0
  164. data/docs/XArticleEntityOneOf1ValueData.md +18 -0
  165. data/docs/XArticleEntityOneOf2.md +20 -0
  166. data/docs/XArticleEntityOneOf2Value.md +22 -0
  167. data/docs/XArticleEntityOneOf2ValueData.md +22 -0
  168. data/docs/XArticleEntityOneOf3.md +20 -0
  169. data/docs/XArticleEntityOneOf3Value.md +22 -0
  170. data/docs/XArticleEntityOneOf3ValueData.md +18 -0
  171. data/docs/XArticleEntityOneOf4.md +20 -0
  172. data/docs/XArticleEntityOneOf4Value.md +22 -0
  173. data/docs/XArticleEntityOneOf4ValueData.md +18 -0
  174. data/docs/XArticleEntityOneOf5.md +20 -0
  175. data/docs/XArticleEntityOneOf5Value.md +22 -0
  176. data/docs/XArticleEntityOneOfValue.md +22 -0
  177. data/docs/XArticleEntityOneOfValueData.md +18 -0
  178. data/docs/XArticleEntityRange.md +22 -0
  179. data/docs/XArticleInlineStyleRange.md +22 -0
  180. data/docs/XArticleTextRange.md +22 -0
  181. data/docs/YouTubeVideoRetentionResponse.md +1 -1
  182. data/docs/YouTubeVideoRetentionResponseRetentionCurveInner.md +2 -2
  183. data/lib/zernio-sdk/api/accounts_api.rb +139 -2
  184. data/lib/zernio-sdk/api/ad_campaigns_api.rb +44 -17
  185. data/lib/zernio-sdk/api/ad_insights_api.rb +171 -6
  186. data/lib/zernio-sdk/api/ad_targeting_api.rb +5 -5
  187. data/lib/zernio-sdk/api/blogs_api.rb +845 -0
  188. data/lib/zernio-sdk/api/comments_api.rb +10 -10
  189. data/lib/zernio-sdk/api/connect_api.rb +149 -0
  190. data/lib/zernio-sdk/api/messages_api.rb +4 -4
  191. data/lib/zernio-sdk/api/posts_api.rb +2 -2
  192. data/lib/zernio-sdk/api/sms_api.rb +2 -2
  193. data/lib/zernio-sdk/api/webhook_events_api.rb +132 -0
  194. data/lib/zernio-sdk/api/whats_app_api.rb +75 -0
  195. data/lib/zernio-sdk/models/account_with_follower_stats.rb +2 -2
  196. data/lib/zernio-sdk/models/{get_ad_analytics200_response.rb → ad_analytics_response.rb} +15 -15
  197. data/lib/zernio-sdk/models/{get_ad_analytics200_response_ad.rb → ad_analytics_response_ad.rb} +4 -47
  198. data/lib/zernio-sdk/models/ad_creative.rb +12 -1
  199. data/lib/zernio-sdk/models/ad_daily_metrics.rb +1 -1
  200. data/lib/zernio-sdk/models/ad_engagement_counts.rb +5 -5
  201. data/lib/zernio-sdk/models/ad_metrics.rb +1 -1
  202. data/lib/zernio-sdk/models/ad_tree_campaign.rb +1 -1
  203. data/lib/zernio-sdk/models/{get_ad_tree200_response.rb → ad_tree_response.rb} +17 -17
  204. data/lib/zernio-sdk/models/add_broadcast_recipients_request.rb +1 -1
  205. data/lib/zernio-sdk/models/{list_ads200_response.rb → ads_list_response.rb} +17 -17
  206. data/lib/zernio-sdk/models/{get_ads_timeline200_response.rb → ads_timeline_response.rb} +17 -17
  207. data/lib/zernio-sdk/models/{get_ads_timeline200_response_rows_inner.rb → ads_timeline_response_rows_inner.rb} +3 -3
  208. data/lib/zernio-sdk/models/analytics_list_response_posts_inner.rb +1 -1
  209. data/lib/zernio-sdk/models/analytics_list_response_posts_inner_media_items_inner.rb +211 -0
  210. data/lib/zernio-sdk/models/analytics_single_post_response_media_items_inner.rb +52 -6
  211. data/lib/zernio-sdk/models/billing_snapshot.rb +14 -3
  212. data/lib/zernio-sdk/models/billing_snapshot_plan.rb +14 -4
  213. data/lib/zernio-sdk/models/blog.rb +211 -0
  214. data/lib/zernio-sdk/models/blog_article.rb +315 -0
  215. data/lib/zernio-sdk/models/blog_article_image.rb +158 -0
  216. data/lib/zernio-sdk/models/bluesky_platform_data.rb +42 -2
  217. data/lib/zernio-sdk/models/boost_post_request.rb +30 -1
  218. data/lib/zernio-sdk/models/{get_campaign_analytics200_response.rb → campaign_analytics_response.rb} +15 -15
  219. data/lib/zernio-sdk/models/{get_campaign_analytics200_response_analytics.rb → campaign_analytics_response_analytics.rb} +4 -4
  220. data/lib/zernio-sdk/models/{get_campaign_analytics200_response_analytics_daily_inner.rb → campaign_analytics_response_analytics_daily_inner.rb} +4 -4
  221. data/lib/zernio-sdk/models/{get_campaign_analytics200_response_campaign.rb → campaign_analytics_response_campaign.rb} +3 -3
  222. data/lib/zernio-sdk/models/connect_shopify_with_token200_response.rb +147 -0
  223. data/lib/zernio-sdk/models/connect_shopify_with_token200_response_account.rb +218 -0
  224. data/lib/zernio-sdk/models/connect_shopify_with_token_request.rb +219 -0
  225. data/lib/zernio-sdk/models/create_blog201_response.rb +190 -0
  226. data/lib/zernio-sdk/models/create_blog_article201_response.rb +190 -0
  227. data/lib/zernio-sdk/models/create_blog_article_request.rb +262 -0
  228. data/lib/zernio-sdk/models/create_blog_article_request_image.rb +174 -0
  229. data/lib/zernio-sdk/models/create_blog_article_request_seo.rb +157 -0
  230. data/lib/zernio-sdk/models/create_blog_request.rb +202 -0
  231. data/lib/zernio-sdk/models/create_call_ad_request.rb +1 -1
  232. data/lib/zernio-sdk/models/create_inbox_conversation_request.rb +13 -1
  233. data/lib/zernio-sdk/models/create_messaging_ad_request.rb +1 -1
  234. data/lib/zernio-sdk/models/create_post_request.rb +1 -1
  235. data/lib/zernio-sdk/models/create_standalone_ad_request.rb +67 -6
  236. data/lib/zernio-sdk/models/create_standalone_ad_request_creatives_inner_video.rb +1 -1
  237. data/lib/zernio-sdk/models/create_standalone_ad_request_promoted_object.rb +3 -3
  238. data/lib/zernio-sdk/models/create_standalone_ad_request_video.rb +1 -1
  239. data/lib/zernio-sdk/models/ctwa_ad_request_body.rb +1 -1
  240. data/lib/zernio-sdk/models/external_post_media_item.rb +48 -16
  241. data/lib/zernio-sdk/models/external_post_summary.rb +1 -11
  242. data/lib/zernio-sdk/models/external_post_summary_analytics.rb +1 -0
  243. data/lib/zernio-sdk/models/facebook_settings.rb +5 -5
  244. data/lib/zernio-sdk/models/get_account_health200_response.rb +13 -4
  245. data/lib/zernio-sdk/models/get_account_health200_response_platform_connection.rb +213 -0
  246. data/lib/zernio-sdk/models/get_account_health200_response_platform_connection_meta_error.rb +168 -0
  247. data/lib/zernio-sdk/models/get_ad_analytics202_response.rb +213 -0
  248. data/lib/zernio-sdk/models/get_ad_tree202_response.rb +215 -0
  249. data/lib/zernio-sdk/models/get_ads_timeline202_response.rb +206 -0
  250. data/lib/zernio-sdk/models/get_bluesky_settings200_response.rb +150 -0
  251. data/lib/zernio-sdk/models/get_campaign_analytics202_response.rb +213 -0
  252. data/lib/zernio-sdk/models/get_inbox_post_comments200_response_comments_inner.rb +13 -2
  253. data/lib/zernio-sdk/models/get_linked_in_post_analytics200_response_analytics.rb +1 -1
  254. data/lib/zernio-sdk/models/get_phone_number_kyc_form200_response.rb +14 -4
  255. data/lib/zernio-sdk/models/get_whats_app_number_kyc_form200_response.rb +14 -4
  256. data/lib/zernio-sdk/models/inbox_webhook_message.rb +2 -2
  257. data/lib/zernio-sdk/models/linked_in_aggregate_analytics_total_response_analytics.rb +1 -1
  258. data/lib/zernio-sdk/models/linked_in_platform_data.rb +15 -6
  259. data/lib/zernio-sdk/models/linked_in_platform_data_poll.rb +277 -0
  260. data/lib/zernio-sdk/models/list_ads202_response.rb +215 -0
  261. data/lib/zernio-sdk/models/list_blog_articles200_response.rb +203 -0
  262. data/lib/zernio-sdk/models/list_blogs200_response.rb +203 -0
  263. data/lib/zernio-sdk/models/list_broadcast_recipients200_response_recipients_inner.rb +1 -0
  264. data/lib/zernio-sdk/models/list_inbox_conversations200_response_data_inner_metadata.rb +4 -4
  265. data/lib/zernio-sdk/models/list_leads200_response_leads_inner.rb +3 -2
  266. data/lib/zernio-sdk/models/list_local_services_lead_conversations200_response.rb +167 -0
  267. data/lib/zernio-sdk/models/list_local_services_lead_conversations200_response_data_inner.rb +198 -0
  268. data/lib/zernio-sdk/models/list_local_services_lead_conversations200_response_data_inner_message.rb +160 -0
  269. data/lib/zernio-sdk/models/list_local_services_lead_conversations200_response_data_inner_phone_call.rb +159 -0
  270. data/lib/zernio-sdk/models/list_local_services_leads200_response.rb +167 -0
  271. data/lib/zernio-sdk/models/list_local_services_leads200_response_data_inner.rb +249 -0
  272. data/lib/zernio-sdk/models/list_local_services_leads200_response_data_inner_contact.rb +169 -0
  273. data/lib/zernio-sdk/models/list_phone_numbers200_response_connected_inner.rb +15 -5
  274. data/lib/zernio-sdk/models/list_phone_numbers200_response_numbers_inner.rb +11 -1
  275. data/lib/zernio-sdk/models/list_sequence_enrollments200_response_enrollments_inner.rb +3 -0
  276. data/lib/zernio-sdk/models/list_whats_app_account_events200_response.rb +149 -0
  277. data/lib/zernio-sdk/models/list_whats_app_account_events200_response_events_inner.rb +228 -0
  278. data/lib/zernio-sdk/models/on_verification_approved_request.rb +1 -0
  279. data/lib/zernio-sdk/models/on_verification_failed_request.rb +1 -0
  280. data/lib/zernio-sdk/models/on_whats_app_automatic_event_request.rb +1 -0
  281. data/lib/zernio-sdk/models/on_whats_app_number_action_required_request.rb +1 -0
  282. data/lib/zernio-sdk/models/on_whats_app_number_activated_request.rb +1 -0
  283. data/lib/zernio-sdk/models/on_whats_app_number_declined_request.rb +1 -0
  284. data/lib/zernio-sdk/models/on_whats_app_number_kyc_submitted_request.rb +1 -0
  285. data/lib/zernio-sdk/models/on_whats_app_number_reactivated_request.rb +1 -0
  286. data/lib/zernio-sdk/models/on_whats_app_number_released_request.rb +1 -0
  287. data/lib/zernio-sdk/models/on_whats_app_number_suspended_request.rb +1 -0
  288. data/lib/zernio-sdk/models/on_whats_app_number_verification_required_request.rb +1 -0
  289. data/lib/zernio-sdk/models/platform_target.rb +5 -4
  290. data/lib/zernio-sdk/models/post_analytics.rb +2 -1
  291. data/lib/zernio-sdk/models/search_ad_targeting200_response_results_inner.rb +1 -1
  292. data/lib/zernio-sdk/models/send_inbox_message_request.rb +15 -3
  293. data/lib/zernio-sdk/models/social_account.rb +2 -2
  294. data/lib/zernio-sdk/models/submit_phone_number_kyc_request.rb +1 -1
  295. data/lib/zernio-sdk/models/submit_phone_number_kyc_request_address.rb +11 -1
  296. data/lib/zernio-sdk/models/submit_whats_app_number_kyc_request.rb +1 -1
  297. data/lib/zernio-sdk/models/twitter_platform_data.rb +11 -2
  298. data/lib/zernio-sdk/models/update_ad_campaign_status200_response.rb +50 -15
  299. data/lib/zernio-sdk/models/update_ad_set200_response.rb +26 -1
  300. data/lib/zernio-sdk/models/update_ad_set_request.rb +1 -1
  301. data/lib/zernio-sdk/models/update_ad_set_status200_response.rb +72 -4
  302. data/lib/zernio-sdk/models/update_blog_article_request.rb +257 -0
  303. data/lib/zernio-sdk/models/update_blog_request.rb +196 -0
  304. data/lib/zernio-sdk/models/update_bluesky_settings_request.rb +176 -0
  305. data/lib/zernio-sdk/models/validate_phone_number_kyc_address_request.rb +11 -1
  306. data/lib/zernio-sdk/models/webhook_payload_account_ads_initial_sync_completed.rb +1 -0
  307. data/lib/zernio-sdk/models/webhook_payload_account_connected.rb +1 -0
  308. data/lib/zernio-sdk/models/webhook_payload_account_disconnected.rb +1 -0
  309. data/lib/zernio-sdk/models/webhook_payload_ad_status_changed.rb +1 -1
  310. data/lib/zernio-sdk/models/webhook_payload_call_ended.rb +1 -0
  311. data/lib/zernio-sdk/models/webhook_payload_call_ended_call.rb +23 -1
  312. data/lib/zernio-sdk/models/webhook_payload_call_failed.rb +1 -0
  313. data/lib/zernio-sdk/models/webhook_payload_call_permission_request.rb +1 -0
  314. data/lib/zernio-sdk/models/webhook_payload_call_received.rb +1 -0
  315. data/lib/zernio-sdk/models/webhook_payload_comment.rb +1 -0
  316. data/lib/zernio-sdk/models/webhook_payload_comment_comment_author.rb +11 -1
  317. data/lib/zernio-sdk/models/webhook_payload_conversation_started.rb +1 -0
  318. data/lib/zernio-sdk/models/webhook_payload_external_post.rb +1 -0
  319. data/lib/zernio-sdk/models/webhook_payload_lead.rb +1 -0
  320. data/lib/zernio-sdk/models/webhook_payload_message.rb +1 -0
  321. data/lib/zernio-sdk/models/webhook_payload_message_deleted.rb +1 -0
  322. data/lib/zernio-sdk/models/webhook_payload_message_delivery_status.rb +2 -1
  323. data/lib/zernio-sdk/models/webhook_payload_message_edited.rb +1 -0
  324. data/lib/zernio-sdk/models/webhook_payload_message_message.rb +2 -2
  325. data/lib/zernio-sdk/models/webhook_payload_message_metadata.rb +23 -4
  326. data/lib/zernio-sdk/models/webhook_payload_message_metadata_referral.rb +15 -5
  327. data/lib/zernio-sdk/models/webhook_payload_message_metadata_unsupported.rb +169 -0
  328. data/lib/zernio-sdk/models/webhook_payload_message_sent.rb +1 -0
  329. data/lib/zernio-sdk/models/webhook_payload_post.rb +1 -0
  330. data/lib/zernio-sdk/models/webhook_payload_post_platform.rb +1 -0
  331. data/lib/zernio-sdk/models/webhook_payload_reaction.rb +1 -0
  332. data/lib/zernio-sdk/models/webhook_payload_reaction_reaction_sender.rb +1 -1
  333. data/lib/zernio-sdk/models/webhook_payload_referral.rb +347 -0
  334. data/lib/zernio-sdk/models/webhook_payload_referral_referral.rb +198 -0
  335. data/lib/zernio-sdk/models/webhook_payload_referral_referral_ads_context_data.rb +193 -0
  336. data/lib/zernio-sdk/models/webhook_payload_referral_sender.rb +176 -0
  337. data/lib/zernio-sdk/models/webhook_payload_review_new.rb +1 -0
  338. data/lib/zernio-sdk/models/webhook_payload_review_updated.rb +1 -0
  339. data/lib/zernio-sdk/models/webhook_payload_test.rb +1 -0
  340. data/lib/zernio-sdk/models/webhook_payload_whats_app_template_category_updated.rb +295 -0
  341. data/lib/zernio-sdk/models/webhook_payload_whats_app_template_category_updated_template.rb +353 -0
  342. data/lib/zernio-sdk/models/webhook_payload_whats_app_template_status_updated.rb +1 -1
  343. data/lib/zernio-sdk/models/workflow_node.rb +42 -4
  344. data/lib/zernio-sdk/models/x_article.rb +255 -0
  345. data/lib/zernio-sdk/models/x_article_block.rb +273 -0
  346. data/lib/zernio-sdk/models/x_article_block_data.rb +182 -0
  347. data/lib/zernio-sdk/models/x_article_content_state.rb +204 -0
  348. data/lib/zernio-sdk/models/x_article_cover.rb +204 -0
  349. data/lib/zernio-sdk/models/x_article_entity.rb +109 -0
  350. data/lib/zernio-sdk/models/x_article_entity_one_of.rb +199 -0
  351. data/lib/zernio-sdk/models/x_article_entity_one_of1.rb +199 -0
  352. data/lib/zernio-sdk/models/x_article_entity_one_of1_value.rb +242 -0
  353. data/lib/zernio-sdk/models/x_article_entity_one_of1_value_data.rb +164 -0
  354. data/lib/zernio-sdk/models/x_article_entity_one_of2.rb +199 -0
  355. data/lib/zernio-sdk/models/x_article_entity_one_of2_value.rb +242 -0
  356. data/lib/zernio-sdk/models/x_article_entity_one_of2_value_data.rb +214 -0
  357. data/lib/zernio-sdk/models/x_article_entity_one_of3.rb +199 -0
  358. data/lib/zernio-sdk/models/x_article_entity_one_of3_value.rb +242 -0
  359. data/lib/zernio-sdk/models/x_article_entity_one_of3_value_data.rb +173 -0
  360. data/lib/zernio-sdk/models/x_article_entity_one_of4.rb +199 -0
  361. data/lib/zernio-sdk/models/x_article_entity_one_of4_value.rb +242 -0
  362. data/lib/zernio-sdk/models/x_article_entity_one_of4_value_data.rb +164 -0
  363. data/lib/zernio-sdk/models/x_article_entity_one_of5.rb +199 -0
  364. data/lib/zernio-sdk/models/x_article_entity_one_of5_value.rb +242 -0
  365. data/lib/zernio-sdk/models/x_article_entity_one_of_value.rb +242 -0
  366. data/lib/zernio-sdk/models/x_article_entity_one_of_value_data.rb +173 -0
  367. data/lib/zernio-sdk/models/x_article_entity_range.rb +245 -0
  368. data/lib/zernio-sdk/models/x_article_inline_style_range.rb +259 -0
  369. data/lib/zernio-sdk/models/x_article_text_range.rb +237 -0
  370. data/lib/zernio-sdk/models/you_tube_video_retention_response.rb +1 -1
  371. data/lib/zernio-sdk/models/you_tube_video_retention_response_retention_curve_inner.rb +2 -2
  372. data/lib/zernio-sdk/version.rb +1 -1
  373. data/lib/zernio-sdk.rb +80 -10
  374. data/openapi.yaml +2141 -282
  375. data/spec/api/accounts_api_spec.rb +26 -1
  376. data/spec/api/ad_campaigns_api_spec.rb +12 -7
  377. data/spec/api/ad_insights_api_spec.rb +36 -2
  378. data/spec/api/ad_targeting_api_spec.rb +2 -2
  379. data/spec/api/blogs_api_spec.rb +174 -0
  380. data/spec/api/comments_api_spec.rb +5 -5
  381. data/spec/api/connect_api_spec.rb +27 -0
  382. data/spec/api/messages_api_spec.rb +2 -2
  383. data/spec/api/posts_api_spec.rb +1 -1
  384. data/spec/api/sms_api_spec.rb +1 -1
  385. data/spec/api/whats_app_api_spec.rb +13 -0
  386. data/spec/models/account_with_follower_stats_spec.rb +1 -1
  387. data/spec/models/{get_campaign_analytics200_response_campaign_spec.rb → ad_analytics_response_ad_spec.rb} +6 -6
  388. data/spec/models/{get_ad_analytics200_response_spec.rb → ad_analytics_response_spec.rb} +8 -8
  389. data/spec/models/ad_creative_spec.rb +6 -0
  390. data/spec/models/{get_ad_tree200_response_spec.rb → ad_tree_response_spec.rb} +8 -8
  391. data/spec/models/{list_ads200_response_spec.rb → ads_list_response_spec.rb} +8 -8
  392. data/spec/models/{get_ads_timeline200_response_rows_inner_spec.rb → ads_timeline_response_rows_inner_spec.rb} +6 -6
  393. data/spec/models/{get_ads_timeline200_response_spec.rb → ads_timeline_response_spec.rb} +8 -8
  394. data/spec/models/analytics_list_response_posts_inner_media_items_inner_spec.rb +58 -0
  395. data/spec/models/analytics_single_post_response_media_items_inner_spec.rb +20 -0
  396. data/spec/models/billing_snapshot_plan_spec.rb +6 -0
  397. data/spec/models/billing_snapshot_spec.rb +7 -1
  398. data/spec/models/blog_article_image_spec.rb +42 -0
  399. data/spec/models/blog_article_spec.rb +118 -0
  400. data/spec/models/blog_spec.rb +58 -0
  401. data/spec/models/bluesky_platform_data_spec.rb +6 -0
  402. data/spec/models/{get_campaign_analytics200_response_analytics_daily_inner_spec.rb → campaign_analytics_response_analytics_daily_inner_spec.rb} +6 -6
  403. data/spec/models/{get_campaign_analytics200_response_analytics_spec.rb → campaign_analytics_response_analytics_spec.rb} +6 -6
  404. data/spec/models/campaign_analytics_response_campaign_spec.rb +60 -0
  405. data/spec/models/{get_campaign_analytics200_response_spec.rb → campaign_analytics_response_spec.rb} +8 -8
  406. data/spec/models/connect_shopify_with_token200_response_account_spec.rb +64 -0
  407. data/spec/models/connect_shopify_with_token200_response_spec.rb +36 -0
  408. data/spec/models/connect_shopify_with_token_request_spec.rb +48 -0
  409. data/spec/models/create_blog201_response_spec.rb +46 -0
  410. data/spec/models/create_blog_article201_response_spec.rb +46 -0
  411. data/spec/models/create_blog_article_request_image_spec.rb +42 -0
  412. data/spec/models/create_blog_article_request_seo_spec.rb +42 -0
  413. data/spec/models/create_blog_article_request_spec.rb +90 -0
  414. data/spec/models/create_blog_request_spec.rb +42 -0
  415. data/spec/models/create_inbox_conversation_request_spec.rb +6 -0
  416. data/spec/models/create_standalone_ad_request_spec.rb +16 -0
  417. data/spec/models/create_webhook_settings_request_spec.rb +1 -1
  418. data/spec/models/external_post_media_item_spec.rb +20 -0
  419. data/spec/models/external_post_summary_spec.rb +0 -6
  420. data/spec/models/get_account_health200_response_platform_connection_meta_error_spec.rb +48 -0
  421. data/spec/models/get_account_health200_response_platform_connection_spec.rb +58 -0
  422. data/spec/models/get_account_health200_response_spec.rb +6 -0
  423. data/spec/models/get_ad_analytics202_response_spec.rb +52 -0
  424. data/spec/models/get_ad_tree202_response_spec.rb +52 -0
  425. data/spec/models/get_ads_timeline202_response_spec.rb +46 -0
  426. data/spec/models/get_bluesky_settings200_response_spec.rb +36 -0
  427. data/spec/models/get_campaign_analytics202_response_spec.rb +52 -0
  428. data/spec/models/get_inbox_post_comments200_response_comments_inner_spec.rb +6 -0
  429. data/spec/models/get_phone_number_kyc_form200_response_spec.rb +6 -0
  430. data/spec/models/get_whats_app_number_kyc_form200_response_spec.rb +6 -0
  431. data/spec/models/inbox_webhook_message_spec.rb +1 -1
  432. data/spec/models/linked_in_platform_data_poll_spec.rb +52 -0
  433. data/spec/models/linked_in_platform_data_spec.rb +6 -0
  434. data/spec/models/list_ads202_response_spec.rb +52 -0
  435. data/spec/models/list_blog_articles200_response_spec.rb +52 -0
  436. data/spec/models/list_blogs200_response_spec.rb +52 -0
  437. data/spec/models/list_local_services_lead_conversations200_response_data_inner_message_spec.rb +42 -0
  438. data/spec/models/list_local_services_lead_conversations200_response_data_inner_phone_call_spec.rb +42 -0
  439. data/spec/models/list_local_services_lead_conversations200_response_data_inner_spec.rb +66 -0
  440. data/spec/models/list_local_services_lead_conversations200_response_spec.rb +48 -0
  441. data/spec/models/list_local_services_leads200_response_data_inner_contact_spec.rb +48 -0
  442. data/spec/models/list_local_services_leads200_response_data_inner_spec.rb +96 -0
  443. data/spec/models/list_local_services_leads200_response_spec.rb +48 -0
  444. data/spec/models/list_phone_numbers200_response_connected_inner_spec.rb +6 -0
  445. data/spec/models/list_phone_numbers200_response_numbers_inner_spec.rb +6 -0
  446. data/spec/models/list_whats_app_account_events200_response_events_inner_spec.rb +70 -0
  447. data/spec/models/list_whats_app_account_events200_response_spec.rb +36 -0
  448. data/spec/models/platform_target_spec.rb +1 -1
  449. data/spec/models/send_inbox_message_request_spec.rb +6 -0
  450. data/spec/models/social_account_spec.rb +1 -1
  451. data/spec/models/submit_phone_number_kyc_request_address_spec.rb +6 -0
  452. data/spec/models/twitter_platform_data_spec.rb +6 -0
  453. data/spec/models/update_ad_campaign_status200_response_spec.rb +8 -4
  454. data/spec/models/update_ad_set200_response_spec.rb +12 -0
  455. data/spec/models/update_ad_set_status200_response_spec.rb +22 -0
  456. data/spec/models/update_blog_article_request_spec.rb +90 -0
  457. data/spec/models/update_blog_request_spec.rb +42 -0
  458. data/spec/models/update_bluesky_settings_request_spec.rb +36 -0
  459. data/spec/models/update_webhook_settings_request_spec.rb +1 -1
  460. data/spec/models/validate_phone_number_kyc_address_request_spec.rb +6 -0
  461. data/spec/models/webhook_payload_call_ended_call_spec.rb +12 -0
  462. data/spec/models/webhook_payload_comment_comment_author_spec.rb +6 -0
  463. data/spec/models/webhook_payload_message_message_spec.rb +1 -1
  464. data/spec/models/webhook_payload_message_metadata_referral_spec.rb +6 -0
  465. data/spec/models/webhook_payload_message_metadata_spec.rb +12 -0
  466. data/spec/models/webhook_payload_message_metadata_unsupported_spec.rb +48 -0
  467. data/spec/models/webhook_payload_referral_referral_ads_context_data_spec.rb +66 -0
  468. data/spec/models/webhook_payload_referral_referral_spec.rb +66 -0
  469. data/spec/models/webhook_payload_referral_sender_spec.rb +42 -0
  470. data/spec/models/webhook_payload_referral_spec.rb +76 -0
  471. data/spec/models/webhook_payload_whats_app_template_category_updated_spec.rb +64 -0
  472. data/spec/models/webhook_payload_whats_app_template_category_updated_template_spec.rb +94 -0
  473. data/spec/models/webhook_spec.rb +1 -1
  474. data/spec/models/workflow_node_spec.rb +6 -0
  475. data/spec/models/x_article_block_data_spec.rb +54 -0
  476. data/spec/models/{get_ad_analytics200_response_ad_spec.rb → x_article_block_spec.rb} +16 -16
  477. data/spec/models/x_article_content_state_spec.rb +42 -0
  478. data/spec/models/x_article_cover_spec.rb +42 -0
  479. data/spec/models/x_article_entity_one_of1_spec.rb +42 -0
  480. data/spec/models/x_article_entity_one_of1_value_data_spec.rb +36 -0
  481. data/spec/models/x_article_entity_one_of1_value_spec.rb +56 -0
  482. data/spec/models/x_article_entity_one_of2_spec.rb +42 -0
  483. data/spec/models/x_article_entity_one_of2_value_data_spec.rb +48 -0
  484. data/spec/models/x_article_entity_one_of2_value_spec.rb +56 -0
  485. data/spec/models/x_article_entity_one_of3_spec.rb +42 -0
  486. data/spec/models/x_article_entity_one_of3_value_data_spec.rb +36 -0
  487. data/spec/models/x_article_entity_one_of3_value_spec.rb +56 -0
  488. data/spec/models/x_article_entity_one_of4_spec.rb +42 -0
  489. data/spec/models/x_article_entity_one_of4_value_data_spec.rb +36 -0
  490. data/spec/models/x_article_entity_one_of4_value_spec.rb +56 -0
  491. data/spec/models/x_article_entity_one_of5_spec.rb +42 -0
  492. data/spec/models/x_article_entity_one_of5_value_spec.rb +56 -0
  493. data/spec/models/x_article_entity_one_of_spec.rb +42 -0
  494. data/spec/models/x_article_entity_one_of_value_data_spec.rb +36 -0
  495. data/spec/models/x_article_entity_one_of_value_spec.rb +56 -0
  496. data/spec/models/x_article_entity_range_spec.rb +48 -0
  497. data/spec/models/x_article_entity_spec.rb +32 -0
  498. data/spec/models/x_article_inline_style_range_spec.rb +52 -0
  499. data/spec/models/x_article_spec.rb +58 -0
  500. data/spec/models/x_article_text_range_spec.rb +48 -0
  501. data/zernio-sdk-0.0.717.gem +0 -0
  502. metadata +1914 -1634
  503. data/docs/GetAdAnalytics200Response.md +0 -22
  504. data/docs/GetAdTree200Response.md +0 -22
  505. data/docs/GetAdsTimeline200Response.md +0 -20
  506. data/docs/GetCampaignAnalytics200Response.md +0 -22
  507. data/docs/ListAds200Response.md +0 -22
  508. data/zernio-sdk-0.0.715.gem +0 -0
@@ -30,11 +30,11 @@ All URIs are relative to *https://zernio.com/api*
30
30
 
31
31
  ## boost_post
32
32
 
33
- > <UpdateAd200Response> boost_post(boost_post_request)
33
+ > <UpdateAd200Response> boost_post(boost_post_request, opts)
34
34
 
35
35
  Boost post as ad
36
36
 
37
- Creates a paid ad from an existing published post, keeping the post's engagement. By default it provisions the whole hierarchy (campaign, ad set, ad). **Attach shape (Meta).** Send `adSetId` to put the ad under an EXISTING ad set instead, so that ad set keeps its learning phase. It then owns `budget`, `schedule` and `targeting`, and sending any of those alongside `adSetId` is a 400 rather than a silent drop. `budget` is required only without `adSetId`. `instagramAccountId`, `destinationType` and `adSetId` are Meta-only and return 400 on other platforms.
37
+ Creates a paid ad from an existing published post, keeping the post's engagement. By default it provisions the whole hierarchy (campaign, ad set, ad). **Attach shape (Meta).** Send `adSetId` to put the ad under an EXISTING ad set instead, so that ad set keeps its learning phase. It then owns `budget`, `schedule` and `targeting`, and sending any of those alongside `adSetId` is a 400 rather than a silent drop. `budget` is required only without `adSetId`. `instagramAccountId`, `destinationType` and `adSetId` are Meta-only and return 400 on other platforms. **Retries.** Boosts are NOT idempotent and can take minutes when Meta requires re-hosting an Instagram video, so do not retry on client timeout. Send an Idempotency-Key header to make retries safe: same key and body replays the original 201, and distinct keys always create distinct ads. Without the header, an identical request is treated as a retry: while one is in flight it returns 409, and within 10 minutes of a completed boost it returns the already-created ad instead of creating another. To intentionally duplicate an ad, send distinct Idempotency-Keys (or vary the body, e.g. the name).
38
38
 
39
39
  ### Examples
40
40
 
@@ -49,10 +49,13 @@ end
49
49
 
50
50
  api_instance = Zernio::AdCampaignsApi.new
51
51
  boost_post_request = Zernio::BoostPostRequest.new({account_id: 'account_id_example', ad_account_id: 'ad_account_id_example', name: 'name_example', goal: 'engagement'}) # BoostPostRequest |
52
+ opts = {
53
+ idempotency_key: 'idempotency_key_example' # String | 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.
54
+ }
52
55
 
53
56
  begin
54
57
  # Boost post as ad
55
- result = api_instance.boost_post(boost_post_request)
58
+ result = api_instance.boost_post(boost_post_request, opts)
56
59
  p result
57
60
  rescue Zernio::ApiError => e
58
61
  puts "Error when calling AdCampaignsApi->boost_post: #{e}"
@@ -63,12 +66,12 @@ end
63
66
 
64
67
  This returns an Array which contains the response data, status code and headers.
65
68
 
66
- > <Array(<UpdateAd200Response>, Integer, Hash)> boost_post_with_http_info(boost_post_request)
69
+ > <Array(<UpdateAd200Response>, Integer, Hash)> boost_post_with_http_info(boost_post_request, opts)
67
70
 
68
71
  ```ruby
69
72
  begin
70
73
  # Boost post as ad
71
- data, status_code, headers = api_instance.boost_post_with_http_info(boost_post_request)
74
+ data, status_code, headers = api_instance.boost_post_with_http_info(boost_post_request, opts)
72
75
  p status_code # => 2xx
73
76
  p headers # => { ... }
74
77
  p data # => <UpdateAd200Response>
@@ -82,6 +85,7 @@ end
82
85
  | Name | Type | Description | Notes |
83
86
  | ---- | ---- | ----------- | ----- |
84
87
  | **boost_post_request** | [**BoostPostRequest**](BoostPostRequest.md) | | |
88
+ | **idempotency_key** | **String** | 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. | [optional] |
85
89
 
86
90
  ### Return type
87
91
 
@@ -823,7 +827,7 @@ end
823
827
 
824
828
  ## get_ad_tree
825
829
 
826
- > <GetAdTree200Response> get_ad_tree(opts)
830
+ > <AdTreeResponse> get_ad_tree(opts)
827
831
 
828
832
  Get campaign tree
829
833
 
@@ -852,8 +856,10 @@ opts = {
852
856
  account_id: 'account_id_example', # String | Social account ID
853
857
  profile_id: 'profile_id_example', # String | Profile ID
854
858
  campaign_id: 'campaign_id_example', # String | 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.
855
- from_date: Date.parse('2013-10-20'), # Date | Start of the METRICS date range (YYYY-MM-DD). Affects only the spend/impression numbers overlaid on each node, NOT which campaigns are returned. Defaults to 90 days ago.
859
+ from_date: Date.parse('2013-10-20'), # 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.
856
860
  to_date: Date.parse('2013-10-20'), # Date | End of metrics date range (YYYY-MM-DD). Defaults to today. Max 730-day range.
861
+ has_delivery: true, # Boolean | 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.
862
+ min_spend: 8.14, # Float | 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.
857
863
  sort: 'newest', # String | 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.
858
864
  time_increment: 1, # Integer | 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.
859
865
  daily_level: 'campaign' # String | 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.
@@ -872,7 +878,7 @@ end
872
878
 
873
879
  This returns an Array which contains the response data, status code and headers.
874
880
 
875
- > <Array(<GetAdTree200Response>, Integer, Hash)> get_ad_tree_with_http_info(opts)
881
+ > <Array(<AdTreeResponse>, Integer, Hash)> get_ad_tree_with_http_info(opts)
876
882
 
877
883
  ```ruby
878
884
  begin
@@ -880,7 +886,7 @@ begin
880
886
  data, status_code, headers = api_instance.get_ad_tree_with_http_info(opts)
881
887
  p status_code # => 2xx
882
888
  p headers # => { ... }
883
- p data # => <GetAdTree200Response>
889
+ p data # => <AdTreeResponse>
884
890
  rescue Zernio::ApiError => e
885
891
  puts "Error when calling AdCampaignsApi->get_ad_tree_with_http_info: #{e}"
886
892
  end
@@ -900,15 +906,17 @@ end
900
906
  | **account_id** | **String** | Social account ID | [optional] |
901
907
  | **profile_id** | **String** | Profile ID | [optional] |
902
908
  | **campaign_id** | **String** | Restrict the tree to a single campaign by its platform campaign id (the id the platform assigns, e.g. Meta&#39;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 &#x60;campaignId&#x60; filter on GET /v1/ads. | [optional] |
903
- | **from_date** | **Date** | Start of the METRICS date range (YYYY-MM-DD). Affects only the spend/impression numbers overlaid on each node, NOT which campaigns are returned. Defaults to 90 days ago. | [optional] |
909
+ | **from_date** | **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 &#x60;hasDelivery&#x60; or &#x60;minSpend&#x60; to also filter the campaign set to this window. Defaults to 90 days ago. | [optional] |
904
910
  | **to_date** | **Date** | End of metrics date range (YYYY-MM-DD). Defaults to today. Max 730-day range. | [optional] |
911
+ | **has_delivery** | **Boolean** | 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, so a campaign that spent then and is paused today is still returned. Filters the campaign set itself, so &#x60;pagination.total&#x60; counts only matching campaigns. | [optional] |
912
+ | **min_spend** | **Float** | Return only campaigns whose spend between &#x60;fromDate&#x60; and &#x60;toDate&#x60; reaches this amount. Expressed in each campaign&#39;s OWN currency (the &#x60;currency&#x60; field on the campaign node): spend is stored per ad account in its native currency and one response can span several. Implies &#x60;hasDelivery&#x60;; &#x60;minSpend&#x3D;0&#x60; applies no filter. | [optional] |
905
913
  | **sort** | **String** | Campaign-level sort order. &#x60;newest&#x60; (default) / &#x60;oldest&#x60; order by the campaign&#39;s newest-ad createdAt. &#x60;spend_desc&#x60; / &#x60;spend_asc&#x60; order by aggregated spend in the requested date range; campaigns with no spend land at the end. | [optional][default to &#39;newest&#39;] |
906
914
  | **time_increment** | **Integer** | Set to &#x60;1&#x60; to also return a daily breakdown. Mirrors Meta Insights&#39; &#x60;time_increment&#x3D;1&#x60;: each node gains a &#x60;daily[]&#x60; array of per-day metrics (same fields as the aggregated &#x60;metrics&#x60;) alongside the range total, so you get per-entity daily trends in ONE call instead of calling the tree once per day. Only &#x60;1&#x60; (daily) is supported. The daily series covers the same date range and uses the same source data as &#x60;metrics&#x60;, except &#x60;reach&#x60; on Meta and TikTok: the range total is the platform&#39;s de-duplicated value, so daily reach does not sum to it. See &#x60;dailyLevel&#x60; to control which levels carry it. | [optional] |
907
915
  | **daily_level** | **String** | Which tree levels get the &#x60;daily[]&#x60; series when &#x60;timeIncrement&#x3D;1&#x60;. &#x60;campaign&#x60; (default) attaches it on campaign nodes only — the common per-campaign-trend case, and the smallest payload. &#x60;adset&#x60; adds it on ad sets too; &#x60;ad&#x60; adds it on every ad in &#x60;ads[]&#x60; as well (heaviest — a long range × up to 100 ads per ad set). Scope with &#x60;campaignId&#x60; to keep &#x60;ad&#x60;-level responses small. Ignored when &#x60;timeIncrement&#x60; is unset. | [optional][default to &#39;campaign&#39;] |
908
916
 
909
917
  ### Return type
910
918
 
911
- [**GetAdTree200Response**](GetAdTree200Response.md)
919
+ [**AdTreeResponse**](AdTreeResponse.md)
912
920
 
913
921
  ### Authorization
914
922
 
@@ -922,7 +930,7 @@ end
922
930
 
923
931
  ## get_ads_timeline
924
932
 
925
- > <GetAdsTimeline200Response> get_ads_timeline(account_id, opts)
933
+ > <AdsTimelineResponse> get_ads_timeline(account_id, opts)
926
934
 
927
935
  Get daily account metrics
928
936
 
@@ -961,7 +969,7 @@ end
961
969
 
962
970
  This returns an Array which contains the response data, status code and headers.
963
971
 
964
- > <Array(<GetAdsTimeline200Response>, Integer, Hash)> get_ads_timeline_with_http_info(account_id, opts)
972
+ > <Array(<AdsTimelineResponse>, Integer, Hash)> get_ads_timeline_with_http_info(account_id, opts)
965
973
 
966
974
  ```ruby
967
975
  begin
@@ -969,7 +977,7 @@ begin
969
977
  data, status_code, headers = api_instance.get_ads_timeline_with_http_info(account_id, opts)
970
978
  p status_code # => 2xx
971
979
  p headers # => { ... }
972
- p data # => <GetAdsTimeline200Response>
980
+ p data # => <AdsTimelineResponse>
973
981
  rescue Zernio::ApiError => e
974
982
  puts "Error when calling AdCampaignsApi->get_ads_timeline_with_http_info: #{e}"
975
983
  end
@@ -987,7 +995,7 @@ end
987
995
 
988
996
  ### Return type
989
997
 
990
- [**GetAdsTimeline200Response**](GetAdsTimeline200Response.md)
998
+ [**AdsTimelineResponse**](AdsTimelineResponse.md)
991
999
 
992
1000
  ### Authorization
993
1001
 
@@ -1031,7 +1039,9 @@ opts = {
1031
1039
  account_id: 'account_id_example', # String | Social account ID
1032
1040
  profile_id: 'profile_id_example', # String | Profile ID
1033
1041
  from_date: Date.parse('2013-10-20'), # Date | Start of metrics date range (YYYY-MM-DD, inclusive). Defaults to 90 days ago when both date params are omitted.
1034
- to_date: Date.parse('2013-10-20') # Date | End of metrics date range (YYYY-MM-DD, inclusive). Defaults to today. Max 730-day range.
1042
+ to_date: Date.parse('2013-10-20'), # Date | End of metrics date range (YYYY-MM-DD, inclusive). Defaults to today. Max 730-day range.
1043
+ has_delivery: true, # Boolean | 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. Filters the campaign set itself, so `pagination.total` counts only matching campaigns. Mirrors the same filter on /v1/ads/tree.
1044
+ min_spend: 8.14 # Float | Return only campaigns whose spend between `fromDate` and `toDate` reaches this amount, in each campaign's OWN currency (the `currency` field on the campaign). Implies `hasDelivery`; `minSpend=0` applies no filter. Mirrors the same filter on /v1/ads/tree.
1035
1045
  }
1036
1046
 
1037
1047
  begin
@@ -1077,6 +1087,8 @@ end
1077
1087
  | **profile_id** | **String** | Profile ID | [optional] |
1078
1088
  | **from_date** | **Date** | Start of metrics date range (YYYY-MM-DD, inclusive). Defaults to 90 days ago when both date params are omitted. | [optional] |
1079
1089
  | **to_date** | **Date** | End of metrics date range (YYYY-MM-DD, inclusive). Defaults to today. Max 730-day range. | [optional] |
1090
+ | **has_delivery** | **Boolean** | 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. | [optional] |
1091
+ | **min_spend** | **Float** | 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. | [optional] |
1080
1092
 
1081
1093
  ### Return type
1082
1094
 
@@ -1185,7 +1197,7 @@ end
1185
1197
 
1186
1198
  ## list_ads
1187
1199
 
1188
- > <ListAds200Response> list_ads(opts)
1200
+ > <AdsListResponse> list_ads(opts)
1189
1201
 
1190
1202
  List ads
1191
1203
 
@@ -1234,7 +1246,7 @@ end
1234
1246
 
1235
1247
  This returns an Array which contains the response data, status code and headers.
1236
1248
 
1237
- > <Array(<ListAds200Response>, Integer, Hash)> list_ads_with_http_info(opts)
1249
+ > <Array(<AdsListResponse>, Integer, Hash)> list_ads_with_http_info(opts)
1238
1250
 
1239
1251
  ```ruby
1240
1252
  begin
@@ -1242,7 +1254,7 @@ begin
1242
1254
  data, status_code, headers = api_instance.list_ads_with_http_info(opts)
1243
1255
  p status_code # => 2xx
1244
1256
  p headers # => { ... }
1245
- p data # => <ListAds200Response>
1257
+ p data # => <AdsListResponse>
1246
1258
  rescue Zernio::ApiError => e
1247
1259
  puts "Error when calling AdCampaignsApi->list_ads_with_http_info: #{e}"
1248
1260
  end
@@ -1270,7 +1282,7 @@ end
1270
1282
 
1271
1283
  ### Return type
1272
1284
 
1273
- [**ListAds200Response**](ListAds200Response.md)
1285
+ [**AdsListResponse**](AdsListResponse.md)
1274
1286
 
1275
1287
  ### Authorization
1276
1288
 
@@ -1430,7 +1442,7 @@ end
1430
1442
 
1431
1443
  Pause or resume a campaign
1432
1444
 
1433
- Updates the status of all ads in a campaign. Makes one platform API call (not per-ad) since status cascades through the campaign hierarchy. Ads in terminal statuses (rejected, completed, cancelled) are automatically skipped.
1445
+ 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.
1434
1446
 
1435
1447
  ### Examples
1436
1448
 
@@ -1572,7 +1584,7 @@ end
1572
1584
 
1573
1585
  Pause or resume a single ad set
1574
1586
 
1575
- 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.
1587
+ 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.
1576
1588
 
1577
1589
  ### Examples
1578
1590
 
data/docs/AdCreative.md CHANGED
@@ -8,6 +8,7 @@
8
8
  | **image_url** | **String** | Alternative image URL | [optional] |
9
9
  | **video_id** | **String** | Meta video ID for VIDEO-type ads. Null for non-video ads. Callers that need an embeddable MP4 can call GET /{videoId}?fields&#x3D;source with the page access token. | [optional] |
10
10
  | **video_url** | **String** | Public Facebook watch URL for VIDEO-type ads (https://www.facebook.com/watch/?v&#x3D;{videoId}). Null for non-video ads. | [optional] |
11
+ | **creative_id** | **String** | Meta ad creative id backing this ad. Reusable via existingCreativeId on POST /v1/ads/create. | [optional] |
11
12
  | **object_type** | **String** | Meta creative object_type (e.g. SHARE, VIDEO, PRIVACY_CHECK_FAIL, POST_DELETED). Use this to render state-aware previews — when Meta moderation strips image/video fields, only thumbnailUrl at 64x64 is available. | [optional] |
12
13
  | **object_story_id** | **String** | Meta creative &#x60;object_story_id&#x60; (the SHARE reference). Frequently absent — Meta omits it for SHARE creatives. Use effectiveObjectStoryId instead. | [optional] |
13
14
  | **effective_object_story_id** | **String** | Meta &#x60;effective_object_story_id&#x60; — &#x60;{pageId}_{postId}&#x60; of the Facebook post the ad&#39;s engagement (comments) lives on. Pass to GET /v1/ads?effectiveObjectStoryId&#x3D; to map a Business-Manager-visible post back to this ad; GET /v1/ads/{adId}/comments resolves comments against it. | [optional] |
@@ -36,6 +37,7 @@ instance = Zernio::AdCreative.new(
36
37
  image_url: null,
37
38
  video_id: null,
38
39
  video_url: null,
40
+ creative_id: null,
39
41
  object_type: null,
40
42
  object_story_id: null,
41
43
  effective_object_story_id: null,
@@ -14,7 +14,7 @@
14
14
  | **engagement** | **Integer** | | [optional] |
15
15
  | **conversions** | **Float** | Count of conversion events over the requested date range. FRACTIONAL: attribution splits one conversion across touchpoints and Google additionally reports modeled conversions, so values like 0.347 are normal. Meta: events matching the campaign&#39;s promoted_object.custom_event_type (PURCHASE, LEAD, etc.). Google: the account&#39;s tracked conversions. X and LinkedIn: their reported website/lead conversions (added 2026-07). 0 for non-conversion campaigns or when no events have fired. | [optional] |
16
16
  | **cost_per_conversion** | **Float** | Derived spend / conversions in the same currency as spend. 0 when conversions is 0. | [optional] |
17
- | **actions** | **Hash&lt;String, Integer&gt;** | Per-action-type counts summed over the date range, keyed by the platform&#39;s action-type names. Meta: raw Insights action_type keys (link_click, offsite_conversion.fb_pixel_purchase, onsite_conversion.lead_grouped, ...) — both engagement and conversion events. X: conversion types (purchase, sign_up, site_visit, download, custom). LinkedIn: conversion types (post_click, post_view, lead_gen). Google returns {} (its per-action names aren&#39;t synced per ad). Empty object when no actions are reported. NOTE: keys differ by platform, so branch on the ad&#39;s platform when interpreting them. | [optional] |
17
+ | **actions** | **Hash&lt;String, Integer&gt;** | Per-action-type counts summed over the date range, keyed by the platform&#39;s action-type names. Meta: raw Insights action_type keys (link_click, offsite_conversion.fb_pixel_purchase, onsite_conversion.lead_grouped, ...) — both engagement and conversion events. TikTok: pixel conversions (purchase, add_to_cart, initiate_checkout, view_content, complete_payment, lead) plus the paid-engagement family (follow, post_reaction for paid likes, comment, share) — follow is how FOLLOWERS-goal campaigns report their result. X: conversion types (purchase, sign_up, site_visit, download, custom). LinkedIn: conversion types (post_click, post_view, lead_gen). Google returns {} (its per-action names aren&#39;t synced per ad). Empty object when no actions are reported. NOTE: keys differ by platform, so branch on the ad&#39;s platform when interpreting them. | [optional] |
18
18
  | **action_values** | **Hash&lt;String, Float&gt;** | Monetary mirror of &#x60;actions&#x60;, from Meta&#39;s Insights &#x60;action_values[]&#x60; array. Same keying — values are the revenue attributed to each action_type, in ad-account native currency (same unit as &#x60;spend&#x60;; see the campaign node&#39;s &#x60;currency&#x60; field). Use this to compute revenue-per-event (e.g. avg purchase value). Meta-only; other platforms return {}. | [optional] |
19
19
  | **purchase_value** | **Float** | Convenience sum of purchase-type action values — picked from &#x60;actionValues&#x60; via the same priority list as &#x60;conversions&#x60; so both fields describe the same events. In ad-account native currency. 0 when the campaign has no purchase event configured. Meta-only. | [optional] |
20
20
  | **roas** | **Float** | Return on ad spend — derived as &#x60;purchaseValue / spend&#x60;. 0 when &#x60;spend&#x60; is 0. Equivalent to Meta&#39;s &#x60;purchase_roas&#x60; under default attribution. At ad-set and campaign levels this is recomputed from summed purchaseValue + spend (NOT averaged across children) so it&#39;s mathematically correct at every rollup level. | [optional] |
@@ -4,11 +4,11 @@
4
4
 
5
5
  | Name | Type | Description | Notes |
6
6
  | ---- | ---- | ----------- | ----- |
7
- | **post_engagement** | **Integer** | Meta&#39;s own post-engagement total (&#x60;post_engagement&#x60;). | [optional] |
8
- | **page_engagement** | **Integer** | Meta&#39;s own page-engagement total (&#x60;page_engagement&#x60;). | [optional] |
9
- | **reactions** | **Integer** | Reactions on the ad&#39;s post (&#x60;post_reaction&#x60;). | [optional] |
7
+ | **post_engagement** | **Integer** | Meta&#39;s own post-engagement total (&#x60;post_engagement&#x60;). Meta-only. | [optional] |
8
+ | **page_engagement** | **Integer** | Meta&#39;s own page-engagement total (&#x60;page_engagement&#x60;). Meta-only. | [optional] |
9
+ | **reactions** | **Integer** | Reactions on the ad&#39;s post (&#x60;post_reaction&#x60;). For TikTok these are its paid likes. | [optional] |
10
10
  | **comments** | **Integer** | Comments on the ad&#39;s post. | [optional] |
11
- | **shares** | **Integer** | Shares of the ad&#39;s post. Meta reports these under the action type literally named &#x60;post&#x60;. | [optional] |
11
+ | **shares** | **Integer** | Shares of the ad&#39;s post. Meta reports these under the action type literally named &#x60;post&#x60;; TikTok under &#x60;share&#x60;. | [optional] |
12
12
  | **saves** | **Integer** | Saves of the ad&#39;s post (&#x60;onsite_conversion.post_save&#x60;). | [optional] |
13
13
  | **page_likes** | **Integer** | New Page likes attributed to the ad (&#x60;like&#x60;). | [optional] |
14
14
  | **video_views** | **Integer** | 3-second video views (&#x60;video_view&#x60;). For completion-based counts use &#x60;videoThruplayWatchedActions&#x60;. | [optional] |
@@ -11,6 +11,8 @@ All URIs are relative to *https://zernio.com/api*
11
11
  | [**get_ad_insights_report**](AdInsightsApi.md#get_ad_insights_report) | **GET** /v1/ads/insights/reports/{reportRunId} | Poll an async insights report run |
12
12
  | [**get_ads_search_terms**](AdInsightsApi.md#get_ads_search_terms) | **GET** /v1/ads/search-terms | Google Ads search terms report |
13
13
  | [**get_campaign_analytics**](AdInsightsApi.md#get_campaign_analytics) | **GET** /v1/ads/campaigns/{campaignId}/analytics | Get campaign analytics |
14
+ | [**list_local_services_lead_conversations**](AdInsightsApi.md#list_local_services_lead_conversations) | **GET** /v1/ads/local-services/leads/{leadId}/conversations | Conversations of a Local Services lead |
15
+ | [**list_local_services_leads**](AdInsightsApi.md#list_local_services_leads) | **GET** /v1/ads/local-services/leads | Google Local Services Ads leads |
14
16
  | [**query_ad_insights**](AdInsightsApi.md#query_ad_insights) | **GET** /v1/ads/insights | Flexible live insights query |
15
17
 
16
18
 
@@ -223,7 +225,7 @@ end
223
225
 
224
226
  ## get_ad_analytics
225
227
 
226
- > <GetAdAnalytics200Response> get_ad_analytics(ad_id, opts)
228
+ > <AdAnalyticsResponse> get_ad_analytics(ad_id, opts)
227
229
 
228
230
  Get ad analytics
229
231
 
@@ -261,7 +263,7 @@ end
261
263
 
262
264
  This returns an Array which contains the response data, status code and headers.
263
265
 
264
- > <Array(<GetAdAnalytics200Response>, Integer, Hash)> get_ad_analytics_with_http_info(ad_id, opts)
266
+ > <Array(<AdAnalyticsResponse>, Integer, Hash)> get_ad_analytics_with_http_info(ad_id, opts)
265
267
 
266
268
  ```ruby
267
269
  begin
@@ -269,7 +271,7 @@ begin
269
271
  data, status_code, headers = api_instance.get_ad_analytics_with_http_info(ad_id, opts)
270
272
  p status_code # => 2xx
271
273
  p headers # => { ... }
272
- p data # => <GetAdAnalytics200Response>
274
+ p data # => <AdAnalyticsResponse>
273
275
  rescue Zernio::ApiError => e
274
276
  puts "Error when calling AdInsightsApi->get_ad_analytics_with_http_info: #{e}"
275
277
  end
@@ -286,7 +288,7 @@ end
286
288
 
287
289
  ### Return type
288
290
 
289
- [**GetAdAnalytics200Response**](GetAdAnalytics200Response.md)
291
+ [**AdAnalyticsResponse**](AdAnalyticsResponse.md)
290
292
 
291
293
  ### Authorization
292
294
 
@@ -460,7 +462,7 @@ end
460
462
 
461
463
  ## get_campaign_analytics
462
464
 
463
- > <GetCampaignAnalytics200Response> get_campaign_analytics(campaign_id, opts)
465
+ > <CampaignAnalyticsResponse> get_campaign_analytics(campaign_id, opts)
464
466
 
465
467
  Get campaign analytics
466
468
 
@@ -499,7 +501,7 @@ end
499
501
 
500
502
  This returns an Array which contains the response data, status code and headers.
501
503
 
502
- > <Array(<GetCampaignAnalytics200Response>, Integer, Hash)> get_campaign_analytics_with_http_info(campaign_id, opts)
504
+ > <Array(<CampaignAnalyticsResponse>, Integer, Hash)> get_campaign_analytics_with_http_info(campaign_id, opts)
503
505
 
504
506
  ```ruby
505
507
  begin
@@ -507,7 +509,7 @@ begin
507
509
  data, status_code, headers = api_instance.get_campaign_analytics_with_http_info(campaign_id, opts)
508
510
  p status_code # => 2xx
509
511
  p headers # => { ... }
510
- p data # => <GetCampaignAnalytics200Response>
512
+ p data # => <CampaignAnalyticsResponse>
511
513
  rescue Zernio::ApiError => e
512
514
  puts "Error when calling AdInsightsApi->get_campaign_analytics_with_http_info: #{e}"
513
515
  end
@@ -525,7 +527,169 @@ end
525
527
 
526
528
  ### Return type
527
529
 
528
- [**GetCampaignAnalytics200Response**](GetCampaignAnalytics200Response.md)
530
+ [**CampaignAnalyticsResponse**](CampaignAnalyticsResponse.md)
531
+
532
+ ### Authorization
533
+
534
+ [bearerAuth](../README.md#bearerAuth)
535
+
536
+ ### HTTP request headers
537
+
538
+ - **Content-Type**: Not defined
539
+ - **Accept**: application/json
540
+
541
+
542
+ ## list_local_services_lead_conversations
543
+
544
+ > <ListLocalServicesLeadConversations200Response> list_local_services_lead_conversations(lead_id, account_id, opts)
545
+
546
+ Conversations of a Local Services lead
547
+
548
+ Conversation entries of one Local Services lead: phone calls (duration, recording URL) and messages (text, attachment URLs), oldest first. Read live from `local_services_lead_conversation`, always scoped to a single lead. Call-recording URLs require read access on the Google Ads account. Draws on the shared Google Ads operations budget.
549
+
550
+ ### Examples
551
+
552
+ ```ruby
553
+ require 'time'
554
+ require 'zernio-sdk'
555
+ # setup authorization
556
+ Zernio.configure do |config|
557
+ # Configure Bearer authorization (JWT): bearerAuth
558
+ config.access_token = 'YOUR_BEARER_TOKEN'
559
+ end
560
+
561
+ api_instance = Zernio::AdInsightsApi.new
562
+ lead_id = 'lead_id_example' # String | Numeric lead id from /v1/ads/local-services/leads.
563
+ account_id = 'account_id_example' # String | Google ads SocialAccount id.
564
+ opts = {
565
+ customer_id: 'customer_id_example', # String | Numeric Google Ads customer id (no dashes). Defaults to the account's connected customer.
566
+ page_token: 'page_token_example' # String | Cursor from paging.nextPageToken of the previous page.
567
+ }
568
+
569
+ begin
570
+ # Conversations of a Local Services lead
571
+ result = api_instance.list_local_services_lead_conversations(lead_id, account_id, opts)
572
+ p result
573
+ rescue Zernio::ApiError => e
574
+ puts "Error when calling AdInsightsApi->list_local_services_lead_conversations: #{e}"
575
+ end
576
+ ```
577
+
578
+ #### Using the list_local_services_lead_conversations_with_http_info variant
579
+
580
+ This returns an Array which contains the response data, status code and headers.
581
+
582
+ > <Array(<ListLocalServicesLeadConversations200Response>, Integer, Hash)> list_local_services_lead_conversations_with_http_info(lead_id, account_id, opts)
583
+
584
+ ```ruby
585
+ begin
586
+ # Conversations of a Local Services lead
587
+ data, status_code, headers = api_instance.list_local_services_lead_conversations_with_http_info(lead_id, account_id, opts)
588
+ p status_code # => 2xx
589
+ p headers # => { ... }
590
+ p data # => <ListLocalServicesLeadConversations200Response>
591
+ rescue Zernio::ApiError => e
592
+ puts "Error when calling AdInsightsApi->list_local_services_lead_conversations_with_http_info: #{e}"
593
+ end
594
+ ```
595
+
596
+ ### Parameters
597
+
598
+ | Name | Type | Description | Notes |
599
+ | ---- | ---- | ----------- | ----- |
600
+ | **lead_id** | **String** | Numeric lead id from /v1/ads/local-services/leads. | |
601
+ | **account_id** | **String** | Google ads SocialAccount id. | |
602
+ | **customer_id** | **String** | Numeric Google Ads customer id (no dashes). Defaults to the account&#39;s connected customer. | [optional] |
603
+ | **page_token** | **String** | Cursor from paging.nextPageToken of the previous page. | [optional] |
604
+
605
+ ### Return type
606
+
607
+ [**ListLocalServicesLeadConversations200Response**](ListLocalServicesLeadConversations200Response.md)
608
+
609
+ ### Authorization
610
+
611
+ [bearerAuth](../README.md#bearerAuth)
612
+
613
+ ### HTTP request headers
614
+
615
+ - **Content-Type**: Not defined
616
+ - **Accept**: application/json
617
+
618
+
619
+ ## list_local_services_leads
620
+
621
+ > <ListLocalServicesLeads200Response> list_local_services_leads(account_id, opts)
622
+
623
+ Google Local Services Ads leads
624
+
625
+ Leads generated by Local Services Ads (phone calls, messages, bookings), read live from Google's `local_services_lead` resource, newest first. No persistence: Google is the source of truth and lead/credit statuses keep changing server-side. Google never returns healthcare-category leads, and `WIPED_OUT` leads arrive with contact erased (`contact` is null). Draws on the shared Google Ads operations budget.
626
+
627
+ ### Examples
628
+
629
+ ```ruby
630
+ require 'time'
631
+ require 'zernio-sdk'
632
+ # setup authorization
633
+ Zernio.configure do |config|
634
+ # Configure Bearer authorization (JWT): bearerAuth
635
+ config.access_token = 'YOUR_BEARER_TOKEN'
636
+ end
637
+
638
+ api_instance = Zernio::AdInsightsApi.new
639
+ account_id = 'account_id_example' # String | Google ads SocialAccount id.
640
+ opts = {
641
+ customer_id: 'customer_id_example', # String | Numeric Google Ads customer id (no dashes). Defaults to the account's connected customer.
642
+ from_date: Date.parse('2013-10-20'), # Date | Leads created at/after this day.
643
+ to_date: Date.parse('2013-10-20'), # Date | Leads created at/before this day.
644
+ lead_type: 'PHONE_CALL', # String |
645
+ lead_status: 'lead_status_example', # String | Google LocalServicesLeadStatus enum value (e.g. NEW, BOOKED, WIPED_OUT).
646
+ charged_only: true, # Boolean | true = only leads Google charged for.
647
+ page_token: 'page_token_example' # String | Cursor from paging.nextPageToken of the previous page.
648
+ }
649
+
650
+ begin
651
+ # Google Local Services Ads leads
652
+ result = api_instance.list_local_services_leads(account_id, opts)
653
+ p result
654
+ rescue Zernio::ApiError => e
655
+ puts "Error when calling AdInsightsApi->list_local_services_leads: #{e}"
656
+ end
657
+ ```
658
+
659
+ #### Using the list_local_services_leads_with_http_info variant
660
+
661
+ This returns an Array which contains the response data, status code and headers.
662
+
663
+ > <Array(<ListLocalServicesLeads200Response>, Integer, Hash)> list_local_services_leads_with_http_info(account_id, opts)
664
+
665
+ ```ruby
666
+ begin
667
+ # Google Local Services Ads leads
668
+ data, status_code, headers = api_instance.list_local_services_leads_with_http_info(account_id, opts)
669
+ p status_code # => 2xx
670
+ p headers # => { ... }
671
+ p data # => <ListLocalServicesLeads200Response>
672
+ rescue Zernio::ApiError => e
673
+ puts "Error when calling AdInsightsApi->list_local_services_leads_with_http_info: #{e}"
674
+ end
675
+ ```
676
+
677
+ ### Parameters
678
+
679
+ | Name | Type | Description | Notes |
680
+ | ---- | ---- | ----------- | ----- |
681
+ | **account_id** | **String** | Google ads SocialAccount id. | |
682
+ | **customer_id** | **String** | Numeric Google Ads customer id (no dashes). Defaults to the account&#39;s connected customer. | [optional] |
683
+ | **from_date** | **Date** | Leads created at/after this day. | [optional] |
684
+ | **to_date** | **Date** | Leads created at/before this day. | [optional] |
685
+ | **lead_type** | **String** | | [optional] |
686
+ | **lead_status** | **String** | Google LocalServicesLeadStatus enum value (e.g. NEW, BOOKED, WIPED_OUT). | [optional] |
687
+ | **charged_only** | **Boolean** | true &#x3D; only leads Google charged for. | [optional] |
688
+ | **page_token** | **String** | Cursor from paging.nextPageToken of the previous page. | [optional] |
689
+
690
+ ### Return type
691
+
692
+ [**ListLocalServicesLeads200Response**](ListLocalServicesLeads200Response.md)
529
693
 
530
694
  ### Authorization
531
695
 
data/docs/AdMetrics.md CHANGED
@@ -14,7 +14,7 @@
14
14
  | **engagement** | **Integer** | | [optional] |
15
15
  | **conversions** | **Float** | Count of conversion events over the requested date range. FRACTIONAL: attribution splits one conversion across touchpoints and Google additionally reports modeled conversions, so values like 0.347 are normal. Meta: events matching the campaign&#39;s promoted_object.custom_event_type (PURCHASE, LEAD, etc.). Google: the account&#39;s tracked conversions. X and LinkedIn: their reported website/lead conversions (added 2026-07). 0 for non-conversion campaigns or when no events have fired. | [optional] |
16
16
  | **cost_per_conversion** | **Float** | Derived spend / conversions in the same currency as spend. 0 when conversions is 0. | [optional] |
17
- | **actions** | **Hash&lt;String, Integer&gt;** | Per-action-type counts summed over the date range, keyed by the platform&#39;s action-type names. Meta: raw Insights action_type keys (link_click, offsite_conversion.fb_pixel_purchase, onsite_conversion.lead_grouped, ...) — both engagement and conversion events. X: conversion types (purchase, sign_up, site_visit, download, custom). LinkedIn: conversion types (post_click, post_view, lead_gen). Google returns {} (its per-action names aren&#39;t synced per ad). Empty object when no actions are reported. NOTE: keys differ by platform, so branch on the ad&#39;s platform when interpreting them. | [optional] |
17
+ | **actions** | **Hash&lt;String, Integer&gt;** | Per-action-type counts summed over the date range, keyed by the platform&#39;s action-type names. Meta: raw Insights action_type keys (link_click, offsite_conversion.fb_pixel_purchase, onsite_conversion.lead_grouped, ...) — both engagement and conversion events. TikTok: pixel conversions (purchase, add_to_cart, initiate_checkout, view_content, complete_payment, lead) plus the paid-engagement family (follow, post_reaction for paid likes, comment, share) — follow is how FOLLOWERS-goal campaigns report their result. X: conversion types (purchase, sign_up, site_visit, download, custom). LinkedIn: conversion types (post_click, post_view, lead_gen). Google returns {} (its per-action names aren&#39;t synced per ad). Empty object when no actions are reported. NOTE: keys differ by platform, so branch on the ad&#39;s platform when interpreting them. | [optional] |
18
18
  | **action_values** | **Hash&lt;String, Float&gt;** | Monetary mirror of &#x60;actions&#x60;, from Meta&#39;s Insights &#x60;action_values[]&#x60; array. Same keying — values are the revenue attributed to each action_type, in ad-account native currency (same unit as &#x60;spend&#x60;; see the campaign node&#39;s &#x60;currency&#x60; field). Use this to compute revenue-per-event (e.g. avg purchase value). Meta-only; other platforms return {}. | [optional] |
19
19
  | **purchase_value** | **Float** | Convenience sum of purchase-type action values — picked from &#x60;actionValues&#x60; via the same priority list as &#x60;conversions&#x60; so both fields describe the same events. In ad-account native currency. 0 when the campaign has no purchase event configured. Meta-only. | [optional] |
20
20
  | **roas** | **Float** | Return on ad spend — derived as &#x60;purchaseValue / spend&#x60;. 0 when &#x60;spend&#x60; is 0. Equivalent to Meta&#39;s &#x60;purchase_roas&#x60; under default attribution. At ad-set and campaign levels this is recomputed from summed purchaseValue + spend (NOT averaged across children) so it&#39;s mathematically correct at every rollup level. | [optional] |
@@ -295,7 +295,7 @@ end
295
295
 
296
296
  Search targeting options
297
297
 
298
- Resolve a human-readable query into the platform's opaque targeting ids used in the `TargetingSpec` (`countries`/`regions`/`cities`/`zips`/`metros` geo keys, and `interests`/`behaviors` entity ids) on `POST /v1/ads/create`, `POST /v1/ads/targeting/reach-estimate`, and `saved_targeting` audiences. The `dimension` param selects what is searched, `geo` (locations, further scoped by `geoType`), `interest`, `behavior`, or `income`. Availability of each dimension varies by platform (e.g. behaviours are Meta/TikTok only). Results are normalized across platforms into a single shape, so the same client code consumes Meta, TikTok, LinkedIn, X, Pinterest, and Google results. TikTok geo searches return every matching level in one list (`type` is `country`, `region`, `city`, `district`, or `metro` for DMA areas) — `geoType` is not applied. Results are scoped to the advertiser's targetable markets, and every id is usable in `regions`/`cities`/`metros` keys on `POST /v1/ads/create`. For geo queries, `q` should contain only the locality name (e.g. `\"Amsterdam\"`, not `\"Amsterdam, NL\"`). Use `countryCode` to disambiguate.
298
+ Resolve a human-readable query into the platform's opaque targeting ids used in the `TargetingSpec` (`countries`/`regions`/`cities`/`zips`/`metros` geo keys, and `interests`/`behaviors` entity ids) on `POST /v1/ads/create`, `POST /v1/ads/targeting/reach-estimate`, and `saved_targeting` audiences. The `dimension` param selects what is searched, `geo` (locations, further scoped by `geoType`), `interest`, `behavior`, or `income`. Availability of each dimension varies by platform (e.g. behaviours are Meta/TikTok only). Results are normalized across platforms into a single shape, so the same client code consumes Meta, TikTok, LinkedIn, X, Pinterest, and Google results. TikTok geo searches return every matching level in one list (`type` is `country`, `region`, `city`, `district`, or `metro` for DMA areas) — `geoType` is not applied. Results are scoped to the advertiser's targetable markets, and every id is usable in `regions`/`cities`/`metros` keys on `POST /v1/ads/create`. LinkedIn geo searches also return every matching level in one list, and neither `geoType` nor `countryCode` is applied: LinkedIn's typeahead only returns a name and a URN per result, with no level or country field to filter on. Every result has `type` set to `location`, and its id is a `urn:li:geo:*` URN usable as a `regions[].key` on `POST /v1/ads/create`, `POST /v1/ads/boost` and `POST /v1/ads/targeting/reach-estimate`. Pinterest resolves against three whole-catalog endpoints (interests, locations, regions) with no server-side query or pagination, so matching, ranking and the `limit` cutoff all happen in Zernio; the catalog is independent of any ad account and results never carry `audienceSize`. Names come back localized to the connected Pinterest account's language (there is no way to force a locale), so match against whatever language that account returns. `geoType` routes to a different catalog: `country` and `metro_area` read the locations catalog (`type` is `country` or `metro`); `region` reads the regions catalog (`type` is `region`, its id a `regions[].key` on `POST /v1/ads/create`); `all` and the default `city` merge both catalogs with honest per-entry `type`s, since Pinterest has no city-level catalog and `city` is an alias for `all`, not a literal city search. `zip`, `subcity`, `neighborhood`, `place` and `geo_market` return a 400: Pinterest exposes no postal-code catalog, pass postal codes directly as `targeting.zips: [{ key }]` on `POST /v1/ads/create`. For geo queries, `q` should contain only the locality name (e.g. `\"Amsterdam\"`, not `\"Amsterdam, NL\"`). Use `countryCode` to disambiguate.
299
299
 
300
300
  ### Examples
301
301
 
@@ -313,7 +313,7 @@ account_id = 'account_id_example' # String | Social account ID (a connected acco
313
313
  q = 'q_example' # String | Search query. For geo, the locality name only (no region/country suffix).
314
314
  opts = {
315
315
  dimension: 'geo', # String | What to search. `geo` resolves locations (scope further with `geoType`), `interest`/`behavior` resolve audience entities, `income` resolves income-tier options. Defaults to `interest` for backward compatibility with the deprecated /v1/ads/interests alias.
316
- geo_type: 'country', # String | Only used when `dimension=geo`. The kind of location to resolve. Defaults to `city`.
316
+ geo_type: 'all', # String | Only used when `dimension=geo`. The kind of location to resolve. `all` searches every type in one relevance-ranked call. Defaults to `city`.
317
317
  country_code: 'country_code_example', # String | ISO 3166-1 alpha-2 country code (e.g. NL) to scope a geo search.
318
318
  limit: 56 # Integer | Maximum results to return.
319
319
  }
@@ -352,7 +352,7 @@ end
352
352
  | **account_id** | **String** | Social account ID (a connected account on the target ad platform). | |
353
353
  | **q** | **String** | Search query. For geo, the locality name only (no region/country suffix). | |
354
354
  | **dimension** | **String** | What to search. &#x60;geo&#x60; resolves locations (scope further with &#x60;geoType&#x60;), &#x60;interest&#x60;/&#x60;behavior&#x60; resolve audience entities, &#x60;income&#x60; resolves income-tier options. Defaults to &#x60;interest&#x60; for backward compatibility with the deprecated /v1/ads/interests alias. | [optional][default to &#39;interest&#39;] |
355
- | **geo_type** | **String** | Only used when &#x60;dimension&#x3D;geo&#x60;. The kind of location to resolve. Defaults to &#x60;city&#x60;. | [optional][default to &#39;city&#39;] |
355
+ | **geo_type** | **String** | Only used when &#x60;dimension&#x3D;geo&#x60;. The kind of location to resolve. &#x60;all&#x60; searches every type in one relevance-ranked call. Defaults to &#x60;city&#x60;. | [optional][default to &#39;city&#39;] |
356
356
  | **country_code** | **String** | ISO 3166-1 alpha-2 country code (e.g. NL) to scope a geo search. | [optional] |
357
357
  | **limit** | **Integer** | Maximum results to return. | [optional][default to 25] |
358
358
 
@@ -23,7 +23,7 @@
23
23
  | **platform_ad_account_name** | **String** | Human-readable advertiser/account name from the platform. Refreshed on every sync. | [optional] |
24
24
  | **account_id** | **String** | | [optional] |
25
25
  | **profile_id** | **String** | | [optional] |
26
- | **advertising_channel_type** | **String** | Google-only. Raw campaign.advertising_channel_type (SEARCH, PERFORMANCE_MAX, VIDEO, DEMAND_GEN, DISPLAY, SHOPPING, ...). Serving surface, distinct from platformObjective (advertiser intent). Null/absent for non-Google platforms. | [optional] |
26
+ | **advertising_channel_type** | **String** | Google-only. Raw campaign.advertising_channel_type (SEARCH, PERFORMANCE_MAX, LOCAL_SERVICES, VIDEO, DEMAND_GEN, DISPLAY, SHOPPING, ...). Serving surface, distinct from platformObjective (advertiser intent). Null/absent for non-Google platforms. | [optional] |
27
27
  | **platform_objective** | **String** | Raw Meta campaign objective (e.g. OUTCOME_SALES, OUTCOME_LEADS, OUTCOME_TRAFFIC) | [optional] |
28
28
  | **optimization_goal** | **String** | Optimization goal shared across ad sets, or comma-separated values when ad sets differ. Meta: e.g. OFFSITE_CONVERSIONS, VALUE, LEAD_GENERATION. LinkedIn: the campaign optimizationTargetType (e.g. MAX_CLICK, MAX_IMPRESSION, NONE); &#x60;NONE&#x60; with a manual costType is a campaign LinkedIn will not deliver. | [optional] |
29
29
  | **bid_strategy** | [**BidStrategy**](BidStrategy.md) | | [optional] |
@@ -0,0 +1,22 @@
1
+ # Zernio::AdTreeResponse
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **campaigns** | [**Array&lt;AdTreeCampaign&gt;**](AdTreeCampaign.md) | | [optional] |
8
+ | **pagination** | [**Pagination**](Pagination.md) | | [optional] |
9
+ | **backfill_pending** | **Boolean** | Present and true while historical data is being backfilled. | [optional] |
10
+
11
+ ## Example
12
+
13
+ ```ruby
14
+ require 'zernio-sdk'
15
+
16
+ instance = Zernio::AdTreeResponse.new(
17
+ campaigns: null,
18
+ pagination: null,
19
+ backfill_pending: null
20
+ )
21
+ ```
22
+
@@ -4,7 +4,7 @@
4
4
 
5
5
  | Name | Type | Description | Notes |
6
6
  | ---- | ---- | ----------- | ----- |
7
- | **contact_ids** | **Array&lt;String&gt;** | Specific contact IDs to add | [optional] |
7
+ | **contact_ids** | **Array&lt;String&gt;** | Specific contact IDs to add. Zernio contact ids (24-character hex), as returned by the list-contacts endpoint. A platform identifier such as a WhatsApp wa_id is rejected with 400; use phones for raw numbers. | [optional] |
8
8
  | **phones** | **Array&lt;String&gt;** | Raw phone numbers (auto-creates contacts). Useful for WhatsApp/Telegram manual entry | [optional] |
9
9
  | **use_segment** | **Boolean** | Auto-populate from broadcast segment filters | [optional] |
10
10
 
@@ -0,0 +1,22 @@
1
+ # Zernio::AdsListResponse
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **ads** | [**Array&lt;Ad&gt;**](Ad.md) | | [optional] |
8
+ | **pagination** | [**Pagination**](Pagination.md) | | [optional] |
9
+ | **backfill_pending** | **Boolean** | Present and true while historical data is being backfilled. | [optional] |
10
+
11
+ ## Example
12
+
13
+ ```ruby
14
+ require 'zernio-sdk'
15
+
16
+ instance = Zernio::AdsListResponse.new(
17
+ ads: null,
18
+ pagination: null,
19
+ backfill_pending: null
20
+ )
21
+ ```
22
+