late-sdk 0.0.859 → 0.0.861

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +20 -0
  3. data/docs/AdAccountsApi.md +1 -1
  4. data/docs/AdCampaignsApi.md +304 -6
  5. data/docs/AdInsightsApi.md +1 -1
  6. data/docs/CampaignBidding.md +28 -0
  7. data/docs/CampaignBiddingBidSpec.md +24 -0
  8. data/docs/CampaignBiddingPortfolio.md +20 -0
  9. data/docs/ConversionsApi.md +2 -2
  10. data/docs/CreateAdCampaignRequest.md +5 -3
  11. data/docs/CreateBidStrategy201Response.md +18 -0
  12. data/docs/CreateBidStrategy201ResponseStrategy.md +22 -0
  13. data/docs/CreateBidStrategyRequest.md +28 -0
  14. data/docs/CreateStandaloneAdRequest.md +3 -1
  15. data/docs/GetAdsSearchTerms200Response.md +5 -1
  16. data/docs/GetCampaignBidding200Response.md +30 -0
  17. data/docs/GetCampaignTargeting200Response.md +5 -1
  18. data/docs/ListAccountCallouts200Response.md +5 -1
  19. data/docs/ListAdAccounts200Response.md +5 -1
  20. data/docs/ListBidStrategies200Response.md +26 -0
  21. data/docs/ListCampaignNegativeKeywords200Response.md +5 -1
  22. data/docs/ListConversionActions200Response.md +5 -1
  23. data/docs/PortfolioBidStrategy.md +42 -0
  24. data/docs/UpdateAdCampaign200Response.md +2 -0
  25. data/docs/UpdateAdCampaignRequest.md +3 -1
  26. data/docs/UpdateAdRequestTargeting.md +2 -0
  27. data/docs/UpdateAdRequestTargetingDevicesInner.md +49 -0
  28. data/docs/UpdateAdRequestTargetingDevicesInnerOneOf.md +20 -0
  29. data/docs/UpdateBidStrategy200Response.md +18 -0
  30. data/docs/UpdateBidStrategy200ResponseStrategy.md +18 -0
  31. data/docs/UpdateBidStrategyRequest.md +28 -0
  32. data/docs/UpdateCampaignTargeting200Response.md +7 -1
  33. data/docs/UpdateCampaignTargeting200ResponseDevicesInner.md +22 -0
  34. data/docs/UpdateCampaignTargeting200ResponseLanguagesInner.md +22 -0
  35. data/lib/zernio-sdk/api/ad_accounts_api.rb +2 -2
  36. data/lib/zernio-sdk/api/ad_campaigns_api.rb +312 -12
  37. data/lib/zernio-sdk/api/ad_insights_api.rb +2 -2
  38. data/lib/zernio-sdk/api/conversions_api.rb +4 -4
  39. data/lib/zernio-sdk/models/campaign_bidding.rb +232 -0
  40. data/lib/zernio-sdk/models/campaign_bidding_bid_spec.rb +200 -0
  41. data/lib/zernio-sdk/models/campaign_bidding_portfolio.rb +157 -0
  42. data/lib/zernio-sdk/models/create_ad_campaign_request.rb +37 -6
  43. data/lib/zernio-sdk/models/create_bid_strategy201_response.rb +147 -0
  44. data/lib/zernio-sdk/models/create_bid_strategy201_response_strategy.rb +166 -0
  45. data/lib/zernio-sdk/models/create_bid_strategy_request.rb +289 -0
  46. data/lib/zernio-sdk/models/create_standalone_ad_request.rb +33 -2
  47. data/lib/zernio-sdk/models/get_ads_search_terms200_response.rb +25 -4
  48. data/lib/zernio-sdk/models/get_campaign_bidding200_response.rb +246 -0
  49. data/lib/zernio-sdk/models/get_campaign_targeting200_response.rb +25 -4
  50. data/lib/zernio-sdk/models/list_account_callouts200_response.rb +25 -4
  51. data/lib/zernio-sdk/models/list_ad_accounts200_response.rb +25 -4
  52. data/lib/zernio-sdk/models/list_bid_strategies200_response.rb +189 -0
  53. data/lib/zernio-sdk/models/list_campaign_negative_keywords200_response.rb +25 -4
  54. data/lib/zernio-sdk/models/list_conversion_actions200_response.rb +25 -4
  55. data/lib/zernio-sdk/models/portfolio_bid_strategy.rb +300 -0
  56. data/lib/zernio-sdk/models/update_ad_campaign200_response.rb +11 -1
  57. data/lib/zernio-sdk/models/update_ad_campaign_request.rb +33 -2
  58. data/lib/zernio-sdk/models/update_ad_request_targeting.rb +14 -2
  59. data/lib/zernio-sdk/models/update_ad_request_targeting_devices_inner.rb +104 -0
  60. data/lib/zernio-sdk/models/update_ad_request_targeting_devices_inner_one_of.rb +226 -0
  61. data/lib/zernio-sdk/models/update_bid_strategy200_response.rb +147 -0
  62. data/lib/zernio-sdk/models/update_bid_strategy200_response_strategy.rb +147 -0
  63. data/lib/zernio-sdk/models/update_bid_strategy_request.rb +273 -0
  64. data/lib/zernio-sdk/models/update_campaign_targeting200_response.rb +37 -4
  65. data/lib/zernio-sdk/models/update_campaign_targeting200_response_devices_inner.rb +201 -0
  66. data/lib/zernio-sdk/models/update_campaign_targeting200_response_languages_inner.rb +165 -0
  67. data/lib/zernio-sdk/version.rb +1 -1
  68. data/lib/zernio-sdk.rb +16 -0
  69. data/openapi.yaml +340 -33
  70. data/spec/api/ad_accounts_api_spec.rb +1 -1
  71. data/spec/api/ad_campaigns_api_spec.rb +61 -6
  72. data/spec/api/ad_insights_api_spec.rb +1 -1
  73. data/spec/api/conversions_api_spec.rb +2 -2
  74. data/spec/models/campaign_bidding_bid_spec_spec.rb +54 -0
  75. data/spec/models/campaign_bidding_portfolio_spec.rb +42 -0
  76. data/spec/models/campaign_bidding_spec.rb +70 -0
  77. data/spec/models/create_ad_campaign_request_spec.rb +6 -0
  78. data/spec/models/create_bid_strategy201_response_spec.rb +36 -0
  79. data/spec/models/create_bid_strategy201_response_strategy_spec.rb +48 -0
  80. data/spec/models/create_bid_strategy_request_spec.rb +70 -0
  81. data/spec/models/create_standalone_ad_request_spec.rb +6 -0
  82. data/spec/models/get_ads_search_terms200_response_spec.rb +12 -0
  83. data/spec/models/get_campaign_bidding200_response_spec.rb +76 -0
  84. data/spec/models/get_campaign_targeting200_response_spec.rb +12 -0
  85. data/spec/models/list_account_callouts200_response_spec.rb +12 -0
  86. data/spec/models/list_ad_accounts200_response_spec.rb +12 -0
  87. data/spec/models/list_bid_strategies200_response_spec.rb +60 -0
  88. data/spec/models/list_campaign_negative_keywords200_response_spec.rb +12 -0
  89. data/spec/models/list_conversion_actions200_response_spec.rb +12 -0
  90. data/spec/models/portfolio_bid_strategy_spec.rb +112 -0
  91. data/spec/models/update_ad_campaign200_response_spec.rb +6 -0
  92. data/spec/models/update_ad_campaign_request_spec.rb +6 -0
  93. data/spec/models/update_ad_request_targeting_devices_inner_one_of_spec.rb +46 -0
  94. data/spec/models/update_ad_request_targeting_devices_inner_spec.rb +32 -0
  95. data/spec/models/update_ad_request_targeting_spec.rb +6 -0
  96. data/spec/models/update_bid_strategy200_response_spec.rb +36 -0
  97. data/spec/models/update_bid_strategy200_response_strategy_spec.rb +36 -0
  98. data/spec/models/update_bid_strategy_request_spec.rb +70 -0
  99. data/spec/models/update_campaign_targeting200_response_devices_inner_spec.rb +52 -0
  100. data/spec/models/update_campaign_targeting200_response_languages_inner_spec.rb +48 -0
  101. data/spec/models/update_campaign_targeting200_response_spec.rb +18 -0
  102. data/zernio-sdk-0.0.861.gem +0 -0
  103. metadata +66 -2
  104. data/zernio-sdk-0.0.859.gem +0 -0
