late-sdk 0.0.596 → 0.0.598

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 (64) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -0
  3. data/docs/AdInsightsApi.md +155 -9
  4. data/docs/CreatePostRequestPlatformsInnerPlatformSpecificData.md +2 -0
  5. data/docs/GenerateKeywordHistoricalMetrics200Response.md +22 -0
  6. data/docs/GenerateKeywordHistoricalMetricsRequest.md +32 -0
  7. data/docs/GenerateKeywordIdeas200Response.md +24 -0
  8. data/docs/GenerateKeywordIdeas200ResponsePaging.md +18 -0
  9. data/docs/GenerateKeywordIdeasRequest.md +36 -0
  10. data/docs/GetAdsActivityLog200Response.md +1 -1
  11. data/docs/GetAdsActivityLog200ResponsePaging.md +18 -0
  12. data/docs/ListAdCreatives200Response.md +1 -1
  13. data/docs/ListAdImages200Response.md +1 -1
  14. data/docs/ListAdLabels200Response.md +1 -1
  15. data/docs/ListAdStudies200Response.md +1 -1
  16. data/docs/ListHighDemandPeriods200Response.md +1 -1
  17. data/docs/ListMetaBusinesses200Response.md +1 -1
  18. data/docs/PlatformTargetPlatformSpecificData.md +2 -0
  19. data/docs/QueryAdInsights200Response.md +5 -1
  20. data/docs/QueryAdInsights200ResponsePaging.md +4 -2
  21. data/docs/SlackPlatformData.md +26 -0
  22. data/lib/zernio-sdk/api/accounts_api.rb +1 -1
  23. data/lib/zernio-sdk/api/ad_insights_api.rb +158 -13
  24. data/lib/zernio-sdk/api/connect_api.rb +1 -1
  25. data/lib/zernio-sdk/models/account_with_follower_stats.rb +2 -2
  26. data/lib/zernio-sdk/models/create_post_request_platforms_inner_platform_specific_data.rb +1 -0
  27. data/lib/zernio-sdk/models/generate_keyword_historical_metrics200_response.rb +169 -0
  28. data/lib/zernio-sdk/models/generate_keyword_historical_metrics_request.rb +337 -0
  29. data/lib/zernio-sdk/models/generate_keyword_ideas200_response.rb +178 -0
  30. data/lib/zernio-sdk/models/generate_keyword_ideas200_response_paging.rb +149 -0
  31. data/lib/zernio-sdk/models/generate_keyword_ideas_request.rb +378 -0
  32. data/lib/zernio-sdk/models/get_ads_activity_log200_response.rb +1 -1
  33. data/lib/zernio-sdk/models/get_ads_activity_log200_response_paging.rb +149 -0
  34. data/lib/zernio-sdk/models/list_ad_creatives200_response.rb +1 -1
  35. data/lib/zernio-sdk/models/list_ad_images200_response.rb +1 -1
  36. data/lib/zernio-sdk/models/list_ad_labels200_response.rb +1 -1
  37. data/lib/zernio-sdk/models/list_ad_studies200_response.rb +1 -1
  38. data/lib/zernio-sdk/models/list_high_demand_periods200_response.rb +1 -1
  39. data/lib/zernio-sdk/models/list_meta_businesses200_response.rb +1 -1
  40. data/lib/zernio-sdk/models/platform_target_platform_specific_data.rb +1 -0
  41. data/lib/zernio-sdk/models/query_ad_insights200_response.rb +23 -1
  42. data/lib/zernio-sdk/models/query_ad_insights200_response_paging.rb +17 -6
  43. data/lib/zernio-sdk/models/slack_platform_data.rb +189 -0
  44. data/lib/zernio-sdk/models/social_account.rb +2 -2
  45. data/lib/zernio-sdk/models/validate_post_request_platforms_inner.rb +2 -2
  46. data/lib/zernio-sdk/version.rb +1 -1
  47. data/lib/zernio-sdk.rb +7 -0
  48. data/openapi.yaml +156 -22
  49. data/spec/api/ad_insights_api_spec.rb +30 -3
  50. data/spec/models/account_with_follower_stats_spec.rb +1 -1
  51. data/spec/models/generate_keyword_historical_metrics200_response_spec.rb +48 -0
  52. data/spec/models/generate_keyword_historical_metrics_request_spec.rb +82 -0
  53. data/spec/models/generate_keyword_ideas200_response_paging_spec.rb +36 -0
  54. data/spec/models/generate_keyword_ideas200_response_spec.rb +54 -0
  55. data/spec/models/generate_keyword_ideas_request_spec.rb +94 -0
  56. data/spec/models/get_ads_activity_log200_response_paging_spec.rb +36 -0
  57. data/spec/models/query_ad_insights200_response_paging_spec.rb +6 -0
  58. data/spec/models/query_ad_insights200_response_spec.rb +12 -0
  59. data/spec/models/slack_platform_data_spec.rb +60 -0
  60. data/spec/models/social_account_spec.rb +1 -1
  61. data/spec/models/validate_post_request_platforms_inner_spec.rb +1 -1
  62. data/zernio-sdk-0.0.598.gem +0 -0
  63. metadata +30 -2
  64. data/zernio-sdk-0.0.596.gem +0 -0
@@ -15,13 +15,17 @@ require 'time'
15
15
 
16
16
  module Zernio
17
17
  class QueryAdInsights200ResponsePaging < ApiModelBase
18
- # Cursor for the next page; null when exhausted.
18
+ # Meta cursor for the next page; null when exhausted.
19
19
  attr_accessor :after
20
20
 
