late-sdk 0.0.899 → 0.0.901

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 (223) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +81 -8
  3. data/docs/AdAccountsApi.md +1375 -277
  4. data/docs/AdCampaignsApi.md +525 -13
  5. data/docs/AdCreative.md +6 -0
  6. data/docs/AdTracking.md +20 -0
  7. data/docs/AddAccountCalloutsRequest.md +3 -3
  8. data/docs/AddAccountSitelinks201Response.md +20 -0
  9. data/docs/AddAccountSitelinks201ResponseSitelinksInner.md +26 -0
  10. data/docs/AddAccountSitelinksRequest.md +22 -0
  11. data/docs/AddAccountStructuredSnippets201Response.md +20 -0
  12. data/docs/AddAccountStructuredSnippets201ResponseStructuredSnippetsInner.md +22 -0
  13. data/docs/AddAccountStructuredSnippetsRequest.md +22 -0
  14. data/docs/AttachAdGroupAssets201Response.md +24 -0
  15. data/docs/AttachCampaignAssetsRequest.md +4 -4
  16. data/docs/CreateAdCampaign200Response.md +26 -0
  17. data/docs/CreateAdCampaignRequest.md +8 -0
  18. data/docs/CreateCallAdRequest.md +2 -0
  19. data/docs/CreateMessagingAdRequest.md +2 -0
  20. data/docs/CreateStandaloneAdRequest.md +15 -7
  21. data/docs/CreateStandaloneAdRequestAdditionalDescriptionsInner.md +49 -0
  22. data/docs/CreateStandaloneAdRequestAdditionalHeadlinesInner.md +49 -0
  23. data/docs/CtwaAdRequestBody.md +2 -0
  24. data/docs/GetAd200Response.md +5 -1
  25. data/docs/GetAdComments200ResponseMeta.md +10 -4
  26. data/docs/GetIosFourteenCampaignLimits200Response.md +18 -0
  27. data/docs/GetIosFourteenCampaignLimits200ResponseLimits.md +22 -0
  28. data/docs/GoogleAssetUpdate.md +26 -0
  29. data/docs/GoogleRsaDescription.md +20 -0
  30. data/docs/GoogleRsaHeadline.md +20 -0
  31. data/docs/{AttachCampaignAssetsRequestSitelinksInner.md → GoogleSitelink.md} +2 -2
  32. data/docs/{AttachCampaignAssetsRequestStructuredSnippetsInner.md → GoogleStructuredSnippet.md} +2 -2
  33. data/docs/HideAdComment200Response.md +22 -0
  34. data/docs/HideAdCommentRequest.md +18 -0
  35. data/docs/ListAccountCallouts200Response.md +2 -2
  36. data/docs/ListAccountCallouts200ResponseCalloutsInner.md +3 -3
  37. data/docs/ListAccountSitelinks200Response.md +24 -0
  38. data/docs/ListAccountSitelinks200ResponseSitelinksInner.md +32 -0
  39. data/docs/ListAccountStructuredSnippets200Response.md +24 -0
  40. data/docs/ListAccountStructuredSnippets200ResponseStructuredSnippetsInner.md +28 -0
  41. data/docs/ListAdGroupAssets200Response.md +28 -0
  42. data/docs/ListAdGroupAssets200ResponseCalloutsInner.md +22 -0
  43. data/docs/ListAdGroupAssets200ResponseSitelinksInner.md +28 -0
  44. data/docs/ListAdGroupAssets200ResponseStructuredSnippetsInner.md +24 -0
  45. data/docs/ListAdsInstagramAccounts200Response.md +22 -0
  46. data/docs/ListAdsInstagramAccounts200ResponseAccountsInner.md +26 -0
  47. data/docs/ListAdsInstagramAccounts200ResponsePagesInner.md +24 -0
  48. data/docs/ListAdsInstagramAccounts200ResponseResolved.md +22 -0
  49. data/docs/ListAdvertisableApplications200Response.md +18 -0
  50. data/docs/ListAdvertisableApplications200ResponseApplicationsInner.md +24 -0
  51. data/docs/ListCampaignAssets200Response.md +28 -0
  52. data/docs/ListCampaignAssets200ResponseCalloutsInner.md +22 -0
  53. data/docs/ListCampaignAssets200ResponseSitelinksInner.md +28 -0
  54. data/docs/ListCampaignAssets200ResponseStructuredSnippetsInner.md +24 -0
  55. data/docs/MetaInstagramIdentityRef.md +22 -0
  56. data/docs/RemoveAccountCalloutRequest.md +3 -3
  57. data/docs/RemoveAdGroupAssetsRequest.md +24 -0
  58. data/docs/RemoveCampaignAssets200Response.md +18 -0
  59. data/docs/RemoveCampaignAssetsRequest.md +24 -0
  60. data/docs/ReplyToAdComment200Response.md +20 -0
  61. data/docs/ReplyToAdCommentRequest.md +18 -0
  62. data/docs/TargetingSpec.md +4 -0
  63. data/docs/UpdateAccountCallouts200Response.md +20 -0
  64. data/docs/UpdateAccountCalloutsRequest.md +22 -0
  65. data/docs/UpdateAccountCalloutsRequestUpdatesInner.md +20 -0
  66. data/docs/UpdateAccountCalloutsRequestUpdatesInnerCalloutAsset.md +18 -0
  67. data/docs/UpdateAccountSitelinksRequest.md +22 -0
  68. data/docs/UpdateAccountSitelinksRequestUpdatesInner.md +22 -0
  69. data/docs/UpdateAccountSitelinksRequestUpdatesInnerSitelinkAsset.md +24 -0
  70. data/docs/UpdateAccountStructuredSnippetsRequest.md +22 -0
  71. data/docs/UpdateAccountStructuredSnippetsRequestUpdatesInner.md +20 -0
  72. data/docs/UpdateAdRequest.md +6 -0
  73. data/docs/UpdateCampaignAssets200Response.md +18 -0
  74. data/docs/UpdateCampaignAssetsRequest.md +22 -0
  75. data/lib/zernio-sdk/api/ad_accounts_api.rb +1511 -363
  76. data/lib/zernio-sdk/api/ad_campaigns_api.rb +589 -13
  77. data/lib/zernio-sdk/models/ad_creative.rb +112 -1
  78. data/lib/zernio-sdk/models/{create_standalone_ad_request_tracking.rb → ad_tracking.rb} +5 -5
  79. data/lib/zernio-sdk/models/add_account_callouts_request.rb +34 -3
  80. data/lib/zernio-sdk/models/add_account_sitelinks201_response.rb +158 -0
  81. data/lib/zernio-sdk/models/add_account_sitelinks201_response_sitelinks_inner.rb +267 -0
  82. data/lib/zernio-sdk/models/add_account_sitelinks_request.rb +253 -0
  83. data/lib/zernio-sdk/models/add_account_structured_snippets201_response.rb +158 -0
  84. data/lib/zernio-sdk/models/add_account_structured_snippets201_response_structured_snippets_inner.rb +229 -0
  85. data/lib/zernio-sdk/models/add_account_structured_snippets_request.rb +253 -0
  86. data/lib/zernio-sdk/models/attach_ad_group_assets201_response.rb +180 -0
  87. data/lib/zernio-sdk/models/attach_campaign_assets_request.rb +37 -5
  88. data/lib/zernio-sdk/models/create_ad_campaign200_response.rb +231 -0
  89. data/lib/zernio-sdk/models/create_ad_campaign_request.rb +52 -1
  90. data/lib/zernio-sdk/models/create_call_ad_request.rb +10 -1
  91. data/lib/zernio-sdk/models/create_messaging_ad_request.rb +10 -1
  92. data/lib/zernio-sdk/models/create_standalone_ad_request.rb +102 -8
  93. data/lib/zernio-sdk/models/create_standalone_ad_request_additional_descriptions_inner.rb +104 -0
  94. data/lib/zernio-sdk/models/create_standalone_ad_request_additional_headlines_inner.rb +104 -0
  95. data/lib/zernio-sdk/models/ctwa_ad_request_body.rb +10 -1
  96. data/lib/zernio-sdk/models/get_ad200_response.rb +25 -4
  97. data/lib/zernio-sdk/models/get_ad_comments200_response_meta.rb +36 -46
  98. data/lib/zernio-sdk/models/get_ios_fourteen_campaign_limits200_response.rb +164 -0
  99. data/lib/zernio-sdk/models/get_ios_fourteen_campaign_limits200_response_limits.rb +172 -0
  100. data/lib/zernio-sdk/models/google_asset_update.rb +234 -0
  101. data/lib/zernio-sdk/models/google_rsa_description.rb +226 -0
  102. data/lib/zernio-sdk/models/google_rsa_headline.rb +226 -0
  103. data/lib/zernio-sdk/models/{attach_campaign_assets_request_sitelinks_inner.rb → google_sitelink.rb} +3 -3
  104. data/lib/zernio-sdk/models/{attach_campaign_assets_request_structured_snippets_inner.rb → google_structured_snippet.rb} +3 -3
  105. data/lib/zernio-sdk/models/hide_ad_comment200_response.rb +225 -0
  106. data/lib/zernio-sdk/models/hide_ad_comment_request.rb +165 -0
  107. data/lib/zernio-sdk/models/list_account_callouts200_response.rb +2 -2
  108. data/lib/zernio-sdk/models/list_account_callouts200_response_callouts_inner.rb +13 -14
  109. data/lib/zernio-sdk/models/list_account_sitelinks200_response.rb +179 -0
  110. data/lib/zernio-sdk/models/list_account_sitelinks200_response_sitelinks_inner.rb +210 -0
  111. data/lib/zernio-sdk/models/list_account_structured_snippets200_response.rb +179 -0
  112. data/lib/zernio-sdk/models/list_account_structured_snippets200_response_structured_snippets_inner.rb +194 -0
  113. data/lib/zernio-sdk/models/list_ad_group_assets200_response.rb +201 -0
  114. data/lib/zernio-sdk/models/list_ad_group_assets200_response_callouts_inner.rb +165 -0
  115. data/lib/zernio-sdk/models/list_ad_group_assets200_response_sitelinks_inner.rb +192 -0
  116. data/lib/zernio-sdk/models/list_ad_group_assets200_response_structured_snippets_inner.rb +176 -0
  117. data/lib/zernio-sdk/models/list_ads_instagram_accounts200_response.rb +220 -0
  118. data/lib/zernio-sdk/models/list_ads_instagram_accounts200_response_accounts_inner.rb +287 -0
  119. data/lib/zernio-sdk/models/list_ads_instagram_accounts200_response_pages_inner.rb +210 -0
  120. data/lib/zernio-sdk/models/list_ads_instagram_accounts200_response_resolved.rb +211 -0
  121. data/lib/zernio-sdk/models/list_advertisable_applications200_response.rb +166 -0
  122. data/lib/zernio-sdk/models/list_advertisable_applications200_response_applications_inner.rb +250 -0
  123. data/lib/zernio-sdk/models/list_campaign_assets200_response.rb +201 -0
  124. data/lib/zernio-sdk/models/list_campaign_assets200_response_callouts_inner.rb +165 -0
  125. data/lib/zernio-sdk/models/list_campaign_assets200_response_sitelinks_inner.rb +192 -0
  126. data/lib/zernio-sdk/models/list_campaign_assets200_response_structured_snippets_inner.rb +176 -0
  127. data/lib/zernio-sdk/models/meta_instagram_identity_ref.rb +202 -0
  128. data/lib/zernio-sdk/models/remove_account_callout_request.rb +45 -3
  129. data/lib/zernio-sdk/models/remove_ad_group_assets_request.rb +281 -0
  130. data/lib/zernio-sdk/models/remove_campaign_assets200_response.rb +147 -0
  131. data/lib/zernio-sdk/models/remove_campaign_assets_request.rb +281 -0
  132. data/lib/zernio-sdk/models/reply_to_ad_comment200_response.rb +215 -0
  133. data/lib/zernio-sdk/models/reply_to_ad_comment_request.rb +174 -0
  134. data/lib/zernio-sdk/models/targeting_spec.rb +63 -1
  135. data/lib/zernio-sdk/models/update_account_callouts200_response.rb +156 -0
  136. data/lib/zernio-sdk/models/update_account_callouts_request.rb +253 -0
  137. data/lib/zernio-sdk/models/update_account_callouts_request_updates_inner.rb +186 -0
  138. data/lib/zernio-sdk/models/update_account_callouts_request_updates_inner_callout_asset.rb +182 -0
  139. data/lib/zernio-sdk/models/update_account_sitelinks_request.rb +253 -0
  140. data/lib/zernio-sdk/models/update_account_sitelinks_request_updates_inner.rb +216 -0
  141. data/lib/zernio-sdk/models/update_account_sitelinks_request_updates_inner_sitelink_asset.rb +241 -0
  142. data/lib/zernio-sdk/models/update_account_structured_snippets_request.rb +253 -0
  143. data/lib/zernio-sdk/models/update_account_structured_snippets_request_updates_inner.rb +186 -0
  144. data/lib/zernio-sdk/models/update_ad_request.rb +112 -1
  145. data/lib/zernio-sdk/models/update_campaign_assets200_response.rb +147 -0
  146. data/lib/zernio-sdk/models/update_campaign_assets_request.rb +253 -0
  147. data/lib/zernio-sdk/version.rb +1 -1
  148. data/lib/zernio-sdk.rb +55 -4
  149. data/openapi.yaml +2898 -733
  150. data/spec/api/ad_accounts_api_spec.rb +209 -10
  151. data/spec/api/ad_campaigns_api_spec.rb +99 -6
  152. data/spec/models/ad_creative_spec.rb +18 -0
  153. data/spec/models/{create_standalone_ad_request_tracking_spec.rb → ad_tracking_spec.rb} +6 -6
  154. data/spec/models/add_account_sitelinks201_response_sitelinks_inner_spec.rb +60 -0
  155. data/spec/models/add_account_sitelinks201_response_spec.rb +42 -0
  156. data/spec/models/add_account_sitelinks_request_spec.rb +48 -0
  157. data/spec/models/add_account_structured_snippets201_response_spec.rb +42 -0
  158. data/spec/models/add_account_structured_snippets201_response_structured_snippets_inner_spec.rb +52 -0
  159. data/spec/models/add_account_structured_snippets_request_spec.rb +48 -0
  160. data/spec/models/attach_ad_group_assets201_response_spec.rb +54 -0
  161. data/spec/models/create_ad_campaign200_response_spec.rb +68 -0
  162. data/spec/models/create_ad_campaign_request_spec.rb +28 -0
  163. data/spec/models/create_call_ad_request_spec.rb +6 -0
  164. data/spec/models/create_messaging_ad_request_spec.rb +6 -0
  165. data/spec/models/create_standalone_ad_request_additional_descriptions_inner_spec.rb +32 -0
  166. data/spec/models/create_standalone_ad_request_additional_headlines_inner_spec.rb +32 -0
  167. data/spec/models/create_standalone_ad_request_spec.rb +28 -0
  168. data/spec/models/ctwa_ad_request_body_spec.rb +6 -0
  169. data/spec/models/get_ad200_response_spec.rb +12 -0
  170. data/spec/models/get_ad_comments200_response_meta_spec.rb +19 -1
  171. data/spec/models/get_ios_fourteen_campaign_limits200_response_limits_spec.rb +48 -0
  172. data/spec/models/get_ios_fourteen_campaign_limits200_response_spec.rb +36 -0
  173. data/spec/models/google_asset_update_spec.rb +60 -0
  174. data/spec/models/google_rsa_description_spec.rb +46 -0
  175. data/spec/models/google_rsa_headline_spec.rb +46 -0
  176. data/spec/models/{attach_campaign_assets_request_sitelinks_inner_spec.rb → google_sitelink_spec.rb} +6 -6
  177. data/spec/models/{attach_campaign_assets_request_structured_snippets_inner_spec.rb → google_structured_snippet_spec.rb} +6 -6
  178. data/spec/models/hide_ad_comment200_response_spec.rb +52 -0
  179. data/spec/models/hide_ad_comment_request_spec.rb +36 -0
  180. data/spec/models/list_account_callouts200_response_callouts_inner_spec.rb +2 -2
  181. data/spec/models/{create_standalone_ad_request_promoted_object_spec.rb → list_account_sitelinks200_response_sitelinks_inner_spec.rb} +14 -32
  182. data/spec/models/list_account_sitelinks200_response_spec.rb +54 -0
  183. data/spec/models/list_account_structured_snippets200_response_spec.rb +54 -0
  184. data/spec/models/list_account_structured_snippets200_response_structured_snippets_inner_spec.rb +66 -0
  185. data/spec/models/list_ad_group_assets200_response_callouts_inner_spec.rb +48 -0
  186. data/spec/models/list_ad_group_assets200_response_sitelinks_inner_spec.rb +66 -0
  187. data/spec/models/list_ad_group_assets200_response_spec.rb +66 -0
  188. data/spec/models/list_ad_group_assets200_response_structured_snippets_inner_spec.rb +54 -0
  189. data/spec/models/list_ads_instagram_accounts200_response_accounts_inner_spec.rb +64 -0
  190. data/spec/models/list_ads_instagram_accounts200_response_pages_inner_spec.rb +54 -0
  191. data/spec/models/list_ads_instagram_accounts200_response_resolved_spec.rb +52 -0
  192. data/spec/models/list_ads_instagram_accounts200_response_spec.rb +48 -0
  193. data/spec/models/list_advertisable_applications200_response_applications_inner_spec.rb +54 -0
  194. data/spec/models/list_advertisable_applications200_response_spec.rb +36 -0
  195. data/spec/models/list_campaign_assets200_response_callouts_inner_spec.rb +48 -0
  196. data/spec/models/list_campaign_assets200_response_sitelinks_inner_spec.rb +66 -0
  197. data/spec/models/list_campaign_assets200_response_spec.rb +66 -0
  198. data/spec/models/list_campaign_assets200_response_structured_snippets_inner_spec.rb +54 -0
  199. data/spec/models/meta_instagram_identity_ref_spec.rb +48 -0
  200. data/spec/models/remove_ad_group_assets_request_spec.rb +54 -0
  201. data/spec/models/remove_campaign_assets200_response_spec.rb +36 -0
  202. data/spec/models/remove_campaign_assets_request_spec.rb +54 -0
  203. data/spec/models/reply_to_ad_comment200_response_spec.rb +46 -0
  204. data/spec/models/reply_to_ad_comment_request_spec.rb +36 -0
  205. data/spec/models/targeting_spec_spec.rb +12 -0
  206. data/spec/models/update_account_callouts200_response_spec.rb +42 -0
  207. data/spec/models/update_account_callouts_request_spec.rb +48 -0
  208. data/spec/models/update_account_callouts_request_updates_inner_callout_asset_spec.rb +36 -0
  209. data/spec/models/update_account_callouts_request_updates_inner_spec.rb +42 -0
  210. data/spec/models/update_account_sitelinks_request_spec.rb +48 -0
  211. data/spec/models/update_account_sitelinks_request_updates_inner_sitelink_asset_spec.rb +54 -0
  212. data/spec/models/update_account_sitelinks_request_updates_inner_spec.rb +48 -0
  213. data/spec/models/update_account_structured_snippets_request_spec.rb +48 -0
  214. data/spec/models/update_account_structured_snippets_request_updates_inner_spec.rb +42 -0
  215. data/spec/models/update_ad_request_spec.rb +18 -0
  216. data/spec/models/update_campaign_assets200_response_spec.rb +36 -0
  217. data/spec/models/update_campaign_assets_request_spec.rb +48 -0
  218. data/zernio-sdk-0.0.901.gem +0 -0
  219. metadata +222 -18
  220. data/docs/CreateStandaloneAdRequestPromotedObject.md +0 -38
  221. data/docs/CreateStandaloneAdRequestTracking.md +0 -20
  222. data/lib/zernio-sdk/models/create_standalone_ad_request_promoted_object.rb +0 -249
  223. data/zernio-sdk-0.0.899.gem +0 -0