@@ -12,9 +12,10 @@
12
12
  | **budget_amount** | **Float** | Campaign-level (CBO) 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. Requires budgetType. | [optional] |
13
13
  | **budget_type** | **String** | | [optional] |
14
14
  | **status** | **String** | | [optional][default to 'PAUSED'] |
15
- | **bid_strategy** | **String** | Campaign bid strategy. Meta stores `bid_strategy` alongside the budget, so this REQUIRES `budgetAmount` + `budgetType` on the same request; sending it without a campaign budget is a 400. A campaign carrying a strategy without its `bid_amount` makes every ad set created under it fail with an error that names the ad set (code 100, subcode 1815857), so the bad state is rejected up front rather than accepted. To bid at ad-set level, set the strategy there instead. | [optional] |
16
- | **bid_amount** | **Float** | Whole currency units (USD: 5 = $5.00). Required for LOWEST_COST_WITH_BID_CAP and COST_CAP; ignored otherwise. Validated here but NOT stored by Meta: the campaign object has no bid_amount field, only bid_strategy lives on it. The amount takes effect once an ad set joins this campaign (existingCampaignId on POST /v1/ads/create) and supplies its own bidAmount there. | [optional] |
15
+ | **bid_strategy** | **String** | Campaign bid strategy. Meta stores `bid_strategy` alongside the budget, so this REQUIRES `budgetAmount` + `budgetType` on the same request; sending it without a campaign budget is a 400. A campaign carrying a strategy without its `bid_amount` makes every ad set created under it fail with an error that names the ad set (code 100, subcode 1815857), so the bad state is rejected up front rather than accepted. To bid at ad-set level on Meta, set the strategy there instead. 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. | [optional] |
16
+ | **bid_amount** | **Float** | Whole currency units (USD: 5 = $5.00). Required for LOWEST_COST_WITH_BID_CAP and COST_CAP; ignored otherwise. On Meta, validated here but NOT stored: the campaign object has no bid_amount field, only bid_strategy lives on it, and the amount takes effect once an ad set joins this campaign (existingCampaignId on POST /v1/ads/create) and supplies its own bidAmount there. On Google, stored directly on the campaign's bidding strategy. | [optional] |
17
17
  | **roas_average_floor** | **Float** | Decimal ROAS multiplier (2.0 = 2.0x). Required for LOWEST_COST_WITH_MIN_ROAS. | [optional] |
18
+ | **portfolio_bid_strategy_id** | **String** | Google only. Attach an existing portfolio bid strategy (numeric id from GET /v1/ads/bid-strategies) to the new campaign instead of a standard one. Exclusive with bidStrategy. | [optional] |
18
19
 
19
20
  ## Example
20
21
 