21
+ # Google cursor for the next page; null when exhausted.
22
+ attr_accessor :next_page_token
23
+
21
24
  # Attribute mapping from ruby-style variable name to JSON key.
22
25
  def self.attribute_map
23
26
  {
24
- :'after' => :'after'
27
+ :'after' => :'after',
28
+ :'next_page_token' => :'nextPageToken'
25
29
  }
26
30
  end
27
31
 
@@ -38,14 +42,16 @@ module Zernio
38
42
  # Attribute type mapping.
39
43
  def self.openapi_types
40
44
  {
41
- :'after' => :'String'
45
+ :'after' => :'String',
46
+ :'next_page_token' => :'String'
42
47
  }
43
48
  end
44
49
 
45
50
  # List of attributes with nullable: true
46
51
  def self.openapi_nullable
47
52
  Set.new([
48
- :'after'
53
+ :'after',
54
+ :'next_page_token'
49
55
  ])
50
56
  end
51
57
 
@@ -68,6 +74,10 @@ module Zernio
68
74
  if attributes.key?(:'after')
69
75
  self.after = attributes[:'after']
70
76
  end
77
+
78
+ if attributes.key?(:'next_page_token')
79
+ self.next_page_token = attributes[:'next_page_token']
80
+ end
71
81
  end
72
82
 
73
83
  # Show invalid properties with the reasons. Usually used together with valid?
@@ -90,7 +100,8 @@ module Zernio
90
100
  def ==(o)
91
101
  return true if self.equal?(o)
92
102
  self.class == o.class &&
93
- after == o.after
103
+ after == o.after &&
104
+ next_page_token == o.next_page_token
94
105
  end
95
106
 
96
107
  # @see the `==` method
@@ -102,7 +113,7 @@ module Zernio
102
113
  # Calculates hash code according to all attributes.
103
114
  # @return [Integer] Hash code
104
115
  def hash
105
- [after].hash
116
+ [after, next_page_token].hash
106
117
  end
107
118
 
108
119
  # Builds the object from hash
@@ -0,0 +1,189 @@
1
+ =begin
2
+ #Zernio API
3
+
4
+ #API reference for Zernio. Authenticate with a Bearer API key. Base URL: https://zernio.com/api
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 'date'
14
+ require 'time'
15
+
16
+ module Zernio
17
+ # Slack message settings. Posts mrkdwn text (up to 40,000 chars; Slack truncates beyond that) to the channel fixed by the connected account, with up to 10 media files per post uploaded via Slack's file API (the text becomes the caption). The target channel is chosen at connect time — one connected account per channel — so channelId is NOT accepted here (a 400 is returned); connect the desired channel via /v1/connect/slack and target its accountId. Messages over 4,000 characters cannot be edited later (Slack's edit limit is stricter than its post limit).
18
+ class SlackPlatformData < ApiModelBase
19
+ # Parent message ts to post this message as a thread reply (e.g. \"1503435956.000247\").
20
+ attr_accessor :thread_ts
21
+
22
+ # Expand links in the message into preview cards. Default true.
23
+ attr_accessor :unfurl_links
24
+
25
+ # Expand media links into inline previews. Default true.
26
+ attr_accessor :unfurl_media
27
+
28
+ # Override the bot display name for this message only (requires no setup; shown with an APP badge). Does not change the app identity in the sidebar.
29
+ attr_accessor :username
30
+
31
+ # Override the bot avatar image URL for this message only.
32
+ attr_accessor :icon_url
33
+
34
+ # Attribute mapping from ruby-style variable name to JSON key.
35
+ def self.attribute_map
36
+ {
37
+ :'thread_ts' => :'threadTs',
38
+ :'unfurl_links' => :'unfurlLinks',
39
+ :'unfurl_media' => :'unfurlMedia',
40
+ :'username' => :'username',
41
+ :'icon_url' => :'iconUrl'
42
+ }
43
+ end
44
+
45
+ # Returns attribute mapping this model knows about
46
+ def self.acceptable_attribute_map
47
+ attribute_map
48
+ end
49
+
50
+ # Returns all the JSON keys this model knows about
51
+ def self.acceptable_attributes
52
+ acceptable_attribute_map.values
53
+ end
54
+
55
+ # Attribute type mapping.
56
+ def self.openapi_types
57
+ {
58
+ :'thread_ts' => :'String',
59
+ :'unfurl_links' => :'Boolean',
60
+ :'unfurl_media' => :'Boolean',
61
+ :'username' => :'String',
62
+ :'icon_url' => :'String'
63
+ }
64
+ end
65
+
66
+ # List of attributes with nullable: true
67
+ def self.openapi_nullable
68
+ Set.new([
69
+ ])
70
+ end
71
+
72
+ # Initializes the object
73
+ # @param [Hash] attributes Model attributes in the form of hash
74
+ def initialize(attributes = {})
75
+ if (!attributes.is_a?(Hash))
76
+ fail ArgumentError, "The input argument (attributes) must be a hash in `Zernio::SlackPlatformData` initialize method"
77
+ end
78
+
79
+ # check to see if the attribute exists and convert string to symbol for hash key
80
+ acceptable_attribute_map = self.class.acceptable_attribute_map
81
+ attributes = attributes.each_with_object({}) { |(k, v), h|
82
+ if (!acceptable_attribute_map.key?(k.to_sym))
83
+ fail ArgumentError, "`#{k}` is not a valid attribute in `Zernio::SlackPlatformData`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
84
+ end
85
+ h[k.to_sym] = v
86
+ }
87
+
88
+ if attributes.key?(:'thread_ts')
89
+ self.thread_ts = attributes[:'thread_ts']
90
+ end
91
+
92
+ if attributes.key?(:'unfurl_links')
93
+ self.unfurl_links = attributes[:'unfurl_links']
94
+ end
95
+
96
+ if attributes.key?(:'unfurl_media')
97
+ self.unfurl_media = attributes[:'unfurl_media']
98
+ end
99
+
100
+ if attributes.key?(:'username')
101
+ self.username = attributes[:'username']
102
+ end
103
+
104
+ if attributes.key?(:'icon_url')
105
+ self.icon_url = attributes[:'icon_url']
106
+ end
107
+ end
108
+
109
+ # Show invalid properties with the reasons. Usually used together with valid?
110
+ # @return Array for valid properties with the reasons
111
+ def list_invalid_properties
112
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
113
+ invalid_properties = Array.new
114
+ invalid_properties
115
+ end
116
+
117
+ # Check to see if the all the properties in the model are valid
118
+ # @return true if the model is valid
119
+ def valid?
120
+ warn '[DEPRECATED] the `valid?` method is obsolete'
121
+ true
122
+ end
123
+
124
+ # Checks equality by comparing each attribute.
125
+ # @param [Object] Object to be compared
126
+ def ==(o)
127
+ return true if self.equal?(o)
128
+ self.class == o.class &&
129
+ thread_ts == o.thread_ts &&
130
+ unfurl_links == o.unfurl_links &&
131
+ unfurl_media == o.unfurl_media &&
132
+ username == o.username &&
133
+ icon_url == o.icon_url
134
+ end
135
+
136
+ # @see the `==` method
137
+ # @param [Object] Object to be compared
138
+ def eql?(o)
139
+ self == o
140
+ end
141
+
142
+ # Calculates hash code according to all attributes.
143
+ # @return [Integer] Hash code
144
+ def hash
145
+ [thread_ts, unfurl_links, unfurl_media, username, icon_url].hash
146
+ end
147
+
148
+ # Builds the object from hash
149
+ # @param [Hash] attributes Model attributes in the form of hash
150
+ # @return [Object] Returns the model itself
151
+ def self.build_from_hash(attributes)
152
+ return nil unless attributes.is_a?(Hash)
153
+ attributes = attributes.transform_keys(&:to_sym)
154
+ transformed_hash = {}
155
+ openapi_types.each_pair do |key, type|
156
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
157
+ transformed_hash["#{key}"] = nil
158
+ elsif type =~ /\AArray<(.*)>/i
159
+ # check to ensure the input is an array given that the attribute
160
+ # is documented as an array but the input is not
161
+ if attributes[attribute_map[key]].is_a?(Array)
162
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
163
+ end
164
+ elsif !attributes[attribute_map[key]].nil?
165
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
166
+ end
167
+ end
168
+ new(transformed_hash)
169
+ end
170
+
171
+ # Returns the object in the form of hash
172
+ # @return [Hash] Returns the object in the form of hash
173
+ def to_hash
174
+ hash = {}
175
+ self.class.attribute_map.each_pair do |attr, param|
176
+ value = self.send(attr)
177
+ if value.nil?
178
+ is_nullable = self.class.openapi_nullable.include?(attr)
179
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
180
+ end
181
+
182
+ hash[param] = _to_hash(value)
183
+ end
184
+ hash
185
+ end
186
+
187
+ end
188
+
189
+ end
@@ -242,7 +242,7 @@ module Zernio
242
242
  warn '[DEPRECATED] the `valid?` method is obsolete'
