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 +4 -4
- data/docs/AdCampaignsApi.md +1 -1
- data/docs/CreateStandaloneAdRequest.md +3 -3
- data/docs/CreateStandaloneAdRequestPlacementAssetsRulesInner.md +6 -0
- data/lib/zernio-sdk/api/ad_campaigns_api.rb +2 -2
- data/lib/zernio-sdk/models/create_standalone_ad_request.rb +3 -3
- data/lib/zernio-sdk/models/create_standalone_ad_request_placement_assets.rb +1 -1
- data/lib/zernio-sdk/models/create_standalone_ad_request_placement_assets_rules_inner.rb +106 -1
- data/lib/zernio-sdk/version.rb +1 -1
- data/openapi.yaml +49 -12
- data/spec/api/ad_campaigns_api_spec.rb +1 -1
- data/spec/models/create_standalone_ad_request_placement_assets_rules_inner_spec.rb +18 -0
- data/zernio-sdk-0.0.922.gem +0 -0
- metadata +2 -2
- data/zernio-sdk-0.0.920.gem +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3696a6b4e2830a3c0f8e3d9b3730becc79213b1a02fa5a40e8e48d77864343ca
|
|
4
|
+
data.tar.gz: f3ec52812cbc292bd668c6356abc96686d17a1e607782f65c135a7e01784ecab
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 51301be5a93bf80e7d2c006a93802eef7574dfe5eb5d0818edeae515d98baad90b3d6cbd27861aa1f71092b57a751107fd75ddce62329a7b11328d40c84848ce
|
|
7
|
+
data.tar.gz: 845950536dbdc1998a128fd8ae289625f396a6e3aa5e69979924c84fa9c471aa21c3bd1bd1fb7f86383f09c4083914702d6ff83d7f75cd786ec1bd9d105ae198
|
data/docs/AdCampaignsApi.md
CHANGED
|
@@ -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[]
|
|
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
|
data/lib/zernio-sdk/version.rb
CHANGED
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:
|
|
44007
|
-
budget: { amount:
|
|
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[]
|
|
51600
|
-
|
|
51601
|
-
|
|
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
|
-
|
|
51605
|
-
|
|
51606
|
-
|
|
51607
|
-
|
|
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 `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`.
|
|
575
|
+
# 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`.
|
|
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.
|
|
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.
|
|
6358
|
+
- zernio-sdk-0.0.922.gem
|
|
6359
6359
|
- zernio-sdk.gemspec
|
|
6360
6360
|
homepage: https://openapi-generator.tech
|
|
6361
6361
|
licenses:
|
data/zernio-sdk-0.0.920.gem
DELETED
|
Binary file
|