late-sdk 0.0.920 → 0.0.922

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: 3696a6b4e2830a3c0f8e3d9b3730becc79213b1a02fa5a40e8e48d77864343ca
4
+ data.tar.gz: f3ec52812cbc292bd668c6356abc96686d17a1e607782f65c135a7e01784ecab
5
5
  SHA512:
6
- metadata.gz: 96c3456acb147bca85978b4f2ca9ac4d9d6003d57f586ffd75f86ca20ae7e7291af33a688efc45e084a876a26eea3031701db20206d4b6172ce11976da4b544d
7
- data.tar.gz: 742671702d09b3f84b24be024bd2563289b3ea4c6a6b5951010aa210522882eb50d5dc216c6acc02847f267c3f13ee2447597e052608b548fe3b5de52bd03e86
6
+ metadata.gz: 51301be5a93bf80e7d2c006a93802eef7574dfe5eb5d0818edeae515d98baad90b3d6cbd27861aa1f71092b57a751107fd75ddce62329a7b11328d40c84848ce
7
+ data.tar.gz: 845950536dbdc1998a128fd8ae289625f396a6e3aa5e69979924c84fa9c471aa21c3bd1bd1fb7f86383f09c4083914702d6ff83d7f75cd786ec1bd9d105ae198
@@ -2844,7 +2844,7 @@ end
2844
2844
 
2845
2845
  Update a campaign
2846
2846
 
2847
- Campaign-level edits. Send at least one of `budget`, `bidStrategy`, `portfolioBidStrategyId`, `name` or `platformSpecificData`. An unsupported field is always an error, never a silent drop. | Body field | Meta | Google | Others | |---|---|---|---| | `bidStrategy` | Yes | Yes | 501 | | `bidAmount`, `roasAverageFloor` | 400 (ad-set level) | Yes | 400 | | `portfolioBidStrategyId` | 400 | Yes | 400 | | `budget` (CBO; ABO returns 409) | Yes | Daily only | 501 | | `name` | Yes | 501 | 501 | | `platformSpecificData.spendCap` | Yes | 400 | 400 | | `accountId` (empty campaigns) | Yes | - | - | On Google: `LOWEST_COST_WITHOUT_CAP` = Maximize Conversions, `COST_CAP` + `bidAmount` = Target CPA, `LOWEST_COST_WITH_MIN_ROAS` + `roasAverageFloor` = Target ROAS, `LOWEST_COST_WITH_BID_CAP` + `bidAmount` = Maximize Clicks with a CPC ceiling; `portfolioBidStrategyId` attaches a portfolio strategy instead (exclusive with `bidStrategy`). Setting the standard triplet on a campaign that is currently on a PORTFOLIO strategy is rejected: detach it in Google Ads first, since it is shared across campaigns. Google budget updates read the current budget before mutation. Shared budgets return 409 unless allowSharedBudgetUpdate=true is explicitly supplied, because the change affects every campaign using that budget. Unknown sharing state also returns 409. `accountId` forwards the update straight to Meta for a campaign with zero ads, which would otherwise 404; the response then carries `updated: 0`.
2847
+ Campaign-level edits. Send at least one of `budget`, `bidStrategy`, `portfolioBidStrategyId`, `name` or `platformSpecificData`. An unsupported field is always an error, never a silent drop. | Body field | Meta | Google | Others | |---|---|---|---| | `bidStrategy` | Yes | Yes | 501 | | `bidAmount`, `roasAverageFloor` | 400 (ad-set level) | Yes | 400 | | `portfolioBidStrategyId` | 400 | Yes | 400 | | `budget` (CBO; ABO returns 409) | Yes | Daily only | 501 | | `name` | Yes | 501 | 501 | | `platformSpecificData.spendCap` | Yes | 400 | 400 | | `accountId` (empty campaigns) | Yes | - | - | Meta budget edits check the live campaign budget, so an older local ABO stamp cannot block a CBO campaign. A successful edit repairs local ad budget fields. A live ABO campaign still returns 409 with the ad-set budget endpoint. On Google: `LOWEST_COST_WITHOUT_CAP` = Maximize Conversions, `COST_CAP` + `bidAmount` = Target CPA, `LOWEST_COST_WITH_MIN_ROAS` + `roasAverageFloor` = Target ROAS, `LOWEST_COST_WITH_BID_CAP` + `bidAmount` = Maximize Clicks with a CPC ceiling; `portfolioBidStrategyId` attaches a portfolio strategy instead (exclusive with `bidStrategy`). Setting the standard triplet on a campaign that is currently on a PORTFOLIO strategy is rejected: detach it in Google Ads first, since it is shared across campaigns. Google budget updates read the current budget before mutation. Shared budgets return 409 unless allowSharedBudgetUpdate=true is explicitly supplied, because the change affects every campaign using that budget. Unknown sharing state also returns 409. `accountId` forwards the update straight to Meta for a campaign with zero ads, which would otherwise 404; the response then carries `updated: 0`.
2848
2848
 