@@ -33,8 +33,8 @@ describe 'AdAccountsApi' do
33
33
  end
34
34
 
35
35
  # unit tests for add_account_callouts
36
- # Add account-level callout extensions
37
- # Creates one asset plus one `customerAsset` link (field type CALLOUT) per callout text, in a single mutate. Google only; every other platform returns 501.
36
+ # Add account callouts
37
+ # Creates assets and customer_asset links for this Google customer. Links apply at account level.
38
38
  # @param add_account_callouts_request
39
39
  # @param [Hash] opts the optional parameters
40
40
  # @return [AddAccountCallouts201Response]
@@ -44,6 +44,30 @@ describe 'AdAccountsApi' do
44
44
  end
45
45
  end
46
46
 
47
+ # unit tests for add_account_sitelinks
48
+ # Add account sitelinks
49
+ # Creates assets and customer_asset links for this Google customer. Links apply at account level.
50
+ # @param add_account_sitelinks_request
51
+ # @param [Hash] opts the optional parameters
52
+ # @return [AddAccountSitelinks201Response]
53
+ describe 'add_account_sitelinks test' do
54
+ it 'should work' do
55
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
56
+ end
57
+ end
58
+
59
+ # unit tests for add_account_structured_snippets
60
+ # Add account snippets
61
+ # Creates assets and customer_asset links for this Google customer. Links apply at account level.
62
+ # @param add_account_structured_snippets_request
63
+ # @param [Hash] opts the optional parameters
64
+ # @return [AddAccountStructuredSnippets201Response]
65
+ describe 'add_account_structured_snippets test' do
66
+ it 'should work' do
67
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
68
+ end
69
+ end
70
+
47
71
  # unit tests for create_ad_negative_keyword_list
