late-sdk 0.0.706 → 0.0.708

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -0
  3. data/docs/AdInsightsApi.md +84 -0
  4. data/docs/BoostPostRequest.md +4 -4
  5. data/docs/BoostPostRequestPlatformSpecificData.md +49 -0
  6. data/docs/CreateStandaloneAdRequest.md +4 -4
  7. data/docs/GetAdsSearchTerms200Response.md +22 -0
  8. data/docs/GetAdsSearchTerms200ResponseDataInner.md +40 -0
  9. data/docs/GetAdsSearchTerms200ResponsePaging.md +18 -0
  10. data/docs/InstagramApi.md +1 -1
  11. data/docs/MetaAdsPlatformData.md +22 -0
  12. data/docs/WebhookPayloadCommentPost.md +7 -1
  13. data/lib/zernio-sdk/api/ad_insights_api.rb +82 -0
  14. data/lib/zernio-sdk/api/instagram_api.rb +2 -2
  15. data/lib/zernio-sdk/models/boost_post_request.rb +4 -4
  16. data/lib/zernio-sdk/models/boost_post_request_platform_specific_data.rb +105 -0
  17. data/lib/zernio-sdk/models/create_standalone_ad_request.rb +4 -4
  18. data/lib/zernio-sdk/models/get_ads_search_terms200_response.rb +167 -0
  19. data/lib/zernio-sdk/models/get_ads_search_terms200_response_data_inner.rb +256 -0
  20. data/lib/zernio-sdk/models/get_ads_search_terms200_response_paging.rb +149 -0
  21. data/lib/zernio-sdk/models/meta_ads_platform_data.rb +190 -0
  22. data/lib/zernio-sdk/models/webhook_payload_comment_post.rb +43 -4
  23. data/lib/zernio-sdk/version.rb +1 -1
  24. data/lib/zernio-sdk.rb +5 -0
  25. data/openapi.yaml +117 -6
  26. data/spec/api/ad_insights_api_spec.rb +18 -0
  27. data/spec/api/instagram_api_spec.rb +1 -1
  28. data/spec/models/boost_post_request_platform_specific_data_spec.rb +32 -0
  29. data/spec/models/get_ads_search_terms200_response_data_inner_spec.rb +102 -0
  30. data/spec/models/get_ads_search_terms200_response_paging_spec.rb +36 -0
  31. data/spec/models/get_ads_search_terms200_response_spec.rb +48 -0
  32. data/spec/models/meta_ads_platform_data_spec.rb +48 -0
  33. data/spec/models/webhook_payload_comment_post_spec.rb +18 -0
  34. data/zernio-sdk-0.0.708.gem +0 -0
  35. metadata +22 -2
  36. data/zernio-sdk-0.0.706.gem +0 -0