243
243
  return false if @_id.nil?
244
244
  return false if @platform.nil?
245
- platform_validator = EnumAttributeValidator.new('String', ["tiktok", "instagram", "facebook", "youtube", "linkedin", "twitter", "threads", "pinterest", "reddit", "bluesky", "googlebusiness", "telegram", "snapchat", "discord", "whatsapp", "linkedinads", "metaads", "pinterestads", "tiktokads", "xads", "googleads", "openaiads"])
245
+ platform_validator = EnumAttributeValidator.new('String', ["tiktok", "instagram", "facebook", "youtube", "linkedin", "twitter", "threads", "pinterest", "reddit", "bluesky", "googlebusiness", "telegram", "snapchat", "discord", "slack", "whatsapp", "linkedinads", "metaads", "pinterestads", "tiktokads", "xads", "googleads", "openaiads"])
246
246
  return false unless platform_validator.valid?(@platform)
247
247
  return false if @profile_id.nil?
248
248
  return false if @is_active.nil?
@@ -262,7 +262,7 @@ module Zernio
262
262
  # Custom attribute writer method checking allowed values (enum).
263
263
  # @param [Object] platform Object to be assigned
264
264
  def platform=(platform)
265
- validator = EnumAttributeValidator.new('String', ["tiktok", "instagram", "facebook", "youtube", "linkedin", "twitter", "threads", "pinterest", "reddit", "bluesky", "googlebusiness", "telegram", "snapchat", "discord", "whatsapp", "linkedinads", "metaads", "pinterestads", "tiktokads", "xads", "googleads", "openaiads"])
265
+ validator = EnumAttributeValidator.new('String', ["tiktok", "instagram", "facebook", "youtube", "linkedin", "twitter", "threads", "pinterest", "reddit", "bluesky", "googlebusiness", "telegram", "snapchat", "discord", "slack", "whatsapp", "linkedinads", "metaads", "pinterestads", "tiktokads", "xads", "googleads", "openaiads"])
266
266
  unless validator.valid?(platform)
267
267
  fail ArgumentError, "invalid value for \"platform\", must be one of #{validator.allowable_values}."
268
268
  end