48
72
  # Create a negative keyword list
49
73
  # Creates one Google Ads shared negative keyword list with optional initial keywords in a single atomic mutation. Daily quota is reserved for every mutate item, so large batches may return 429 before any change. This operation is not idempotent. The list is not attached to any campaign.
@@ -93,6 +117,21 @@ describe 'AdAccountsApi' do
93
117
  end
94
118
  end
95
119
 
120
+ # unit tests for delete_ad_comment
121
+ # Delete an ad comment
122
+ # Delete your own TikTok ad comment or reply. TikTok must return can_delete=true for the comment. Other users' comments can be hidden instead. Requires Ads access. The ad is resolved within the caller's accessible profiles. Before moderation, Zernio verifies that the comment belongs to this ad using TikTok's ad-group comment listing. The default search window is the last 30 days. Use since/until for older comments, with at most 30 days between the dates. Lookups scan at most 2,000 ad-group comments; narrow the date window if exceeded. Meta returns 501 feature_not_available with guidance to use the existing inbox comment endpoints and the account/post IDs from GET /v1/ads/{adId}/comments.
123
+ # @param ad_id Internal Zernio ad ID or indexed platform ad ID.
124
+ # @param comment_id TikTok comment ID from the ad comment listing.
125
+ # @param [Hash] opts the optional parameters
126
+ # @option opts [Date] :since Start date of the comment lookup window. Defaults to 30 days before until.
127
+ # @option opts [Date] :_until End date of the comment lookup window. Defaults to today in UTC.
128
+ # @return [ReplyToAdComment200Response]
129
+ describe 'delete_ad_comment test' do
130
+ it 'should work' do
131
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
132
+ end
133
+ end
134
+
96
135
  # unit tests for delete_ad_negative_keyword_list