@@ -32,7 +33,8 @@ instance = Zernio::CreateAdCampaignRequest.new(
32
33
  status: null,
33
34
  bid_strategy: null,
34
35
  bid_amount: null,
35
- roas_average_floor: null
36
+ roas_average_floor: null,
37
+ portfolio_bid_strategy_id: null
36
38
  )
37
39
  ```
38
40
 
@@ -0,0 +1,18 @@
1
+ # Zernio::CreateBidStrategy201Response
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **strategy** | [**CreateBidStrategy201ResponseStrategy**](CreateBidStrategy201ResponseStrategy.md) | | [optional] |
8
+
9
+ ## Example
10
+
11
+ ```ruby
12
+ require 'zernio-sdk'
13
+
14
+ instance = Zernio::CreateBidStrategy201Response.new(
15
+ strategy: null
16
+ )
17
+ ```
18
+
@@ -0,0 +1,22 @@
1
+ # Zernio::CreateBidStrategy201ResponseStrategy
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **customer_id** | **String** | | [optional] |
8
+ | **id** | **String** | Numeric bid strategy id; pass as portfolioBidStrategyId or in the {strategyId} path. | [optional] |
9
+ | **resource_name** | **String** | | [optional] |
10
+
11
+ ## Example
12
+
13
+ ```ruby
14
+ require 'zernio-sdk'
15
+
16
+ instance = Zernio::CreateBidStrategy201ResponseStrategy.new(
17
+ customer_id: null,
18
+ id: null,
19
+ resource_name: null
20
+ )
21
+ ```
22
+
@@ -0,0 +1,28 @@
1
+ # Zernio::CreateBidStrategyRequest
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **account_id** | **String** | Google ads SocialAccount id. | |
8
+ | **customer_id** | **String** | Numeric Google Ads customer id (no dashes). Defaults to the account's connected customer. | [optional] |
9
+ | **name** | **String** | | |
10
+ | **type** | **String** | | |
11
+ | **target_cpa** | **Float** | Required when type is TARGET_CPA, in the account's currency units. | [optional] |
12
+ | **target_roas** | **Float** | Required when type is TARGET_ROAS; a multiplier (2.0 = 2.0x). | [optional] |
13
+
14
+ ## Example
15
+
16
+ ```ruby
17
+ require 'zernio-sdk'
18
+
19
+ instance = Zernio::CreateBidStrategyRequest.new(
20
+ account_id: null,
21
+ customer_id: null,
22
+ name: null,
23
+ type: null,
24
+ target_cpa: null,
25
+ target_roas: null
26
+ )
27
+ ```
28
+
@@ -89,9 +89,10 @@
89
89
  | **advantage_audience** | **Integer** | Meta only. Controls the Advantage audience feature (targeting_automation). 0 = disabled (default), 1 = enabled. Meta Marketing API requires this field on all ad set creation requests. | [optional] |
90
90
  | **attribution_spec** | [**Array<CreateStandaloneAdRequestAttributionSpecInner>**](CreateStandaloneAdRequestAttributionSpecInner.md) | Meta only. Conversion attribution window for the ad set — maps 1:1 to Meta's ad-set `attribution_spec`. Only honored for conversion goals (`conversions`, `lead_generation`, `app_promotion`); ignored for awareness/traffic/engagement. Omit to use Meta's default (`7-day click` + `1-day view`). Meta enforces the valid combinations: `VIEW_THROUGH` only allows `windowDays: 1` (7d/28d view windows were removed Jan 2026); `ENGAGED_VIDEO_VIEW` only `1` and only alongside `VIEW_THROUGH: 1`; `CLICK_THROUGH: 28` only on certain objectives. Invalid combos surface as a Meta 400. Example: `[{ \"eventType\": \"CLICK_THROUGH\", \"windowDays\": 7 }, { \"eventType\": \"VIEW_THROUGH\", \"windowDays\": 1 }]` | [optional] |
91
91
  | **gender** | **String** | Restrict the audience by gender. 'male' targets men only, 'female' targets women only, 'all' (default) targets everyone. Applied on Meta, TikTok and Pinterest. Ignored on Google, LinkedIn and X. | [optional][default to 'all'] |
92
- | **bid_strategy** | [**BidStrategy**](BidStrategy.md) | Deprecated: send it inside `platformSpecificData` instead (Meta today; TikTok's nested shape is planned). The flat field keeps working during the deprecation window; sending both shapes returns a 400. Meta bid strategy applied to the ad set. OpenAI Ads: required on every ad group via this flat field, the only channel it supports (`platformSpecificData` is Meta/LinkedIn-only and returns 400 for OpenAI). No auto-bid option exists; send `LOWEST_COST_WITH_BID_CAP` or `COST_CAP` together with `bidAmount`, omitting it returns 400. | [optional] |
92
+ | **bid_strategy** | [**BidStrategy**](BidStrategy.md) | Deprecated: send it inside `platformSpecificData` instead (Meta today; TikTok's nested shape is planned). The flat field keeps working during the deprecation window; sending both shapes returns a 400. Meta bid strategy applied to the ad set. OpenAI Ads: required on every ad group via this flat field, the only channel it supports (`platformSpecificData` is Meta/LinkedIn-only and returns 400 for OpenAI). No auto-bid option exists; send `LOWEST_COST_WITH_BID_CAP` or `COST_CAP` together with `bidAmount`, omitting it returns 400. Google (not deprecated there, this shared flat field is Google's only shape): applied to the campaign this call creates. 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. Omitted, the campaign falls back to a goal-based default. | [optional] |
93
93
  | **bid_amount** | **Float** | Deprecated: send it inside `platformSpecificData` instead (Meta today; TikTok's nested shape is planned). The flat field keeps working during the deprecation window; sending both shapes returns a 400. Bid cap in WHOLE currency units (USD: 5 = $5.00; JPY: 100 = ¥100). Required when `bidStrategy` is `LOWEST_COST_WITH_BID_CAP` or `COST_CAP`. Meta only: sending `bidAmount` WITHOUT `bidStrategy` requires `existingCampaignId` (400 otherwise), and sets the new ad set's cap under the joined campaign's COST_CAP / LOWEST_COST_WITH_BID_CAP parent. The strategy itself is inherited from the campaign. Restating bidStrategy here is accepted but has no effect on the ad set. Rejected with 400 in `adSetId` attach mode: that shape inherits its cap from the platform. Use `PUT /v1/ads/ad-sets/{adSetId}` there instead. | [optional] |
94
94
  | **roas_average_floor** | **Float** | Deprecated: send it inside `platformSpecificData` instead (Meta today; TikTok's nested shape is planned). The flat field keeps working during the deprecation window; sending both shapes returns a 400. Minimum ROAS as a decimal multiplier (e.g. 2.0 = 2.0x ROAS). Required when `bidStrategy` is `LOWEST_COST_WITH_MIN_ROAS`. Sending it without `bidStrategy` is a 400. Sent to Meta as `bid_constraints.roas_average_floor` × 10000. Known gap: a CBO campaign's ROAS floor lives on the campaign only (set via `POST /v1/ads/campaigns`); there is no supported way to set it while joining a CBO campaign here. | [optional] |
95
+ | **portfolio_bid_strategy_id** | **String** | Google only. Attach an existing portfolio bid strategy (numeric id from GET /v1/ads/bid-strategies) to the new campaign instead of a standard one. Exclusive with bidStrategy. | [optional] |
95
96
  | **value_rule_set_id** | **String** | Meta only (facebook, instagram; other platforms return 400). Value rule set to attach to the new ad set, from `/v1/ads/value-rule-sets`. Attachment is driven by this id, so `valueRulesApplied` is optional alongside it. Rejected with 400 in `adSetId` attach mode: that shape inherits the existing ad set's attachment, so the field would be silently ignored. Use `PUT /v1/ads/ad-sets/{adSetId}` there instead. Ignored (stripped before the ad-set create) when `buyingType` is `RESERVED`: value rules only apply to auction ad sets on `LOWEST_COST_WITHOUT_CAP` or `COST_CAP`, and a Reach & Frequency reservation has no auction bid strategy. Read back with `GET /v1/ads/ad-sets/{adSetId}?fields=value_rule_set_id`; the attachment is not mirrored onto Zernio's ad documents. | [optional] |
96
97
  | **value_rules_applied** | **Boolean** | Meta only (facebook, instagram; other platforms return 400). Optional when attaching, and requires `valueRuleSetId`. `false` is REJECTED here with 400: a newly created ad set has nothing to detach, so detaching lives on `PUT /v1/ads/ad-sets/{adSetId}`. | [optional] |
97
98
  | **platform_specific_data** | [**CreateStandaloneAdRequestPlatformSpecificData**](CreateStandaloneAdRequestPlatformSpecificData.md) | | [optional] |
@@ -196,6 +197,7 @@ instance = Zernio::CreateStandaloneAdRequest.new(
196
197
  bid_strategy: null,
197
198
  bid_amount: null,
198
199
  roas_average_floor: null,
200
+ portfolio_bid_strategy_id: null,
199
201
  value_rule_set_id: null,
200
202
  value_rules_applied: null,
201
203
  platform_specific_data: null,
@@ -7,6 +7,8 @@
7
7
  | **customer_id** | **String** | | [optional] |
8
8
  | **data** | [**Array<GetAdsSearchTerms200ResponseDataInner>**](GetAdsSearchTerms200ResponseDataInner.md) | | [optional] |
9
9
  | **paging** | [**GetAdsSearchTerms200ResponsePaging**](GetAdsSearchTerms200ResponsePaging.md) | | [optional] |
10
+ | **cached_at** | **Time** | When this data was fetched from Google. Null when it was never served from cache. | [optional] |
11
+ | **stale** | **Boolean** | True when Google's daily API quota was exhausted and this is the last successful fetch, not a live read. | [optional] |
10
12
 
11
13
  ## Example
12
14
 
@@ -16,7 +18,9 @@ require 'zernio-sdk'
16
18
  instance = Zernio::GetAdsSearchTerms200Response.new(
17
19
  customer_id: null,
18
20
  data: null,
19
- paging: null
21
+ paging: null,
22
+ cached_at: null,
23
+ stale: null
20
24
  )
21
25
  ```
22
26
 
@@ -0,0 +1,30 @@
1
+ # Zernio::GetCampaignBidding200Response
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **channel** | **String** | campaign.advertising_channel_type. COST_CAP's underlying Google field differs by channel; see bidStrategy on PUT. | [optional] |
8
+ | **bidding_strategy_type** | **String** | Google's raw enum: MAXIMIZE_CONVERSIONS, TARGET_CPA, MAXIMIZE_CONVERSION_VALUE, TARGET_ROAS, TARGET_SPEND, MANUAL_CPC, TARGET_IMPRESSION_SHARE, or another Google adds later. | [optional] |
9
+ | **bid_spec** | [**CampaignBiddingBidSpec**](CampaignBiddingBidSpec.md) | | [optional] |
10
+ | **portfolio** | [**CampaignBiddingPortfolio**](CampaignBiddingPortfolio.md) | | [optional] |
11
+ | **cached_at** | **Time** | When this data was fetched from Google. Null when it was never served from cache. | [optional] |
12
+ | **stale** | **Boolean** | True when Google's daily API quota was exhausted and this is the last successful fetch, not a live read. | [optional] |
13
+ | **campaign_id** | **String** | | [optional] |
14
+
15
+ ## Example
16
+
17
+ ```ruby
18
+ require 'zernio-sdk'
19
+
20
+ instance = Zernio::GetCampaignBidding200Response.new(
21
+ channel: null,
22
+ bidding_strategy_type: null,
23
+ bid_spec: null,
24
+ portfolio: null,
25
+ cached_at: null,
26
+ stale: null,
27
+ campaign_id: null
28
+ )
29
+ ```
30
+
@@ -7,6 +7,8 @@
7
7
  | **devices** | [**Array<GetCampaignTargeting200ResponseDevicesInner>**](GetCampaignTargeting200ResponseDevicesInner.md) | | [optional] |
8
8
  | **locations** | [**Array<GetCampaignTargeting200ResponseLocationsInner>**](GetCampaignTargeting200ResponseLocationsInner.md) | | [optional] |
9
9
  | **languages** | [**Array<GetCampaignTargeting200ResponseLanguagesInner>**](GetCampaignTargeting200ResponseLanguagesInner.md) | | [optional] |
10
+ | **cached_at** | **Time** | When this targeting was fetched from Google. Null when it was never served from cache. | [optional] |
11
+ | **stale** | **Boolean** | True when Google's daily API quota was exhausted and this is the last successful fetch, not a live read. | [optional] |
10
12
 
11
13
  ## Example
12
14
 
@@ -16,7 +18,9 @@ require 'zernio-sdk'
16
18
  instance = Zernio::GetCampaignTargeting200Response.new(
17
19
  devices: null,
18
20
  locations: null,
19
- languages: null
21
+ languages: null,
22
+ cached_at: null,
23
+ stale: null
20
24
  )
21
25
  ```
22
26
 
@@ -6,6 +6,8 @@
6
6
  | ---- | ---- | ----------- | ----- |
7
7
  | **customer_id** | **String** | | [optional] |
8
8
  | **callouts** | [**Array<ListAccountCallouts200ResponseCalloutsInner>**](ListAccountCallouts200ResponseCalloutsInner.md) | | [optional] |
9
+ | **cached_at** | **Time** | When this list was fetched from Google. Null when it was never served from cache. | [optional] |
10
+ | **stale** | **Boolean** | True when Google's daily API quota was exhausted and this is the last successful fetch, not a live read. | [optional] |
9
11
 
10
12
  ## Example
11
13
 
@@ -14,7 +16,9 @@ require 'zernio-sdk'
14
16
 
15
17
  instance = Zernio::ListAccountCallouts200Response.new(
16
18
  customer_id: null,
17
- callouts: null
19
+ callouts: null,
20
+ cached_at: null,
21
+ stale: null
18
22
  )
19
23
  ```
20
24
 
@@ -5,6 +5,8 @@
5
5
  | Name | Type | Description | Notes |
6
6
  | ---- | ---- | ----------- | ----- |
7
7
  | **accounts** | [**Array<ListAdAccounts200ResponseAccountsInner>**](ListAdAccounts200ResponseAccountsInner.md) | | [optional] |
8
+ | **cached_at** | **Time** | Google only. When this list was fetched from Google. Null when it was never served from cache, or on other platforms. | [optional] |
9
+ | **stale** | **Boolean** | Google only. True when Google's daily API quota was exhausted and this is the last successful fetch, not a live read. Absent on other platforms. | [optional] |
8
10
 
9
11
  ## Example
10
12
 
@@ -12,7 +14,9 @@
12
14
  require 'zernio-sdk'
13
15
 
14
16
  instance = Zernio::ListAdAccounts200Response.new(
15
- accounts: null
17
+ accounts: null,
18
+ cached_at: null,
19
+ stale: null
16
20
  )
17
21
  ```
18
22
 
@@ -0,0 +1,26 @@
1
+ # Zernio::ListBidStrategies200Response
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **customer_id** | **String** | | [optional] |
8
+ | **currency** | **String** | Account currency code; money fields are in this currency's units. | [optional] |
9
+ | **strategies** | [**Array<PortfolioBidStrategy>**](PortfolioBidStrategy.md) | | [optional] |
10
+ | **cached_at** | **Time** | When this data was fetched from Google. Null when it was never served from cache. | [optional] |
11
+ | **stale** | **Boolean** | True when Google's daily API quota was exhausted and this is the last successful fetch, not a live read. | [optional] |
12
+
13
+ ## Example
14
+
15
+ ```ruby
16
+ require 'zernio-sdk'
17
+
18
+ instance = Zernio::ListBidStrategies200Response.new(
19
+ customer_id: null,
20
+ currency: null,
21
+ strategies: null,
22
+ cached_at: null,
23
+ stale: null
24
+ )
25
+ ```
26
+
@@ -5,6 +5,8 @@
5
5
  | Name | Type | Description | Notes |
6
6
  | ---- | ---- | ----------- | ----- |
7
7
  | **keywords** | [**Array<ListCampaignNegativeKeywords200ResponseKeywordsInner>**](ListCampaignNegativeKeywords200ResponseKeywordsInner.md) | | [optional] |
8
+ | **cached_at** | **Time** | When this list was fetched from Google. Null when it was never served from cache. | [optional] |
9
+ | **stale** | **Boolean** | True when Google's daily API quota was exhausted and this is the last successful fetch, not a live read. | [optional] |
8
10
 
9
11
  ## Example
10
12
 
@@ -12,7 +14,9 @@
12
14
  require 'zernio-sdk'
13
15
 
14
16
  instance = Zernio::ListCampaignNegativeKeywords200Response.new(
15
- keywords: null
17
+ keywords: null,
18
+ cached_at: null,
19
+ stale: null
16
20
  )
17
21
  ```
18
22
 
@@ -6,6 +6,8 @@
6
6
  | ---- | ---- | ----------- | ----- |
7
7
  | **customer_id** | **String** | The Google Ads customer id the actions were read from. | [optional] |
8
8
  | **actions** | [**Array<ConversionAction>**](ConversionAction.md) | | [optional] |
9
+ | **cached_at** | **Time** | When this list was fetched from Google. Null when it was never served from cache. | [optional] |
10
+ | **stale** | **Boolean** | True when Google's daily API quota was exhausted and this is the last successful fetch, not a live read. | [optional] |
9
11
 
10
12
  ## Example
11
13
 
@@ -14,7 +16,9 @@ require 'zernio-sdk'
14
16
 
15
17
  instance = Zernio::ListConversionActions200Response.new(
16
18
  customer_id: null,
17
- actions: null
19
+ actions: null,
20
+ cached_at: null,
21
+ stale: null
18
22
  )
19
23
  ```
20
24
 
@@ -0,0 +1,42 @@
1
+ # Zernio::PortfolioBidStrategy
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **id** | **String** | Numeric bid strategy id; pass as portfolioBidStrategyId or in the {strategyId} path. | [optional] |
8
+ | **name** | **String** | | [optional] |
9
+ | **type** | **String** | | [optional] |
10
+ | **status** | **String** | ENABLED or REMOVED. | [optional] |
11
+ | **campaign_count** | **Integer** | Number of campaigns currently attached. | [optional] |
12
+ | **clicks** | **Integer** | | [optional] |
13
+ | **cost** | **Float** | Cost in the account's currency units (converted from micros). | [optional] |
14
+ | **cost_per_conversion** | **Float** | Cost per conversion in the account's currency units. | [optional] |
15
+ | **impressions** | **Integer** | | [optional] |
16
+ | **average_cpc** | **Float** | Average CPC in the account's currency units. | [optional] |
17
+ | **conversions** | **Float** | | [optional] |
18
+ | **target_cpa** | **Float** | Current target, in the account's currency units. Null for a ROAS-family type (TARGET_ROAS, MAXIMIZE_CONVERSION_VALUE), or a Maximize type with no target set. Pre-fills the edit form's target field. | [optional] |
19
+ | **target_roas** | **Float** | Current target as a decimal multiplier (2.0 = 2.0x). Null for a CPA-family type (TARGET_CPA, MAXIMIZE_CONVERSIONS), or a Maximize type with no target set. | [optional] |
20
+
21
+ ## Example
22
+
23
+ ```ruby
24
+ require 'zernio-sdk'
25
+
26
+ instance = Zernio::PortfolioBidStrategy.new(
27
+ id: null,
28
+ name: null,
29
+ type: null,
30
+ status: null,
31
+ campaign_count: null,
32
+ clicks: null,
33
+ cost: null,
34
+ cost_per_conversion: null,
35
+ impressions: null,
36
+ average_cpc: null,
37
+ conversions: null,
38
+ target_cpa: null,
39
+ target_roas: null
40
+ )
41
+ ```
42
+
@@ -10,6 +10,7 @@
10
10
  | **bid_strategy** | [**BidStrategy**](BidStrategy.md) | | [optional] |
11
11
  | **bid_amount** | **Float** | | [optional] |
12
12
  | **roas_average_floor** | **Float** | | [optional] |
13
+ | **portfolio_bid_strategy_id** | **String** | Google only. Echoed back, but NOT mirrored onto local Ad documents (no column for it yet). | [optional] |
13
14
  | **platform_specific_data** | **Object** | | [optional] |
14
15
 
15
16
  ## Example
@@ -24,6 +25,7 @@ instance = Zernio::UpdateAdCampaign200Response.new(
24
25
  bid_strategy: null,
25
26
  bid_amount: null,
26
27
  roas_average_floor: null,
28
+ portfolio_bid_strategy_id: null,
27
29
  platform_specific_data: null
28
30
  )
29
31
  ```
@@ -6,9 +6,10 @@
6
6
  | ---- | ---- | ----------- | ----- |
7
7
  | **platform** | **String** | Required: platform campaign IDs are not globally unique. | |
8
8
  | **account_id** | **String** | **Meta only.** Zernio SocialAccount id owning the ad account. Needed only for an EMPTY campaign (zero ads); ignored otherwise. | [optional] |
9
- | **bid_strategy** | [**BidStrategy**](BidStrategy.md) | **Meta + Google.** On Meta, the campaign default that ad sets inherit unless they override it. On Google, the campaign's own bidding strategy. | [optional] |
9
+ | **bid_strategy** | [**BidStrategy**](BidStrategy.md) | **Meta + Google.** On Meta, the campaign default that ad sets inherit unless they override it. On Google, the campaign's own bidding strategy. 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. | [optional] |
10
10
  | **bid_amount** | **Float** | **Google only.** Whole currency units (USD: 12 = $12.00). Max CPC for LOWEST_COST_WITH_BID_CAP, CPA target for COST_CAP; required for both. | [optional] |
11
11
  | **roas_average_floor** | **Float** | **Google only.** Decimal ROAS multiplier (2.0 = 2.0x), required for LOWEST_COST_WITH_MIN_ROAS. | [optional] |
12
+ | **portfolio_bid_strategy_id** | **String** | **Google only.** Attach an existing portfolio bid strategy (numeric id from GET /v1/ads/bid-strategies) instead of setting bidStrategy. Exclusive with bidStrategy. | [optional] |
12
13
  | **budget** | [**UpdateAdCampaignRequestBudget**](UpdateAdCampaignRequestBudget.md) | | [optional] |
13
14
  | **name** | **String** | **Meta only.** Rename the campaign. | [optional] |
14
15
  | **platform_specific_data** | [**UpdateAdCampaignRequestPlatformSpecificData**](UpdateAdCampaignRequestPlatformSpecificData.md) | | [optional] |
@@ -24,6 +25,7 @@ instance = Zernio::UpdateAdCampaignRequest.new(
24
25
  bid_strategy: null,
25
26
  bid_amount: null,
26
27
  roas_average_floor: null,
28
+ portfolio_bid_strategy_id: null,
27
29
  budget: null,
28
30
  name: null,
29
31
  platform_specific_data: null
@@ -6,6 +6,7 @@
6
6
  | ---- | ---- | ----------- | ----- |
7
7
  | **keywords** | [**Array<UpdateAdRequestTargetingKeywordsInner>**](UpdateAdRequestTargetingKeywordsInner.md) | Google only. The FULL new set of positive keywords for the ad group; live keywords not listed are removed. Entries are strings (BROAD) or { text, matchType } with matchType exact | phrase | broad. Mirrored to GET /v1/ads/keywords immediately. | [optional] |
8
8
  | **negative_keywords** | [**Array<UpdateAdRequestTargetingKeywordsInner>**](UpdateAdRequestTargetingKeywordsInner.md) | Google only. Same declarative contract as keywords, for the ad group's negative keywords. | [optional] |
9
+ | **devices** | [**Array<UpdateAdRequestTargetingDevicesInner>**](UpdateAdRequestTargetingDevicesInner.md) | Google only. The FULL new set of device criteria for the campaign; devices not listed are excluded. Entries are a device name alone (included, no bid adjustment) or { device, bidModifier }. | [optional] |
9
10
  | **age_min** | **Integer** | | [optional] |
10
11
  | **age_max** | **Integer** | | [optional] |
11
12
  | **countries** | **Array<String>** | | [optional] |
@@ -20,6 +21,7 @@ require 'zernio-sdk'
20
21
  instance = Zernio::UpdateAdRequestTargeting.new(
21
22
  keywords: null,
22
23
  negative_keywords: null,
24
+ devices: null,
23
25
  age_min: null,
24
26
  age_max: null,
25
27
  countries: null,
@@ -0,0 +1,49 @@
1
+ # Zernio::UpdateAdRequestTargetingDevicesInner
2
+
3
+ ## Class instance methods
4
+
5
+ ### `openapi_one_of`
6
+
7
+ Returns the list of classes defined in oneOf.
8
+
9
+ #### Example
10
+
11
+ ```ruby
12
+ require 'zernio-sdk'
13
+
14
+ Zernio::UpdateAdRequestTargetingDevicesInner.openapi_one_of
15
+ # =>
16
+ # [
17
+ # :'String',
18
+ # :'UpdateAdRequestTargetingDevicesInnerOneOf'
19
+ # ]
20
+ ```
21
+
22
+ ### build
23
+
24
+ Find the appropriate object from the `openapi_one_of` list and casts the data into it.
25
+
26
+ #### Example
27
+
28
+ ```ruby
29
+ require 'zernio-sdk'
30
+
31
+ Zernio::UpdateAdRequestTargetingDevicesInner.build(data)
32
+ # => #<String:0x00007fdd4aab02a0>
33
+
34
+ Zernio::UpdateAdRequestTargetingDevicesInner.build(data_that_doesnt_match)
35
+ # => nil
36
+ ```
37
+
38
+ #### Parameters
39
+
40
+ | Name | Type | Description |
41
+ | ---- | ---- | ----------- |
42
+ | **data** | **Mixed** | data to be matched against the list of oneOf items |
43
+
44
+ #### Return type
45
+
46
+ - `String`
47
+ - `UpdateAdRequestTargetingDevicesInnerOneOf`
48
+ - `nil` (if no type matches)
49
+
@@ -0,0 +1,20 @@
1
+ # Zernio::UpdateAdRequestTargetingDevicesInnerOneOf
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **device** | **String** | | |
8
+ | **bid_modifier** | **Float** | Google device bid modifier, 0.1 to 10 (minus 90% to plus 900%). Omit a device to exclude it. | [optional] |
9
+
10
+ ## Example
11
+
12
+ ```ruby
13
+ require 'zernio-sdk'
14
+
15
+ instance = Zernio::UpdateAdRequestTargetingDevicesInnerOneOf.new(
16
+ device: null,
17
+ bid_modifier: null
18
+ )
19
+ ```
20
+
@@ -0,0 +1,18 @@
1
+ # Zernio::UpdateBidStrategy200Response
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **strategy** | [**UpdateBidStrategy200ResponseStrategy**](UpdateBidStrategy200ResponseStrategy.md) | | [optional] |
8
+
9
+ ## Example
10
+
11
+ ```ruby
12
+ require 'zernio-sdk'
13
+
14
+ instance = Zernio::UpdateBidStrategy200Response.new(
15
+ strategy: null
16
+ )
17
+ ```
18
+
@@ -0,0 +1,18 @@
1
+ # Zernio::UpdateBidStrategy200ResponseStrategy
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **customer_id** | **String** | | [optional] |
8
+
9
+ ## Example
10
+
11
+ ```ruby
12
+ require 'zernio-sdk'
13
+
14
+ instance = Zernio::UpdateBidStrategy200ResponseStrategy.new(
15
+ customer_id: null
16
+ )
17
+ ```
18
+
@@ -0,0 +1,28 @@
1
+ # Zernio::UpdateBidStrategyRequest
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **account_id** | **String** | Google ads SocialAccount id. | |
8
+ | **customer_id** | **String** | Numeric Google Ads customer id (no dashes). Defaults to the account&#39;s connected customer. | [optional] |
9
+ | **name** | **String** | | [optional] |
10
+ | **type** | **String** | | [optional] |
11
+ | **target_cpa** | **Float** | | [optional] |
12
+ | **target_roas** | **Float** | | [optional] |
13
+
14
+ ## Example
15
+
16
+ ```ruby
17
+ require 'zernio-sdk'
18
+
19
+ instance = Zernio::UpdateBidStrategyRequest.new(
20
+ account_id: null,
21
+ customer_id: null,
22
+ name: null,
23
+ type: null,
24
+ target_cpa: null,
25
+ target_roas: null
26
+ )
27
+ ```
28
+
@@ -6,6 +6,9 @@
6
6
  | ---- | ---- | ----------- | ----- |
7
7
  | **campaign_id** | **String** | | [optional] |
8
8
  | **updated** | **Array&lt;String&gt;** | Which targeting fields were applied. | [optional] |
9
+ | **devices** | [**Array&lt;UpdateCampaignTargeting200ResponseDevicesInner&gt;**](UpdateCampaignTargeting200ResponseDevicesInner.md) | | [optional] |
10
+ | **locations** | [**Array&lt;GetCampaignTargeting200ResponseLocationsInner&gt;**](GetCampaignTargeting200ResponseLocationsInner.md) | | [optional] |
11
+ | **languages** | [**Array&lt;UpdateCampaignTargeting200ResponseLanguagesInner&gt;**](UpdateCampaignTargeting200ResponseLanguagesInner.md) | | [optional] |
9
12
 
10
13
  ## Example
11
14
 
@@ -14,7 +17,10 @@ require 'zernio-sdk'
14
17
 
15
18
  instance = Zernio::UpdateCampaignTargeting200Response.new(
16
19
  campaign_id: null,
17
- updated: null
20
+ updated: null,
21
+ devices: null,
22
+ locations: null,
23
+ languages: null
18
24
  )
19
25
  ```
20
26
 
@@ -0,0 +1,22 @@
1
+ # Zernio::UpdateCampaignTargeting200ResponseDevicesInner
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **device** | **String** | | [optional] |
8
+ | **included** | **Boolean** | | [optional] |
9
+ | **bid_modifier** | **Float** | Always null on this read; see GET&#39;s description. | [optional] |
10
+
11
+ ## Example
12
+
13
+ ```ruby
14
+ require 'zernio-sdk'
15
+
16
+ instance = Zernio::UpdateCampaignTargeting200ResponseDevicesInner.new(
17
+ device: null,
18
+ included: null,
19
+ bid_modifier: null
20
+ )
21
+ ```
22
+
@@ -0,0 +1,22 @@
1
+ # Zernio::UpdateCampaignTargeting200ResponseLanguagesInner
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **code** | **String** | | [optional] |
8
+ | **id** | **String** | | [optional] |
9
+ | **name** | **String** | | [optional] |
10
+
11
+ ## Example
12
+
13
+ ```ruby
14
+ require 'zernio-sdk'
15
+
16
+ instance = Zernio::UpdateCampaignTargeting200ResponseLanguagesInner.new(
17
+ code: null,
18
+ id: null,
19
+ name: null
20
+ )
21
+ ```
22
+
@@ -829,7 +829,7 @@ module Zernio
829
829
  end
830
830
 
831
831
  # List account-level callout extensions
832
- # Google Ads compliance row C.75: callout assets linked at the CUSTOMER level via `customer_asset` (not a campaign or ad group), so they serve fleet-wide across the account. Google only; every other platform returns 501. Draws on the shared Google Ads operations budget.
832
+ # Google Ads compliance row C.75: callout assets linked at the CUSTOMER level via `customer_asset` (not a campaign or ad group), so they serve fleet-wide across the account. Google only; every other platform returns 501. Cached for the quota window (10 minutes fresh, up to 7 days last-good), and gated by the shared Google Ads operations budget on a cache miss. The response carries `cachedAt` and `stale`, set when a quota-exhausted call falls back to the last-good copy instead of a live read.
833
833
  # @param account_id [String] Google ads SocialAccount id.
834
834
  # @param [Hash] opts the optional parameters
835
835
  # @option opts [String] :customer_id Numeric Google Ads customer id (no dashes). Defaults to the account&#39;s connected customer.
@@ -840,7 +840,7 @@ module Zernio
840
840
  end
841
841
 
842
842
  # List account-level callout extensions
843
- # Google Ads compliance row C.75: callout assets linked at the CUSTOMER level via &#x60;customer_asset&#x60; (not a campaign or ad group), so they serve fleet-wide across the account. Google only; every other platform returns 501. Draws on the shared Google Ads operations budget.
843
+ # Google Ads compliance row C.75: callout assets linked at the CUSTOMER level via &#x60;customer_asset&#x60; (not a campaign or ad group), so they serve fleet-wide across the account. Google only; every other platform returns 501. Cached for the quota window (10 minutes fresh, up to 7 days last-good), and gated by the shared Google Ads operations budget on a cache miss. The response carries &#x60;cachedAt&#x60; and &#x60;stale&#x60;, set when a quota-exhausted call falls back to the last-good copy instead of a live read.
844
844
  # @param account_id [String] Google ads SocialAccount id.
845
845
  # @param [Hash] opts the optional parameters
846
846
  # @option opts [String] :customer_id Numeric Google Ads customer id (no dashes). Defaults to the account&#39;s connected customer.