2849
2849
  ### Examples
2850
2850
 
@@ -19,18 +19,18 @@
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] |
26
26
  | **campaign_status** | **String** | Meta only. Overrides `status` for the campaign level alone, so you can create a live campaign whose ad set and ad stay paused, or the reverse. Omitted, it follows `status`. | [optional] |
27
- | **budget_level** | **String** | Meta only. Where the budget lives, which selects the Meta budget model: - `adset` (default): ABO (Ad-set Budget Optimization). The budget is set on the ad set. This is the back-compatible behaviour; omit this field to keep it. - `campaign`: CBO (Campaign Budget Optimization / Advantage Campaign Budget). The budget AND `bidStrategy` are set on the CAMPAIGN, and Meta distributes spend across ad sets automatically. Meta requires the budget at exactly one level, never both. Non-Meta platforms ignore this field. Ignored on the attach shape (`adSetId`), which inherits the existing budget. | [optional][default to 'adset'] |
27
+ | **budget_level** | **String** | Meta only. Where the budget lives, which selects the Meta budget model: - `adset` (default): ABO (Ad-set Budget Optimization). The budget is set on the ad set. This is the back-compatible behaviour; omit this field to keep it. - `campaign`: CBO (Campaign Budget Optimization / Advantage Campaign Budget). The budget AND `bidStrategy` are set on the CAMPAIGN, and Meta distributes spend across ad sets automatically. The returned ad stores the applied `budgetLevel` and budget in `campaignBudget` for CBO or `adSetBudget` for ABO. Edit CBO budgets with `PUT /v1/ads/campaigns/{campaignId}` and ABO budgets with `PUT /v1/ads/ad-sets/{adSetId}`. Meta requires the budget at exactly one level, never both. Non-Meta platforms ignore this field. Ignored on the attach shape (`adSetId`), which inherits the existing budget. | [optional][default to 'adset'] |
28
28
  | **currency** | **String** | ISO 4217 currency code matching the ad account's currency (e.g. `USD`). Meta only. Optional: Zernio resolves it from the ad account when omitted. The value selects the minor-unit exponent Zernio converts budget/bid amounts by before calling Meta (most currencies are cents; zero-decimal currencies like JPY/KRW are sent as-is). | [optional] |
