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.
- checksums.yaml +4 -4
- data/README.md +9 -0
- data/docs/AdInsightsApi.md +155 -9
- data/docs/CreatePostRequestPlatformsInnerPlatformSpecificData.md +2 -0
- data/docs/GenerateKeywordHistoricalMetrics200Response.md +22 -0
- data/docs/GenerateKeywordHistoricalMetricsRequest.md +32 -0
- data/docs/GenerateKeywordIdeas200Response.md +24 -0
- data/docs/GenerateKeywordIdeas200ResponsePaging.md +18 -0
- data/docs/GenerateKeywordIdeasRequest.md +36 -0
- data/docs/GetAdsActivityLog200Response.md +1 -1
- data/docs/GetAdsActivityLog200ResponsePaging.md +18 -0
- data/docs/ListAdCreatives200Response.md +1 -1
- data/docs/ListAdImages200Response.md +1 -1
- data/docs/ListAdLabels200Response.md +1 -1
- data/docs/ListAdStudies200Response.md +1 -1
- data/docs/ListHighDemandPeriods200Response.md +1 -1
- data/docs/ListMetaBusinesses200Response.md +1 -1
- data/docs/PlatformTargetPlatformSpecificData.md +2 -0
- data/docs/QueryAdInsights200Response.md +5 -1
- data/docs/QueryAdInsights200ResponsePaging.md +4 -2
- data/docs/SlackPlatformData.md +26 -0
- data/lib/zernio-sdk/api/accounts_api.rb +1 -1
- data/lib/zernio-sdk/api/ad_insights_api.rb +158 -13
- data/lib/zernio-sdk/api/connect_api.rb +1 -1
- data/lib/zernio-sdk/models/account_with_follower_stats.rb +2 -2
- data/lib/zernio-sdk/models/create_post_request_platforms_inner_platform_specific_data.rb +1 -0
- data/lib/zernio-sdk/models/generate_keyword_historical_metrics200_response.rb +169 -0
- data/lib/zernio-sdk/models/generate_keyword_historical_metrics_request.rb +337 -0
- data/lib/zernio-sdk/models/generate_keyword_ideas200_response.rb +178 -0
- data/lib/zernio-sdk/models/generate_keyword_ideas200_response_paging.rb +149 -0
- data/lib/zernio-sdk/models/generate_keyword_ideas_request.rb +378 -0
- data/lib/zernio-sdk/models/get_ads_activity_log200_response.rb +1 -1
- data/lib/zernio-sdk/models/get_ads_activity_log200_response_paging.rb +149 -0
- data/lib/zernio-sdk/models/list_ad_creatives200_response.rb +1 -1
- data/lib/zernio-sdk/models/list_ad_images200_response.rb +1 -1
- data/lib/zernio-sdk/models/list_ad_labels200_response.rb +1 -1
- data/lib/zernio-sdk/models/list_ad_studies200_response.rb +1 -1
- data/lib/zernio-sdk/models/list_high_demand_periods200_response.rb +1 -1
- data/lib/zernio-sdk/models/list_meta_businesses200_response.rb +1 -1
- data/lib/zernio-sdk/models/platform_target_platform_specific_data.rb +1 -0
- data/lib/zernio-sdk/models/query_ad_insights200_response.rb +23 -1
- data/lib/zernio-sdk/models/query_ad_insights200_response_paging.rb +17 -6
- data/lib/zernio-sdk/models/slack_platform_data.rb +189 -0
- data/lib/zernio-sdk/models/social_account.rb +2 -2
- data/lib/zernio-sdk/models/validate_post_request_platforms_inner.rb +2 -2
- data/lib/zernio-sdk/version.rb +1 -1
- data/lib/zernio-sdk.rb +7 -0
- data/openapi.yaml +156 -22
- data/spec/api/ad_insights_api_spec.rb +30 -3
- data/spec/models/account_with_follower_stats_spec.rb +1 -1
- data/spec/models/generate_keyword_historical_metrics200_response_spec.rb +48 -0
- data/spec/models/generate_keyword_historical_metrics_request_spec.rb +82 -0
- data/spec/models/generate_keyword_ideas200_response_paging_spec.rb +36 -0
- data/spec/models/generate_keyword_ideas200_response_spec.rb +54 -0
- data/spec/models/generate_keyword_ideas_request_spec.rb +94 -0
- data/spec/models/get_ads_activity_log200_response_paging_spec.rb +36 -0
- data/spec/models/query_ad_insights200_response_paging_spec.rb +6 -0
- data/spec/models/query_ad_insights200_response_spec.rb +12 -0
- data/spec/models/slack_platform_data_spec.rb +60 -0
- data/spec/models/social_account_spec.rb +1 -1
- data/spec/models/validate_post_request_platforms_inner_spec.rb +1 -1
- data/zernio-sdk-0.0.598.gem +0 -0
- metadata +30 -2
- 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
|
-
#
|
|
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
|
data/lib/zernio-sdk/version.rb
CHANGED
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
|
|
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
|
-
|
|
35218
|
-
|
|
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
|
-
|
|
35221
|
-
|
|
35222
|
-
(
|
|
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)
|
|
35227
|
-
- { name: objectId, in: query,
|
|
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
|
|
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
|
|
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: "
|
|
35258
|
-
|
|
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:
|
|
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'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'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 `countries` 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
|
|
96
|
-
# @param account_id Zernio SocialAccount id (posting or ads variant)
|
|
97
|
-
# @param object_id Meta insights node: act_<n>, campaign id, ad set id or ad id.
|
|
119
|
+
# Live, flexible insights query. The account's platform picks the contract: **Meta (facebook/instagram)**: forwards caller-chosen `fields`, `breakdowns` and `filtering` to any Meta insights node and returns Meta's rows verbatim. `objectId` (required) selects the node; `level` sets row granularity. Semantic validation is Meta's: an unknown field or invalid breakdown combination returns a 400 carrying Meta'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 `query` (campaign/keyword/search-term/geo/demographic/asset/shopping resources, `change_event`, any `segments.*`) and rows come back verbatim (camelCase, counters as strings). Results are paged at a fixed 10,000 rows; follow `paging.nextPageToken` with `pageToken`. `customerId` is only needed when the connection has several Google Ads accounts. Semantic validation is Google's: an invalid query returns a 400 carrying Google's message (note: selecting `segments.date` 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_<n>, 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 = Meta's default set.
|
|
101
128
|
# @option opts [String] :breakdowns Comma-separated Graph breakdowns (e.g. age,gender or publisher_platform).
|