late-sdk 0.0.920 → 0.0.921

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: 40e2044e5a7296ed3c98b27ebbe305a8774a0ea47146a6f679d3e31127b2fa11
4
- data.tar.gz: dad4e1e52cd622362f1409fd7f4cf66923e9e45edfd7140d77d05372df23d33b
3
+ metadata.gz: c2aaedfa75a4c777d9f738f8214bb3a852fe60b62381d90f472c94ac56b9682d
4
+ data.tar.gz: 0cc02bb3b55e4270ccace14ead86a773152db32e9bc107e5a03ad477a369a8b7
5
5
  SHA512:
6
- metadata.gz: 96c3456acb147bca85978b4f2ca9ac4d9d6003d57f586ffd75f86ca20ae7e7291af33a688efc45e084a876a26eea3031701db20206d4b6172ce11976da4b544d
7
- data.tar.gz: 742671702d09b3f84b24be024bd2563289b3ea4c6a6b5951010aa210522882eb50d5dc216c6acc02847f267c3f13ee2447597e052608b548fe3b5de52bd03e86
6
+ metadata.gz: 10bfc0b0fe29d20fc5c61ead22103f23b978ae65afa4707494d2bb31ed77e484c570542a7c4b67c0e76e01b67d872b05093ced1c1a709229c7e73371e06012ac
7
+ data.tar.gz: ae57e75a81673466581c38ca7a6357673d1e1af810c22e243ac1a156a9fd76c0baec8fce4a75a723d1b3854de3a7b3b7462a261d482b6f80d2400d6611a0603e
@@ -19,7 +19,7 @@
19
19
  | **promotion** | [**MetaPromotion**](MetaPromotion.md) | | [optional] |
20
20
  | **creative_features** | **Hash<String, String>** | Meta only. Applied to each new creative, including standalone and attach shapes. With creatives[], these are defaults; an item replaces the whole feature map, including an empty map. auto_promotion_tag is an enhancement; an explicit offer uses promotion. | [optional] |
21
21
  | **multi_advertiser** | **String** | Meta only. Multi-advertiser ads: whether Meta may show this ad alongside other advertisers' in one unit. Meta auto-enrols since Aug 2024, so send OPT_OUT to leave. It is a top-level creative field, NOT a `creativeFeatures` key, and Meta rejects it there. | [optional] |
22
- | **validate_only** | **Boolean** | Google Performance Max validates the complete atomic campaign and asset group with no resource creation or local persistence. Google validation still downloads image URLs and consumes quota. On Meta, validates the complete inline campaign, ad set, creative and ad with execution_options validate_only. Nothing is uploaded or created, and validation bypasses Idempotency-Key storage. Supports a single image, existing video.id or existingCreativeId; media pools, new video uploads, creatives[], adSetId and RESERVED buying return 400. Existing campaign or creative nodes are marked skipped. Success returns 200 with per-node results; Meta rejection returns an error. | [optional] |
22
+ | **validate_only** | **Boolean** | Google Performance Max validates the complete atomic campaign and asset group with no resource creation or local persistence. Google validation still downloads image URLs and consumes quota. On Meta, validates the complete inline campaign, ad set, creative and ad with execution_options validate_only. Nothing is uploaded or created, and validation bypasses Idempotency-Key storage. Supports a single image, all-image placementAssets with per-rule copy, existing video.id or existingCreativeId; other media pools, new video uploads, creatives[], adSetId and RESERVED buying return 400. Placement validation uses existing Instagram identities only. Existing campaign or creative nodes are marked skipped. Success returns 200 with per-node results; Meta rejection returns an error. | [optional] |
23
23
  | **budget_amount** | **Float** | Budget in WHOLE currency units (USD: 50 = $50.00), NOT cents. Meta's own Marketing API takes this same number in minor units, so it is an easy and expensive mix-up. Required on legacy, multi-creative and Performance Max shapes. Inherited on attach. OpenAI Ads requires a $1 minimum (its budget is lifetime-only, see budgetType). | [optional] |
24
24
  | **budget_type** | **String** | Required on legacy, multi-creative and Performance Max shapes. Inherited on attach. OpenAI Ads accepts lifetime only (no daily-budget concept on the platform); sending daily returns 422. OpenAI Ads lifetime budgets require `endDate` to give the lifetime cap a spend window. | [optional] |