97
136
  # Delete a negative keyword list
98
137
  # Removes the Google shared negative keyword list. Detach it from all campaigns first; an in-use list is rejected. Only NEGATIVE_KEYWORDS shared sets are supported.
@@ -136,11 +175,13 @@ describe 'AdAccountsApi' do
136
175
 
137
176
  # unit tests for get_ad_comments
138
177
  # List comments on an ad
139
- # Returns comments on an ad's underlying creative post. Useful for moderating or analyzing engagement on dark posts (ad creatives that never went live organically), which the regular GET /v1/inbox/comments/{postId} endpoint cannot serve because dark posts are not in Zernio's post database. An ad that runs on both Facebook feed and Instagram feed has two separate underlying posts with separate comment threads (the creative's effective_object_story_id and effective_instagram_media_id). Use the `placement` query param to pick one; with no param the Instagram side is returned when it exists, otherwise Facebook. The identifiers are read from the ad record (persisted during sync) with a Marketing-API fallback for ads that predate the field. For Instagram-placed comments, the Instagram account that runs the ad must be connected to Zernio, because those comments are read through that account's token. If no connected Instagram account on the profile can read the ad's media, the call returns ads_connection_required (the Facebook side, if any, is still readable via ?placement=facebook). Meta-only for now. Other ad platforms (TikTok, LinkedIn, Pinterest, Google, X) are not wired to this endpoint and return feature_not_available. Requires the Ads add-on. Response shape matches GET /v1/inbox/comments/{postId}. The `{adId}` path segment accepts any identifier dialect Zernio indexes for the ad: Zernio internal `_id` (24-char hex), Meta's numeric `platformAdId` (the value shipped in `comment.received` webhooks as `comment.ad.id`), or the creative's `effective_object_story_id` / `effective_instagram_media_id`. Caller doesn't need a translation step.
140
- # @param ad_id Internal Zernio ad ID (ObjectId).
178
+ # Returns comments on an ad's underlying creative post. Useful for moderating or analyzing engagement on dark posts (ad creatives that never went live organically), which the regular GET /v1/inbox/comments/{postId} endpoint cannot serve because dark posts are not in Zernio's post database. An ad that runs on both Facebook feed and Instagram feed has two separate underlying posts with separate comment threads (the creative's effective_object_story_id and effective_instagram_media_id). Use the `placement` query param to pick one; with no param the Instagram side is returned when it exists, otherwise Facebook. The identifiers are read from the ad record (persisted during sync) with a Marketing-API fallback for ads that predate the field. For Instagram-placed comments, the Instagram account that runs the ad must be connected to Zernio, because those comments are read through that account's token. If no connected Instagram account on the profile can read the ad's media, the call returns ads_connection_required (the Facebook side, if any, is still readable via ?placement=facebook). TikTok uses the connected TikTok Ads advertiser token and supports both paid video ads and Spark Ads. `since` and `until` select a date window of at most 30 days; the default is the last 30 days. TikTok searches by ad group, so Zernio filters each page to this ad. A page can be empty while `pagination.hasMore` is true. Reuse `pagination.cursor` with the same `limit`; the cursor retains the date window. `placement` is Meta-only and returns a 400 for TikTok. TikTok returns replies as separate comments with `parentId`; nested reply fetching is not supported. `canReply` requires a first-level comment and an identity with comment-management permission. `canDelete` reflects TikTok's own-comment deletion capability. `canHide` is supported and `canLike` is false. Use the ad comment reply, hide and delete operations below to moderate TikTok comments. Other platforms return feature_not_available. Requires the Ads add-on. Response shape matches GET /v1/inbox/comments/{postId}. The `{adId}` path segment accepts any identifier dialect Zernio indexes for the ad: Zernio internal `_id` (24-char hex), the numeric `platformAdId` (the value shipped in `comment.received` webhooks as `comment.ad.id`), or the creative's `effective_object_story_id` / `effective_instagram_media_id`. Caller doesn't need a translation step.
179
+ # @param ad_id Internal Zernio ad ID or indexed platform ad/post ID.
141
180
  # @param [Hash] opts the optional parameters
142
181
  # @option opts [String] :placement Which side of the ad to return comments for. Omit to default to the Instagram side when present, else Facebook. Returns ad_not_commentable if the ad has no such placement.
143
182
  # @option opts [Integer] :limit
183
+ # @option opts [Date] :since TikTok-only start date. Defaults to 30 days before until. Maximum window is 30 days.
184
+ # @option opts [Date] :_until TikTok-only end date. Defaults to today in UTC.
144
185
  # @option opts [String] :cursor Pagination cursor from a previous response.
145
186
  # @return [GetAdComments200Response]
146
187
  describe 'get_ad_comments test' do
@@ -208,6 +249,20 @@ describe 'AdAccountsApi' do
208
249
  end
209
250
  end
210
251
 
252
+ # unit tests for get_ios_fourteen_campaign_limits
253
+ # Get iOS 14 campaign limits
254
+ # Reads Meta iOS 14 campaign limits for an application on an ad account. applicationId is sent as Meta app_id. This read does not establish that the application is configured for iOS promotion.
255
+ # @param account_id Zernio Meta Ads or Facebook SocialAccount ID.
256
+ # @param ad_account_id Meta ad account ID including the act_ prefix.
257
+ # @param application_id Meta application ID from advertisable-applications.
258
+ # @param [Hash] opts the optional parameters
259
+ # @return [GetIosFourteenCampaignLimits200Response]
260
+ describe 'get_ios_fourteen_campaign_limits test' do
261
+ it 'should work' do
262
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
263
+ end
264
+ end
265
+
211
266
  # unit tests for get_value_rule_set
212
267
  # Read a value rule set
213
268
  # Reads one value rule set including every nested rule id and criterion id. This is step one of any edit: `PUT` is a full replace, so you need the ids before you can keep the objects you are not changing. Meta's own read returns `GENDER` values lowercase (`\"male\"`) while writes require `\"MALE\"`. Values are passed through untouched, so never case-compare a stored rule against a fetched one.
@@ -221,12 +276,28 @@ describe 'AdAccountsApi' do
221
276
  end