@@ -0,0 +1,190 @@
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
+ # Meta (facebook/instagram) options for platformSpecificData on POST /v1/ads/boost and /v1/ads/create. Unknown keys are rejected, not dropped.
18
+ class MetaAdsPlatformData < ApiModelBase
19
+ attr_accessor :bid_strategy
20
+
21
+ # Whole currency units (USD: 5 = $5.00). Required when bidStrategy is LOWEST_COST_WITH_BID_CAP or COST_CAP.
22
+ attr_accessor :bid_amount
23
+
24
+ # Decimal ROAS multiplier (2.0 = 2.0x). Required when bidStrategy is LOWEST_COST_WITH_MIN_ROAS.
25
+ attr_accessor :roas_average_floor
26
+
27
+ class EnumAttributeValidator
28
+ attr_reader :datatype
29
+ attr_reader :allowable_values
30
+
31
+ def initialize(datatype, allowable_values)
32
+ @allowable_values = allowable_values.map do |value|
33
+ case datatype.to_s
34
+ when /Integer/i
35
+ value.to_i
36
+ when /Float/i
37
+ value.to_f
38
+ else
39
+ value
40
+ end
41
+ end
42
+ end
43
+
44
+ def valid?(value)
45
+ !value || allowable_values.include?(value)
46
+ end
47
+ end
48
+
49
+ # Attribute mapping from ruby-style variable name to JSON key.
50
+ def self.attribute_map
51
+ {
52
+ :'bid_strategy' => :'bidStrategy',
53
+ :'bid_amount' => :'bidAmount',
54
+ :'roas_average_floor' => :'roasAverageFloor'
55
+ }
56
+ end
57
+
58
+ # Returns attribute mapping this model knows about
59
+ def self.acceptable_attribute_map
60
+ attribute_map
61
+ end
62
+
63
+ # Returns all the JSON keys this model knows about
64
+ def self.acceptable_attributes
65
+ acceptable_attribute_map.values
66
+ end
67
+
68
+ # Attribute type mapping.
69
+ def self.openapi_types
70
+ {
71
+ :'bid_strategy' => :'BidStrategy',
72
+ :'bid_amount' => :'Float',
73
+ :'roas_average_floor' => :'Float'
74
+ }
75
+ end
76
+
77
+ # List of attributes with nullable: true
78
+ def self.openapi_nullable
79
+ Set.new([
80
+ ])
81
+ end
82
+
83
+ # Initializes the object
84
+ # @param [Hash] attributes Model attributes in the form of hash
85
+ def initialize(attributes = {})
86
+ if (!attributes.is_a?(Hash))
87
+ fail ArgumentError, "The input argument (attributes) must be a hash in `Zernio::MetaAdsPlatformData` initialize method"
88
+ end
89
+
90
+ # check to see if the attribute exists and convert string to symbol for hash key
91
+ acceptable_attribute_map = self.class.acceptable_attribute_map
92
+ attributes = attributes.each_with_object({}) { |(k, v), h|
93
+ if (!acceptable_attribute_map.key?(k.to_sym))
94
+ fail ArgumentError, "`#{k}` is not a valid attribute in `Zernio::MetaAdsPlatformData`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
95
+ end
96
+ h[k.to_sym] = v
97
+ }
98
+
99
+ if attributes.key?(:'bid_strategy')
100
+ self.bid_strategy = attributes[:'bid_strategy']
101
+ end
102
+
103
+ if attributes.key?(:'bid_amount')
104
+ self.bid_amount = attributes[:'bid_amount']
105
+ end
106
+
107
+ if attributes.key?(:'roas_average_floor')
108
+ self.roas_average_floor = attributes[:'roas_average_floor']
109
+ end
110
+ end
111
+
112
+ # Show invalid properties with the reasons. Usually used together with valid?
113
+ # @return Array for valid properties with the reasons
114
+ def list_invalid_properties
115
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
116
+ invalid_properties = Array.new
117
+ invalid_properties
118
+ end
119
+
120
+ # Check to see if the all the properties in the model are valid
121
+ # @return true if the model is valid
122
+ def valid?
123
+ warn '[DEPRECATED] the `valid?` method is obsolete'
124
+ true
125
+ end
126
+
127
+ # Checks equality by comparing each attribute.
128
+ # @param [Object] Object to be compared
129
+ def ==(o)
130
+ return true if self.equal?(o)
131
+ self.class == o.class &&
132
+ bid_strategy == o.bid_strategy &&
133
+ bid_amount == o.bid_amount &&
134
+ roas_average_floor == o.roas_average_floor
135
+ end
136
+
137
+ # @see the `==` method
138
+ # @param [Object] Object to be compared
139
+ def eql?(o)
140
+ self == o
141
+ end
142
+
143
+ # Calculates hash code according to all attributes.
144
+ # @return [Integer] Hash code
145
+ def hash
146
+ [bid_strategy, bid_amount, roas_average_floor].hash
147
+ end
148
+
149
+ # Builds the object from hash
150
+ # @param [Hash] attributes Model attributes in the form of hash
151
+ # @return [Object] Returns the model itself
152
+ def self.build_from_hash(attributes)
153
+ return nil unless attributes.is_a?(Hash)
154
+ attributes = attributes.transform_keys(&:to_sym)
155
+ transformed_hash = {}
156
+ openapi_types.each_pair do |key, type|
157
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
158
+ transformed_hash["#{key}"] = nil
159
+ elsif type =~ /\AArray<(.*)>/i
160
+ # check to ensure the input is an array given that the attribute
161
+ # is documented as an array but the input is not
162
+ if attributes[attribute_map[key]].is_a?(Array)
163
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
164
+ end
165
+ elsif !attributes[attribute_map[key]].nil?
166
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
167
+ end
168
+ end
169
+ new(transformed_hash)
170
+ end
171
+
172
+ # Returns the object in the form of hash
173
+ # @return [Hash] Returns the object in the form of hash
174
+ def to_hash
175
+ hash = {}
176
+ self.class.attribute_map.each_pair do |attr, param|
177
+ value = self.send(attr)
178
+ if value.nil?
179
+ is_nullable = self.class.openapi_nullable.include?(attr)
180
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
181
+ end
182
+
183
+ hash[param] = _to_hash(value)
184
+ end
185
+ hash
186
+ end
187
+
188
+ end
189
+
190
+ end
@@ -21,11 +21,23 @@ module Zernio
21
21
  # Platform's post ID