@@ -144,7 +144,7 @@ module Zernio
144
144
  def valid?
145
145
  warn '[DEPRECATED] the `valid?` method is obsolete'
146
146
  return false if @platform.nil?
147
- platform_validator = EnumAttributeValidator.new('String', ["twitter", "instagram", "tiktok", "youtube", "facebook", "linkedin", "bluesky", "threads", "reddit", "pinterest", "telegram", "snapchat", "googlebusiness", "discord"])
147
+ platform_validator = EnumAttributeValidator.new('String', ["twitter", "instagram", "tiktok", "youtube", "facebook", "linkedin", "bluesky", "threads", "reddit", "pinterest", "telegram", "snapchat", "googlebusiness", "discord", "slack"])
148
148
  return false unless platform_validator.valid?(@platform)
149
149
  true
150
150
  end
@@ -152,7 +152,7 @@ module Zernio
152
152
  # Custom attribute writer method checking allowed values (enum).
153
153
  # @param [Object] platform Object to be assigned
154
154
  def platform=(platform)
155
- validator = EnumAttributeValidator.new('String', ["twitter", "instagram", "tiktok", "youtube", "facebook", "linkedin", "bluesky", "threads", "reddit", "pinterest", "telegram", "snapchat", "googlebusiness", "discord"])
155
+ validator = EnumAttributeValidator.new('String', ["twitter", "instagram", "tiktok", "youtube", "facebook", "linkedin", "bluesky", "threads", "reddit", "pinterest", "telegram", "snapchat", "googlebusiness", "discord", "slack"])
156
156
  unless validator.valid?(platform)
157
157
  fail ArgumentError, "invalid value for \"platform\", must be one of #{validator.allowable_values}."
158
158
  end
@@ -11,5 +11,5 @@ Generator version: 7.19.0
11
11
  =end
12
12
 
13
13
  module Zernio
14
- VERSION = '0.0.596'
14
+ VERSION = '0.0.598'
15
15
  end
data/lib/zernio-sdk.rb CHANGED
@@ -413,6 +413,11 @@ require 'zernio-sdk/models/gbp_update_free_form_service_item_label'
413
413
  require 'zernio-sdk/models/generate_ad_previews200_response'
414
414
  require 'zernio-sdk/models/generate_ad_previews200_response_previews_inner'
415
415
  require 'zernio-sdk/models/generate_ad_previews_request'
416
+ require 'zernio-sdk/models/generate_keyword_historical_metrics200_response'
417
+ require 'zernio-sdk/models/generate_keyword_historical_metrics_request'
418
+ require 'zernio-sdk/models/generate_keyword_ideas200_response'
419
+ require 'zernio-sdk/models/generate_keyword_ideas200_response_paging'
420
+ require 'zernio-sdk/models/generate_keyword_ideas_request'
416
421
  require 'zernio-sdk/models/geo_restriction'
417
422
  require 'zernio-sdk/models/get_account_health200_response'
418
423
  require 'zernio-sdk/models/get_account_health200_response_permissions'
@@ -435,6 +440,7 @@ require 'zernio-sdk/models/get_ad_set_details200_response'
435
440
  require 'zernio-sdk/models/get_ad_tracking_tags200_response'
436
441
  require 'zernio-sdk/models/get_ad_tree200_response'
437
442
  require 'zernio-sdk/models/get_ads_activity_log200_response'
443
+ require 'zernio-sdk/models/get_ads_activity_log200_response_paging'
438
444
  require 'zernio-sdk/models/get_ads_timeline200_response'
439
445
  require 'zernio-sdk/models/get_ads_timeline200_response_rows_inner'
440
446
  require 'zernio-sdk/models/get_all_accounts_health200_response'
@@ -1192,6 +1198,7 @@ require 'zernio-sdk/models/set_whatsapp_business_username_request'
1192
1198
  require 'zernio-sdk/models/share_sms_registration200_response'
1193
1199
  require 'zernio-sdk/models/share_sms_registration_request'
1194
1200
  require 'zernio-sdk/models/shared_ad_account'
1201
+ require 'zernio-sdk/models/slack_platform_data'
1195
1202
  require 'zernio-sdk/models/snapchat_platform_data'
1196
1203
  require 'zernio-sdk/models/social_account'
1197
1204
  require 'zernio-sdk/models/social_account_profile_id'
data/openapi.yaml CHANGED
@@ -4053,6 +4053,7 @@ components:
4053
4053
  - $ref: '#/components/schemas/RedditPlatformData'
4054
4054
  - $ref: '#/components/schemas/BlueskyPlatformData'
4055
4055
  - $ref: '#/components/schemas/DiscordPlatformData'
4056
+ - $ref: '#/components/schemas/SlackPlatformData'
4056
4057
  additionalProperties: true
4057
4058
  status:
4058
4059
  type: string
@@ -5304,6 +5305,27 @@ components:
5304
5305
  description: |
5305
5306
  Discord message settings. Supports plain text (2,000 chars), rich embeds (up to 10), native polls, forum posts, threads, and announcement crossposts. Media attachments support images (JPEG, PNG, GIF, WebP), videos (MP4), and documents (up to 10 files, 25 MB each). Webhook identity (username + avatar) can be customized per-account via PATCH /v1/connect/discord or per-post via webhookUsername/webhookAvatarUrl.
5306
5307
 