222
277
  end
223
278
 
279
+ # unit tests for hide_ad_comment
280
+ # Hide or unhide an ad comment
281
+ # Hide or restore a TikTok ad comment. Send hidden=true to hide it or hidden=false to make it public again. Requires Ads access. The ad is resolved within the caller's accessible profiles. Before moderation, Zernio verifies that the comment belongs to this ad using TikTok's ad-group comment listing. The default search window is the last 30 days. Use since/until for older comments, with at most 30 days between the dates. Lookups scan at most 2,000 ad-group comments; narrow the date window if exceeded. Meta returns 501 feature_not_available with guidance to use the existing inbox comment endpoints and the account/post IDs from GET /v1/ads/{adId}/comments.
282
+ # @param ad_id Internal Zernio ad ID or indexed platform ad ID.
283
+ # @param comment_id TikTok comment ID from the ad comment listing.
284
+ # @param hide_ad_comment_request
285
+ # @param [Hash] opts the optional parameters
286
+ # @option opts [Date] :since Start date of the comment lookup window. Defaults to 30 days before until.
287
+ # @option opts [Date] :_until End date of the comment lookup window. Defaults to today in UTC.
288
+ # @return [HideAdComment200Response]
289
+ describe 'hide_ad_comment test' do
290
+ it 'should work' do
291
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
292
+ end
293
+ end
294
+
224
295
  # unit tests for list_account_callouts
225
- # List account-level callout extensions
226
- # Google Ads compliance row C.75: callout assets linked at the CUSTOMER level via `customer_asset` (not a campaign or ad group), so they serve fleet-wide across the account. Google only; every other platform returns 501. Cached for the quota window (10 minutes fresh, up to 7 days last-good), and gated by the shared Google Ads operations budget on a cache miss. The response carries `cachedAt` and `stale`, set when a quota-exhausted call falls back to the last-good copy instead of a live read.
227
- # @param account_id Google ads SocialAccount id.
296
+ # List account callouts
297
+ # Lists directly attached Google assets. Fresh reads are cached for 10 minutes; exhausted quota may return the last successful read with stale=true. Inherited assets are not included. Preserves Google RMF C.75 account-level callouts.
298
+ # @param account_id
228
299
  # @param [Hash] opts the optional parameters
229
- # @option opts [String] :customer_id Numeric Google Ads customer id (no dashes). Defaults to the account's connected customer.
300
+ # @option opts [String] :customer_id
230
301
  # @return [ListAccountCallouts200Response]
231
302
  describe 'list_account_callouts test' do
232
303
  it 'should work' do
@@ -234,6 +305,32 @@ describe 'AdAccountsApi' do
234
305
  end
235
306
  end
236
307
 
308
+ # unit tests for list_account_sitelinks
309
+ # List account sitelinks
310
+ # Lists directly attached Google assets. Fresh reads are cached for 10 minutes; exhausted quota may return the last successful read with stale=true. Inherited assets are not included.
311
+ # @param account_id
312
+ # @param [Hash] opts the optional parameters
313
+ # @option opts [String] :customer_id
314
+ # @return [ListAccountSitelinks200Response]
315
+ describe 'list_account_sitelinks test' do
316
+ it 'should work' do
317
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
318
+ end
319
+ end
320
+
321
+ # unit tests for list_account_structured_snippets
322
+ # List account snippets
323
+ # Lists directly attached Google assets. Fresh reads are cached for 10 minutes; exhausted quota may return the last successful read with stale=true. Inherited assets are not included.
324
+ # @param account_id
325
+ # @param [Hash] opts the optional parameters
326
+ # @option opts [String] :customer_id
327
+ # @return [ListAccountStructuredSnippets200Response]
328
+ describe 'list_account_structured_snippets test' do
329
+ it 'should work' do
330
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
331
+ end
332
+ end
333
+
237
334
  # unit tests for list_ad_accounts
238
335
  # List ad accounts
239
336
  # Returns the platform ad accounts available for the given account (e.g. Meta ad accounts, TikTok advertiser IDs, Google Ads customer IDs). For TikTok agencies: enumerates every advertiser under every Business Center the token can read (paginated server-side), then chunks the lookup against TikTok's `/advertiser/info/` endpoint (which has a per-call cap of ≤100 IDs). Solo advertisers without a BC fall back to the OAuth-time `advertiser_ids` list. Cached for 1h on the SocialAccount; lazy-refreshed on first call after expiry. For Google Ads: responds `429` when Google's API quota is temporarily exhausted (instead of an empty list). Retry after a delay.
@@ -305,6 +402,32 @@ describe 'AdAccountsApi' do
305
402
  end
306
403
  end
307
404
 
405
+ # unit tests for list_ads_instagram_accounts
406
+ # List Instagram ad identities
407
+ # Discovers identities through connected_instagram_accounts, Page linkage and Page-backed identities, with a best-effort business fallback. Business permission errors do not fail discovery. The resolved object uses the same profile-scoped resolver as ad creation; null means no identity was resolved. Format-specific observed-actor fallbacks at creative creation are not predicted.
408
+ # @param account_id Zernio Meta Ads or Facebook SocialAccount ID.
409
+ # @param ad_account_id Meta ad account ID including the act_ prefix.
410
+ # @param [Hash] opts the optional parameters
411
+ # @return [ListAdsInstagramAccounts200Response]
412
+ describe 'list_ads_instagram_accounts test' do
413
+ it 'should work' do
414
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
415
+ end
416
+ end
417
+
418
+ # unit tests for list_advertisable_applications
419
+ # List advertisable apps
420
+ # Lists applications available to a Meta ad account, their supported platforms and unmodified object store URLs. A listed app still needs a configured mobile platform and store URL to run install promotion.
421
+ # @param account_id Zernio Meta Ads or Facebook SocialAccount ID.
422
+ # @param ad_account_id Meta ad account ID including the act_ prefix.
423
+ # @param [Hash] opts the optional parameters
424
+ # @return [ListAdvertisableApplications200Response]
425
+ describe 'list_advertisable_applications test' do
426
+ it 'should work' do
427
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
428
+ end
429
+ end
430
+
308
431
  # unit tests for list_custom_conversions
309
432
  # List custom conversions
310
433
  # The ad account's Meta custom conversions, including archived ones (`isArchived`).
@@ -364,8 +487,8 @@ describe 'AdAccountsApi' do
364
487
  end
365
488
 
366
489
  # unit tests for remove_account_callout
367
- # Remove an account-level callout extension
368
- # Removes the `customerAsset` link (`customers/{cid}/customerAssets/{assetId}~CALLOUT`). Google only; every other platform returns 501.
490
+ # Remove account callout
491
+ # Removes the customer_asset attachment only. The underlying shared asset and its campaign or ad-group attachments remain.
369
492
  # @param remove_account_callout_request
370
493
  # @param [Hash] opts the optional parameters
371
494
  # @return [RemoveAccountCallout200Response]
@@ -375,6 +498,30 @@ describe 'AdAccountsApi' do
375
498
  end
376
499
  end
377
500
 