22
22
  attr_accessor :platform_post_id
23
23
 
24
+ # Post text, from our synced copy — no platform call is made on the comment path, so null when the post was never synced.
25
+ attr_accessor :content
26
+
27
+ # Post thumbnail or first media item URL. Platform CDN URLs expire, fetch promptly.
28
+ attr_accessor :image_url
29
+
30
+ # Public URL of the post. Null for posts published through Zernio that were never re-synced.
31
+ attr_accessor :permalink
32
+
24
33
  # Attribute mapping from ruby-style variable name to JSON key.
25
34
  def self.attribute_map
26
35
  {
27
36
  :'id' => :'id',
28
- :'platform_post_id' => :'platformPostId'
37
+ :'platform_post_id' => :'platformPostId',
38
+ :'content' => :'content',
39
+ :'image_url' => :'imageUrl',
40
+ :'permalink' => :'permalink'
29
41
  }
30
42
  end
31
43
 
@@ -43,7 +55,10 @@ module Zernio
43
55
  def self.openapi_types
44
56
  {
45
57
  :'id' => :'String',
46
- :'platform_post_id' => :'String'
58
+ :'platform_post_id' => :'String',
59
+ :'content' => :'String',
60
+ :'image_url' => :'String',
61
+ :'permalink' => :'String'
47
62
  }
48
63
  end
49
64
 
@@ -51,6 +66,9 @@ module Zernio
51
66
  def self.openapi_nullable
52
67
  Set.new([
53
68
  :'id',
69
+ :'content',
70
+ :'image_url',
71
+ :'permalink'
54
72
  ])
55
73
  end
56
74
 
@@ -81,6 +99,24 @@ module Zernio
81
99
  else
82
100
  self.platform_post_id = nil
83
101
  end
102
+
103
+ if attributes.key?(:'content')
104
+ self.content = attributes[:'content']
105
+ else
106
+ self.content = nil
107
+ end
108
+
109
+ if attributes.key?(:'image_url')
110
+ self.image_url = attributes[:'image_url']
111
+ else
112
+ self.image_url = nil
113
+ end
114
+
115
+ if attributes.key?(:'permalink')
116
+ self.permalink = attributes[:'permalink']
117
+ else
118
+ self.permalink = nil
119
+ end
84
120
  end
85
121
 
86
122
  # Show invalid properties with the reasons. Usually used together with valid?
@@ -119,7 +155,10 @@ module Zernio
119
155
  return true if self.equal?(o)
120
156
  self.class == o.class &&
121
157
  id == o.id &&
122
- platform_post_id == o.platform_post_id
158
+ platform_post_id == o.platform_post_id &&
159
+ content == o.content &&
160
+ image_url == o.image_url &&
161
+ permalink == o.permalink
123
162
  end
124
163
 
125
164
  # @see the `==` method
@@ -131,7 +170,7 @@ module Zernio
131
170
  # Calculates hash code according to all attributes.
132
171
  # @return [Integer] Hash code
133
172
  def hash
134
- [id, platform_post_id].hash
173
+ [id, platform_post_id, content, image_url, permalink].hash
135
174
  end