5308
+ SlackPlatformData:
5309
+ type: object
5310
+ properties:
5311
+ threadTs:
5312
+ type: string
5313
+ description: 'Parent message ts to post this message as a thread reply (e.g. "1503435956.000247").'
5314
+ unfurlLinks:
5315
+ type: boolean
5316
+ description: 'Expand links in the message into preview cards. Default true.'
5317
+ unfurlMedia:
5318
+ type: boolean
5319
+ description: 'Expand media links into inline previews. Default true.'
5320
+ username:
5321
+ type: string
5322
+ description: 'Override the bot display name for this message only (requires no setup; shown with an APP badge). Does not change the app identity in the sidebar.'
5323
+ iconUrl:
5324
+ type: string
5325
+ description: 'Override the bot avatar image URL for this message only.'
5326
+ description: |
5327
+ Slack message settings. Posts mrkdwn text (up to 40,000 chars; Slack truncates beyond that) to the channel fixed by the connected account, with up to 10 media files per post uploaded via Slack's file API (the text becomes the caption). The target channel is chosen at connect time — one connected account per channel — so channelId is NOT accepted here (a 400 is returned); connect the desired channel via /v1/connect/slack and target its accountId. Messages over 4,000 characters cannot be edited later (Slack's edit limit is stricter than its post limit).
5328
+
5307
5329
  DiscordScheduledEvent:
5308
5330
  type: object
5309
5331
  description: |
@@ -5406,7 +5428,7 @@ components:
5406
5428
  _id: { type: string }
5407
5429
  platform:
5408
5430
  type: string
5409
- enum: [tiktok, instagram, facebook, youtube, linkedin, twitter, threads, pinterest, reddit, bluesky, googlebusiness, telegram, snapchat, discord, whatsapp, linkedinads, metaads, pinterestads, tiktokads, xads, googleads, openaiads]
5431
+ enum: [tiktok, instagram, facebook, youtube, linkedin, twitter, threads, pinterest, reddit, bluesky, googlebusiness, telegram, snapchat, discord, slack, whatsapp, linkedinads, metaads, pinterestads, tiktokads, xads, googleads, openaiads]
5410
5432
  profileId:
5411
5433
  oneOf:
5412
5434
  - type: string
@@ -8330,7 +8352,7 @@ paths:
8330
8352
  properties:
8331
8353
  platform:
8332
8354
  type: string
8333
- enum: [twitter, instagram, tiktok, youtube, facebook, linkedin, bluesky, threads, reddit, pinterest, telegram, snapchat, googlebusiness, discord]
8355
+ enum: [twitter, instagram, tiktok, youtube, facebook, linkedin, bluesky, threads, reddit, pinterest, telegram, snapchat, googlebusiness, discord, slack]
8334
8356
  accountId: { type: string, description: 'Account to validate against. For twitter, resolves X Premium status to apply the 25000 character limit instead of 280.' }
8335
8357
  customContent: { type: string }
8336
8358
  platformSpecificData: { type: object }
@@ -12176,6 +12198,7 @@ paths:
12176
12198
  - $ref: '#/components/schemas/RedditPlatformData'
12177
12199
  - $ref: '#/components/schemas/BlueskyPlatformData'
12178
12200
  - $ref: '#/components/schemas/DiscordPlatformData'
12201
+ - $ref: '#/components/schemas/SlackPlatformData'
12179
12202
  scheduledFor: { type: string, format: date-time }
12180
12203
  publishNow: { type: boolean, default: false }
12181
12204
  isDraft:
@@ -13856,7 +13879,7 @@ paths:
13856
13879
  description: Filter by platform
13857
13880
  schema:
13858
13881
  type: string
13859
- enum: [facebook, instagram, linkedin, twitter, tiktok, youtube, threads, pinterest, reddit, bluesky, googlebusiness, telegram, snapchat, discord, whatsapp]
13882
+ enum: [facebook, instagram, linkedin, twitter, tiktok, youtube, threads, pinterest, reddit, bluesky, googlebusiness, telegram, snapchat, discord, slack, whatsapp]
13860
13883
  - name: status
13861
13884
  in: query
13862
13885
  description: Filter by health status
@@ -14344,7 +14367,7 @@ paths:
14344
14367
  required: true
14345
14368
  schema:
14346
14369
  type: string
14347
- enum: [facebook, instagram, linkedin, twitter, tiktok, youtube, threads, reddit, pinterest, bluesky, googlebusiness, telegram, snapchat, discord, whatsapp]
14370
+ enum: [facebook, instagram, linkedin, twitter, tiktok, youtube, threads, reddit, pinterest, bluesky, googlebusiness, telegram, snapchat, discord, slack, whatsapp]
14348
14371
  description: Social media platform to connect
14349
14372
  - name: profileId
14350
14373
  in: query
@@ -35203,28 +35226,136 @@ paths:
35203
35226
  '429': { description: Meta rate limit reached }
35204
35227
  '501': { description: Only supported on Meta (facebook/instagram) }
35205
35228
 