25
25
  | **status** | **String** | Google Performance Max accepts PAUSED only and always creates a paused campaign. Meta, TikTok, and LinkedIn: publish state of the created entities. Omitted or ACTIVE publishes live (default, back-compat); PAUSED creates them paused so you can review before they spend. On Meta the pause is held on the campaign this call creates, leaving the ad set and ad switched on, so a single PUT /v1/ads/campaigns/{campaignId}/status with `active` brings the whole thing live. It is held at every level instead when the pause cannot rely on the campaign: `existingCampaignId` (that campaign may be running and is never touched) or `campaignStatus: ACTIVE`. On TikTok the whole campaign > ad group > ad hierarchy stays paused. On LinkedIn the whole campaign group, campaign, and creative hierarchy stays PAUSED (intendedStatus PAUSED on each). | [optional] |
@@ -30,7 +30,7 @@
30
30
  | **long_headline** | **String** | Google Display only. Defaults to `headline` if omitted. On LinkedIn, reused as the optional secondary description text on traffic (link) ads; omitted if not provided. | [optional] |
31
31
  | **body** | **String** | Required on legacy + attach shapes. For X this is the tweet text (max 280 chars including a ~24-char URL when `linkUrl` is set). On LinkedIn this is the post commentary (the intro text shown above the ad). On OpenAI Ads this is the chat card's body text. Max: Google=90, Pinterest=500, OpenAI=100. | [optional] |