501
+ # unit tests for remove_account_sitelink
502
+ # Remove account sitelink
503
+ # Removes the customer_asset attachment only. The underlying shared asset and its campaign or ad-group attachments remain.
504
+ # @param remove_account_callout_request
505
+ # @param [Hash] opts the optional parameters
506
+ # @return [RemoveAccountCallout200Response]
507
+ describe 'remove_account_sitelink test' do
508
+ it 'should work' do
509
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
510
+ end
511
+ end
512
+
513
+ # unit tests for remove_account_structured_snippet
514
+ # Remove account snippet
515
+ # Removes the customer_asset attachment only. The underlying shared asset and its campaign or ad-group attachments remain.
516
+ # @param remove_account_callout_request
517
+ # @param [Hash] opts the optional parameters
518
+ # @return [RemoveAccountCallout200Response]
519
+ describe 'remove_account_structured_snippet test' do
520
+ it 'should work' do
521
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
522
+ end
523
+ end
524
+
378
525
  # unit tests for replace_ad_negative_keyword_list_keywords
379
526
  # Replace negative list keywords
380
527
  # Replaces the full desired keyword set. Existing keywords are diffed by normalized text and match type; creates and removals are applied atomically in one mutation. Unchanged criteria retain their ids. Send an empty keywords array to clear the list. Changes affect every campaign using this list. Each create or removal consumes one daily operation; the entire batch must fit the remaining quota.
@@ -388,6 +535,58 @@ describe 'AdAccountsApi' do
388
535
  end
389
536
  end
390
537
 
538
+ # unit tests for reply_to_ad_comment
539
+ # Reply to an ad comment
540
+ # Reply to a first-level TikTok ad comment. Requires a TT_USER or CUSTOMIZED_USER identity with comment-management permission. Replies to replies are rejected. The response commentId identifies the new reply. This operation is not idempotent; do not blindly retry an uncertain response. Requires Ads access. The ad is resolved within the caller's accessible profiles. Before moderation, Zernio verifies that the comment belongs to this ad using TikTok's ad-group comment listing. The default search window is the last 30 days. Use since/until for older comments, with at most 30 days between the dates. Lookups scan at most 2,000 ad-group comments; narrow the date window if exceeded. Meta returns 501 feature_not_available with guidance to use the existing inbox comment endpoints and the account/post IDs from GET /v1/ads/{adId}/comments.
541
+ # @param ad_id Internal Zernio ad ID or indexed platform ad ID.
542
+ # @param comment_id TikTok comment ID from the ad comment listing.
543
+ # @param reply_to_ad_comment_request
544
+ # @param [Hash] opts the optional parameters
545
+ # @option opts [Date] :since Start date of the comment lookup window. Defaults to 30 days before until.
546
+ # @option opts [Date] :_until End date of the comment lookup window. Defaults to today in UTC.
547
+ # @return [ReplyToAdComment200Response]
548
+ describe 'reply_to_ad_comment test' do
549
+ it 'should work' do
550
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
551
+ end
552
+ end
553
+
554
+ # unit tests for update_account_callouts
555
+ # Update account callouts
556
+ # Edits existing Google assets in place. Send updates with assetResourceName and the fields to change. An asset is shared: changes affect every attachment using it. Omitted fields stay unchanged. The operation consumes the Google operations budget and invalidates affected cached lists.
557
+ # @param update_account_callouts_request
558
+ # @param [Hash] opts the optional parameters
559
+ # @return [UpdateAccountCallouts200Response]
560
+ describe 'update_account_callouts test' do
561
+ it 'should work' do
562
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
563
+ end
564
+ end
565
+
566
+ # unit tests for update_account_sitelinks
567
+ # Update account sitelinks
568
+ # Edits existing Google assets in place. Send updates with assetResourceName and the fields to change. An asset is shared: changes affect every attachment using it. Omitted fields stay unchanged. The operation consumes the Google operations budget and invalidates affected cached lists.
569
+ # @param update_account_sitelinks_request
570
+ # @param [Hash] opts the optional parameters
571
+ # @return [UpdateAccountCallouts200Response]
572
+ describe 'update_account_sitelinks test' do
573
+ it 'should work' do
574
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
575
+ end
576
+ end
577
+
578
+ # unit tests for update_account_structured_snippets
579
+ # Update account snippets
580
+ # Edits existing Google assets in place. Send updates with assetResourceName and the fields to change. An asset is shared: changes affect every attachment using it. Omitted fields stay unchanged. The operation consumes the Google operations budget and invalidates affected cached lists.
581
+ # @param update_account_structured_snippets_request
582
+ # @param [Hash] opts the optional parameters
583
+ # @return [UpdateAccountCallouts200Response]
584
+ describe 'update_account_structured_snippets test' do
585
+ it 'should work' do
586
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
587
+ end
588
+ end
589
+
391
590
  # unit tests for update_ad_account
392
591
  # Update ad account settings
393
592
  # Sets the default DSA beneficiary and payor on a Meta ad account (EU DSA, Article 26). Set them once and every EU-targeted call to `/v1/ads/create`, `/v1/ads/boost` and `/v1/ads/ctwa` on that ad account can omit `dsaBeneficiary`/`dsaPayor`: Meta applies the defaults automatically. The values are written to the ad account on Meta, the same setting Ads Manager edits. Nothing is stored in Zernio, and defaults already set in Ads Manager work identically. Zernio never guesses these values for you. Beneficiary and payor are legal disclosures shown to EU users, so you must provide the entity names explicitly. Use `GET /v1/ads/dsa-recommendations` to offer suggestions in your UI. If `defaultDsaPayor` is omitted, the beneficiary is also set as the payor, which covers the common case where the same entity benefits from and pays for the ads. Read the current values back with `GET /v1/ads/dsa-defaults`. Currently supported for Meta accounts only; other platforms return 400.
@@ -44,10 +44,23 @@ describe 'AdCampaignsApi' do
44
44
  end
45
45
  end
46
46
 
47
+ # unit tests for attach_ad_group_assets
48
+ # Attach ad-group assets
49
+ # Creates and attaches sitelinks, callouts and structured snippets in one Google mutation.
50
+ # @param ad_set_id Numeric Google platform id.
51
+ # @param attach_campaign_assets_request
52
+ # @param [Hash] opts the optional parameters
53
+ # @return [AttachAdGroupAssets201Response]
54
+ describe 'attach_ad_group_assets test' do
55
+ it 'should work' do
56
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
57
+ end
58
+ end
59
+
47
60
  # unit tests for attach_campaign_assets
48
- # Attach extension assets to a Google Search campaign
49
- # 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.
50
- # @param campaign_id Numeric Google platform campaign id.
61
+ # Attach campaign assets
62
+ # Creates and attaches sitelinks, callouts and structured snippets in one Google mutation.
63
+ # @param campaign_id Numeric Google platform id.
51
64
  # @param attach_campaign_assets_request
52
65
  # @param [Hash] opts the optional parameters
53
66
  # @return [AttachCampaignAssets201Response]
@@ -88,7 +101,7 @@ describe 'AdCampaignsApi' do
88
101
  # @param create_ad_campaign_request
89
102
  # @param [Hash] opts the optional parameters
90
103
  # @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. Only 2xx responses are stored, so a request that failed with a 4xx can be retried with a corrected body under the SAME key.
91
- # @return [CreateAdCampaign201Response]
104
+ # @return [CreateAdCampaign200Response]
92
105
  describe 'create_ad_campaign test' do
93
106
  it 'should work' do
94
107
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
@@ -214,7 +227,7 @@ describe 'AdCampaignsApi' do
214
227
 
215
228
  # unit tests for get_ad
216
229
  # Get ad details