136
175
 
137
176
  # Builds the object from hash
@@ -11,5 +11,5 @@ Generator version: 7.19.0
11
11
  =end
12
12
 
13
13
  module Zernio
14
- VERSION = '0.0.706'
14
+ VERSION = '0.0.708'
15
15
  end
data/lib/zernio-sdk.rb CHANGED
@@ -100,6 +100,7 @@ require 'zernio-sdk/models/bookmark_post200_response'
100
100
  require 'zernio-sdk/models/bookmark_post_request'
101
101
  require 'zernio-sdk/models/boost_post_request'
102
102
  require 'zernio-sdk/models/boost_post_request_budget'
103
+ require 'zernio-sdk/models/boost_post_request_platform_specific_data'
103
104
  require 'zernio-sdk/models/boost_post_request_schedule'
104
105
  require 'zernio-sdk/models/boost_post_request_targeting'
105
106
  require 'zernio-sdk/models/boost_post_request_targeting_cities_inner'
@@ -462,6 +463,9 @@ require 'zernio-sdk/models/get_ad_tracking_tags200_response'
462
463
  require 'zernio-sdk/models/get_ad_tree200_response'
463
464
  require 'zernio-sdk/models/get_ads_activity_log200_response'
464
465
  require 'zernio-sdk/models/get_ads_activity_log200_response_paging'
466
+ require 'zernio-sdk/models/get_ads_search_terms200_response'
467
+ require 'zernio-sdk/models/get_ads_search_terms200_response_data_inner'
468
+ require 'zernio-sdk/models/get_ads_search_terms200_response_paging'
465
469
  require 'zernio-sdk/models/get_ads_timeline200_response'
466
470
  require 'zernio-sdk/models/get_ads_timeline200_response_rows_inner'
467
471
  require 'zernio-sdk/models/get_all_accounts_health200_response'
@@ -999,6 +1003,7 @@ require 'zernio-sdk/models/lookup_sms_number200_response'
999
1003
  require 'zernio-sdk/models/mark_conversation_read200_response'
1000
1004
  require 'zernio-sdk/models/media_item'
1001
1005
  require 'zernio-sdk/models/media_upload_response'
1006
+ require 'zernio-sdk/models/meta_ads_platform_data'
1002
1007
  require 'zernio-sdk/models/meta_lead_form_platform_data'
1003
1008
  require 'zernio-sdk/models/meta_lead_form_platform_data_context_card'
1004
1009
  require 'zernio-sdk/models/money'
data/openapi.yaml CHANGED
@@ -2829,7 +2829,7 @@ components:
2829
2829
  description: 'Source URL (from attachment.url). For GIFs this is an l.facebook.com redirect.'
2830
2830
  post:
2831
2831
  type: object
2832
- required: [id, platformPostId]
2832
+ required: [id, platformPostId, content, imageUrl, permalink]
2833
2833
  properties:
2834
2834
  id:
2835
2835
  type: [string, "null"]
@@ -2837,6 +2837,15 @@ components:
2837
2837
  platformPostId:
2838
2838
  type: string
2839
2839
  description: Platform's post ID
2840
+ content:
2841
+ type: [string, "null"]
2842
+ description: 'Post text, from our synced copy — no platform call is made on the comment path, so null when the post was never synced.'
2843
+ imageUrl:
2844
+ type: [string, "null"]
2845
+ description: 'Post thumbnail or first media item URL. Platform CDN URLs expire, fetch promptly.'
2846
+ permalink:
2847
+ type: [string, "null"]
2848
+ description: 'Public URL of the post. Null for posts published through Zernio that were never re-synced.'
2840
2849
  account:
2841
2850
  type: object
2842
2851
  required: [id, platform, username]
@@ -4917,6 +4926,14 @@ components:
4917
4926
  amount: { type: string, description: "Amount as a decimal string, e.g. \"88.59\"." }
4918
4927
  currencyCode: { type: string, description: "ISO 4217 currency code, e.g. \"USD\"." }
4919
4928
 