32
32
  | **description** | **String** | Meta only (facebook/instagram). Link description: the secondary text shown below the headline (Meta's link_data.description; on video creatives mapped to video_data.link_description). When omitted, Meta auto-pulls the destination URL's OpenGraph description. Applies on legacy, attach, and placementAssets shapes; for multi-creative use creatives[].description (this field is the shared fallback). For multi-text variations use `descriptions` (array) instead. | [optional] |
33
- | **bodies** | **Array<String>** | Meta only. Multiple Text Options (Advantage+ Flexible Format): supply 1-5 primary-text variations and Meta optimises delivery across them, WITHOUT enabling full Dynamic Creative (`dynamicCreative`). Uses `optimization_type: DEGREES_OF_FREEDOM` on the asset feed, so multiple ads per ad set are allowed (unlike `dynamicCreative` which is limited to one). Requires `imageUrl` or `video`, `linkUrl`, and `callToAction`. When set, the top-level `body` field is used as the `object_story_spec.link_data.message` (the preview text) and `headlines` must also be present. On a video creative the copy lands in `video_data.message` / `video_data.title` instead of `link_data`. Mutually exclusive with `dynamicCreative`, `placementAssets`, `carouselCards`, and `creatives[]`. | [optional] |
33
+ | **bodies** | **Array<String>** | Meta only. Multiple Text Options (Advantage+ Flexible Format): supply 1-5 primary-text variations and Meta optimises delivery across them, WITHOUT enabling full Dynamic Creative (`dynamicCreative`). Uses `optimization_type: DEGREES_OF_FREEDOM` on the asset feed, so multiple ads per ad set are allowed (unlike `dynamicCreative` which is limited to one). Requires `imageUrl` or `video`, `linkUrl`, and `callToAction`. When set, the top-level `body` field is used as the `object_story_spec.link_data.message` (the preview text) and `headlines` must also be present. On a video creative the copy lands in `video_data.message` / `video_data.title` instead of `link_data`. Mutually exclusive with `dynamicCreative`, `placementAssets`, `carouselCards`, and `creatives[]`. For placement-specific copy, use the singular `placementAssets.rules[].body` and `headline` fields instead. | [optional] |
34
34
  | **headlines** | **Array<String>** | Meta only. Headline variations for Multiple Text Options. Must be sent alongside `bodies`. The top-level `headline` field is used as the `object_story_spec.link_data.name` (`video_data.title` on a video creative). | [optional] |
35
35
  | **descriptions** | **Array<String>** | Meta only. Optional description variations for Multiple Text Options. Sent alongside `bodies` and `headlines`. | [optional] |
36
36
  | **call_to_action** | **String** | Required on legacy + attach shapes for Meta. Honoured on TikTok (passes through to the Spark Ad creative's `call_to_action`) and on LinkedIn (the CTA button on the ad; defaults to LEARN_MORE when `linkUrl` is set). LinkedIn accepts: LEARN_MORE, SIGN_UP, DOWNLOAD, SUBSCRIBE, REGISTER, JOIN, ATTEND, REQUEST_DEMO, VIEW_QUOTE, APPLY, SEE_MORE, SHOP_NOW, BUY_NOW. Ignored by Google, Pinterest, and X. | [optional] |
@@ -7,6 +7,9 @@
7
7
  | **image_url** | **String** | Image mode. The image to deliver for this rule's placements. | [optional] |
8
8
  | **video_url** | **String** | Video mode. The video to deliver for this rule's placements. | [optional] |
9
9
  | **thumbnail_url** | **String** | Video mode (optional). Poster image for this rule's video; auto-generated when omitted. | [optional] |
10
+ | **headline** | **String** | One headline pinned to this rule. Omit to inherit the top-level headline. | [optional] |
11
+ | **body** | **String** | One primary text pinned to this rule. Omit to inherit the top-level body. | [optional] |
12
+ | **description** | **String** | One link description pinned to this rule. Omit to inherit the top-level description. | [optional] |
10
13
  | **placements** | [**CreateStandaloneAdRequestPlacementAssetsRulesInnerPlacements**](CreateStandaloneAdRequestPlacementAssetsRulesInnerPlacements.md) | | |
11
14
 
12
15
  ## Example
@@ -18,6 +21,9 @@ instance = Zernio::CreateStandaloneAdRequestPlacementAssetsRulesInner.new(
18
21
  image_url: null,
19
22
  video_url: null,
20
23
  thumbnail_url: null,
24
+ headline: null,
25
+ body: null,
26
+ description: null,
21
27
  placements: null
22
28
  )
23
29
  ```
@@ -55,7 +55,7 @@ module Zernio
55
55
  # Meta only. Multi-advertiser ads: whether Meta may show this ad alongside other advertisers' in one unit. Meta auto-enrols since Aug 2024, so send OPT_OUT to leave. It is a top-level creative field, NOT a `creativeFeatures` key, and Meta rejects it there.
56
56
  attr_accessor :multi_advertiser
57
57
 
58
- # Google Performance Max validates the complete atomic campaign and asset group with no resource creation or local persistence. Google validation still downloads image URLs and consumes quota. On Meta, validates the complete inline campaign, ad set, creative and ad with execution_options validate_only. Nothing is uploaded or created, and validation bypasses Idempotency-Key storage. Supports a single image, existing video.id or existingCreativeId; media pools, new video uploads, creatives[], adSetId and RESERVED buying return 400. Existing campaign or creative nodes are marked skipped. Success returns 200 with per-node results; Meta rejection returns an error.
58
+ # Google Performance Max validates the complete atomic campaign and asset group with no resource creation or local persistence. Google validation still downloads image URLs and consumes quota. On Meta, validates the complete inline campaign, ad set, creative and ad with execution_options validate_only. Nothing is uploaded or created, and validation bypasses Idempotency-Key storage. Supports a single image, all-image placementAssets with per-rule copy, existing video.id or existingCreativeId; other media pools, new video uploads, creatives[], adSetId and RESERVED buying return 400. Placement validation uses existing Instagram identities only. Existing campaign or creative nodes are marked skipped. Success returns 200 with per-node results; Meta rejection returns an error.
59
59
  attr_accessor :validate_only
60
60
 
61
61
  # Budget in WHOLE currency units (USD: 50 = $50.00), NOT cents. Meta's own Marketing API takes this same number in minor units, so it is an easy and expensive mix-up. Required on legacy, multi-creative and Performance Max shapes. Inherited on attach. OpenAI Ads requires a $1 minimum (its budget is lifetime-only, see budgetType).
@@ -88,7 +88,7 @@ module Zernio
88
88
  # Meta only (facebook/instagram). Link description: the secondary text shown below the headline (Meta's link_data.description; on video creatives mapped to video_data.link_description). When omitted, Meta auto-pulls the destination URL's OpenGraph description. Applies on legacy, attach, and placementAssets shapes; for multi-creative use creatives[].description (this field is the shared fallback). For multi-text variations use `descriptions` (array) instead.
89
89
  attr_accessor :description
90
90
 
91
- # Meta only. Multiple Text Options (Advantage+ Flexible Format): supply 1-5 primary-text variations and Meta optimises delivery across them, WITHOUT enabling full Dynamic Creative (`dynamicCreative`). Uses `optimization_type: DEGREES_OF_FREEDOM` on the asset feed, so multiple ads per ad set are allowed (unlike `dynamicCreative` which is limited to one). Requires `imageUrl` or `video`, `linkUrl`, and `callToAction`. When set, the top-level `body` field is used as the `object_story_spec.link_data.message` (the preview text) and `headlines` must also be present. On a video creative the copy lands in `video_data.message` / `video_data.title` instead of `link_data`. Mutually exclusive with `dynamicCreative`, `placementAssets`, `carouselCards`, and `creatives[]`.
91
+ # Meta only. Multiple Text Options (Advantage+ Flexible Format): supply 1-5 primary-text variations and Meta optimises delivery across them, WITHOUT enabling full Dynamic Creative (`dynamicCreative`). Uses `optimization_type: DEGREES_OF_FREEDOM` on the asset feed, so multiple ads per ad set are allowed (unlike `dynamicCreative` which is limited to one). Requires `imageUrl` or `video`, `linkUrl`, and `callToAction`. When set, the top-level `body` field is used as the `object_story_spec.link_data.message` (the preview text) and `headlines` must also be present. On a video creative the copy lands in `video_data.message` / `video_data.title` instead of `link_data`. Mutually exclusive with `dynamicCreative`, `placementAssets`, `carouselCards`, and `creatives[]`. For placement-specific copy, use the singular `placementAssets.rules[].body` and `headline` fields instead.
92
92
  attr_accessor :bodies
93
93
 
94
94
  # Meta only. Headline variations for Multiple Text Options. Must be sent alongside `bodies`. The top-level `headline` field is used as the `object_story_spec.link_data.name` (`video_data.title` on a video creative).
@@ -14,7 +14,7 @@ require 'date'
14
14
  require 'time'
15
15
 
16
16
  module Zernio
17
- # Meta only. Placement asset customization: pin a SPECIFIC asset (image OR video) to each placement group on a SINGLE ad (e.g. a 9:16 on Stories/Reels and a 4:5 on Feed). The same thing Meta Ads Manager produces with \"different creative per placement\", mapped to the creative's `asset_feed_spec` + `asset_customization_rules`. Deterministic pinning, NOT the auto-optimizing pool of `dynamicCreative` (mutually exclusive). Works on the legacy single shape AND the attach shape (`adSetId` + placementAssets adds one placement-customized ad to an existing ad set, the way to build N per-placement ads sharing one ad set: create the first normally, attach the rest). Cannot be combined with `creatives[]`. Shared copy (headline, body, link, CTA) comes from the top-level single-creative fields since only the asset varies by placement. Each rule's `placements` accepts the same fields as the top-level `placements` object; Meta enforces co-selection rules and returns an actionable error. Note on text rendering: Meta suppresses primary text and headline on fullscreen placements (Stories and Reels) in actual ad delivery; the fields are accepted and the ad publishes, but the copy is not shown to users. For visible copy on those placements, bake the text into the creative image or video itself. A block is all-image OR all-video, never mixed (Meta's asset_feed_spec carries one ad format). Image mode: `defaultImageUrl` + `rules[].imageUrl`. Video mode: `defaultVideoUrl` + `rules[].videoUrl` (optional `thumbnailUrl`/`defaultThumbnailUrl` posters; Meta auto-generates when omitted). Exactly one catch-all default is required.
17
+ # Meta only. Placement asset customization: pin a SPECIFIC asset (image OR video) to each placement group on a SINGLE ad (e.g. a 9:16 on Stories/Reels and a 4:5 on Feed). The same thing Meta Ads Manager produces with \"different creative per placement\", mapped to the creative's `asset_feed_spec` + `asset_customization_rules`. Deterministic pinning, NOT the auto-optimizing pool of `dynamicCreative` (mutually exclusive). Works on the legacy single shape AND the attach shape (`adSetId` + placementAssets adds one placement-customized ad to an existing ad set, the way to build N per-placement ads sharing one ad set: create the first normally, attach the rest). Cannot be combined with `creatives[]` or top-level `bodies`/`headlines`/`descriptions` arrays. Each rule can override `headline`, `body` and `description` with one string per field. Omitted fields and unmatched placements use the top-level copy; `linkUrl` and `callToAction` remain shared. Zernio emits labelled text with `optimization_type: PLACEMENT`. Multiple text options rotating within a placement are not supported by this input. Each rule's `placements` accepts the same fields as the top-level `placements` object; Meta enforces co-selection rules and returns an actionable error. Meta controls text rendering by placement and format. Validation accepts these fields but does not prove that every field appears in delivery. Preview the ad; put copy that must always be visible into the image or video itself. `validateOnly: true` supports all-image placementAssets without uploading or creating anything. Video placement validation remains unsupported because it requires uploads. A block is all-image OR all-video, never mixed (Meta's asset_feed_spec carries one ad format). Image mode: `defaultImageUrl` + `rules[].imageUrl`. Video mode: `defaultVideoUrl` + `rules[].videoUrl` (optional `thumbnailUrl`/`defaultThumbnailUrl` posters; Meta auto-generates when omitted). Exactly one catch-all default is required.
18
18
  class CreateStandaloneAdRequestPlacementAssets < ApiModelBase
19
19
  # Image mode. Catch-all image for any placement no rule matches. Required in image mode (Meta mandates a default rule).
20
20
  attr_accessor :default_image_url
@@ -24,6 +24,15 @@ module Zernio
24
24
  # Video mode (optional). Poster image for this rule's video; auto-generated when omitted.
25
25
  attr_accessor :thumbnail_url
26
26
 
27
+ # One headline pinned to this rule. Omit to inherit the top-level headline.
28
+ attr_accessor :headline
29
+
30
+ # One primary text pinned to this rule. Omit to inherit the top-level body.
31
+ attr_accessor :body
32
+
33
+ # One link description pinned to this rule. Omit to inherit the top-level description.
34
+ attr_accessor :description
35
+
27
36
  attr_accessor :placements
28
37
 
29
38
  # Attribute mapping from ruby-style variable name to JSON key.
@@ -32,6 +41,9 @@ module Zernio
32
41
  :'image_url' => :'imageUrl',
33
42
  :'video_url' => :'videoUrl',
34
43
  :'thumbnail_url' => :'thumbnailUrl',
44
+ :'headline' => :'headline',
45
+ :'body' => :'body',
46
+ :'description' => :'description',
35
47
  :'placements' => :'placements'
36
48
  }
37
49
  end
@@ -52,6 +64,9 @@ module Zernio
52
64
  :'image_url' => :'String',
53
65
  :'video_url' => :'String',
54
66
  :'thumbnail_url' => :'String',
67
+ :'headline' => :'String',
68
+ :'body' => :'String',
69
+ :'description' => :'String',
55
70
  :'placements' => :'CreateStandaloneAdRequestPlacementAssetsRulesInnerPlacements'
56
71
  }
57
72
  end
@@ -90,6 +105,18 @@ module Zernio
90
105
  self.thumbnail_url = attributes[:'thumbnail_url']
91
106
  end
92
107
 
108
+ if attributes.key?(:'headline')
109
+ self.headline = attributes[:'headline']
110
+ end
111
+
112
+ if attributes.key?(:'body')
113
+ self.body = attributes[:'body']
114
+ end
115
+
116
+ if attributes.key?(:'description')
117
+ self.description = attributes[:'description']
118
+ end
119
+
93
120
  if attributes.key?(:'placements')
94
121
  self.placements = attributes[:'placements']
95
122
  else
@@ -102,6 +129,26 @@ module Zernio
102
129
  def list_invalid_properties
103
130
  warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
104
131
  invalid_properties = Array.new
132
+ if !@headline.nil? && @headline.to_s.length > 255
133
+ invalid_properties.push('invalid value for "headline", the character length must be smaller than or equal to 255.')
134
+ end
135
+
136
+ if !@headline.nil? && @headline.to_s.length < 1
137
+ invalid_properties.push('invalid value for "headline", the character length must be greater than or equal to 1.')
138
+ end
139
+
140
+ if !@body.nil? && @body.to_s.length < 1
141
+ invalid_properties.push('invalid value for "body", the character length must be greater than or equal to 1.')
142
+ end
143
+
144
+ if !@description.nil? && @description.to_s.length > 255
145
+ invalid_properties.push('invalid value for "description", the character length must be smaller than or equal to 255.')
146
+ end
147
+
148
+ if !@description.nil? && @description.to_s.length < 1
149
+ invalid_properties.push('invalid value for "description", the character length must be greater than or equal to 1.')
150
+ end
151
+
105
152
  if @placements.nil?
106
153
  invalid_properties.push('invalid value for "placements", placements cannot be nil.')
107
154
  end
@@ -113,10 +160,65 @@ module Zernio
113
160
  # @return true if the model is valid
114
161
  def valid?
115
162
  warn '[DEPRECATED] the `valid?` method is obsolete'
163
+ return false if !@headline.nil? && @headline.to_s.length > 255
164
+ return false if !@headline.nil? && @headline.to_s.length < 1
165
+ return false if !@body.nil? && @body.to_s.length < 1
166
+ return false if !@description.nil? && @description.to_s.length > 255
167
+ return false if !@description.nil? && @description.to_s.length < 1
116
168
  return false if @placements.nil?
117
169
  true
118
170
  end
119
171
 
172
+ # Custom attribute writer method with validation
173
+ # @param [Object] headline Value to be assigned
174
+ def headline=(headline)
175
+ if headline.nil?
176
+ fail ArgumentError, 'headline cannot be nil'
177
+ end
178
+
179
+ if headline.to_s.length > 255
180
+ fail ArgumentError, 'invalid value for "headline", the character length must be smaller than or equal to 255.'
181
+ end
182
+
183
+ if headline.to_s.length < 1
184
+ fail ArgumentError, 'invalid value for "headline", the character length must be greater than or equal to 1.'
185
+ end
186
+
187
+ @headline = headline
188
+ end
189
+
190
+ # Custom attribute writer method with validation
191
+ # @param [Object] body Value to be assigned
192
+ def body=(body)
193
+ if body.nil?
194
+ fail ArgumentError, 'body cannot be nil'
195
+ end
196
+
197
+ if body.to_s.length < 1
198
+ fail ArgumentError, 'invalid value for "body", the character length must be greater than or equal to 1.'
199
+ end
200
+
201
+ @body = body
202
+ end
203
+
204
+ # Custom attribute writer method with validation
205
+ # @param [Object] description Value to be assigned
206
+ def description=(description)
207
+ if description.nil?
208
+ fail ArgumentError, 'description cannot be nil'
209
+ end
210
+
211
+ if description.to_s.length > 255
212
+ fail ArgumentError, 'invalid value for "description", the character length must be smaller than or equal to 255.'
213
+ end
214
+
215
+ if description.to_s.length < 1
216
+ fail ArgumentError, 'invalid value for "description", the character length must be greater than or equal to 1.'
217
+ end
218
+
219
+ @description = description
220
+ end
221
+
120
222
  # Custom attribute writer method with validation
121
223
  # @param [Object] placements Value to be assigned
122
224
  def placements=(placements)
@@ -135,6 +237,9 @@ module Zernio
135
237
  image_url == o.image_url &&
136
238
  video_url == o.video_url &&
137
239
  thumbnail_url == o.thumbnail_url &&
240
+ headline == o.headline &&
241
+ body == o.body &&
242
+ description == o.description &&
138
243
  placements == o.placements
139
244
  end
140
245
 
@@ -147,7 +252,7 @@ module Zernio
147
252
  # Calculates hash code according to all attributes.
148
253
  # @return [Integer] Hash code
149
254
  def hash
150
- [image_url, video_url, thumbnail_url, placements].hash
255
+ [image_url, video_url, thumbnail_url, headline, body, description, placements].hash
151
256
  end
152
257
 
153
258
  # 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.920'
14
+ VERSION = '0.0.921'
15
15
  end
data/openapi.yaml CHANGED
@@ -51037,7 +51037,7 @@ paths:
51037
51037
  description: "Meta only. Multi-advertiser ads: whether Meta may show this ad alongside other advertisers' in one unit. Meta auto-enrols since Aug 2024, so send OPT_OUT to leave. It is a top-level creative field, NOT a `creativeFeatures` key, and Meta rejects it there."
51038
51038
  validateOnly:
51039
51039
  type: boolean
51040
- description: 'Google Performance Max validates the complete atomic campaign and asset group with no resource creation or local persistence. Google validation still downloads image URLs and consumes quota. On Meta, validates the complete inline campaign, ad set, creative and ad with execution_options validate_only. Nothing is uploaded or created, and validation bypasses Idempotency-Key storage. Supports a single image, existing video.id or existingCreativeId; media pools, new video uploads, creatives[], adSetId and RESERVED buying return 400. Existing campaign or creative nodes are marked skipped. Success returns 200 with per-node results; Meta rejection returns an error.'
51040
+ description: 'Google Performance Max validates the complete atomic campaign and asset group with no resource creation or local persistence. Google validation still downloads image URLs and consumes quota. On Meta, validates the complete inline campaign, ad set, creative and ad with execution_options validate_only. Nothing is uploaded or created, and validation bypasses Idempotency-Key storage. Supports a single image, all-image placementAssets with per-rule copy, existing video.id or existingCreativeId; other media pools, new video uploads, creatives[], adSetId and RESERVED buying return 400. Placement validation uses existing Instagram identities only. Existing campaign or creative nodes are marked skipped. Success returns 200 with per-node results; Meta rejection returns an error.'
51041
51041
  budgetAmount: { type: number, description: "Budget in WHOLE currency units (USD: 50 = $50.00), NOT cents. Meta's own Marketing API takes this same number in minor units, so it is an easy and expensive mix-up. Required on legacy, multi-creative and Performance Max shapes. Inherited on attach. OpenAI Ads requires a $1 minimum (its budget is lifetime-only, see budgetType)." }
51042
51042
  budgetType: { type: string, enum: [daily, lifetime], description: "Required on legacy, multi-creative and Performance Max shapes. Inherited on attach. OpenAI Ads accepts lifetime only (no daily-budget concept on the platform); sending daily returns 422. OpenAI Ads lifetime budgets require `endDate` to give the lifetime cap a spend window." }
51043
51043
  status:
@@ -51080,7 +51080,7 @@ paths:
51080
51080
  `body` field is used as the `object_story_spec.link_data.message` (the preview text) and
51081
51081
  `headlines` must also be present. On a video creative the copy lands in
51082
51082
  `video_data.message` / `video_data.title` instead of `link_data`. Mutually exclusive
51083
- with `dynamicCreative`, `placementAssets`, `carouselCards`, and `creatives[]`.
51083
+ with `dynamicCreative`, `placementAssets`, `carouselCards`, and `creatives[]`. For placement-specific copy, use the singular `placementAssets.rules[].body` and `headline` fields instead.
51084
51084
  headlines:
51085
51085
  type: array
51086
51086
  minItems: 1
@@ -51596,20 +51596,36 @@ paths:
51596
51596
  on the legacy single shape AND the attach shape (`adSetId` + placementAssets adds one
51597
51597
  placement-customized ad to an existing ad set, the way to build N per-placement ads
51598
51598
  sharing one ad set: create the first normally, attach the rest). Cannot be combined
51599
- with `creatives[]`. Shared copy (headline, body, link,
51600
- CTA) comes from the top-level single-creative fields since only the asset varies by
51601
- placement. Each rule's `placements` accepts the same fields as the top-level
51599
+ with `creatives[]` or top-level `bodies`/`headlines`/`descriptions` arrays. Each rule
51600
+ can override `headline`, `body` and `description` with one string per field. Omitted
51601
+ fields and unmatched placements use the top-level copy; `linkUrl` and `callToAction`
51602
+ remain shared. Zernio emits labelled text with `optimization_type: PLACEMENT`.
51603
+ Multiple text options rotating within a placement are not supported by this input. Each rule's `placements` accepts the same fields as the top-level
51602
51604
  `placements` object; Meta enforces co-selection rules and returns an actionable error.
51603
51605
 
51604
- Note on text rendering: Meta suppresses primary text and headline on fullscreen
51605
- placements (Stories and Reels) in actual ad delivery; the fields are accepted and
51606
- the ad publishes, but the copy is not shown to users. For visible copy on those
51607
- placements, bake the text into the creative image or video itself.
51606
+ Meta controls text rendering by placement and format. Validation accepts these fields
51607
+ but does not prove that every field appears in delivery. Preview the ad; put copy that
51608
+ must always be visible into the image or video itself.
51609
+
51610
+ `validateOnly: true` supports all-image placementAssets without uploading or creating
51611
+ anything. Video placement validation remains unsupported because it requires uploads.
51608
51612
 
51609
51613
  A block is all-image OR all-video, never mixed (Meta's asset_feed_spec carries one ad
51610
51614
  format). Image mode: `defaultImageUrl` + `rules[].imageUrl`. Video mode:
51611
51615
  `defaultVideoUrl` + `rules[].videoUrl` (optional `thumbnailUrl`/`defaultThumbnailUrl`
51612
51616
  posters; Meta auto-generates when omitted). Exactly one catch-all default is required.
51617
+ example:
51618
+ defaultImageUrl: 'https://example.com/feed-4x5.jpg'
51619
+ rules:
51620
+ - imageUrl: 'https://example.com/feed-4x5.jpg'
51621
+ headline: 'Build with Zernio'
51622
+ body: 'Schedule social posts from your app.'
51623
+ description: 'One API for your social content.'
51624
+ placements: { publisherPlatforms: [facebook], facebookPositions: [feed] }
51625
+ - imageUrl: 'https://example.com/story-9x16.jpg'
51626
+ headline: 'Your next story'
51627
+ body: 'Bring your social workflow to Zernio.'
51628
+ placements: { publisherPlatforms: [facebook], facebookPositions: [story, facebook_reels] }
51613
51629
  required: [rules]
51614
51630
  properties:
51615
51631
  defaultImageUrl:
@@ -51645,6 +51661,20 @@ paths:
51645
51661
  type: string
51646
51662
  format: uri
51647
51663
  description: "Video mode (optional). Poster image for this rule's video; auto-generated when omitted."
51664
+ headline:
51665
+ type: string
51666
+ minLength: 1
51667
+ maxLength: 255
51668
+ description: "One headline pinned to this rule. Omit to inherit the top-level headline."
51669
+ body:
51670
+ type: string
51671
+ minLength: 1
51672
+ description: "One primary text pinned to this rule. Omit to inherit the top-level body."
51673
+ description:
51674
+ type: string
51675
+ minLength: 1
51676
+ maxLength: 255
51677
+ description: "One link description pinned to this rule. Omit to inherit the top-level description."
51648
51678
  placements:
51649
51679
  type: object
51650
51680
  description: "Placements this asset is pinned to. At least one field must be set (an empty rule is invalid; that role is served by the default asset). Same enums as the top-level `placements` object."
@@ -45,6 +45,24 @@ describe Zernio::CreateStandaloneAdRequestPlacementAssetsRulesInner do
45
45
  end
46
46
  end
47
47
 
48
+ describe 'test attribute "headline"' do
49
+ it 'should work' do
50
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
51
+ end
52
+ end
53
+
54
+ describe 'test attribute "body"' do
55
+ it 'should work' do
56
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
57
+ end
58
+ end
59
+
60
+ describe 'test attribute "description"' do
61
+ it 'should work' do
62
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
63
+ end
64
+ end
65
+
48
66
  describe 'test attribute "placements"' do
49
67
  it 'should work' do
50
68
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: late-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.920
4
+ version: 0.0.921
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenAPI-Generator
@@ -6355,7 +6355,7 @@ files:
6355
6355
  - spec/models/you_tube_video_retention_response_retention_curve_inner_spec.rb
6356
6356
  - spec/models/you_tube_video_retention_response_spec.rb
6357
6357
  - spec/spec_helper.rb
6358
- - zernio-sdk-0.0.920.gem
6358
+ - zernio-sdk-0.0.921.gem
6359
6359
  - zernio-sdk.gemspec
6360
6360
  homepage: https://openapi-generator.tech
6361
6361
  licenses:
Binary file