217
- # Returns an ad with its creative, targeting, status, and performance metrics. The `{adId}` path segment accepts any identifier dialect Zernio indexes for the ad: - the Zernio internal `_id` (24-char hex) - Meta's numeric `platformAdId` (the value shipped in `comment.received` webhooks as `comment.ad.id`) - the creative's `effective_object_story_id` (`{pageId}_{postId}` shape, Facebook side) - the creative's `effective_instagram_media_id` (Instagram side) Any of the four resolve to the same ad. Caller doesn't need a translation step. By default, creative.promotion and creative.creativeFeatures contain stored requested settings, which do not confirm platform application. With `refreshPromotion=true`, Meta promotion metadata is read live and exposed as `ad.creative.promotion` with `promotionStatus`. Only `applied` confirms an offer; `not_returned` means the creative read succeeded without promotion metadata, and `unavailable` means it failed.
230
+ # Returns an ad with its creative, targeting, status, and performance metrics. Google Search ads include current creative.headlines, creative.descriptions and creative.finalUrls, preserving pinnedField. Top-level cachedAt and stale report cache freshness. Google mutations invalidate this read. RSA enrichment requires a stored advertisingChannelType of SEARCH. Ads with an unknown or other channel return their stored details without a Google read. If RSA enrichment fails, the stored ad is returned with HTTP 200 and without cache metadata. The `{adId}` path segment accepts any identifier dialect Zernio indexes for the ad: - the Zernio internal `_id` (24-char hex) - Meta's numeric `platformAdId` (the value shipped in `comment.received` webhooks as `comment.ad.id`) - the creative's `effective_object_story_id` (`{pageId}_{postId}` shape, Facebook side) - the creative's `effective_instagram_media_id` (Instagram side) Any of the four resolve to the same ad. Caller doesn't need a translation step. By default, creative.promotion and creative.creativeFeatures contain stored requested settings, which do not confirm platform application. With `refreshPromotion=true`, Meta promotion metadata is read live and exposed as `ad.creative.promotion` with `promotionStatus`. Only `applied` confirms an offer; `not_returned` means the creative read succeeded without promotion metadata, and `unavailable` means it failed.
218
231
  # @param ad_id Zernio `_id` (hex), Meta `platformAdId` (numeric), or one of the creative's effective story/media IDs. See description for details.
219
232
  # @param [Hash] opts the optional parameters
220
233
  # @option opts [Boolean] :refresh_promotion Meta only. Read current promotion metadata from Meta and include promotionStatus. Omit for stored creative settings with no promotion-specific Graph call.
@@ -336,6 +349,20 @@ describe 'AdCampaignsApi' do
336
349
  end
337
350
  end
338
351
 
352
+ # unit tests for list_ad_group_assets
353
+ # List ad-group assets
354
+ # Lists directly attached Google assets. Fresh reads are cached for 10 minutes; exhausted quota may return the last successful read with stale=true. Inherited assets are not included.
355
+ # @param ad_set_id Numeric Google platform id.
356
+ # @param account_id
357
+ # @param [Hash] opts the optional parameters
358
+ # @option opts [String] :customer_id
359
+ # @return [ListAdGroupAssets200Response]
360
+ describe 'list_ad_group_assets test' do
361
+ it 'should work' do
362
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
363
+ end
364
+ end
365
+
339
366
  # unit tests for list_ad_keywords
340
367
  # List Search keywords
341
368
  # Returns the Google Search keyword criteria (positive and negative) synced from connected Google Ads accounts, one row per ad-group keyword. Refreshed about once a week per Google Ads customer (the keyword sweep rides the ads discovery pass on a slower slot, to stay inside Google's shared daily API quota), so keywords added on Google can take several days to appear. A customer synced for the first time is populated on the next discovery pass rather than waiting for its weekly slot, and connecting an account or triggering a manual sync refreshes it immediately. Campaign-level negative keywords are not included; only ad-group-level criteria are.
@@ -414,6 +441,20 @@ describe 'AdCampaignsApi' do
414
441
  end
415
442
  end
416
443
 
444
+ # unit tests for list_campaign_assets
445
+ # List campaign assets
446
+ # Lists directly attached Google assets. Fresh reads are cached for 10 minutes; exhausted quota may return the last successful read with stale=true. Inherited assets are not included.
447
+ # @param campaign_id Numeric Google platform id.
448
+ # @param account_id
449
+ # @param [Hash] opts the optional parameters
450
+ # @option opts [String] :customer_id
451
+ # @return [ListCampaignAssets200Response]
452
+ describe 'list_campaign_assets test' do
453
+ it 'should work' do
454
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
455
+ end
456
+ end
457
+
417
458
  # unit tests for list_campaign_negative_keyword_lists
418
459
  # List campaign negative lists
419
460
  # Returns shared negative keyword lists attached to the campaign, separate from campaign-level negative keywords. Google Ads shared negative keyword lists (shared_set type NEGATIVE_KEYWORDS). Reads are cached for 10 minutes; quota exhaustion may return the last successful result for up to 7 days with stale=true. Customer selection is limited to this connection and its account scope.
@@ -440,6 +481,19 @@ describe 'AdCampaignsApi' do
440
481
  end
441
482
  end
442
483
 
484
+ # unit tests for remove_ad_group_assets
485
+ # Remove ad-group assets
486
+ # Removes the specified attachments only. Google assets cannot be deleted. Other attachments remain. assetResourceNames is retained for compatibility.
487
+ # @param ad_set_id Numeric Google platform id.
488
+ # @param remove_ad_group_assets_request
489
+ # @param [Hash] opts the optional parameters
490
+ # @return [RemoveCampaignAssets200Response]
491
+ describe 'remove_ad_group_assets test' do
492
+ it 'should work' do
493
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
494
+ end
495
+ end
496
+
443
497
  # unit tests for remove_ad_keyword
444
498
  # Remove a Search keyword
445
499
  # Removes one keyword criterion (positive or negative) from its ad group (M.140).
@@ -452,6 +506,19 @@ describe 'AdCampaignsApi' do
452
506
  end
453
507
  end
454
508
 
509
+ # unit tests for remove_campaign_assets
510
+ # Remove campaign assets
511
+ # Removes the specified attachments only. Google assets cannot be deleted. Other attachments remain. assetResourceNames is retained for compatibility.
512
+ # @param campaign_id Numeric Google platform id.
513
+ # @param remove_campaign_assets_request
514
+ # @param [Hash] opts the optional parameters
515
+ # @return [RemoveCampaignAssets200Response]
516
+ describe 'remove_campaign_assets test' do
517
+ it 'should work' do
518
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
519
+ end
520
+ end
521
+
455
522
  # unit tests for replace_campaign_negative_keyword_lists
456
523
  # Replace campaign negative lists
457
524
  # Sets the full desired set of shared negative keyword list associations on this campaign. Send listIds=[] to detach all negative keyword lists. Only campaign_shared_set links are changed; the lists and their keywords are preserved. Every list must belong to the campaign customer and have type NEGATIVE_KEYWORDS.
@@ -480,7 +547,7 @@ describe 'AdCampaignsApi' do
480
547
 
481
548
  # unit tests for update_ad
482
549
  # Update ad
483
- # 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 (countries or regions, excludedLocations (countries), the B2B facets, and audience segments; applied to the LinkedIn Campaign via PARTIAL_UPDATE, and REPLACES the campaign's entire targetingCriteria, not a merge), 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.
550
+ # 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. RSA text updates use top-level `headlines`, `descriptions` and `finalUrls`. Each supplied array replaces the full list; omit a field to preserve it. Use 3-15 headlines (1-30 characters) and 2-4 descriptions (1-90 characters). Omit an asset to remove it; omit pinnedField on an included asset to unpin it. Updates do not pad or truncate text. The legacy creative fields remain unsupported for Google. - **LinkedIn**: status, budget, targeting (countries or regions, excludedLocations (countries), the B2B facets, and audience segments; applied to the LinkedIn Campaign via PARTIAL_UPDATE, and REPLACES the campaign's entire targetingCriteria, not a merge), 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.
484
551
  # @param ad_id