29
29
  | **headline** | **String** | Required for Meta, Google, Pinterest, LinkedIn, and OpenAI Ads on legacy + attach shapes (skip for multi-creative; use `creatives[].headline`). Ignored for TikTok and X. Max: Meta=255, Google=30, Pinterest=100, LinkedIn=400, OpenAI=50 (min 3). On LinkedIn this is the ad's headline (the bold text on the creative); for traffic ads it's the link card title. On OpenAI Ads this is the chat card's title. | [optional] |
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
  ```
@@ -2981,7 +2981,7 @@ module Zernio
2981
2981
  end
2982
2982
 
2983
2983
  # Update a campaign
2984
- # Campaign-level edits. Send at least one of `budget`, `bidStrategy`, `portfolioBidStrategyId`, `name` or `platformSpecificData`. An unsupported field is always an error, never a silent drop. | Body field | Meta | Google | Others | |---|---|---|---| | `bidStrategy` | Yes | Yes | 501 | | `bidAmount`, `roasAverageFloor` | 400 (ad-set level) | Yes | 400 | | `portfolioBidStrategyId` | 400 | Yes | 400 | | `budget` (CBO; ABO returns 409) | Yes | Daily only | 501 | | `name` | Yes | 501 | 501 | | `platformSpecificData.spendCap` | Yes | 400 | 400 | | `accountId` (empty campaigns) | Yes | - | - | On Google: `LOWEST_COST_WITHOUT_CAP` = Maximize Conversions, `COST_CAP` + `bidAmount` = Target CPA, `LOWEST_COST_WITH_MIN_ROAS` + `roasAverageFloor` = Target ROAS, `LOWEST_COST_WITH_BID_CAP` + `bidAmount` = Maximize Clicks with a CPC ceiling; `portfolioBidStrategyId` attaches a portfolio strategy instead (exclusive with `bidStrategy`). Setting the standard triplet on a campaign that is currently on a PORTFOLIO strategy is rejected: detach it in Google Ads first, since it is shared across campaigns. Google budget updates read the current budget before mutation. Shared budgets return 409 unless allowSharedBudgetUpdate=true is explicitly supplied, because the change affects every campaign using that budget. Unknown sharing state also returns 409. `accountId` forwards the update straight to Meta for a campaign with zero ads, which would otherwise 404; the response then carries `updated: 0`.
2984
+ # Campaign-level edits. Send at least one of `budget`, `bidStrategy`, `portfolioBidStrategyId`, `name` or `platformSpecificData`. An unsupported field is always an error, never a silent drop. | Body field | Meta | Google | Others | |---|---|---|---| | `bidStrategy` | Yes | Yes | 501 | | `bidAmount`, `roasAverageFloor` | 400 (ad-set level) | Yes | 400 | | `portfolioBidStrategyId` | 400 | Yes | 400 | | `budget` (CBO; ABO returns 409) | Yes | Daily only | 501 | | `name` | Yes | 501 | 501 | | `platformSpecificData.spendCap` | Yes | 400 | 400 | | `accountId` (empty campaigns) | Yes | - | - | Meta budget edits check the live campaign budget, so an older local ABO stamp cannot block a CBO campaign. A successful edit repairs local ad budget fields. A live ABO campaign still returns 409 with the ad-set budget endpoint. On Google: `LOWEST_COST_WITHOUT_CAP` = Maximize Conversions, `COST_CAP` + `bidAmount` = Target CPA, `LOWEST_COST_WITH_MIN_ROAS` + `roasAverageFloor` = Target ROAS, `LOWEST_COST_WITH_BID_CAP` + `bidAmount` = Maximize Clicks with a CPC ceiling; `portfolioBidStrategyId` attaches a portfolio strategy instead (exclusive with `bidStrategy`). Setting the standard triplet on a campaign that is currently on a PORTFOLIO strategy is rejected: detach it in Google Ads first, since it is shared across campaigns. Google budget updates read the current budget before mutation. Shared budgets return 409 unless allowSharedBudgetUpdate=true is explicitly supplied, because the change affects every campaign using that budget. Unknown sharing state also returns 409. `accountId` forwards the update straight to Meta for a campaign with zero ads, which would otherwise 404; the response then carries `updated: 0`.
2985
2985
  # @param campaign_id [String] Platform campaign ID
2986
2986
  # @param update_ad_campaign_request [UpdateAdCampaignRequest]
2987
2987
  # @param [Hash] opts the optional parameters
@@ -2992,7 +2992,7 @@ module Zernio
2992
2992
  end
2993
2993
 
2994
2994
  # Update a campaign
2995
- # Campaign-level edits. Send at least one of `budget`, `bidStrategy`, `portfolioBidStrategyId`, `name` or `platformSpecificData`. An unsupported field is always an error, never a silent drop. | Body field | Meta | Google | Others | |---|---|---|---| | `bidStrategy` | Yes | Yes | 501 | | `bidAmount`, `roasAverageFloor` | 400 (ad-set level) | Yes | 400 | | `portfolioBidStrategyId` | 400 | Yes | 400 | | `budget` (CBO; ABO returns 409) | Yes | Daily only | 501 | | `name` | Yes | 501 | 501 | | `platformSpecificData.spendCap` | Yes | 400 | 400 | | `accountId` (empty campaigns) | Yes | - | - | On Google: `LOWEST_COST_WITHOUT_CAP` = Maximize Conversions, `COST_CAP` + `bidAmount` = Target CPA, `LOWEST_COST_WITH_MIN_ROAS` + `roasAverageFloor` = Target ROAS, `LOWEST_COST_WITH_BID_CAP` + `bidAmount` = Maximize Clicks with a CPC ceiling; `portfolioBidStrategyId` attaches a portfolio strategy instead (exclusive with `bidStrategy`). Setting the standard triplet on a campaign that is currently on a PORTFOLIO strategy is rejected: detach it in Google Ads first, since it is shared across campaigns. Google budget updates read the current budget before mutation. Shared budgets return 409 unless allowSharedBudgetUpdate=true is explicitly supplied, because the change affects every campaign using that budget. Unknown sharing state also returns 409. `accountId` forwards the update straight to Meta for a campaign with zero ads, which would otherwise 404; the response then carries `updated: 0`.
2995
+ # Campaign-level edits. Send at least one of `budget`, `bidStrategy`, `portfolioBidStrategyId`, `name` or `platformSpecificData`. An unsupported field is always an error, never a silent drop. | Body field | Meta | Google | Others | |---|---|---|---| | `bidStrategy` | Yes | Yes | 501 | | `bidAmount`, `roasAverageFloor` | 400 (ad-set level) | Yes | 400 | | `portfolioBidStrategyId` | 400 | Yes | 400 | | `budget` (CBO; ABO returns 409) | Yes | Daily only | 501 | | `name` | Yes | 501 | 501 | | `platformSpecificData.spendCap` | Yes | 400 | 400 | | `accountId` (empty campaigns) | Yes | - | - | Meta budget edits check the live campaign budget, so an older local ABO stamp cannot block a CBO campaign. A successful edit repairs local ad budget fields. A live ABO campaign still returns 409 with the ad-set budget endpoint. On Google: `LOWEST_COST_WITHOUT_CAP` = Maximize Conversions, `COST_CAP` + `bidAmount` = Target CPA, `LOWEST_COST_WITH_MIN_ROAS` + `roasAverageFloor` = Target ROAS, `LOWEST_COST_WITH_BID_CAP` + `bidAmount` = Maximize Clicks with a CPC ceiling; `portfolioBidStrategyId` attaches a portfolio strategy instead (exclusive with `bidStrategy`). Setting the standard triplet on a campaign that is currently on a PORTFOLIO strategy is rejected: detach it in Google Ads first, since it is shared across campaigns. Google budget updates read the current budget before mutation. Shared budgets return 409 unless allowSharedBudgetUpdate=true is explicitly supplied, because the change affects every campaign using that budget. Unknown sharing state also returns 409. `accountId` forwards the update straight to Meta for a campaign with zero ads, which would otherwise 404; the response then carries `updated: 0`.
2996
2996
  # @param campaign_id [String] Platform campaign ID
2997
2997
  # @param update_ad_campaign_request [UpdateAdCampaignRequest]
2998
2998
  # @param [Hash] opts the optional parameters
@@ -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).
@@ -70,7 +70,7 @@ module Zernio
70
70
  # Meta only. Overrides `status` for the campaign level alone, so you can create a live campaign whose ad set and ad stay paused, or the reverse. Omitted, it follows `status`.
71
71
  attr_accessor :campaign_status
72
72
 
73
- # Meta only. Where the budget lives, which selects the Meta budget model: - `adset` (default): ABO (Ad-set Budget Optimization). The budget is set on the ad set. This is the back-compatible behaviour; omit this field to keep it. - `campaign`: CBO (Campaign Budget Optimization / Advantage Campaign Budget). The budget AND `bidStrategy` are set on the CAMPAIGN, and Meta distributes spend across ad sets automatically. Meta requires the budget at exactly one level, never both. Non-Meta platforms ignore this field. Ignored on the attach shape (`adSetId`), which inherits the existing budget.
73
+ # Meta only. Where the budget lives, which selects the Meta budget model: - `adset` (default): ABO (Ad-set Budget Optimization). The budget is set on the ad set. This is the back-compatible behaviour; omit this field to keep it. - `campaign`: CBO (Campaign Budget Optimization / Advantage Campaign Budget). The budget AND `bidStrategy` are set on the CAMPAIGN, and Meta distributes spend across ad sets automatically. The returned ad stores the applied `budgetLevel` and budget in `campaignBudget` for CBO or `adSetBudget` for ABO. Edit CBO budgets with `PUT /v1/ads/campaigns/{campaignId}` and ABO budgets with `PUT /v1/ads/ad-sets/{adSetId}`. Meta requires the budget at exactly one level, never both. Non-Meta platforms ignore this field. Ignored on the attach shape (`adSetId`), which inherits the existing budget.
74
74
  attr_accessor :budget_level
75
75
 
76
76
  # ISO 4217 currency code matching the ad account's currency (e.g. `USD`). Meta only. Optional: Zernio resolves it from the ad account when omitted. The value selects the minor-unit exponent Zernio converts budget/bid amounts by before calling Meta (most currencies are cents; zero-decimal currencies like JPY/KRW are sent as-is).
@@ -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.922'
15
15
  end
data/openapi.yaml CHANGED
@@ -43954,6 +43954,10 @@ paths:
43954
43954
  | `platformSpecificData.spendCap` | Yes | 400 | 400 |
43955
43955
  | `accountId` (empty campaigns) | Yes | - | - |
43956
43956
 
43957
+ Meta budget edits check the live campaign budget, so an older local ABO stamp
43958
+ cannot block a CBO campaign. A successful edit repairs local ad budget fields.
43959
+ A live ABO campaign still returns 409 with the ad-set budget endpoint.
43960
+
43957
43961
  On Google: `LOWEST_COST_WITHOUT_CAP` = Maximize Conversions, `COST_CAP` +
43958
43962
  `bidAmount` = Target CPA, `LOWEST_COST_WITH_MIN_ROAS` + `roasAverageFloor` =
43959
43963
  Target ROAS, `LOWEST_COST_WITH_BID_CAP` + `bidAmount` = Maximize Clicks with a
@@ -44003,9 +44007,8 @@ paths:
44003
44007
  properties:
44004
44008
  spendCap: { type: [number, "null"], description: "Campaign lifetime spend cap, in the ad account's currency (Meta `spend_cap`). Pass null to remove the cap; 0 is rejected by Meta." }
44005
44009
  example:
44006
- platform: google
44007
- budget: { amount: 5, type: daily }
44008
- allowSharedBudgetUpdate: false
44010
+ platform: facebook
44011
+ budget: { amount: 8, type: daily }
44009
44012
  responses:
44010
44013
  '200':
44011
44014
  description: Campaign updated
@@ -51037,7 +51040,7 @@ paths:
51037
51040
  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
51041
  validateOnly:
51039
51042
  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.'
51043
+ 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
51044
  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
51045
  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
51046
  status:
@@ -51059,6 +51062,10 @@ paths:
51059
51062
  - `campaign`: CBO (Campaign Budget Optimization / Advantage Campaign Budget). The
51060
51063
  budget AND `bidStrategy` are set on the CAMPAIGN, and Meta distributes spend
51061
51064
  across ad sets automatically.
51065
+ The returned ad stores the applied `budgetLevel` and budget in `campaignBudget`
51066
+ for CBO or `adSetBudget` for ABO. Edit CBO budgets with
51067
+ `PUT /v1/ads/campaigns/{campaignId}` and ABO budgets with
51068
+ `PUT /v1/ads/ad-sets/{adSetId}`.
51062
51069
  Meta requires the budget at exactly one level, never both. Non-Meta platforms ignore
51063
51070
  this field. Ignored on the attach shape (`adSetId`), which inherits the existing budget.
51064
51071
  currency: { type: string, minLength: 3, maxLength: 3, description: "ISO 4217 currency code matching the ad account's currency (e.g. `USD`). Meta only. Optional: Zernio resolves it from the ad account when omitted. The value selects the minor-unit exponent Zernio converts budget/bid amounts by before calling Meta (most currencies are cents; zero-decimal currencies like JPY/KRW are sent as-is)." }
@@ -51080,7 +51087,7 @@ paths:
51080
51087
  `body` field is used as the `object_story_spec.link_data.message` (the preview text) and
51081
51088
  `headlines` must also be present. On a video creative the copy lands in
51082
51089
  `video_data.message` / `video_data.title` instead of `link_data`. Mutually exclusive
51083
- with `dynamicCreative`, `placementAssets`, `carouselCards`, and `creatives[]`.
51090
+ with `dynamicCreative`, `placementAssets`, `carouselCards`, and `creatives[]`. For placement-specific copy, use the singular `placementAssets.rules[].body` and `headline` fields instead.
51084
51091
  headlines:
51085
51092
  type: array
51086
51093
  minItems: 1
@@ -51596,20 +51603,36 @@ paths:
51596
51603
  on the legacy single shape AND the attach shape (`adSetId` + placementAssets adds one
51597
51604
  placement-customized ad to an existing ad set, the way to build N per-placement ads
51598
51605
  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
51606
+ with `creatives[]` or top-level `bodies`/`headlines`/`descriptions` arrays. Each rule
51607
+ can override `headline`, `body` and `description` with one string per field. Omitted
51608
+ fields and unmatched placements use the top-level copy; `linkUrl` and `callToAction`
51609
+ remain shared. Zernio emits labelled text with `optimization_type: PLACEMENT`.
51610
+ 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
51611
  `placements` object; Meta enforces co-selection rules and returns an actionable error.
51603
51612
 
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.
51613
+ Meta controls text rendering by placement and format. Validation accepts these fields
51614
+ but does not prove that every field appears in delivery. Preview the ad; put copy that
51615
+ must always be visible into the image or video itself.
51616
+
51617
+ `validateOnly: true` supports all-image placementAssets without uploading or creating
51618
+ anything. Video placement validation remains unsupported because it requires uploads.
51608
51619
 
51609
51620
  A block is all-image OR all-video, never mixed (Meta's asset_feed_spec carries one ad
51610
51621
  format). Image mode: `defaultImageUrl` + `rules[].imageUrl`. Video mode:
51611
51622
  `defaultVideoUrl` + `rules[].videoUrl` (optional `thumbnailUrl`/`defaultThumbnailUrl`
51612
51623
  posters; Meta auto-generates when omitted). Exactly one catch-all default is required.
51624
+ example:
51625
+ defaultImageUrl: 'https://example.com/feed-4x5.jpg'
51626
+ rules:
51627
+ - imageUrl: 'https://example.com/feed-4x5.jpg'
51628
+ headline: 'Build with Zernio'
51629
+ body: 'Schedule social posts from your app.'
51630
+ description: 'One API for your social content.'
51631
+ placements: { publisherPlatforms: [facebook], facebookPositions: [feed] }
51632
+ - imageUrl: 'https://example.com/story-9x16.jpg'
51633
+ headline: 'Your next story'
51634
+ body: 'Bring your social workflow to Zernio.'
51635
+ placements: { publisherPlatforms: [facebook], facebookPositions: [story, facebook_reels] }
51613
51636
  required: [rules]
51614
51637
  properties:
51615
51638
  defaultImageUrl:
@@ -51645,6 +51668,20 @@ paths:
51645
51668
  type: string
51646
51669
  format: uri
51647
51670
  description: "Video mode (optional). Poster image for this rule's video; auto-generated when omitted."
51671
+ headline:
51672
+ type: string
51673
+ minLength: 1
51674
+ maxLength: 255
51675
+ description: "One headline pinned to this rule. Omit to inherit the top-level headline."
51676
+ body:
51677
+ type: string
51678
+ minLength: 1
51679
+ description: "One primary text pinned to this rule. Omit to inherit the top-level body."
51680
+ description:
51681
+ type: string
51682
+ minLength: 1
51683
+ maxLength: 255
51684
+ description: "One link description pinned to this rule. Omit to inherit the top-level description."
51648
51685
  placements:
51649
51686
  type: object
51650
51687
  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."
@@ -572,7 +572,7 @@ describe 'AdCampaignsApi' do
572
572
 
573
573
  # unit tests for update_ad_campaign
574
574
  # Update a campaign
575
- # Campaign-level edits. Send at least one of &#x60;budget&#x60;, &#x60;bidStrategy&#x60;, &#x60;portfolioBidStrategyId&#x60;, &#x60;name&#x60; or &#x60;platformSpecificData&#x60;. An unsupported field is always an error, never a silent drop. | Body field | Meta | Google | Others | |---|---|---|---| | &#x60;bidStrategy&#x60; | Yes | Yes | 501 | | &#x60;bidAmount&#x60;, &#x60;roasAverageFloor&#x60; | 400 (ad-set level) | Yes | 400 | | &#x60;portfolioBidStrategyId&#x60; | 400 | Yes | 400 | | &#x60;budget&#x60; (CBO; ABO returns 409) | Yes | Daily only | 501 | | &#x60;name&#x60; | Yes | 501 | 501 | | &#x60;platformSpecificData.spendCap&#x60; | Yes | 400 | 400 | | &#x60;accountId&#x60; (empty campaigns) | Yes | - | - | On Google: &#x60;LOWEST_COST_WITHOUT_CAP&#x60; &#x3D; Maximize Conversions, &#x60;COST_CAP&#x60; + &#x60;bidAmount&#x60; &#x3D; Target CPA, &#x60;LOWEST_COST_WITH_MIN_ROAS&#x60; + &#x60;roasAverageFloor&#x60; &#x3D; Target ROAS, &#x60;LOWEST_COST_WITH_BID_CAP&#x60; + &#x60;bidAmount&#x60; &#x3D; Maximize Clicks with a CPC ceiling; &#x60;portfolioBidStrategyId&#x60; attaches a portfolio strategy instead (exclusive with &#x60;bidStrategy&#x60;). Setting the standard triplet on a campaign that is currently on a PORTFOLIO strategy is rejected: detach it in Google Ads first, since it is shared across campaigns. Google budget updates read the current budget before mutation. Shared budgets return 409 unless allowSharedBudgetUpdate&#x3D;true is explicitly supplied, because the change affects every campaign using that budget. Unknown sharing state also returns 409. &#x60;accountId&#x60; forwards the update straight to Meta for a campaign with zero ads, which would otherwise 404; the response then carries &#x60;updated: 0&#x60;.
575
+ # Campaign-level edits. Send at least one of &#x60;budget&#x60;, &#x60;bidStrategy&#x60;, &#x60;portfolioBidStrategyId&#x60;, &#x60;name&#x60; or &#x60;platformSpecificData&#x60;. An unsupported field is always an error, never a silent drop. | Body field | Meta | Google | Others | |---|---|---|---| | &#x60;bidStrategy&#x60; | Yes | Yes | 501 | | &#x60;bidAmount&#x60;, &#x60;roasAverageFloor&#x60; | 400 (ad-set level) | Yes | 400 | | &#x60;portfolioBidStrategyId&#x60; | 400 | Yes | 400 | | &#x60;budget&#x60; (CBO; ABO returns 409) | Yes | Daily only | 501 | | &#x60;name&#x60; | Yes | 501 | 501 | | &#x60;platformSpecificData.spendCap&#x60; | Yes | 400 | 400 | | &#x60;accountId&#x60; (empty campaigns) | Yes | - | - | Meta budget edits check the live campaign budget, so an older local ABO stamp cannot block a CBO campaign. A successful edit repairs local ad budget fields. A live ABO campaign still returns 409 with the ad-set budget endpoint. On Google: &#x60;LOWEST_COST_WITHOUT_CAP&#x60; &#x3D; Maximize Conversions, &#x60;COST_CAP&#x60; + &#x60;bidAmount&#x60; &#x3D; Target CPA, &#x60;LOWEST_COST_WITH_MIN_ROAS&#x60; + &#x60;roasAverageFloor&#x60; &#x3D; Target ROAS, &#x60;LOWEST_COST_WITH_BID_CAP&#x60; + &#x60;bidAmount&#x60; &#x3D; Maximize Clicks with a CPC ceiling; &#x60;portfolioBidStrategyId&#x60; attaches a portfolio strategy instead (exclusive with &#x60;bidStrategy&#x60;). Setting the standard triplet on a campaign that is currently on a PORTFOLIO strategy is rejected: detach it in Google Ads first, since it is shared across campaigns. Google budget updates read the current budget before mutation. Shared budgets return 409 unless allowSharedBudgetUpdate&#x3D;true is explicitly supplied, because the change affects every campaign using that budget. Unknown sharing state also returns 409. &#x60;accountId&#x60; forwards the update straight to Meta for a campaign with zero ads, which would otherwise 404; the response then carries &#x60;updated: 0&#x60;.
576
576
  # @param campaign_id Platform campaign ID
577
577
  # @param update_ad_campaign_request
578
578
  # @param [Hash] opts the optional parameters
@@ -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.922
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.922.gem
6359
6359
  - zernio-sdk.gemspec
6360
6360
  homepage: https://openapi-generator.tech
6361
6361
  licenses:
Binary file