4929
+ MetaAdsPlatformData:
4930
+ type: object
4931
+ additionalProperties: false
4932
+ description: 'Meta (facebook/instagram) options for platformSpecificData on POST /v1/ads/boost and /v1/ads/create. Unknown keys are rejected, not dropped.'
4933
+ properties:
4934
+ bidStrategy: { $ref: '#/components/schemas/BidStrategy' }
4935
+ bidAmount: { type: number, description: "Whole currency units (USD: 5 = $5.00). Required when bidStrategy is LOWEST_COST_WITH_BID_CAP or COST_CAP." }
4936
+ roasAverageFloor: { type: number, description: "Decimal ROAS multiplier (2.0 = 2.0x). Required when bidStrategy is LOWEST_COST_WITH_MIN_ROAS." }
4920
4937
  LinkedInAdsPlatformData:
4921
4938
  type: object
4922
4939
  additionalProperties: false
@@ -20590,6 +20607,10 @@ paths:
20590
20607
  - `unavailable` — story has expired and we never received its webhook
20591
20608
  payload (for example, the account connected after the story expired)
20592
20609
 
20610
+ Meta can report an expired story as an empty successful result rather
20611
+ than an error, so an expired story resolves to `cached` or `unavailable`
20612
+ even though the upstream request itself succeeded.
20613
+
20593
20614
  Field semantics follow Meta's API. Counts below 5 may be returned as 0
20594
20615
  due to Meta's privacy floor on small audiences. The `navigation` field
20595
20616
  is the sum of `tapsForward + tapsBack + exits + swipesForward`.
@@ -20643,6 +20664,7 @@ paths:
20643
20664
  '400': { description: Invalid request. }
20644
20665
  '401': { $ref: '#/components/responses/Unauthorized' }
20645
20666
  '404': { description: Instagram account not found. }
20667
+ '502': { description: 'Instagram rejected the request.' }
20646
20668
 
20647
20669
  /v1/accounts/{accountId}/pinterest-boards:
20648
20670
  get:
@@ -36818,6 +36840,64 @@ paths:
36818
36840
  '403':
36819
36841
  description: Ads access required. Legacy plans need the Ads add-on; included by default on usage-based plans.
36820
36842
 
36843
+ /v1/ads/search-terms:
36844
+ get:
36845
+ x-resource-group: "ads"
36846
+ operationId: getAdsSearchTerms
36847
+ tags: ["Ad Insights"]
36848
+ x-platforms: ["google"]
36849
+ summary: Google Ads search terms report
36850
+ description: |-
36851
+ The actual search queries that triggered your ads, with matched-keyword
36852
+ status and spend metrics — the raw material for wasted-spend analysis and
36853
+ negative-keyword lists. Reads Google's `search_term_view` live; defaults
36854
+ to the last 30 days. Rows are ordered by cost, descending. Draws on the
36855
+ shared Google Ads operations budget.
36856
+ security:
36857
+ - bearerAuth: []
36858
+ parameters:
36859
+ - { name: accountId, in: query, required: true, schema: { type: string }, description: "Google ads SocialAccount id." }
36860
+ - { name: customerId, in: query, schema: { type: string }, description: "Numeric Google Ads customer id (no dashes). Defaults to the account's connected customer." }
36861
+ - { name: fromDate, in: query, schema: { type: string, format: date }, description: "Defaults to 30 days ago." }
36862
+ - { name: toDate, in: query, schema: { type: string, format: date }, description: "Defaults to today." }
36863
+ - { name: campaignId, in: query, schema: { type: string }, description: "Numeric Google campaign id filter." }
36864
+ - { name: adGroupId, in: query, schema: { type: string }, description: "Numeric Google ad group id filter." }
36865
+ - { name: pageToken, in: query, schema: { type: string }, description: "Cursor from paging.nextPageToken of the previous page." }
36866
+ responses:
36867
+ '200':
36868
+ description: Search terms
36869
+ content:
36870
+ application/json:
36871
+ schema:
36872
+ type: object
36873
+ properties:
36874
+ customerId: { type: string }
36875
+ data:
36876
+ type: array
36877
+ items:
36878
+ type: object
36879
+ properties:
36880
+ searchTerm: { type: [string, "null"] }
36881
+ status: { type: [string, "null"], description: "ADDED / EXCLUDED / ADDED_EXCLUDED / NONE — whether the term is already a keyword or a negative." }
36882
+ matchType: { type: [string, "null"], description: "How the term matched (BROAD, PHRASE, EXACT, NEAR_PHRASE, NEAR_EXACT)." }
36883
+ campaignId: { type: [string, "null"] }
36884
+ campaignName: { type: [string, "null"] }
36885
+ adGroupId: { type: [string, "null"] }
36886
+ adGroupName: { type: [string, "null"] }
36887
+ impressions: { type: integer }
36888
+ clicks: { type: integer }
36889
+ costMicros: { type: integer, description: "Cost in micros of the account currency (divide by 1,000,000)." }
36890
+ conversions: { type: number }
36891
+ conversionsValue: { type: number }
36892
+ paging:
36893
+ type: object
36894
+ properties:
36895
+ nextPageToken: { type: [string, "null"], description: "Null when the last page was returned." }
36896
+ '400': { $ref: '#/components/responses/BadRequest' }
36897
+ '401': { $ref: '#/components/responses/Unauthorized' }
36898
+ '429': { description: "Google Ads operations budget exhausted; retry later." }
36899
+ '501': { description: Only available on Google Ads accounts }
36900
+
36821
36901
  /v1/ads/keywords:
36822
36902
  get:
36823
36903
  x-resource-group: "ads"
@@ -40003,18 +40083,27 @@ paths:
40003
40083
  as `targeting_automation`.
40004
40084
  bidStrategy:
40005
40085
  allOf: [{ $ref: '#/components/schemas/BidStrategy' }]
40086
+ deprecated: true
40006
40087
  description: |
40088
+ Deprecated: send it inside `platformSpecificData` instead (Meta today; TikTok's nested shape is planned). The flat field keeps working during the deprecation window; sending both shapes returns a 400.
40089
+
40007
40090
  Meta bid strategy applied to the ad set. On TikTok, mapped to
40008
40091
  `bid_type` / `bid_price` / `deep_bid_type` automatically.
40009
40092
  bidAmount:
40010
40093
  type: number
40094
+ deprecated: true
40011
40095
  description: |
40096
+ Deprecated: send it inside `platformSpecificData` instead (Meta today; TikTok's nested shape is planned). The flat field keeps working during the deprecation window; sending both shapes returns a 400.
40097
+
40012
40098
  Bid cap in WHOLE currency units (USD: 5 = $5.00; JPY: 100 = ¥100). Required when
40013
40099
  `bidStrategy` is `LOWEST_COST_WITH_BID_CAP` or `COST_CAP`. Backward-compat: providing
40014
40100
  `bidAmount` without `bidStrategy` is treated as `LOWEST_COST_WITH_BID_CAP`.
40015
40101
  roasAverageFloor:
40016
40102
  type: number
40103
+ deprecated: true
40017
40104
  description: |
40105
+ Deprecated: send it inside `platformSpecificData` instead (Meta today; TikTok's nested shape is planned). The flat field keeps working during the deprecation window; sending both shapes returns a 400.
40106
+
40018
40107
  Minimum ROAS as a decimal multiplier (e.g. 2.0 = 2.0x ROAS). Required when
40019
40108
  `bidStrategy` is `LOWEST_COST_WITH_MIN_ROAS`. Sent to Meta as
40020
40109
  `bid_constraints.roas_average_floor` × 10000 (Meta uses fixed-point integers).
@@ -40022,10 +40111,16 @@ paths:
40022
40111
  description: |
40023
40112
  Platform-specific options. The platform is derived from `accountId`;
40024
40113
  sending options for a different platform returns a 400. LinkedIn
40025
- (campaign bidding and delivery controls) is the only platform with
40026
- options today.
40114
+ (campaign bidding and delivery controls) and Meta (the bid trio)
40115
+ have options today.
40116
+
40117
+ **Meta**: `bidStrategy`, `bidAmount` and `roasAverageFloor` may be
40118
+ sent here instead of at the root — the preferred home going forward.
40119
+ Sending the bid fields in BOTH places returns a 400
40120
+ (`mutually_exclusive_fields`).
40027
40121
  oneOf:
40028
40122
  - $ref: '#/components/schemas/LinkedInAdsPlatformData'
40123
+ - $ref: '#/components/schemas/MetaAdsPlatformData'
40029
40124
  tracking:
40030
40125
  type: object
40031
40126
  description: "Meta only. Tracking specs (pixel, URL tags)."
@@ -40794,15 +40889,25 @@ paths:
40794
40889
  gender: { type: string, enum: [all, male, female], default: all, description: "Restrict the audience by gender. 'male' targets men only, 'female' targets women only, 'all' (default) targets everyone. Applied on Meta, TikTok and Pinterest. Ignored on Google, LinkedIn and X." }
40795
40890
  bidStrategy:
40796
40891
  allOf: [{ $ref: '#/components/schemas/BidStrategy' }]
40797
- description: "Meta bid strategy applied to the ad set."
40892
+ deprecated: true
40893
+ description: |
40894
+ Deprecated: send it inside `platformSpecificData` instead (Meta today; TikTok's nested shape is planned). The flat field keeps working during the deprecation window; sending both shapes returns a 400.
40895
+
40896
+ Meta bid strategy applied to the ad set.
40798
40897
  bidAmount:
40799
40898
  type: number
40899
+ deprecated: true
40800
40900
  description: |
40901
+ Deprecated: send it inside `platformSpecificData` instead (Meta today; TikTok's nested shape is planned). The flat field keeps working during the deprecation window; sending both shapes returns a 400.
40902
+
40801
40903
  Bid cap in WHOLE currency units (USD: 5 = $5.00; JPY: 100 = ¥100). Required when
40802
40904
  `bidStrategy` is `LOWEST_COST_WITH_BID_CAP` or `COST_CAP`.
40803
40905
  roasAverageFloor:
40804
40906
  type: number
40907
+ deprecated: true
40805
40908
  description: |
40909
+ Deprecated: send it inside `platformSpecificData` instead (Meta today; TikTok's nested shape is planned). The flat field keeps working during the deprecation window; sending both shapes returns a 400.
40910
+
40806
40911
  Minimum ROAS as a decimal multiplier (e.g. 2.0 = 2.0x ROAS). Required when
40807
40912
  `bidStrategy` is `LOWEST_COST_WITH_MIN_ROAS`. Sent to Meta as
40808
40913
  `bid_constraints.roas_average_floor` × 10000.
@@ -40835,10 +40940,16 @@ paths:
40835
40940
  description: |
40836
40941
  Platform-specific options. The platform is derived from `accountId`;
40837
40942
  sending options for a different platform returns a 400. LinkedIn
40838
- (campaign bidding and delivery controls) is the only platform with
40839
- options today.
40943
+ (campaign bidding and delivery controls) and Meta (the bid trio)
40944
+ have options today.
40945
+
40946
+ **Meta**: `bidStrategy`, `bidAmount` and `roasAverageFloor` may be
40947
+ sent here instead of at the root — the preferred home going forward.
40948
+ Sending the bid fields in BOTH places returns a 400
40949
+ (`mutually_exclusive_fields`).
40840
40950
  oneOf:
40841
40951
  - $ref: '#/components/schemas/LinkedInAdsPlatformData'
40952
+ - $ref: '#/components/schemas/MetaAdsPlatformData'
40842
40953
  dsaBeneficiary:
40843
40954
  type: string
40844
40955
  maxLength: 100
@@ -98,6 +98,24 @@ describe 'AdInsightsApi' do
98
98
  end
99
99
  end
100
100
 
101
+ # unit tests for get_ads_search_terms
102
+ # Google Ads search terms report
103
+ # The actual search queries that triggered your ads, with matched-keyword status and spend metrics — the raw material for wasted-spend analysis and negative-keyword lists. Reads Google&#39;s &#x60;search_term_view&#x60; live; defaults to the last 30 days. Rows are ordered by cost, descending. Draws on the shared Google Ads operations budget.
104
+ # @param account_id Google ads SocialAccount id.
105
+ # @param [Hash] opts the optional parameters
106
+ # @option opts [String] :customer_id Numeric Google Ads customer id (no dashes). Defaults to the account&#39;s connected customer.
107
+ # @option opts [Date] :from_date Defaults to 30 days ago.
108
+ # @option opts [Date] :to_date Defaults to today.
109
+ # @option opts [String] :campaign_id Numeric Google campaign id filter.
110
+ # @option opts [String] :ad_group_id Numeric Google ad group id filter.
111
+ # @option opts [String] :page_token Cursor from paging.nextPageToken of the previous page.
112
+ # @return [GetAdsSearchTerms200Response]
113
+ describe 'get_ads_search_terms test' do
114
+ it 'should work' do
115
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
116
+ end
117
+ end
118
+
101
119
  # unit tests for get_campaign_analytics
102
120
  # Get campaign analytics
103
121
  # Returns performance analytics for a whole campaign in one call: summary metrics, a daily timeline over the requested date range (summed across the campaign&#39;s ads), and optional demographic breakdowns. Breakdowns are fetched live from Meta at the campaign level (one call per dimension, no per-ad fan-out), so an agency dashboard gets campaign-level age/gender/etc. without summing thousands of per-ad reads. &#x60;campaignId&#x60; is the platform campaign id; pass &#x60;platform&#x60; when a campaign id could be ambiguous across platforms. If no date range is provided, defaults to the last 90 days. Date range is capped at 730 days max.
@@ -46,7 +46,7 @@ describe 'InstagramApi' do
46
46
 
47
47
  # unit tests for get_instagram_story_insights
48
48
  # Get Instagram story insights
49
- # Returns metrics for a single story. The &#x60;source&#x60; field discriminates between three states: - &#x60;live&#x60; — fetched from Meta in real time (story is still active) - &#x60;cached&#x60; — fetched from a persisted &#x60;story_insights&#x60; webhook payload (story has expired but we received its final-state metrics from Meta) - &#x60;unavailable&#x60; — story has expired and we never received its webhook payload (for example, the account connected after the story expired) Field semantics follow Meta&#39;s API. Counts below 5 may be returned as 0 due to Meta&#39;s privacy floor on small audiences. The &#x60;navigation&#x60; field is the sum of &#x60;tapsForward + tapsBack + exits + swipesForward&#x60;.
49
+ # Returns metrics for a single story. The &#x60;source&#x60; field discriminates between three states: - &#x60;live&#x60; — fetched from Meta in real time (story is still active) - &#x60;cached&#x60; — fetched from a persisted &#x60;story_insights&#x60; webhook payload (story has expired but we received its final-state metrics from Meta) - &#x60;unavailable&#x60; — story has expired and we never received its webhook payload (for example, the account connected after the story expired) Meta can report an expired story as an empty successful result rather than an error, so an expired story resolves to &#x60;cached&#x60; or &#x60;unavailable&#x60; even though the upstream request itself succeeded. Field semantics follow Meta&#39;s API. Counts below 5 may be returned as 0 due to Meta&#39;s privacy floor on small audiences. The &#x60;navigation&#x60; field is the sum of &#x60;tapsForward + tapsBack + exits + swipesForward&#x60;.
50
50
  # @param account_id The Instagram account ID
51
51
  # @param story_id The Instagram media ID of the story.
52
52
  # @param [Hash] opts the optional parameters
@@ -0,0 +1,32 @@
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::BoostPostRequestPlatformSpecificData
18
+ # Automatically generated by openapi-generator (https://openapi-generator.tech)
19
+ # Please update as you see appropriate
20
+ describe Zernio::BoostPostRequestPlatformSpecificData do
21
+ describe '.openapi_one_of' do
22
+ it 'lists the items referenced in the oneOf array' do
23
+ expect(described_class.openapi_one_of).to_not be_empty
24
+ end
25
+ end
26
+
27
+ describe '.build' do
28
+ it 'returns the correct model' do
29
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
30
+ end
31
+ end
32
+ end