35229
+ /v1/ads/keywords/ideas:
35230
+ post:
35231
+ operationId: generateKeywordIdeas
35232
+ tags: ["Ad Insights"]
35233
+ x-platforms: ["google"]
35234
+ summary: Generate keyword ideas (Google Keyword Planner)
35235
+ description: |
35236
+ Google Ads only. Runs Keyword Planner's generateKeywordIdeas from seed keywords, a seed URL,
35237
+ or both, returning idea rows verbatim (avgMonthlySearches, competition, competitionIndex,
35238
+ top-of-page bid micros, monthlySearchVolumes). Counters are int64s encoded as strings; bid
35239
+ values are micros of the account currency. Omitting `countries` targets worldwide.
35240
+ security:
35241
+ - bearerAuth: []
35242
+ requestBody:
35243
+ required: true
35244
+ content:
35245
+ application/json:
35246
+ schema:
35247
+ type: object
35248
+ required: [accountId]
35249
+ properties:
35250
+ accountId: { type: string, description: "Zernio googleads SocialAccount id." }
35251
+ customerId: { type: string, description: "Numeric Google Ads customer id (no dashes); only needed when the connection has several accounts." }
35252
+ seedKeywords: { type: array, items: { type: string, maxLength: 80 }, minItems: 1, maxItems: 20, description: "Seed terms. Provide these, seedUrl, or both." }
35253
+ seedUrl: { type: string, format: uri, description: "Landing page to mine for ideas. Provide this, seedKeywords, or both." }
35254
+ countries: { type: array, items: { type: string, minLength: 2, maxLength: 2 }, minItems: 1, maxItems: 10, description: "ISO 3166-1 alpha-2 country codes. Omitted = worldwide." }
35255
+ languageConstantId: { type: string, default: "1000", description: "Google languageConstant id (1000 = English)." }
35256
+ network: { type: string, enum: [GOOGLE_SEARCH, GOOGLE_SEARCH_AND_PARTNERS], default: GOOGLE_SEARCH }
35257
+ includeAdultKeywords: { type: boolean }
35258
+ pageSize: { type: integer, minimum: 1, maximum: 10000 }
35259
+ pageToken: { type: string, description: "Cursor from paging.nextPageToken of the previous page." }
35260
+ responses:
35261
+ '200':
35262
+ description: Keyword idea rows (raw Keyword Planner shape)
35263
+ content:
35264
+ application/json:
35265
+ schema:
35266
+ type: object
35267
+ properties:
35268
+ customerId: { type: string, description: "The customer the request ran against." }
35269
+ data:
35270
+ type: array
35271
+ items: { type: object, description: "Raw GenerateKeywordIdeaResult: text + keywordIdeaMetrics." }
35272
+ aggregateMetricResults: { type: [object, "null"] }
35273
+ paging:
35274
+ type: object
35275
+ properties:
35276
+ nextPageToken: { type: [string, "null"], description: "Cursor for the next page; null when exhausted." }
35277
+ '400': { description: "Invalid input, or Google rejected the request — message carries Google's error" }
35278
+ '401': { $ref: '#/components/responses/Unauthorized' }
35279
+ '429': { description: "Per-user Google Ads operations budget or the shared Google quota reached; the message says which and when it resets." }
35280
+ '501': { description: Only supported on Google Ads }
35281
+
35282
+ /v1/ads/keywords/historical-metrics:
35283
+ post:
35284
+ operationId: generateKeywordHistoricalMetrics
35285
+ tags: ["Ad Insights"]
35286
+ x-platforms: ["google"]
35287
+ summary: Historical keyword metrics (Google Keyword Planner)
35288
+ description: |
35289
+ Google Ads only. Runs Keyword Planner's generateKeywordHistoricalMetrics for up to 1,000
35290
+ exact keywords: historical search volume, competition and top-of-page bid ranges, plus
35291
+ averageCpcMicros when includeAverageCpc is set. Rows come back verbatim; counters are int64s
35292
+ encoded as strings, bid/CPC values are micros of the account currency.
35293
+ security:
35294
+ - bearerAuth: []
35295
+ requestBody:
35296
+ required: true
35297
+ content:
35298
+ application/json:
35299
+ schema:
35300
+ type: object
35301
+ required: [accountId, keywords]
35302
+ properties:
35303
+ accountId: { type: string, description: "Zernio googleads SocialAccount id." }
35304
+ customerId: { type: string, description: "Numeric Google Ads customer id (no dashes); only needed when the connection has several accounts." }
35305
+ keywords: { type: array, items: { type: string, maxLength: 80 }, minItems: 1, maxItems: 1000 }
35306
+ countries: { type: array, items: { type: string, minLength: 2, maxLength: 2 }, minItems: 1, maxItems: 10, description: "ISO 3166-1 alpha-2 country codes. Omitted = worldwide." }
35307
+ languageConstantId: { type: string, default: "1000", description: "Google languageConstant id (1000 = English)." }
35308
+ network: { type: string, enum: [GOOGLE_SEARCH, GOOGLE_SEARCH_AND_PARTNERS], default: GOOGLE_SEARCH }
35309
+ includeAdultKeywords: { type: boolean }
35310
+ includeAverageCpc: { type: boolean, description: "Adds averageCpcMicros to each row's keywordMetrics." }
35311
+ responses:
35312
+ '200':
35313
+ description: Historical metric rows (raw Keyword Planner shape)
35314
+ content:
35315
+ application/json:
35316
+ schema:
35317
+ type: object
35318
+ properties:
35319
+ customerId: { type: string, description: "The customer the request ran against." }
35320
+ data:
35321
+ type: array
35322
+ items: { type: object, description: "Raw KeywordHistoricalMetricsResult: text, closeVariants, keywordMetrics." }
35323
+ aggregateMetricResults: { type: [object, "null"] }
35324
+ '400': { description: "Invalid input, or Google rejected the request — message carries Google's error" }
35325
+ '401': { $ref: '#/components/responses/Unauthorized' }
35326
+ '429': { description: "Per-user Google Ads operations budget or the shared Google quota reached; the message says which and when it resets." }
35327
+ '501': { description: Only supported on Google Ads }
35328
+
35206
35329
  /v1/ads/insights:
35207
35330
  get:
35208
35331
  operationId: queryAdInsights
35209
35332
  tags: ["Ad Insights"]
35210
- x-platforms: ["meta"]
35333
+ x-platforms: ["meta", "google"]
35211
35334
  summary: Flexible live insights query
35212
35335
  description: |