485
552
  # @param update_ad_request
486
553
  # @param [Hash] opts the optional parameters
@@ -517,6 +584,19 @@ describe 'AdCampaignsApi' do
517
584
  end
518
585
  end
519
586
 
587
+ # unit tests for update_ad_group_assets
588
+ # Update ad-group assets
589
+ # Edits existing Google assets in place. Send updates with assetResourceName and the fields to change. An asset is shared: changes affect every attachment using it. Omitted fields stay unchanged. The operation consumes the Google operations budget and invalidates affected cached lists.
590
+ # @param ad_set_id Numeric Google platform id.
591
+ # @param update_campaign_assets_request
592
+ # @param [Hash] opts the optional parameters
593
+ # @return [UpdateCampaignAssets200Response]
594
+ describe 'update_ad_group_assets test' do
595
+ it 'should work' do
596
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
597
+ end
598
+ end
599
+
520
600
  # unit tests for update_ad_keyword
521
601
  # Pause or enable a Search keyword
522
602
  # Changes `ad_group_criterion.status` for one keyword criterion (M.140). Negative keywords have no status on Google and cannot be paused or enabled.
@@ -582,6 +662,19 @@ describe 'AdCampaignsApi' do
582
662
  end
583
663
  end
584
664
 
665
+ # unit tests for update_campaign_assets
666
+ # Update campaign assets
667
+ # Edits existing Google assets in place. Send updates with assetResourceName and the fields to change. An asset is shared: changes affect every attachment using it. Omitted fields stay unchanged. The operation consumes the Google operations budget and invalidates affected cached lists.
668
+ # @param campaign_id Numeric Google platform id.
669
+ # @param update_campaign_assets_request
670
+ # @param [Hash] opts the optional parameters
671
+ # @return [UpdateCampaignAssets200Response]
672
+ describe 'update_campaign_assets test' do
673
+ it 'should work' do
674
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
675
+ end
676
+ end
677
+
585
678
  # unit tests for update_campaign_targeting
586
679
  # Edit a Google campaign's device, location, or language targeting
587
680
  # Google Ads compliance row M.10: geo and language targeting set at creation must stay editable afterwards. Send at least one of `devices`, `locations`, `languages`; each provided field REPLACES that field's existing criteria on the campaign (a full set, not a delta). Fields left out of the body are untouched. Google only; every other platform returns 501. `locations` accepts the same shapes as campaign creation: a bare array of ISO country codes, or an object with `countries`/`regions`/`cities`/`zips`/`metros` key lists (`key` from GET /v1/ads/targeting/search?dimension=geo). Negative (excluded) locations are left untouched by this endpoint. `languages` is an array of Google's language codes (ISO 639-1, plus variants such as `zh_CN`); an unknown code returns 400. The response includes the refreshed `devices`/`locations`/`languages` state read back from Google after the edit, and invalidates the cached copy `GET` on this campaign would otherwise keep serving.
@@ -27,6 +27,24 @@ describe Zernio::AdCreative do
27
27
  end
28
28
  end
29
29
 
30
+ describe 'test attribute "headlines"' do
31
+ it 'should work' do
32
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
33
+ end
34
+ end
35
+
36
+ describe 'test attribute "descriptions"' do
37
+ it 'should work' do
38
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
39
+ end
40
+ end
41
+
42
+ describe 'test attribute "final_urls"' do
43
+ it 'should work' do
44
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
45
+ end
46
+ end
47
+
30
48
  describe 'test attribute "thumbnail_url"' do
31
49
  it 'should work' do
32
50
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
@@ -14,16 +14,16 @@ require 'spec_helper'
14
14
  require 'json'
15
15
  require 'date'
16
16
 
17
- # Unit tests for Zernio::CreateStandaloneAdRequestTracking
17
+ # Unit tests for Zernio::AdTracking
18
18
  # Automatically generated by openapi-generator (https://openapi-generator.tech)
19
19
  # Please update as you see appropriate
20
- describe Zernio::CreateStandaloneAdRequestTracking do
21
- #let(:instance) { Zernio::CreateStandaloneAdRequestTracking.new }
20
+ describe Zernio::AdTracking do
21
+ #let(:instance) { Zernio::AdTracking.new }
22
22
 
23
- describe 'test an instance of CreateStandaloneAdRequestTracking' do
24
- it 'should create an instance of CreateStandaloneAdRequestTracking' do
23
+ describe 'test an instance of AdTracking' do
24
+ it 'should create an instance of AdTracking' do
25
25
  # uncomment below to test the instance creation
26
- #expect(instance).to be_instance_of(Zernio::CreateStandaloneAdRequestTracking)
26
+ #expect(instance).to be_instance_of(Zernio::AdTracking)
27
27
  end
28
28
  end
29
29
 
@@ -0,0 +1,60 @@
1
+ =begin
2
+ #Zernio API
3
+
4
+ #API reference for Zernio. Authenticate with a Bearer API key. Base URL: https://zernio.com/api Versioning and deprecation: all endpoints are versioned in the URL path (current version: /v1). Breaking changes only ship in a new path version; existing versions keep working. Deprecated operations are marked 'deprecated: true' in this spec and announced in the changelog (https://zernio.com/changelog) before removal. Errors: every 4xx/5xx response is application/json with a machine-readable 'code' and a human-readable 'error' message (see the ErrorResponse schema).
5
+
6
+ The version of the OpenAPI document: 1.0.4
7
+ Contact: support@zernio.com
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.19.0
10
+
11
+ =end
12
+
13
+ require 'spec_helper'
14
+ require 'json'
15
+ require 'date'
16
+
17
+ # Unit tests for Zernio::AddAccountSitelinks201ResponseSitelinksInner
18
+ # Automatically generated by openapi-generator (https://openapi-generator.tech)
19
+ # Please update as you see appropriate
20
+ describe Zernio::AddAccountSitelinks201ResponseSitelinksInner do
21
+ #let(:instance) { Zernio::AddAccountSitelinks201ResponseSitelinksInner.new }
22
+
23
+ describe 'test an instance of AddAccountSitelinks201ResponseSitelinksInner' do
24
+ it 'should create an instance of AddAccountSitelinks201ResponseSitelinksInner' do
25
+ # uncomment below to test the instance creation
26
+ #expect(instance).to be_instance_of(Zernio::AddAccountSitelinks201ResponseSitelinksInner)
27
+ end
28
+ end
29
+
30
+ describe 'test attribute "asset_id"' do
31
+ it 'should work' do
32
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
33
+ end
34
+ end
35
+
36
+ describe 'test attribute "text"' do
37
+ it 'should work' do
38
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
39
+ end
40
+ end
41
+
42
+ describe 'test attribute "link_url"' do
43
+ it 'should work' do
44
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
45
+ end
46
+ end
47
+
48
+ describe 'test attribute "description1"' do
49
+ it 'should work' do
50
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
51
+ end
52
+ end
53
+
54
+ describe 'test attribute "description2"' do
55
+ it 'should work' do
56
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
57
+ end
58
+ end
59
+
60
+ end