late-sdk 0.0.570 → 0.0.572

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c6662697b65680201c5406dc215197a7698d35f9eb962faaf4b131add23906cb
4
- data.tar.gz: 53a2f69256a9bd88806d40e70be0aaa70bb415d5fccb72fa99c9ca9f8f6c0aa8
3
+ metadata.gz: 5e3324f317e16b81226d00a5144c9cd5aeeec1a79045cc0055a88a593f856d0c
4
+ data.tar.gz: 54ea0e6fa0ac0674cd5804a98f8e60af70edd21de4f469cb1ce457248487933e
5
5
  SHA512:
6
- metadata.gz: a794eb29b649101ab9b233ca322079b4141b15d7440222181ff56ff2f99a3320d6785abb4160d22770b9a5af7433a6e52f6f65a377d58c4299834fa1c7ec5322
7
- data.tar.gz: e6ec84fb9678b5043b3edca764f0b1a3d4a140a84d127da39ea20591833a734bcc27ae57fb5094565c689e1d27cdd9bf1df1f8f79644e5cebe9e266fc5710614
6
+ metadata.gz: e2add62050a6026d715f09327fee6e3b48342f76ee1c93e2d613f04c3bec36bce2f5edd530be962201f7c19e4d1f81fad73f46b55d8026ea01ddd477d05c8ba8
7
+ data.tar.gz: 59e1a9127a67820a19e809cdd74e73d6551c3ddd13a98df4930fd6051283763ee61bb886b1cd58cdd63e3d60cf937a496fa8fc2e41ed9429090c88c67ac8de42
data/README.md CHANGED
@@ -122,6 +122,7 @@ Class | Method | HTTP request | Description
122
122
  *Zernio::AdCampaignsApi* | [**get_ad_tree**](docs/AdCampaignsApi.md#get_ad_tree) | **GET** /v1/ads/tree | Get campaign tree
123
123
  *Zernio::AdCampaignsApi* | [**get_ads_timeline**](docs/AdCampaignsApi.md#get_ads_timeline) | **GET** /v1/ads/timeline | Get daily account metrics
124
124
  *Zernio::AdCampaignsApi* | [**list_ad_campaigns**](docs/AdCampaignsApi.md#list_ad_campaigns) | **GET** /v1/ads/campaigns | List campaigns
125
+ *Zernio::AdCampaignsApi* | [**list_ad_keywords**](docs/AdCampaignsApi.md#list_ad_keywords) | **GET** /v1/ads/keywords | List Search keywords
125
126
  *Zernio::AdCampaignsApi* | [**list_ads**](docs/AdCampaignsApi.md#list_ads) | **GET** /v1/ads | List ads
126
127
  *Zernio::AdCampaignsApi* | [**update_ad**](docs/AdCampaignsApi.md#update_ad) | **PUT** /v1/ads/{adId} | Update ad
127
128
  *Zernio::AdCampaignsApi* | [**update_ad_campaign**](docs/AdCampaignsApi.md#update_ad_campaign) | **PUT** /v1/ads/campaigns/{campaignId} | Update a campaign
@@ -1366,6 +1367,8 @@ Class | Method | HTTP request | Description
1366
1367
  - [Zernio::ListAdCatalogs200ResponseCatalogsInner](docs/ListAdCatalogs200ResponseCatalogsInner.md)
1367
1368
  - [Zernio::ListAdCreatives200Response](docs/ListAdCreatives200Response.md)
1368
1369
  - [Zernio::ListAdImages200Response](docs/ListAdImages200Response.md)
1370
+ - [Zernio::ListAdKeywords200Response](docs/ListAdKeywords200Response.md)
1371
+ - [Zernio::ListAdKeywords200ResponseKeywordsInner](docs/ListAdKeywords200ResponseKeywordsInner.md)
1369
1372
  - [Zernio::ListAdLabels200Response](docs/ListAdLabels200Response.md)
1370
1373
  - [Zernio::ListAdStudies200Response](docs/ListAdStudies200Response.md)
1371
1374
  - [Zernio::ListAds200Response](docs/ListAds200Response.md)
@@ -18,6 +18,7 @@ All URIs are relative to *https://zernio.com/api*
18
18
  | [**get_ad_tree**](AdCampaignsApi.md#get_ad_tree) | **GET** /v1/ads/tree | Get campaign tree |
19
19
  | [**get_ads_timeline**](AdCampaignsApi.md#get_ads_timeline) | **GET** /v1/ads/timeline | Get daily account metrics |
20
20
  | [**list_ad_campaigns**](AdCampaignsApi.md#list_ad_campaigns) | **GET** /v1/ads/campaigns | List campaigns |
21
+ | [**list_ad_keywords**](AdCampaignsApi.md#list_ad_keywords) | **GET** /v1/ads/keywords | List Search keywords |
21
22
  | [**list_ads**](AdCampaignsApi.md#list_ads) | **GET** /v1/ads | List ads |
22
23
  | [**update_ad**](AdCampaignsApi.md#update_ad) | **PUT** /v1/ads/{adId} | Update ad |
23
24
  | [**update_ad_campaign**](AdCampaignsApi.md#update_ad_campaign) | **PUT** /v1/ads/campaigns/{campaignId} | Update a campaign |
@@ -1071,6 +1072,97 @@ end
1071
1072
  - **Accept**: application/json
1072
1073
 
1073
1074
 
1075
+ ## list_ad_keywords
1076
+
1077
+ > <ListAdKeywords200Response> list_ad_keywords(opts)
1078
+
1079
+ List Search keywords
1080
+
1081
+ Returns the Google Search keyword criteria (positive and negative) synced from connected Google Ads accounts, one row per ad-group keyword. Populated by the periodic ads discovery sweep (roughly every 3 hours per account), so keywords added on Google appear with that delay. Campaign-level negative keywords are not included; only ad-group-level criteria are.
1082
+
1083
+ ### Examples
1084
+
1085
+ ```ruby
1086
+ require 'time'
1087
+ require 'zernio-sdk'
1088
+ # setup authorization
1089
+ Zernio.configure do |config|
1090
+ # Configure Bearer authorization (JWT): bearerAuth
1091
+ config.access_token = 'YOUR_BEARER_TOKEN'
1092
+ end
1093
+
1094
+ api_instance = Zernio::AdCampaignsApi.new
1095
+ opts = {
1096
+ page: 56, # Integer | Page number (1-based)
1097
+ limit: 56, # Integer |
1098
+ account_id: 'account_id_example', # String | Social account ID
1099
+ ad_account_id: 'ad_account_id_example', # String | Platform ad account ID (Google customer ID). Mirrors the same filter on /v1/ads.
1100
+ profile_id: 'profile_id_example', # String | Profile ID
1101
+ campaign_id: 'campaign_id_example', # String | Platform campaign ID
1102
+ ad_set_id: 'ad_set_id_example', # String | Platform ad group ID (Google ad group)
1103
+ status: 'active', # String | Keyword criterion status
1104
+ match_type: 'exact', # String |
1105
+ negative: true, # Boolean | true = negative keywords only, false = positive only. Omit for both.
1106
+ search: 'search_example' # String | Case-insensitive substring match on the keyword text
1107
+ }
1108
+
1109
+ begin
1110
+ # List Search keywords
1111
+ result = api_instance.list_ad_keywords(opts)
1112
+ p result
1113
+ rescue Zernio::ApiError => e
1114
+ puts "Error when calling AdCampaignsApi->list_ad_keywords: #{e}"
1115
+ end
1116
+ ```
1117
+
1118
+ #### Using the list_ad_keywords_with_http_info variant
1119
+
1120
+ This returns an Array which contains the response data, status code and headers.
1121
+
1122
+ > <Array(<ListAdKeywords200Response>, Integer, Hash)> list_ad_keywords_with_http_info(opts)
1123
+
1124
+ ```ruby
1125
+ begin
1126
+ # List Search keywords
1127
+ data, status_code, headers = api_instance.list_ad_keywords_with_http_info(opts)
1128
+ p status_code # => 2xx
1129
+ p headers # => { ... }
1130
+ p data # => <ListAdKeywords200Response>
1131
+ rescue Zernio::ApiError => e
1132
+ puts "Error when calling AdCampaignsApi->list_ad_keywords_with_http_info: #{e}"
1133
+ end
1134
+ ```
1135
+
1136
+ ### Parameters
1137
+
1138
+ | Name | Type | Description | Notes |
1139
+ | ---- | ---- | ----------- | ----- |
1140
+ | **page** | **Integer** | Page number (1-based) | [optional][default to 1] |
1141
+ | **limit** | **Integer** | | [optional][default to 50] |
1142
+ | **account_id** | **String** | Social account ID | [optional] |
1143
+ | **ad_account_id** | **String** | Platform ad account ID (Google customer ID). Mirrors the same filter on /v1/ads. | [optional] |
1144
+ | **profile_id** | **String** | Profile ID | [optional] |
1145
+ | **campaign_id** | **String** | Platform campaign ID | [optional] |
1146
+ | **ad_set_id** | **String** | Platform ad group ID (Google ad group) | [optional] |
1147
+ | **status** | **String** | Keyword criterion status | [optional] |
1148
+ | **match_type** | **String** | | [optional] |
1149
+ | **negative** | **Boolean** | true &#x3D; negative keywords only, false &#x3D; positive only. Omit for both. | [optional] |
1150
+ | **search** | **String** | Case-insensitive substring match on the keyword text | [optional] |
1151
+
1152
+ ### Return type
1153
+
1154
+ [**ListAdKeywords200Response**](ListAdKeywords200Response.md)
1155
+
1156
+ ### Authorization
1157
+
1158
+ [bearerAuth](../README.md#bearerAuth)
1159
+
1160
+ ### HTTP request headers
1161
+
1162
+ - **Content-Type**: Not defined
1163
+ - **Accept**: application/json
1164
+
1165
+
1074
1166
  ## list_ads
1075
1167
 
1076
1168
  > <ListAds200Response> list_ads(opts)
@@ -9,7 +9,7 @@
9
9
  | **available** | **Boolean** | Whether deliverable voice inventory exists right now. | [optional] |
10
10
  | **address_constraint** | **String** | | [optional] |
11
11
  | **areas** | **Array&lt;String&gt;** | For &#x60;geo&#x60; only — the area(s) the registered address must be in. | [optional] |
12
- | **area_options** | [**Array&lt;CheckPhoneNumberAvailability200ResponseAreaOptionsInner&gt;**](CheckPhoneNumberAvailability200ResponseAreaOptionsInner.md) | Live inventory grouped by area code, largest stock first. Empty when out of stock (or the area lookup failed). Pass a chosen &#x60;ndc&#x60; as &#x60;areaCode&#x60; on POST /v1/phone-numbers/purchase (or on the KYC submit for regulated countries) to require that area. | [optional] |
12
+ | **area_options** | [**Array&lt;CheckPhoneNumberAvailability200ResponseAreaOptionsInner&gt;**](CheckPhoneNumberAvailability200ResponseAreaOptionsInner.md) | Live inventory grouped by area code, largest stock first. For US and CA this is the full country inventory (every area code with stock, named by state/province); other countries list the areas in the latest inventory page (up to 500 numbers, which for most countries is the entire pool). Empty when out of stock (or the area lookup failed). Pass a chosen &#x60;ndc&#x60; as &#x60;areaCode&#x60; on POST /v1/phone-numbers/purchase (or on the KYC submit for regulated countries) to require that area. | [optional] |
13
13
 
14
14
  ## Example
15
15
 
@@ -5,8 +5,8 @@
5
5
  | Name | Type | Description | Notes |
6
6
  | ---- | ---- | ----------- | ----- |
7
7
  | **ndc** | **String** | Area code (national destination code), e.g. \&quot;11\&quot;. | [optional] |
8
- | **name** | **String** | Human-readable area name, e.g. \&quot;Sao Paulo\&quot;. | [optional] |
9
- | **count** | **Integer** | Deliverable numbers seen in this area on the latest inventory page. | [optional] |
8
+ | **name** | **String** | Area name: state/province for US/CA (e.g. \&quot;Minnesota\&quot;), city otherwise (e.g. \&quot;Sao Paulo\&quot;). | [optional] |
9
+ | **count** | **Integer** | Numbers available in this area: country-wide count for US/CA, numbers seen on the latest inventory page otherwise. | [optional] |
10
10
 
11
11
  ## Example
12
12
 
@@ -0,0 +1,20 @@
1
+ # Zernio::ListAdKeywords200Response
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **keywords** | [**Array&lt;ListAdKeywords200ResponseKeywordsInner&gt;**](ListAdKeywords200ResponseKeywordsInner.md) | | [optional] |
8
+ | **pagination** | [**Pagination**](Pagination.md) | | [optional] |
9
+
10
+ ## Example
11
+
12
+ ```ruby
13
+ require 'zernio-sdk'
14
+
15
+ instance = Zernio::ListAdKeywords200Response.new(
16
+ keywords: null,
17
+ pagination: null
18
+ )
19
+ ```
20
+
@@ -0,0 +1,48 @@
1
+ # Zernio::ListAdKeywords200ResponseKeywordsInner
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **id** | **String** | | [optional] |
8
+ | **account_id** | **String** | Social account ID owning the sync | [optional] |
9
+ | **profile_id** | **String** | | [optional] |
10
+ | **platform** | **String** | | [optional] |
11
+ | **ad_account_id** | **String** | Google customer ID | [optional] |
12
+ | **campaign_id** | **String** | | [optional] |
13
+ | **campaign_name** | **String** | | [optional] |
14
+ | **campaign_status** | **String** | | [optional] |
15
+ | **ad_set_id** | **String** | Google ad group ID | [optional] |
16
+ | **ad_set_name** | **String** | | [optional] |
17
+ | **ad_set_status** | **String** | | [optional] |
18
+ | **keyword** | **String** | | [optional] |
19
+ | **match_type** | **String** | | [optional] |
20
+ | **status** | **String** | | [optional] |
21
+ | **negative** | **Boolean** | | [optional] |
22
+ | **synced_at** | **Time** | | [optional] |
23
+
24
+ ## Example
25
+
26
+ ```ruby
27
+ require 'zernio-sdk'
28
+
29
+ instance = Zernio::ListAdKeywords200ResponseKeywordsInner.new(
30
+ id: null,
31
+ account_id: null,
32
+ profile_id: null,
33
+ platform: null,
34
+ ad_account_id: null,
35
+ campaign_id: null,
36
+ campaign_name: null,
37
+ campaign_status: null,
38
+ ad_set_id: null,
39
+ ad_set_name: null,
40
+ ad_set_status: null,
41
+ keyword: null,
42
+ match_type: null,
43
+ status: null,
44
+ negative: null,
45
+ synced_at: null
46
+ )
47
+ ```
48
+
@@ -1107,6 +1107,120 @@ module Zernio
1107
1107
  return data, status_code, headers
1108
1108
  end
1109
1109
 
1110
+ # List Search keywords
1111
+ # Returns the Google Search keyword criteria (positive and negative) synced from connected Google Ads accounts, one row per ad-group keyword. Populated by the periodic ads discovery sweep (roughly every 3 hours per account), so keywords added on Google appear with that delay. Campaign-level negative keywords are not included; only ad-group-level criteria are.
1112
+ # @param [Hash] opts the optional parameters
1113
+ # @option opts [Integer] :page Page number (1-based) (default to 1)
1114
+ # @option opts [Integer] :limit (default to 50)
1115
+ # @option opts [String] :account_id Social account ID
1116
+ # @option opts [String] :ad_account_id Platform ad account ID (Google customer ID). Mirrors the same filter on /v1/ads.
1117
+ # @option opts [String] :profile_id Profile ID
1118
+ # @option opts [String] :campaign_id Platform campaign ID
1119
+ # @option opts [String] :ad_set_id Platform ad group ID (Google ad group)
1120
+ # @option opts [String] :status Keyword criterion status
1121
+ # @option opts [String] :match_type
1122
+ # @option opts [Boolean] :negative true &#x3D; negative keywords only, false &#x3D; positive only. Omit for both.
1123
+ # @option opts [String] :search Case-insensitive substring match on the keyword text
1124
+ # @return [ListAdKeywords200Response]
1125
+ def list_ad_keywords(opts = {})
1126
+ data, _status_code, _headers = list_ad_keywords_with_http_info(opts)
1127
+ data
1128
+ end
1129
+
1130
+ # List Search keywords
1131
+ # Returns the Google Search keyword criteria (positive and negative) synced from connected Google Ads accounts, one row per ad-group keyword. Populated by the periodic ads discovery sweep (roughly every 3 hours per account), so keywords added on Google appear with that delay. Campaign-level negative keywords are not included; only ad-group-level criteria are.
1132
+ # @param [Hash] opts the optional parameters
1133
+ # @option opts [Integer] :page Page number (1-based) (default to 1)
1134
+ # @option opts [Integer] :limit (default to 50)
1135
+ # @option opts [String] :account_id Social account ID
1136
+ # @option opts [String] :ad_account_id Platform ad account ID (Google customer ID). Mirrors the same filter on /v1/ads.
1137
+ # @option opts [String] :profile_id Profile ID
1138
+ # @option opts [String] :campaign_id Platform campaign ID
1139
+ # @option opts [String] :ad_set_id Platform ad group ID (Google ad group)
1140
+ # @option opts [String] :status Keyword criterion status
1141
+ # @option opts [String] :match_type
1142
+ # @option opts [Boolean] :negative true &#x3D; negative keywords only, false &#x3D; positive only. Omit for both.
1143
+ # @option opts [String] :search Case-insensitive substring match on the keyword text
1144
+ # @return [Array<(ListAdKeywords200Response, Integer, Hash)>] ListAdKeywords200Response data, response status code and response headers
1145
+ def list_ad_keywords_with_http_info(opts = {})
1146
+ if @api_client.config.debugging
1147
+ @api_client.config.logger.debug 'Calling API: AdCampaignsApi.list_ad_keywords ...'
1148
+ end
1149
+ if @api_client.config.client_side_validation && !opts[:'page'].nil? && opts[:'page'] < 1
1150
+ fail ArgumentError, 'invalid value for "opts[:"page"]" when calling AdCampaignsApi.list_ad_keywords, must be greater than or equal to 1.'
1151
+ end
1152
+
1153
+ if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 500
1154
+ fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling AdCampaignsApi.list_ad_keywords, must be smaller than or equal to 500.'
1155
+ end
1156
+
1157
+ if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1
1158
+ fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling AdCampaignsApi.list_ad_keywords, must be greater than or equal to 1.'
1159
+ end
1160
+
1161
+ allowable_values = ["active", "paused"]
1162
+ if @api_client.config.client_side_validation && opts[:'status'] && !allowable_values.include?(opts[:'status'])
1163
+ fail ArgumentError, "invalid value for \"status\", must be one of #{allowable_values}"
1164
+ end
1165
+ allowable_values = ["exact", "phrase", "broad", "unknown"]
1166
+ if @api_client.config.client_side_validation && opts[:'match_type'] && !allowable_values.include?(opts[:'match_type'])
1167
+ fail ArgumentError, "invalid value for \"match_type\", must be one of #{allowable_values}"
1168
+ end
1169
+ if @api_client.config.client_side_validation && !opts[:'search'].nil? && opts[:'search'].to_s.length > 200
1170
+ fail ArgumentError, 'invalid value for "opts[:"search"]" when calling AdCampaignsApi.list_ad_keywords, the character length must be smaller than or equal to 200.'
1171
+ end
1172
+
1173
+ # resource path
1174
+ local_var_path = '/v1/ads/keywords'
1175
+
1176
+ # query parameters
1177
+ query_params = opts[:query_params] || {}
1178
+ query_params[:'page'] = opts[:'page'] if !opts[:'page'].nil?
1179
+ query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil?
1180
+ query_params[:'accountId'] = opts[:'account_id'] if !opts[:'account_id'].nil?
1181
+ query_params[:'adAccountId'] = opts[:'ad_account_id'] if !opts[:'ad_account_id'].nil?
1182
+ query_params[:'profileId'] = opts[:'profile_id'] if !opts[:'profile_id'].nil?
1183
+ query_params[:'campaignId'] = opts[:'campaign_id'] if !opts[:'campaign_id'].nil?
1184
+ query_params[:'adSetId'] = opts[:'ad_set_id'] if !opts[:'ad_set_id'].nil?
1185
+ query_params[:'status'] = opts[:'status'] if !opts[:'status'].nil?
1186
+ query_params[:'matchType'] = opts[:'match_type'] if !opts[:'match_type'].nil?
1187
+ query_params[:'negative'] = opts[:'negative'] if !opts[:'negative'].nil?
1188
+ query_params[:'search'] = opts[:'search'] if !opts[:'search'].nil?
1189
+
1190
+ # header parameters
1191
+ header_params = opts[:header_params] || {}
1192
+ # HTTP header 'Accept' (if needed)
1193
+ header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
1194
+
1195
+ # form parameters
1196
+ form_params = opts[:form_params] || {}
1197
+
1198
+ # http body (model)
1199
+ post_body = opts[:debug_body]
1200
+
1201
+ # return_type
1202
+ return_type = opts[:debug_return_type] || 'ListAdKeywords200Response'
1203
+
1204
+ # auth_names
1205
+ auth_names = opts[:debug_auth_names] || ['bearerAuth']
1206
+
1207
+ new_options = opts.merge(
1208
+ :operation => :"AdCampaignsApi.list_ad_keywords",
1209
+ :header_params => header_params,
1210
+ :query_params => query_params,
1211
+ :form_params => form_params,
1212
+ :body => post_body,
1213
+ :auth_names => auth_names,
1214
+ :return_type => return_type
1215
+ )
1216
+
1217
+ data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options)
1218
+ if @api_client.config.debugging
1219
+ @api_client.config.logger.debug "API called: AdCampaignsApi#list_ad_keywords\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
1220
+ end
1221
+ return data, status_code, headers
1222
+ end
1223
+
1110
1224
  # List ads
1111
1225
  # Returns a paginated list of ads with metrics computed over an optional date range. Use source=all to include externally-synced ads from platform ad managers. If no date range is provided, defaults to the last 90 days. Date range is capped at 730 days max. To find the Zernio ad behind a comment you see in Meta Business Manager, filter by platformAdId (the Meta ad ID), effectiveObjectStoryId (Facebook), or effectiveInstagramMediaId (Instagram) — those are the post/media the ad's engagement lives on, and are also returned on each ad's `creative` object. Then call GET /v1/ads/{adId}/comments with the returned ad id.
1112
1226
  # @param [Hash] opts the optional parameters
@@ -27,7 +27,7 @@ module Zernio
27
27
  # For `geo` only — the area(s) the registered address must be in.
28
28
  attr_accessor :areas
29
29
 
30
- # Live inventory grouped by area code, largest stock first. Empty when out of stock (or the area lookup failed). Pass a chosen `ndc` as `areaCode` on POST /v1/phone-numbers/purchase (or on the KYC submit for regulated countries) to require that area.
30
+ # Live inventory grouped by area code, largest stock first. For US and CA this is the full country inventory (every area code with stock, named by state/province); other countries list the areas in the latest inventory page (up to 500 numbers, which for most countries is the entire pool). Empty when out of stock (or the area lookup failed). Pass a chosen `ndc` as `areaCode` on POST /v1/phone-numbers/purchase (or on the KYC submit for regulated countries) to require that area.
31
31
  attr_accessor :area_options
32
32
 
33
33
  class EnumAttributeValidator
@@ -18,10 +18,10 @@ module Zernio
18
18
  # Area code (national destination code), e.g. \"11\".
19
19
  attr_accessor :ndc
20
20
 
21
- # Human-readable area name, e.g. \"Sao Paulo\".
21
+ # Area name: state/province for US/CA (e.g. \"Minnesota\"), city otherwise (e.g. \"Sao Paulo\").
22
22
  attr_accessor :name
23
23
 
24
- # Deliverable numbers seen in this area on the latest inventory page.
24
+ # Numbers available in this area: country-wide count for US/CA, numbers seen on the latest inventory page otherwise.
25
25
  attr_accessor :count
26
26
 
27
27
  # Attribute mapping from ruby-style variable name to JSON key.
@@ -0,0 +1,158 @@
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
+ class ListAdKeywords200Response < ApiModelBase
18
+ attr_accessor :keywords
19
+
20
+ attr_accessor :pagination
21
+
22
+ # Attribute mapping from ruby-style variable name to JSON key.
23
+ def self.attribute_map
24
+ {
25
+ :'keywords' => :'keywords',
26
+ :'pagination' => :'pagination'
27
+ }
28
+ end
29
+
30
+ # Returns attribute mapping this model knows about
31
+ def self.acceptable_attribute_map
32
+ attribute_map
33
+ end
34
+
35
+ # Returns all the JSON keys this model knows about
36
+ def self.acceptable_attributes
37
+ acceptable_attribute_map.values
38
+ end
39
+
40
+ # Attribute type mapping.
41
+ def self.openapi_types
42
+ {
43
+ :'keywords' => :'Array<ListAdKeywords200ResponseKeywordsInner>',
44
+ :'pagination' => :'Pagination'
45
+ }
46
+ end
47
+
48
+ # List of attributes with nullable: true
49
+ def self.openapi_nullable
50
+ Set.new([
51
+ ])
52
+ end
53
+
54
+ # Initializes the object
55
+ # @param [Hash] attributes Model attributes in the form of hash
56
+ def initialize(attributes = {})
57
+ if (!attributes.is_a?(Hash))
58
+ fail ArgumentError, "The input argument (attributes) must be a hash in `Zernio::ListAdKeywords200Response` initialize method"
59
+ end
60
+
61
+ # check to see if the attribute exists and convert string to symbol for hash key
62
+ acceptable_attribute_map = self.class.acceptable_attribute_map
63
+ attributes = attributes.each_with_object({}) { |(k, v), h|
64
+ if (!acceptable_attribute_map.key?(k.to_sym))
65
+ fail ArgumentError, "`#{k}` is not a valid attribute in `Zernio::ListAdKeywords200Response`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
66
+ end
67
+ h[k.to_sym] = v
68
+ }
69
+
70
+ if attributes.key?(:'keywords')
71
+ if (value = attributes[:'keywords']).is_a?(Array)
72
+ self.keywords = value
73
+ end
74
+ end
75
+
76
+ if attributes.key?(:'pagination')
77
+ self.pagination = attributes[:'pagination']
78
+ end
79
+ end
80
+
81
+ # Show invalid properties with the reasons. Usually used together with valid?
82
+ # @return Array for valid properties with the reasons
83
+ def list_invalid_properties
84
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
85
+ invalid_properties = Array.new
86
+ invalid_properties
87
+ end
88
+
89
+ # Check to see if the all the properties in the model are valid
90
+ # @return true if the model is valid
91
+ def valid?
92
+ warn '[DEPRECATED] the `valid?` method is obsolete'
93
+ true
94
+ end
95
+
96
+ # Checks equality by comparing each attribute.
97
+ # @param [Object] Object to be compared
98
+ def ==(o)
99
+ return true if self.equal?(o)
100
+ self.class == o.class &&
101
+ keywords == o.keywords &&
102
+ pagination == o.pagination
103
+ end
104
+
105
+ # @see the `==` method
106
+ # @param [Object] Object to be compared
107
+ def eql?(o)
108
+ self == o
109
+ end
110
+
111
+ # Calculates hash code according to all attributes.
112
+ # @return [Integer] Hash code
113
+ def hash
114
+ [keywords, pagination].hash
115
+ end
116
+
117
+ # Builds the object from hash
118
+ # @param [Hash] attributes Model attributes in the form of hash
119
+ # @return [Object] Returns the model itself
120
+ def self.build_from_hash(attributes)
121
+ return nil unless attributes.is_a?(Hash)
122
+ attributes = attributes.transform_keys(&:to_sym)
123
+ transformed_hash = {}
124
+ openapi_types.each_pair do |key, type|
125
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
126
+ transformed_hash["#{key}"] = nil
127
+ elsif type =~ /\AArray<(.*)>/i
128
+ # check to ensure the input is an array given that the attribute
129
+ # is documented as an array but the input is not
130
+ if attributes[attribute_map[key]].is_a?(Array)
131
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
132
+ end
133
+ elsif !attributes[attribute_map[key]].nil?
134
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
135
+ end
136
+ end
137
+ new(transformed_hash)
138
+ end
139
+
140
+ # Returns the object in the form of hash
141
+ # @return [Hash] Returns the object in the form of hash
142
+ def to_hash
143
+ hash = {}
144
+ self.class.attribute_map.each_pair do |attr, param|
145
+ value = self.send(attr)
146
+ if value.nil?
147
+ is_nullable = self.class.openapi_nullable.include?(attr)
148
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
149
+ end
150
+
151
+ hash[param] = _to_hash(value)
152
+ end
153
+ hash
154
+ end
155
+
156
+ end
157
+
158
+ end
@@ -0,0 +1,348 @@
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
+ class ListAdKeywords200ResponseKeywordsInner < ApiModelBase
18
+ attr_accessor :id
19
+
20
+ # Social account ID owning the sync
21
+ attr_accessor :account_id
22
+
23
+ attr_accessor :profile_id
24
+
25
+ attr_accessor :platform
26
+
27
+ # Google customer ID
28
+ attr_accessor :ad_account_id
29
+
30
+ attr_accessor :campaign_id
31
+
32
+ attr_accessor :campaign_name
33
+
34
+ attr_accessor :campaign_status
35
+
36
+ # Google ad group ID
37
+ attr_accessor :ad_set_id
38
+
39
+ attr_accessor :ad_set_name
40
+
41
+ attr_accessor :ad_set_status
42
+
43
+ attr_accessor :keyword
44
+
45
+ attr_accessor :match_type
46
+
47
+ attr_accessor :status
48
+
49
+ attr_accessor :negative
50
+
51
+ attr_accessor :synced_at
52
+
53
+ class EnumAttributeValidator
54
+ attr_reader :datatype
55
+ attr_reader :allowable_values
56
+
57
+ def initialize(datatype, allowable_values)
58
+ @allowable_values = allowable_values.map do |value|
59
+ case datatype.to_s
60
+ when /Integer/i
61
+ value.to_i
62
+ when /Float/i
63
+ value.to_f
64
+ else
65
+ value
66
+ end
67
+ end
68
+ end
69
+
70
+ def valid?(value)
71
+ !value || allowable_values.include?(value)
72
+ end
73
+ end
74
+
75
+ # Attribute mapping from ruby-style variable name to JSON key.
76
+ def self.attribute_map
77
+ {
78
+ :'id' => :'id',
79
+ :'account_id' => :'accountId',
80
+ :'profile_id' => :'profileId',
81
+ :'platform' => :'platform',
82
+ :'ad_account_id' => :'adAccountId',
83
+ :'campaign_id' => :'campaignId',
84
+ :'campaign_name' => :'campaignName',
85
+ :'campaign_status' => :'campaignStatus',
86
+ :'ad_set_id' => :'adSetId',
87
+ :'ad_set_name' => :'adSetName',
88
+ :'ad_set_status' => :'adSetStatus',
89
+ :'keyword' => :'keyword',
90
+ :'match_type' => :'matchType',
91
+ :'status' => :'status',
92
+ :'negative' => :'negative',
93
+ :'synced_at' => :'syncedAt'
94
+ }
95
+ end
96
+
97
+ # Returns attribute mapping this model knows about
98
+ def self.acceptable_attribute_map
99
+ attribute_map
100
+ end
101
+
102
+ # Returns all the JSON keys this model knows about
103
+ def self.acceptable_attributes
104
+ acceptable_attribute_map.values
105
+ end
106
+
107
+ # Attribute type mapping.
108
+ def self.openapi_types
109
+ {
110
+ :'id' => :'String',
111
+ :'account_id' => :'String',
112
+ :'profile_id' => :'String',
113
+ :'platform' => :'String',
114
+ :'ad_account_id' => :'String',
115
+ :'campaign_id' => :'String',
116
+ :'campaign_name' => :'String',
117
+ :'campaign_status' => :'String',
118
+ :'ad_set_id' => :'String',
119
+ :'ad_set_name' => :'String',
120
+ :'ad_set_status' => :'String',
121
+ :'keyword' => :'String',
122
+ :'match_type' => :'String',
123
+ :'status' => :'String',
124
+ :'negative' => :'Boolean',
125
+ :'synced_at' => :'Time'
126
+ }
127
+ end
128
+
129
+ # List of attributes with nullable: true
130
+ def self.openapi_nullable
131
+ Set.new([
132
+ :'campaign_name',
133
+ :'campaign_status',
134
+ :'ad_set_name',
135
+ :'ad_set_status',
136
+ :'synced_at'
137
+ ])
138
+ end
139
+
140
+ # Initializes the object
141
+ # @param [Hash] attributes Model attributes in the form of hash
142
+ def initialize(attributes = {})
143
+ if (!attributes.is_a?(Hash))
144
+ fail ArgumentError, "The input argument (attributes) must be a hash in `Zernio::ListAdKeywords200ResponseKeywordsInner` initialize method"
145
+ end
146
+
147
+ # check to see if the attribute exists and convert string to symbol for hash key
148
+ acceptable_attribute_map = self.class.acceptable_attribute_map
149
+ attributes = attributes.each_with_object({}) { |(k, v), h|
150
+ if (!acceptable_attribute_map.key?(k.to_sym))
151
+ fail ArgumentError, "`#{k}` is not a valid attribute in `Zernio::ListAdKeywords200ResponseKeywordsInner`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
152
+ end
153
+ h[k.to_sym] = v
154
+ }
155
+
156
+ if attributes.key?(:'id')
157
+ self.id = attributes[:'id']
158
+ end
159
+
160
+ if attributes.key?(:'account_id')
161
+ self.account_id = attributes[:'account_id']
162
+ end
163
+
164
+ if attributes.key?(:'profile_id')
165
+ self.profile_id = attributes[:'profile_id']
166
+ end
167
+
168
+ if attributes.key?(:'platform')
169
+ self.platform = attributes[:'platform']
170
+ end
171
+
172
+ if attributes.key?(:'ad_account_id')
173
+ self.ad_account_id = attributes[:'ad_account_id']
174
+ end
175
+
176
+ if attributes.key?(:'campaign_id')
177
+ self.campaign_id = attributes[:'campaign_id']
178
+ end
179
+
180
+ if attributes.key?(:'campaign_name')
181
+ self.campaign_name = attributes[:'campaign_name']
182
+ end
183
+
184
+ if attributes.key?(:'campaign_status')
185
+ self.campaign_status = attributes[:'campaign_status']
186
+ end
187
+
188
+ if attributes.key?(:'ad_set_id')
189
+ self.ad_set_id = attributes[:'ad_set_id']
190
+ end
191
+
192
+ if attributes.key?(:'ad_set_name')
193
+ self.ad_set_name = attributes[:'ad_set_name']
194
+ end
195
+
196
+ if attributes.key?(:'ad_set_status')
197
+ self.ad_set_status = attributes[:'ad_set_status']
198
+ end
199
+
200
+ if attributes.key?(:'keyword')
201
+ self.keyword = attributes[:'keyword']
202
+ end
203
+
204
+ if attributes.key?(:'match_type')
205
+ self.match_type = attributes[:'match_type']
206
+ end
207
+
208
+ if attributes.key?(:'status')
209
+ self.status = attributes[:'status']
210
+ end
211
+
212
+ if attributes.key?(:'negative')
213
+ self.negative = attributes[:'negative']
214
+ end
215
+
216
+ if attributes.key?(:'synced_at')
217
+ self.synced_at = attributes[:'synced_at']
218
+ end
219
+ end
220
+
221
+ # Show invalid properties with the reasons. Usually used together with valid?
222
+ # @return Array for valid properties with the reasons
223
+ def list_invalid_properties
224
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
225
+ invalid_properties = Array.new
226
+ invalid_properties
227
+ end
228
+
229
+ # Check to see if the all the properties in the model are valid
230
+ # @return true if the model is valid
231
+ def valid?
232
+ warn '[DEPRECATED] the `valid?` method is obsolete'
233
+ platform_validator = EnumAttributeValidator.new('String', ["google"])
234
+ return false unless platform_validator.valid?(@platform)
235
+ match_type_validator = EnumAttributeValidator.new('String', ["exact", "phrase", "broad", "unknown"])
236
+ return false unless match_type_validator.valid?(@match_type)
237
+ status_validator = EnumAttributeValidator.new('String', ["active", "paused"])
238
+ return false unless status_validator.valid?(@status)
239
+ true
240
+ end
241
+
242
+ # Custom attribute writer method checking allowed values (enum).
243
+ # @param [Object] platform Object to be assigned
244
+ def platform=(platform)
245
+ validator = EnumAttributeValidator.new('String', ["google"])
246
+ unless validator.valid?(platform)
247
+ fail ArgumentError, "invalid value for \"platform\", must be one of #{validator.allowable_values}."
248
+ end
249
+ @platform = platform
250
+ end
251
+
252
+ # Custom attribute writer method checking allowed values (enum).
253
+ # @param [Object] match_type Object to be assigned
254
+ def match_type=(match_type)
255
+ validator = EnumAttributeValidator.new('String', ["exact", "phrase", "broad", "unknown"])
256
+ unless validator.valid?(match_type)
257
+ fail ArgumentError, "invalid value for \"match_type\", must be one of #{validator.allowable_values}."
258
+ end
259
+ @match_type = match_type
260
+ end
261
+
262
+ # Custom attribute writer method checking allowed values (enum).
263
+ # @param [Object] status Object to be assigned
264
+ def status=(status)
265
+ validator = EnumAttributeValidator.new('String', ["active", "paused"])
266
+ unless validator.valid?(status)
267
+ fail ArgumentError, "invalid value for \"status\", must be one of #{validator.allowable_values}."
268
+ end
269
+ @status = status
270
+ end
271
+
272
+ # Checks equality by comparing each attribute.
273
+ # @param [Object] Object to be compared
274
+ def ==(o)
275
+ return true if self.equal?(o)
276
+ self.class == o.class &&
277
+ id == o.id &&
278
+ account_id == o.account_id &&
279
+ profile_id == o.profile_id &&
280
+ platform == o.platform &&
281
+ ad_account_id == o.ad_account_id &&
282
+ campaign_id == o.campaign_id &&
283
+ campaign_name == o.campaign_name &&
284
+ campaign_status == o.campaign_status &&
285
+ ad_set_id == o.ad_set_id &&
286
+ ad_set_name == o.ad_set_name &&
287
+ ad_set_status == o.ad_set_status &&
288
+ keyword == o.keyword &&
289
+ match_type == o.match_type &&
290
+ status == o.status &&
291
+ negative == o.negative &&
292
+ synced_at == o.synced_at
293
+ end
294
+
295
+ # @see the `==` method
296
+ # @param [Object] Object to be compared
297
+ def eql?(o)
298
+ self == o
299
+ end
300
+
301
+ # Calculates hash code according to all attributes.
302
+ # @return [Integer] Hash code
303
+ def hash
304
+ [id, account_id, profile_id, platform, ad_account_id, campaign_id, campaign_name, campaign_status, ad_set_id, ad_set_name, ad_set_status, keyword, match_type, status, negative, synced_at].hash
305
+ end
306
+
307
+ # Builds the object from hash
308
+ # @param [Hash] attributes Model attributes in the form of hash
309
+ # @return [Object] Returns the model itself
310
+ def self.build_from_hash(attributes)
311
+ return nil unless attributes.is_a?(Hash)
312
+ attributes = attributes.transform_keys(&:to_sym)
313
+ transformed_hash = {}
314
+ openapi_types.each_pair do |key, type|
315
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
316
+ transformed_hash["#{key}"] = nil
317
+ elsif type =~ /\AArray<(.*)>/i
318
+ # check to ensure the input is an array given that the attribute
319
+ # is documented as an array but the input is not
320
+ if attributes[attribute_map[key]].is_a?(Array)
321
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
322
+ end
323
+ elsif !attributes[attribute_map[key]].nil?
324
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
325
+ end
326
+ end
327
+ new(transformed_hash)
328
+ end
329
+
330
+ # Returns the object in the form of hash
331
+ # @return [Hash] Returns the object in the form of hash
332
+ def to_hash
333
+ hash = {}
334
+ self.class.attribute_map.each_pair do |attr, param|
335
+ value = self.send(attr)
336
+ if value.nil?
337
+ is_nullable = self.class.openapi_nullable.include?(attr)
338
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
339
+ end
340
+
341
+ hash[param] = _to_hash(value)
342
+ end
343
+ hash
344
+ end
345
+
346
+ end
347
+
348
+ end
@@ -11,5 +11,5 @@ Generator version: 7.19.0
11
11
  =end
12
12
 
13
13
  module Zernio
14
- VERSION = '0.0.570'
14
+ VERSION = '0.0.572'
15
15
  end
data/lib/zernio-sdk.rb CHANGED
@@ -795,6 +795,8 @@ require 'zernio-sdk/models/list_ad_catalogs200_response'
795
795
  require 'zernio-sdk/models/list_ad_catalogs200_response_catalogs_inner'
796
796
  require 'zernio-sdk/models/list_ad_creatives200_response'
797
797
  require 'zernio-sdk/models/list_ad_images200_response'
798
+ require 'zernio-sdk/models/list_ad_keywords200_response'
799
+ require 'zernio-sdk/models/list_ad_keywords200_response_keywords_inner'
798
800
  require 'zernio-sdk/models/list_ad_labels200_response'
799
801
  require 'zernio-sdk/models/list_ad_studies200_response'
800
802
  require 'zernio-sdk/models/list_ads200_response'
data/openapi.yaml CHANGED
@@ -28166,16 +28166,20 @@ paths:
28166
28166
  type: array
28167
28167
  description: >
28168
28168
  Live inventory grouped by area code, largest stock
28169
- first. Empty when out of stock (or the area lookup
28170
- failed). Pass a chosen `ndc` as `areaCode` on POST
28169
+ first. For US and CA this is the full country inventory
28170
+ (every area code with stock, named by state/province);
28171
+ other countries list the areas in the latest inventory
28172
+ page (up to 500 numbers, which for most countries is the
28173
+ entire pool). Empty when out of stock (or the area
28174
+ lookup failed). Pass a chosen `ndc` as `areaCode` on POST
28171
28175
  /v1/phone-numbers/purchase (or on the KYC submit for
28172
28176
  regulated countries) to require that area.
28173
28177
  items:
28174
28178
  type: object
28175
28179
  properties:
28176
28180
  ndc: { type: string, description: 'Area code (national destination code), e.g. "11".' }
28177
- name: { type: string, description: 'Human-readable area name, e.g. "Sao Paulo".' }
28178
- count: { type: integer, description: Deliverable numbers seen in this area on the latest inventory page. }
28181
+ name: { type: string, description: 'Area name: state/province for US/CA (e.g. "Minnesota"), city otherwise (e.g. "Sao Paulo").' }
28182
+ count: { type: integer, description: 'Numbers available in this area: country-wide count for US/CA, numbers seen on the latest inventory page otherwise.' }
28179
28183
  '400': { description: Country not offerable }
28180
28184
  '401': { $ref: '#/components/responses/Unauthorized' }
28181
28185
 
@@ -28532,16 +28536,20 @@ paths:
28532
28536
  type: array
28533
28537
  description: >
28534
28538
  Live inventory grouped by area code, largest stock
28535
- first. Empty when out of stock (or the area lookup
28536
- failed). Pass a chosen `ndc` as `areaCode` on POST
28539
+ first. For US and CA this is the full country inventory
28540
+ (every area code with stock, named by state/province);
28541
+ other countries list the areas in the latest inventory
28542
+ page (up to 500 numbers, which for most countries is the
28543
+ entire pool). Empty when out of stock (or the area
28544
+ lookup failed). Pass a chosen `ndc` as `areaCode` on POST
28537
28545
  /v1/phone-numbers/purchase (or on the KYC submit for
28538
28546
  regulated countries) to require that area.
28539
28547
  items:
28540
28548
  type: object
28541
28549
  properties:
28542
28550
  ndc: { type: string, description: 'Area code (national destination code), e.g. "11".' }
28543
- name: { type: string, description: 'Human-readable area name, e.g. "Sao Paulo".' }
28544
- count: { type: integer, description: Deliverable numbers seen in this area on the latest inventory page. }
28551
+ name: { type: string, description: 'Area name: state/province for US/CA (e.g. "Minnesota"), city otherwise (e.g. "Sao Paulo").' }
28552
+ count: { type: integer, description: 'Numbers available in this area: country-wide count for US/CA, numbers seen on the latest inventory page otherwise.' }
28545
28553
  '400': { description: Country not offerable }
28546
28554
  '401': { $ref: '#/components/responses/Unauthorized' }
28547
28555
 
@@ -33711,6 +33719,67 @@ paths:
33711
33719
  '403':
33712
33720
  description: Ads access required. Legacy plans need the Ads add-on; included by default on usage-based plans.
33713
33721
 
33722
+ /v1/ads/keywords:
33723
+ get:
33724
+ operationId: listAdKeywords
33725
+ tags: ["Ad Campaigns"]
33726
+ x-platforms: ["google"]
33727
+ summary: List Search keywords
33728
+ description: |
33729
+ Returns the Google Search keyword criteria (positive and negative) synced from
33730
+ connected Google Ads accounts, one row per ad-group keyword. Populated by the
33731
+ periodic ads discovery sweep (roughly every 3 hours per account), so keywords
33732
+ added on Google appear with that delay. Campaign-level negative keywords are
33733
+ not included; only ad-group-level criteria are.
33734
+ security:
33735
+ - bearerAuth: []
33736
+ parameters:
33737
+ - $ref: '#/components/parameters/PageParam'
33738
+ - { name: limit, in: query, schema: { type: integer, minimum: 1, maximum: 500, default: 50 } }
33739
+ - { name: accountId, in: query, schema: { type: string }, description: Social account ID }
33740
+ - { name: adAccountId, in: query, schema: { type: string }, description: 'Platform ad account ID (Google customer ID). Mirrors the same filter on /v1/ads.' }
33741
+ - { name: profileId, in: query, schema: { type: string }, description: Profile ID }
33742
+ - { name: campaignId, in: query, schema: { type: string }, description: Platform campaign ID }
33743
+ - { name: adSetId, in: query, schema: { type: string }, description: 'Platform ad group ID (Google ad group)' }
33744
+ - { name: status, in: query, schema: { type: string, enum: [active, paused] }, description: Keyword criterion status }
33745
+ - { name: matchType, in: query, schema: { type: string, enum: [exact, phrase, broad, unknown] } }
33746
+ - { name: negative, in: query, schema: { type: boolean }, description: 'true = negative keywords only, false = positive only. Omit for both.' }
33747
+ - { name: search, in: query, schema: { type: string, maxLength: 200 }, description: 'Case-insensitive substring match on the keyword text' }
33748
+ responses:
33749
+ '200':
33750
+ description: Paginated keywords
33751
+ content:
33752
+ application/json:
33753
+ schema:
33754
+ type: object
33755
+ properties:
33756
+ keywords:
33757
+ type: array
33758
+ items:
33759
+ type: object
33760
+ properties:
33761
+ id: { type: string }
33762
+ accountId: { type: string, description: Social account ID owning the sync }
33763
+ profileId: { type: string }
33764
+ platform: { type: string, enum: [google] }
33765
+ adAccountId: { type: string, description: Google customer ID }
33766
+ campaignId: { type: string }
33767
+ campaignName: { type: [string, "null"] }
33768
+ campaignStatus: { type: [string, "null"] }
33769
+ adSetId: { type: string, description: Google ad group ID }
33770
+ adSetName: { type: [string, "null"] }
33771
+ adSetStatus: { type: [string, "null"] }
33772
+ keyword: { type: string }
33773
+ matchType: { type: string, enum: [exact, phrase, broad, unknown] }
33774
+ status: { type: string, enum: [active, paused] }
33775
+ negative: { type: boolean }
33776
+ syncedAt: { type: [string, "null"], format: date-time }
33777
+ pagination: { $ref: '#/components/schemas/Pagination' }
33778
+ '400': { $ref: '#/components/responses/BadRequest' }
33779
+ '401': { $ref: '#/components/responses/Unauthorized' }
33780
+ '403':
33781
+ description: Ads access required. Legacy plans need the Ads add-on; included by default on usage-based plans.
33782
+
33714
33783
  /v1/ads/campaigns:
33715
33784
  get:
33716
33785
  operationId: listAdCampaigns
@@ -233,6 +233,28 @@ describe 'AdCampaignsApi' do
233
233
  end
234
234
  end
235
235
 
236
+ # unit tests for list_ad_keywords
237
+ # List Search keywords
238
+ # Returns the Google Search keyword criteria (positive and negative) synced from connected Google Ads accounts, one row per ad-group keyword. Populated by the periodic ads discovery sweep (roughly every 3 hours per account), so keywords added on Google appear with that delay. Campaign-level negative keywords are not included; only ad-group-level criteria are.
239
+ # @param [Hash] opts the optional parameters
240
+ # @option opts [Integer] :page Page number (1-based)
241
+ # @option opts [Integer] :limit
242
+ # @option opts [String] :account_id Social account ID
243
+ # @option opts [String] :ad_account_id Platform ad account ID (Google customer ID). Mirrors the same filter on /v1/ads.
244
+ # @option opts [String] :profile_id Profile ID
245
+ # @option opts [String] :campaign_id Platform campaign ID
246
+ # @option opts [String] :ad_set_id Platform ad group ID (Google ad group)
247
+ # @option opts [String] :status Keyword criterion status
248
+ # @option opts [String] :match_type
249
+ # @option opts [Boolean] :negative true &#x3D; negative keywords only, false &#x3D; positive only. Omit for both.
250
+ # @option opts [String] :search Case-insensitive substring match on the keyword text
251
+ # @return [ListAdKeywords200Response]
252
+ describe 'list_ad_keywords test' do
253
+ it 'should work' do
254
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
255
+ end
256
+ end
257
+
236
258
  # unit tests for list_ads
237
259
  # List ads
238
260
  # Returns a paginated list of ads with metrics computed over an optional date range. Use source&#x3D;all to include externally-synced ads from platform ad managers. If no date range is provided, defaults to the last 90 days. Date range is capped at 730 days max. To find the Zernio ad behind a comment you see in Meta Business Manager, filter by platformAdId (the Meta ad ID), effectiveObjectStoryId (Facebook), or effectiveInstagramMediaId (Instagram) — those are the post/media the ad&#39;s engagement lives on, and are also returned on each ad&#39;s &#x60;creative&#x60; object. Then call GET /v1/ads/{adId}/comments with the returned ad id.
@@ -0,0 +1,138 @@
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 'spec_helper'
14
+ require 'json'
15
+ require 'date'
16
+
17
+ # Unit tests for Zernio::ListAdKeywords200ResponseKeywordsInner
18
+ # Automatically generated by openapi-generator (https://openapi-generator.tech)
19
+ # Please update as you see appropriate
20
+ describe Zernio::ListAdKeywords200ResponseKeywordsInner do
21
+ #let(:instance) { Zernio::ListAdKeywords200ResponseKeywordsInner.new }
22
+
23
+ describe 'test an instance of ListAdKeywords200ResponseKeywordsInner' do
24
+ it 'should create an instance of ListAdKeywords200ResponseKeywordsInner' do
25
+ # uncomment below to test the instance creation
26
+ #expect(instance).to be_instance_of(Zernio::ListAdKeywords200ResponseKeywordsInner)
27
+ end
28
+ end
29
+
30
+ describe 'test attribute "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 "account_id"' 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 "profile_id"' 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 "platform"' do
49
+ it 'should work' do
50
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
51
+ # validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["google"])
52
+ # validator.allowable_values.each do |value|
53
+ # expect { instance.platform = value }.not_to raise_error
54
+ # end
55
+ end
56
+ end
57
+
58
+ describe 'test attribute "ad_account_id"' do
59
+ it 'should work' do
60
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
61
+ end
62
+ end
63
+
64
+ describe 'test attribute "campaign_id"' do
65
+ it 'should work' do
66
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
67
+ end
68
+ end
69
+
70
+ describe 'test attribute "campaign_name"' do
71
+ it 'should work' do
72
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
73
+ end
74
+ end
75
+
76
+ describe 'test attribute "campaign_status"' do
77
+ it 'should work' do
78
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
79
+ end
80
+ end
81
+
82
+ describe 'test attribute "ad_set_id"' do
83
+ it 'should work' do
84
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
85
+ end
86
+ end
87
+
88
+ describe 'test attribute "ad_set_name"' do
89
+ it 'should work' do
90
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
91
+ end
92
+ end
93
+
94
+ describe 'test attribute "ad_set_status"' do
95
+ it 'should work' do
96
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
97
+ end
98
+ end
99
+
100
+ describe 'test attribute "keyword"' do
101
+ it 'should work' do
102
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
103
+ end
104
+ end
105
+
106
+ describe 'test attribute "match_type"' do
107
+ it 'should work' do
108
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
109
+ # validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["exact", "phrase", "broad", "unknown"])
110
+ # validator.allowable_values.each do |value|
111
+ # expect { instance.match_type = value }.not_to raise_error
112
+ # end
113
+ end
114
+ end
115
+
116
+ describe 'test attribute "status"' do
117
+ it 'should work' do
118
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
119
+ # validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["active", "paused"])
120
+ # validator.allowable_values.each do |value|
121
+ # expect { instance.status = value }.not_to raise_error
122
+ # end
123
+ end
124
+ end
125
+
126
+ describe 'test attribute "negative"' do
127
+ it 'should work' do
128
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
129
+ end
130
+ end
131
+
132
+ describe 'test attribute "synced_at"' do
133
+ it 'should work' do
134
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
135
+ end
136
+ end
137
+
138
+ end
@@ -0,0 +1,42 @@
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 'spec_helper'
14
+ require 'json'
15
+ require 'date'
16
+
17
+ # Unit tests for Zernio::ListAdKeywords200Response
18
+ # Automatically generated by openapi-generator (https://openapi-generator.tech)
19
+ # Please update as you see appropriate
20
+ describe Zernio::ListAdKeywords200Response do
21
+ #let(:instance) { Zernio::ListAdKeywords200Response.new }
22
+
23
+ describe 'test an instance of ListAdKeywords200Response' do
24
+ it 'should create an instance of ListAdKeywords200Response' do
25
+ # uncomment below to test the instance creation
26
+ #expect(instance).to be_instance_of(Zernio::ListAdKeywords200Response)
27
+ end
28
+ end
29
+
30
+ describe 'test attribute "keywords"' 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 "pagination"' 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
+ end
Binary file
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: late-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.570
4
+ version: 0.0.572
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenAPI-Generator
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-07-24 00:00:00.000000000 Z
11
+ date: 2026-07-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: typhoeus
@@ -873,6 +873,8 @@ files:
873
873
  - docs/ListAdCatalogs200ResponseCatalogsInner.md
874
874
  - docs/ListAdCreatives200Response.md
875
875
  - docs/ListAdImages200Response.md
876
+ - docs/ListAdKeywords200Response.md
877
+ - docs/ListAdKeywords200ResponseKeywordsInner.md
876
878
  - docs/ListAdLabels200Response.md
877
879
  - docs/ListAdStudies200Response.md
878
880
  - docs/ListAds200Response.md
@@ -2472,6 +2474,8 @@ files:
2472
2474
  - lib/zernio-sdk/models/list_ad_catalogs200_response_catalogs_inner.rb
2473
2475
  - lib/zernio-sdk/models/list_ad_creatives200_response.rb
2474
2476
  - lib/zernio-sdk/models/list_ad_images200_response.rb
2477
+ - lib/zernio-sdk/models/list_ad_keywords200_response.rb
2478
+ - lib/zernio-sdk/models/list_ad_keywords200_response_keywords_inner.rb
2475
2479
  - lib/zernio-sdk/models/list_ad_labels200_response.rb
2476
2480
  - lib/zernio-sdk/models/list_ad_studies200_response.rb
2477
2481
  - lib/zernio-sdk/models/list_ads200_response.rb
@@ -4035,6 +4039,8 @@ files:
4035
4039
  - spec/models/list_ad_catalogs200_response_spec.rb
4036
4040
  - spec/models/list_ad_creatives200_response_spec.rb
4037
4041
  - spec/models/list_ad_images200_response_spec.rb
4042
+ - spec/models/list_ad_keywords200_response_keywords_inner_spec.rb
4043
+ - spec/models/list_ad_keywords200_response_spec.rb
4038
4044
  - spec/models/list_ad_labels200_response_spec.rb
4039
4045
  - spec/models/list_ad_studies200_response_spec.rb
4040
4046
  - spec/models/list_ads200_response_spec.rb
@@ -4757,7 +4763,7 @@ files:
4757
4763
  - spec/models/you_tube_video_retention_response_retention_curve_inner_spec.rb
4758
4764
  - spec/models/you_tube_video_retention_response_spec.rb
4759
4765
  - spec/spec_helper.rb
4760
- - zernio-sdk-0.0.570.gem
4766
+ - zernio-sdk-0.0.572.gem
4761
4767
  - zernio-sdk.gemspec
4762
4768
  homepage: https://openapi-generator.tech
4763
4769
  licenses:
@@ -5357,6 +5363,7 @@ test_files:
5357
5363
  - spec/models/unlike_inbox_comment200_response_spec.rb
5358
5364
  - spec/models/update_whats_app_business_profile_request_spec.rb
5359
5365
  - spec/models/create_discord_thread200_response_spec.rb
5366
+ - spec/models/list_ad_keywords200_response_spec.rb
5360
5367
  - spec/models/update_google_business_services_request_service_items_inner_free_form_service_item_label_spec.rb
5361
5368
  - spec/models/reddit_post_spec.rb
5362
5369
  - spec/models/get_telegram_commands200_response_spec.rb
@@ -6156,6 +6163,7 @@ test_files:
6156
6163
  - spec/models/geo_restriction_spec.rb
6157
6164
  - spec/models/trigger_workflow200_response_execution_spec.rb
6158
6165
  - spec/models/linked_in_aggregate_analytics_daily_response_analytics_spec.rb
6166
+ - spec/models/list_ad_keywords200_response_keywords_inner_spec.rb
6159
6167
  - spec/models/create_account_group201_response_group_spec.rb
6160
6168
  - spec/models/send_whats_app_flow_message_request_spec.rb
6161
6169
  - spec/models/list_discord_guild_roles200_response_data_inner_spec.rb
Binary file