35213
- Live, flexible insights query against Meta's Graph API. Unlike GET /v1/ads/{adId}/analytics
35214
- (fixed metric set, cached), this forwards caller-chosen `fields`, `breakdowns` and `filtering`
35215
- to any Meta insights node and returns Meta's rows verbatim.
35336
+ Live, flexible insights query. The account's platform picks the contract:
35216
35337
 
35217
- `objectId` selects the node: an ad account, campaign, ad set or ad platform id.
35218
- `level` sets row granularity independently of the node.
35338
+ **Meta (facebook/instagram)**: forwards caller-chosen `fields`, `breakdowns` and `filtering`
35339
+ to any Meta insights node and returns Meta's rows verbatim. `objectId` (required) selects the
35340
+ node; `level` sets row granularity. Semantic validation is Meta's: an unknown field or invalid
35341
+ breakdown combination returns a 400 carrying Meta's message. For long ranges or agency-scale
35342
+ accounts prefer the async variant (POST /v1/ads/insights/reports).
35219
35343
 
35220
- Semantic validation is Meta's: an unknown field or invalid breakdown combination returns a 400
35221
- carrying Meta's message. For long ranges or agency-scale accounts prefer the async variant
35222
- (POST /v1/ads/insights/reports).
35344
+ **Google Ads (googleads)**: raw GAQL passthrough. Send any read-only GAQL SELECT via `query`
35345
+ (campaign/keyword/search-term/geo/demographic/asset/shopping resources, `change_event`, any
35346
+ `segments.*`) and rows come back verbatim (camelCase, counters as strings). Results are paged
35347
+ at a fixed 10,000 rows; follow `paging.nextPageToken` with `pageToken`. `customerId` is only
35348
+ needed when the connection has several Google Ads accounts. Semantic validation is Google's:
35349
+ an invalid query returns a 400 carrying Google's message (note: selecting `segments.date`
35350
+ requires a finite date filter).
35223
35351
  security:
35224
35352
  - bearerAuth: []
35225
35353
  parameters:
35226
- - { name: accountId, in: query, required: true, schema: { type: string }, description: "Zernio SocialAccount id (posting or ads variant) used to resolve the Meta token." }
35227
- - { name: objectId, in: query, required: true, schema: { type: string }, description: "Meta insights node: act_<n>, campaign id, ad set id or ad id." }
35354
+ - { name: accountId, in: query, required: true, schema: { type: string }, description: "Zernio SocialAccount id (posting or ads variant); its platform selects the Meta or Google contract." }
35355
+ - { name: objectId, in: query, schema: { type: string }, description: "Meta only (required there): insights node act_<n>, campaign id, ad set id or ad id." }
35356
+ - { name: query, in: query, schema: { type: string, maxLength: 10000 }, description: "Google only (required there): the GAQL SELECT statement to run." }
35357
+ - { name: customerId, in: query, schema: { type: string }, description: "Google only: numeric customer id (no dashes) when the connection has several Google Ads accounts." }
35358
+ - { name: pageToken, in: query, schema: { type: string }, description: "Google only: cursor from paging.nextPageToken of the previous page." }
35228
35359
  - { name: level, in: query, schema: { type: string, enum: [ad, adset, campaign, account] }, description: Row granularity }
35229
35360
  - { name: fields, in: query, schema: { type: string }, description: "Comma-separated Graph insights fields (e.g. spend,impressions,frequency,website_purchase_roas). Omitted = Meta's default set." }
35230
35361
  - { name: breakdowns, in: query, schema: { type: string }, description: "Comma-separated Graph breakdowns (e.g. age,gender or publisher_platform)." }
@@ -35241,24 +35372,27 @@ paths:
35241
35372
  - { name: after, in: query, schema: { type: string }, description: "Cursor from paging.after of the previous page." }
35242
35373
  responses:
35243
35374
  '200':
35244
- description: Insight rows (raw Meta shape)
35375
+ description: Insight rows (raw platform shape)
35245
35376
  content:
35246
35377
  application/json:
35247
35378
  schema:
35248
35379
  type: object
35249
35380
  properties:
35250
- objectId: { type: string }
35381
+ objectId: { type: string, description: "Meta responses only." }
35382
+ customerId: { type: string, description: "Google responses only: the customer the query ran against." }
35383
+ fieldMask: { type: [string, "null"], description: "Google responses only: the selected fields echoed by Google." }
35251
35384
  data:
35252
35385
  type: array
35253
- items: { type: object, description: "Raw Meta insights row; keys are the requested Graph fields plus date_start/date_stop." }
35386
+ items: { type: object, description: "Raw platform row. Meta: keys are the requested Graph fields plus date_start/date_stop. Google: nested GAQL resources in camelCase, int64 counters as strings." }
35254
35387
  paging:
35255
35388
  type: object
35256
35389
  properties:
35257
- after: { type: [string, "null"], description: "Cursor for the next page; null when exhausted." }
35258
- '400': { description: "Invalid input, or Meta rejected the query (unknown field, invalid breakdown combo) — message carries Meta's error" }
35390
+ after: { type: [string, "null"], description: "Meta cursor for the next page; null when exhausted." }
35391
+ nextPageToken: { type: [string, "null"], description: "Google cursor for the next page; null when exhausted." }
35392
+ '400': { description: "Invalid input, or the platform rejected the query (unknown field, invalid breakdown combo, malformed GAQL) — message carries the platform's error" }
35259
35393
  '401': { $ref: '#/components/responses/Unauthorized' }
35260
- '429': { description: Meta rate limit reached }
35261
- '501': { description: Only supported on Meta (facebook/instagram) }
35394
+ '429': { description: "Platform rate limit reached. For Google this is the per-user operations budget or the shared quota; the message says which and when it resets." }
35395
+ '501': { description: Only supported on Meta (facebook/instagram) and Google Ads }
35262
35396
 
35263
35397
  /v1/ads/insights/reports:
35264
35398
  post:
@@ -44,6 +44,30 @@ describe 'AdInsightsApi' do
44
44
  end
45
45
  end
46
46
 
47
+ # unit tests for generate_keyword_historical_metrics
48
+ # Historical keyword metrics (Google Keyword Planner)
49
+ # Google Ads only. Runs Keyword Planner&#39;s generateKeywordHistoricalMetrics for up to 1,000 exact keywords: historical search volume, competition and top-of-page bid ranges, plus averageCpcMicros when includeAverageCpc is set. Rows come back verbatim; counters are int64s encoded as strings, bid/CPC values are micros of the account currency.
50
+ # @param generate_keyword_historical_metrics_request
51
+ # @param [Hash] opts the optional parameters
52
+ # @return [GenerateKeywordHistoricalMetrics200Response]
53
+ describe 'generate_keyword_historical_metrics 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 generate_keyword_ideas
60
+ # Generate keyword ideas (Google Keyword Planner)
61
+ # Google Ads only. Runs Keyword Planner&#39;s generateKeywordIdeas from seed keywords, a seed URL, or both, returning idea rows verbatim (avgMonthlySearches, competition, competitionIndex, top-of-page bid micros, monthlySearchVolumes). Counters are int64s encoded as strings; bid values are micros of the account currency. Omitting &#x60;countries&#x60; targets worldwide.
62
+ # @param generate_keyword_ideas_request
63
+ # @param [Hash] opts the optional parameters
64
+ # @return [GenerateKeywordIdeas200Response]
65
+ describe 'generate_keyword_ideas 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 get_ad_analytics
48
72
  # Get ad analytics
49
73
  # Returns detailed performance analytics for an ad. Includes summary metrics, a daily timeline over the requested date range, and optional demographic breakdowns (Meta and TikTok only). If no date range is provided, defaults to the last 90 days. Date range is capped at 730 days max.
@@ -92,10 +116,13 @@ describe 'AdInsightsApi' do
92
116
 
93
117
  # unit tests for query_ad_insights
94
118
  # Flexible live insights query
95
- # Live, flexible insights query against Meta&#39;s Graph API. Unlike GET /v1/ads/{adId}/analytics (fixed metric set, cached), this forwards caller-chosen &#x60;fields&#x60;, &#x60;breakdowns&#x60; and &#x60;filtering&#x60; to any Meta insights node and returns Meta&#39;s rows verbatim. &#x60;objectId&#x60; selects the node: an ad account, campaign, ad set or ad platform id. &#x60;level&#x60; sets row granularity independently of the node. Semantic validation is Meta&#39;s: an unknown field or invalid breakdown combination returns a 400 carrying Meta&#39;s message. For long ranges or agency-scale accounts prefer the async variant (POST /v1/ads/insights/reports).
96
- # @param account_id Zernio SocialAccount id (posting or ads variant) used to resolve the Meta token.
97
- # @param object_id Meta insights node: act_&lt;n&gt;, campaign id, ad set id or ad id.
119
+ # Live, flexible insights query. The account&#39;s platform picks the contract: **Meta (facebook/instagram)**: forwards caller-chosen &#x60;fields&#x60;, &#x60;breakdowns&#x60; and &#x60;filtering&#x60; to any Meta insights node and returns Meta&#39;s rows verbatim. &#x60;objectId&#x60; (required) selects the node; &#x60;level&#x60; sets row granularity. Semantic validation is Meta&#39;s: an unknown field or invalid breakdown combination returns a 400 carrying Meta&#39;s message. For long ranges or agency-scale accounts prefer the async variant (POST /v1/ads/insights/reports). **Google Ads (googleads)**: raw GAQL passthrough. Send any read-only GAQL SELECT via &#x60;query&#x60; (campaign/keyword/search-term/geo/demographic/asset/shopping resources, &#x60;change_event&#x60;, any &#x60;segments.*&#x60;) and rows come back verbatim (camelCase, counters as strings). Results are paged at a fixed 10,000 rows; follow &#x60;paging.nextPageToken&#x60; with &#x60;pageToken&#x60;. &#x60;customerId&#x60; is only needed when the connection has several Google Ads accounts. Semantic validation is Google&#39;s: an invalid query returns a 400 carrying Google&#39;s message (note: selecting &#x60;segments.date&#x60; requires a finite date filter).
120
+ # @param account_id Zernio SocialAccount id (posting or ads variant); its platform selects the Meta or Google contract.
98
121
  # @param [Hash] opts the optional parameters
122
+ # @option opts [String] :object_id Meta only (required there): insights node — act_&lt;n&gt;, campaign id, ad set id or ad id.
123
+ # @option opts [String] :query Google only (required there): the GAQL SELECT statement to run.
124
+ # @option opts [String] :customer_id Google only: numeric customer id (no dashes) when the connection has several Google Ads accounts.
125
+ # @option opts [String] :page_token Google only: cursor from paging.nextPageToken of the previous page.
99
126
  # @option opts [String] :level Row granularity
100
127
  # @option opts [String] :fields Comma-separated Graph insights fields (e.g. spend,impressions,frequency,website_purchase_roas). Omitted &#x3D; Meta&#39;s default set.
101
128
  # @option opts [String] :breakdowns Comma-separated Graph breakdowns (e.g. age,gender or publisher_platform).