late-sdk 0.0.1316 → 0.0.1317

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 (33) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -2
  3. data/docs/AdCampaignsApi.md +10 -10
  4. data/docs/GetCampaignTargeting200Response.md +4 -0
  5. data/docs/GetCampaignTargeting200ResponseExcludedLocationsInner.md +28 -0
  6. data/docs/UpdateCampaignTargeting200Response.md +2 -0
  7. data/docs/UpdateCampaignTargeting200ResponseExcludedLocationsInner.md +28 -0
  8. data/docs/UpdateCampaignTargetingRequestTargeting.md +2 -0
  9. data/docs/UpdateCampaignTargetingRequestTargetingExcludedLocations.md +49 -0
  10. data/docs/UpdateCampaignTargetingRequestTargetingExcludedLocationsOneOf.md +26 -0
  11. data/lib/zernio-sdk/api/ad_campaigns_api.rb +8 -8
  12. data/lib/zernio-sdk/models/get_campaign_targeting200_response.rb +23 -1
  13. data/lib/zernio-sdk/models/get_campaign_targeting200_response_excluded_locations_inner.rb +198 -0
  14. data/lib/zernio-sdk/models/targeting_spec_excluded_locations.rb +1 -1
  15. data/lib/zernio-sdk/models/update_campaign_targeting200_response.rb +13 -1
  16. data/lib/zernio-sdk/models/update_campaign_targeting200_response_excluded_locations_inner.rb +196 -0
  17. data/lib/zernio-sdk/models/update_campaign_targeting_request_targeting.rb +10 -1
  18. data/lib/zernio-sdk/models/update_campaign_targeting_request_targeting_excluded_locations.rb +105 -0
  19. data/lib/zernio-sdk/models/update_campaign_targeting_request_targeting_excluded_locations_one_of.rb +193 -0
  20. data/lib/zernio-sdk/version.rb +1 -1
  21. data/lib/zernio-sdk.rb +4 -0
  22. data/openapi.yaml +1 -1
  23. data/spec/api/ad_campaigns_api_spec.rb +4 -4
  24. data/spec/models/get_campaign_targeting200_response_excluded_locations_inner_spec.rb +66 -0
  25. data/spec/models/get_campaign_targeting200_response_spec.rb +12 -0
  26. data/spec/models/update_campaign_targeting200_response_excluded_locations_inner_spec.rb +66 -0
  27. data/spec/models/update_campaign_targeting200_response_spec.rb +7 -1
  28. data/spec/models/update_campaign_targeting_request_targeting_excluded_locations_one_of_spec.rb +60 -0
  29. data/spec/models/update_campaign_targeting_request_targeting_excluded_locations_spec.rb +32 -0
  30. data/spec/models/update_campaign_targeting_request_targeting_spec.rb +6 -0
  31. data/zernio-sdk-0.0.1317.gem +0 -0
  32. metadata +18 -2
  33. data/zernio-sdk-0.0.1316.gem +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a919072b50f8b830e9a4fa5e528a20043107f7d89a88cb8df923d4480d86f028
4
- data.tar.gz: 5f52533434f404820e2333b1f7c3f3fe1d0c23b8597d01e562bec0c4b2daa451
3
+ metadata.gz: 72b2db3eaed4145c4eaf6a64a99b855d639c506c0898a4b052d561e0a60fb0c1
4
+ data.tar.gz: ecfe30bb9f42496754271def6b65003fa9be770761c8a379d9196096939b7627
5
5
  SHA512:
6
- metadata.gz: e66f5929fbbb16bfb40792951a5e2cd4f099779fdf2ed5ff7ba74977f0e96a99e90bab376c6ab80dbd005c45cb260f1062141803bef330b5199c2d2c9bfb9eb0
7
- data.tar.gz: 4b2ae0bdcaf92791c5306e332709f674bfe8addfa95c0f5c9a7aa229f9a53218e23ab33cc8dde5da875704f5e09e598c3b00bdb7d4005819bda999cd6379d794
6
+ metadata.gz: f3b1495f07b84eb30174b9981d5cd8fee3ad3eb5bc5390ebefe9ae27791be2a8251fb9b590dd9dfeae554f859c5f50867de93095522c541a0d86daa43ff1c024
7
+ data.tar.gz: 141f307bacf4c8ac0303f7316199eb1342db8921be02545f8943642fbec2a2f9158d17d53d7f70352e8fa09fe568af0d565a3a20c4ffbf376535e3d529f7659f
data/README.md CHANGED
@@ -222,7 +222,7 @@ Class | Method | HTTP request | Description
222
222
  *Zernio::AdCampaignsApi* | [**get_campaign_ad_schedule**](docs/AdCampaignsApi.md#get_campaign_ad_schedule) | **GET** /v1/ads/campaigns/{campaignId}/ad-schedule | Read a campaign's ad schedule (dayparting)
223
223
  *Zernio::AdCampaignsApi* | [**get_campaign_bidding**](docs/AdCampaignsApi.md#get_campaign_bidding) | **GET** /v1/ads/campaigns/{campaignId}/bidding | Read a campaign's current bidding
224
224
  *Zernio::AdCampaignsApi* | [**get_campaign_conversion_goals**](docs/AdCampaignsApi.md#get_campaign_conversion_goals) | **GET** /v1/ads/campaigns/{campaignId}/conversion-goals | Get campaign conversion goals
225
- *Zernio::AdCampaignsApi* | [**get_campaign_targeting**](docs/AdCampaignsApi.md#get_campaign_targeting) | **GET** /v1/ads/campaigns/{campaignId}/targeting | Read a Google campaign's device, location, and language targeting
225
+ *Zernio::AdCampaignsApi* | [**get_campaign_targeting**](docs/AdCampaignsApi.md#get_campaign_targeting) | **GET** /v1/ads/campaigns/{campaignId}/targeting | Read a Google campaign's device, location, excluded location, and language targeting
226
226
  *Zernio::AdCampaignsApi* | [**get_google_asset_group**](docs/AdCampaignsApi.md#get_google_asset_group) | **GET** /v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId} | Get a Performance Max asset group
227
227
  *Zernio::AdCampaignsApi* | [**list_ad_campaigns**](docs/AdCampaignsApi.md#list_ad_campaigns) | **GET** /v1/ads/campaigns | List campaigns
228
228
  *Zernio::AdCampaignsApi* | [**list_ad_group_assets**](docs/AdCampaignsApi.md#list_ad_group_assets) | **GET** /v1/ads/ad-sets/{adSetId}/assets | List ad-group assets
@@ -254,7 +254,7 @@ Class | Method | HTTP request | Description
254
254
  *Zernio::AdCampaignsApi* | [**update_campaign_ad_schedule**](docs/AdCampaignsApi.md#update_campaign_ad_schedule) | **PUT** /v1/ads/campaigns/{campaignId}/ad-schedule | Replace a campaign's ad schedule (dayparting)
255
255
  *Zernio::AdCampaignsApi* | [**update_campaign_assets**](docs/AdCampaignsApi.md#update_campaign_assets) | **PUT** /v1/ads/campaigns/{campaignId}/assets | Update campaign assets
256
256
  *Zernio::AdCampaignsApi* | [**update_campaign_conversion_goals**](docs/AdCampaignsApi.md#update_campaign_conversion_goals) | **PATCH** /v1/ads/campaigns/{campaignId}/conversion-goals | Update campaign conversion goals
257
- *Zernio::AdCampaignsApi* | [**update_campaign_targeting**](docs/AdCampaignsApi.md#update_campaign_targeting) | **PUT** /v1/ads/campaigns/{campaignId}/targeting | Edit a Google campaign's device, location, or language targeting
257
+ *Zernio::AdCampaignsApi* | [**update_campaign_targeting**](docs/AdCampaignsApi.md#update_campaign_targeting) | **PUT** /v1/ads/campaigns/{campaignId}/targeting | Edit a Google campaign's device, location, excluded location, or language targeting
258
258
  *Zernio::AdCampaignsApi* | [**update_google_asset_group**](docs/AdCampaignsApi.md#update_google_asset_group) | **PATCH** /v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId} | Update a Performance Max asset group
259
259
  *Zernio::AdCreativesApi* | [**create_ad_creative**](docs/AdCreativesApi.md#create_ad_creative) | **POST** /v1/ads/creatives | Create a standalone creative
260
260
  *Zernio::AdCreativesApi* | [**delete_ad_creative**](docs/AdCreativesApi.md#delete_ad_creative) | **DELETE** /v1/ads/creatives/{creativeId} | Delete a creative
@@ -1914,6 +1914,7 @@ Class | Method | HTTP request | Description
1914
1914
  - [Zernio::GetCampaignConversionGoals200Response](docs/GetCampaignConversionGoals200Response.md)
1915
1915
  - [Zernio::GetCampaignTargeting200Response](docs/GetCampaignTargeting200Response.md)
1916
1916
  - [Zernio::GetCampaignTargeting200ResponseDevicesInner](docs/GetCampaignTargeting200ResponseDevicesInner.md)
1917
+ - [Zernio::GetCampaignTargeting200ResponseExcludedLocationsInner](docs/GetCampaignTargeting200ResponseExcludedLocationsInner.md)
1917
1918
  - [Zernio::GetCampaignTargeting200ResponseLanguagesInner](docs/GetCampaignTargeting200ResponseLanguagesInner.md)
1918
1919
  - [Zernio::GetCampaignTargeting200ResponseLocationsInner](docs/GetCampaignTargeting200ResponseLocationsInner.md)
1919
1920
  - [Zernio::GetCommentAutomation200Response](docs/GetCommentAutomation200Response.md)
@@ -3306,12 +3307,15 @@ Class | Method | HTTP request | Description
3306
3307
  - [Zernio::UpdateCampaignConversionGoalsRequest](docs/UpdateCampaignConversionGoalsRequest.md)
3307
3308
  - [Zernio::UpdateCampaignTargeting200Response](docs/UpdateCampaignTargeting200Response.md)
3308
3309
  - [Zernio::UpdateCampaignTargeting200ResponseDevicesInner](docs/UpdateCampaignTargeting200ResponseDevicesInner.md)
3310
+ - [Zernio::UpdateCampaignTargeting200ResponseExcludedLocationsInner](docs/UpdateCampaignTargeting200ResponseExcludedLocationsInner.md)
3309
3311
  - [Zernio::UpdateCampaignTargeting200ResponseLanguagesInner](docs/UpdateCampaignTargeting200ResponseLanguagesInner.md)
3310
3312
  - [Zernio::UpdateCampaignTargeting200ResponseLocationsInner](docs/UpdateCampaignTargeting200ResponseLocationsInner.md)
3311
3313
  - [Zernio::UpdateCampaignTargetingRequest](docs/UpdateCampaignTargetingRequest.md)
3312
3314
  - [Zernio::UpdateCampaignTargetingRequestTargeting](docs/UpdateCampaignTargetingRequestTargeting.md)
3313
3315
  - [Zernio::UpdateCampaignTargetingRequestTargetingDevicesInner](docs/UpdateCampaignTargetingRequestTargetingDevicesInner.md)
3314
3316
  - [Zernio::UpdateCampaignTargetingRequestTargetingDevicesInnerOneOf](docs/UpdateCampaignTargetingRequestTargetingDevicesInnerOneOf.md)
3317
+ - [Zernio::UpdateCampaignTargetingRequestTargetingExcludedLocations](docs/UpdateCampaignTargetingRequestTargetingExcludedLocations.md)
3318
+ - [Zernio::UpdateCampaignTargetingRequestTargetingExcludedLocationsOneOf](docs/UpdateCampaignTargetingRequestTargetingExcludedLocationsOneOf.md)
3315
3319
  - [Zernio::UpdateCampaignTargetingRequestTargetingLocations](docs/UpdateCampaignTargetingRequestTargetingLocations.md)
3316
3320
  - [Zernio::UpdateCampaignTargetingRequestTargetingLocationsOneOf](docs/UpdateCampaignTargetingRequestTargetingLocationsOneOf.md)
3317
3321
  - [Zernio::UpdateCampaignTargetingRequestTargetingLocationsOneOfRegionsInner](docs/UpdateCampaignTargetingRequestTargetingLocationsOneOfRegionsInner.md)
@@ -32,7 +32,7 @@ All URIs are relative to *https://zernio.com/api*
32
32
  | [**get_campaign_ad_schedule**](AdCampaignsApi.md#get_campaign_ad_schedule) | **GET** /v1/ads/campaigns/{campaignId}/ad-schedule | Read a campaign's ad schedule (dayparting) |
33
33
  | [**get_campaign_bidding**](AdCampaignsApi.md#get_campaign_bidding) | **GET** /v1/ads/campaigns/{campaignId}/bidding | Read a campaign's current bidding |
34
34
  | [**get_campaign_conversion_goals**](AdCampaignsApi.md#get_campaign_conversion_goals) | **GET** /v1/ads/campaigns/{campaignId}/conversion-goals | Get campaign conversion goals |
35
- | [**get_campaign_targeting**](AdCampaignsApi.md#get_campaign_targeting) | **GET** /v1/ads/campaigns/{campaignId}/targeting | Read a Google campaign's device, location, and language targeting |
35
+ | [**get_campaign_targeting**](AdCampaignsApi.md#get_campaign_targeting) | **GET** /v1/ads/campaigns/{campaignId}/targeting | Read a Google campaign's device, location, excluded location, and language targeting |
36
36
  | [**get_google_asset_group**](AdCampaignsApi.md#get_google_asset_group) | **GET** /v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId} | Get a Performance Max asset group |
37
37
  | [**list_ad_campaigns**](AdCampaignsApi.md#list_ad_campaigns) | **GET** /v1/ads/campaigns | List campaigns |
38
38
  | [**list_ad_group_assets**](AdCampaignsApi.md#list_ad_group_assets) | **GET** /v1/ads/ad-sets/{adSetId}/assets | List ad-group assets |
@@ -64,7 +64,7 @@ All URIs are relative to *https://zernio.com/api*
64
64
  | [**update_campaign_ad_schedule**](AdCampaignsApi.md#update_campaign_ad_schedule) | **PUT** /v1/ads/campaigns/{campaignId}/ad-schedule | Replace a campaign's ad schedule (dayparting) |
65
65
  | [**update_campaign_assets**](AdCampaignsApi.md#update_campaign_assets) | **PUT** /v1/ads/campaigns/{campaignId}/assets | Update campaign assets |
66
66
  | [**update_campaign_conversion_goals**](AdCampaignsApi.md#update_campaign_conversion_goals) | **PATCH** /v1/ads/campaigns/{campaignId}/conversion-goals | Update campaign conversion goals |
67
- | [**update_campaign_targeting**](AdCampaignsApi.md#update_campaign_targeting) | **PUT** /v1/ads/campaigns/{campaignId}/targeting | Edit a Google campaign's device, location, or language targeting |
67
+ | [**update_campaign_targeting**](AdCampaignsApi.md#update_campaign_targeting) | **PUT** /v1/ads/campaigns/{campaignId}/targeting | Edit a Google campaign's device, location, excluded location, or language targeting |
68
68
  | [**update_google_asset_group**](AdCampaignsApi.md#update_google_asset_group) | **PATCH** /v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId} | Update a Performance Max asset group |
69
69
 
70
70
 
@@ -2136,9 +2136,9 @@ end
2136
2136
 
2137
2137
  > <GetCampaignTargeting200Response> get_campaign_targeting(campaign_id, opts)
2138
2138
 
2139
- Read a Google campaign's device, location, and language targeting
2139
+ Read a Google campaign's device, location, excluded location, and language targeting
2140
2140
 
2141
- Google Ads compliance requires geo, language, budget, and bidding targeting set at creation to stay editable afterwards; this reads the campaign state so an integrator can build an editor around it. Cached for the quota window (10 minutes fresh, up to 7 days last-good), not always a live read. Google only; every other platform returns 501. `devices` lists the device criteria the campaign carries, which depends on its channel: Search campaigns have MOBILE, DESKTOP and TABLET, Display campaigns also have CONNECTED_TV. `bidModifier` is Google's bid adjustment for that device, `null` when it has none, and `0` when the device is switched off; `included` is false for exactly that case.
2141
+ Google Ads compliance requires geo, language, budget, and bidding targeting set at creation to stay editable afterwards; this reads the campaign state so an integrator can build an editor around it. Cached for the quota window (10 minutes fresh, up to 7 days last-good), not always a live read. Google only; every other platform returns 501. `devices` lists the device criteria the campaign carries, which depends on its channel: Search campaigns have MOBILE, DESKTOP and TABLET, Display campaigns also have CONNECTED_TV. `bidModifier` is Google's bid adjustment for that device, `null` when it has none, and `0` when the device is switched off; `included` is false for exactly that case. `excludedLocations` lists the campaign's negative location criteria (the places it never serves in). `locations` still lists every location criterion, each flagged with `negative`, so a client reading the targeted set filters `negative: false`.
2142
2142
 
2143
2143
  ### Examples
2144
2144
 
@@ -2158,7 +2158,7 @@ opts = {
2158
2158
  }
2159
2159
 
2160
2160
  begin
2161
- # Read a Google campaign's device, location, and language targeting
2161
+ # Read a Google campaign's device, location, excluded location, and language targeting
2162
2162
  result = api_instance.get_campaign_targeting(campaign_id, opts)
2163
2163
  p result
2164
2164
  rescue Zernio::ApiError => e
@@ -2174,7 +2174,7 @@ This returns an Array which contains the response data, status code and headers.
2174
2174
 
2175
2175
  ```ruby
2176
2176
  begin
2177
- # Read a Google campaign's device, location, and language targeting
2177
+ # Read a Google campaign's device, location, excluded location, and language targeting
2178
2178
  data, status_code, headers = api_instance.get_campaign_targeting_with_http_info(campaign_id, opts)
2179
2179
  p status_code # => 2xx
2180
2180
  p headers # => { ... }
@@ -4554,9 +4554,9 @@ end
4554
4554
 
4555
4555
  > <UpdateCampaignTargeting200Response> update_campaign_targeting(campaign_id, update_campaign_targeting_request)
4556
4556
 
4557
- Edit a Google campaign's device, location, or language targeting
4557
+ Edit a Google campaign's device, location, excluded location, or language targeting
4558
4558
 
4559
- Google Ads compliance row M.10: geo and language targeting set at creation must stay editable afterwards. Send at least one of `devices`, `locations`, `languages`, `locationTargetingType`; each provided field REPLACES that field's existing criteria on the campaign (a full set, not a delta). Fields left out of the body are untouched. Google only; every other platform returns 501. `devices` is the full set of device bid modifiers: a supported device you leave out is switched off with a bid modifier of 0, since Google cannot remove a device criterion. A device the campaign's channel does not carry, and a set that switches every device off, both return 422. `locations` accepts the same shapes as campaign creation: a bare array of ISO country codes, or an object with `countries`/`regions`/`cities`/`zips`/`metros` key lists (`key` from GET /v1/ads/targeting/search?dimension=geo). Negative (excluded) locations are left untouched by this endpoint. An empty location list returns 400 instead of removing every criterion: a Google campaign with no location criteria targets every country, so omit `locations` to leave targeting alone. The removes and the creates go out in ONE Google `googleAds:mutate`, so a failed edit leaves the campaign's previous set intact rather than a half-applied one. `languages` is an array of Google's language codes (ISO 639-1, plus variants such as `zh_CN`); an unknown code returns 400. `locationTargetingType` switches who the location targeting reaches: `presence` (people in or regularly in the locations) or `presence_or_interest` (also people searching for or interested in them). Example: `{ \"platform\": \"google\", \"targeting\": { \"locationTargetingType\": \"presence\" } }`. The response includes the refreshed `devices`/`locations`/`languages` state read back from Google after the edit, and invalidates the cached copy `GET` on this campaign would otherwise keep serving. **Demand Gen:** Google keeps a Demand Gen campaign's locations and languages on its ad groups and refuses them on the campaign. When the campaign has one ad group they are written there and the response carries its `adGroupId` (the campaign-level `locations`/`languages` read back then stay empty). With several ad groups the call returns 400 naming them: edit each one with PUT /v1/ads/{adId} `targeting` on an ad of that ad group. Campaigns migrated from Discovery that still target on the campaign keep being written there. `devices` and `locationTargetingType` stay campaign-level.
4559
+ Google Ads compliance row M.10: geo and language targeting set at creation must stay editable afterwards. Send at least one of `devices`, `locations`, `excludedLocations`, `languages`, `locationTargetingType`; each provided field REPLACES that field's existing criteria on the campaign (a full set, not a delta). Fields left out of the body are untouched. Google only; every other platform returns 501. `devices` is the full set of device bid modifiers: a supported device you leave out is switched off with a bid modifier of 0, since Google cannot remove a device criterion. A device the campaign's channel does not carry, and a set that switches every device off, both return 422. `locations` accepts the same shapes as campaign creation: a bare array of ISO country codes, or an object with `countries`/`regions`/`cities`/`zips`/`metros` key lists (`key` from GET /v1/ads/targeting/search?dimension=geo). Excluded locations are left untouched by `locations`. An empty location list returns 400 instead of removing every criterion: a Google campaign with no location criteria targets every country, so omit `locations` to leave targeting alone. `excludedLocations` takes the same two shapes and replaces the campaign's negative location criteria (the places it never serves in), leaving the targeted `locations` untouched. An empty list (or `{}`) removes every exclusion. Radius exclusions are not supported. A place cannot be both targeted and excluded: a request whose result would leave one on both sides returns 400 before anything is written, and moving a place from one side to the other in the same request is applied atomically. Example: `{ \"platform\": \"google\", \"targeting\": { \"excludedLocations\": { \"countries\": [\"CA\"], \"regions\": [\"21137\"] } } }`. The removes and the creates go out in ONE Google `googleAds:mutate`, so a failed edit leaves the campaign's previous set intact rather than a half-applied one. `languages` is an array of Google's language codes (ISO 639-1, plus variants such as `zh_CN`); an unknown code returns 400. `locationTargetingType` switches who the location targeting reaches: `presence` (people in or regularly in the locations) or `presence_or_interest` (also people searching for or interested in them). Example: `{ \"platform\": \"google\", \"targeting\": { \"locationTargetingType\": \"presence\" } }`. The response includes the refreshed `devices`/`locations`/`excludedLocations`/`languages` state read back from Google after the edit, and invalidates the cached copy `GET` on this campaign would otherwise keep serving. **Demand Gen:** Google keeps a Demand Gen campaign's locations and languages on its ad groups and refuses them on the campaign. When the campaign has one ad group they are written there and the response carries its `adGroupId` (the campaign-level `locations`/`languages` read back then stay empty). With several ad groups the call returns 400 naming them: edit each one with PUT /v1/ads/{adId} `targeting` on an ad of that ad group. Campaigns migrated from Discovery that still target on the campaign keep being written there. `devices` and `locationTargetingType` stay campaign-level. `excludedLocations` is not available on Demand Gen yet and returns 400.
4560
4560
 
4561
4561
  ### Examples
4562
4562
 
@@ -4574,7 +4574,7 @@ campaign_id = 'campaign_id_example' # String | Google platform campaign ID
4574
4574
  update_campaign_targeting_request = Zernio::UpdateCampaignTargetingRequest.new({platform: 'google', targeting: Zernio::UpdateCampaignTargetingRequestTargeting.new}) # UpdateCampaignTargetingRequest |
4575
4575
 
4576
4576
  begin
4577
- # Edit a Google campaign's device, location, or language targeting
4577
+ # Edit a Google campaign's device, location, excluded location, or language targeting
4578
4578
  result = api_instance.update_campaign_targeting(campaign_id, update_campaign_targeting_request)
4579
4579
  p result
4580
4580
  rescue Zernio::ApiError => e
@@ -4590,7 +4590,7 @@ This returns an Array which contains the response data, status code and headers.
4590
4590
 
4591
4591
  ```ruby
4592
4592
  begin
4593
- # Edit a Google campaign's device, location, or language targeting
4593
+ # Edit a Google campaign's device, location, excluded location, or language targeting
4594
4594
  data, status_code, headers = api_instance.update_campaign_targeting_with_http_info(campaign_id, update_campaign_targeting_request)
4595
4595
  p status_code # => 2xx
4596
4596
  p headers # => { ... }
@@ -6,6 +6,8 @@
6
6
  | ---- | ---- | ----------- | ----- |
7
7
  | **devices** | [**Array&lt;GetCampaignTargeting200ResponseDevicesInner&gt;**](GetCampaignTargeting200ResponseDevicesInner.md) | | [optional] |
8
8
  | **locations** | [**Array&lt;GetCampaignTargeting200ResponseLocationsInner&gt;**](GetCampaignTargeting200ResponseLocationsInner.md) | | [optional] |
9
+ | **excluded_locations** | [**Array&lt;GetCampaignTargeting200ResponseExcludedLocationsInner&gt;**](GetCampaignTargeting200ResponseExcludedLocationsInner.md) | The negative (excluded) location criteria, same item shape as &#x60;locations&#x60; with &#x60;negative: true&#x60;. | [optional] |
10
+ | **excluded_locations_editable** | **Boolean** | Whether PUT accepts &#x60;excludedLocations&#x60; for this campaign. False on Demand Gen, which returns 400 for any exclusion. | [optional] |
9
11
  | **languages** | [**Array&lt;GetCampaignTargeting200ResponseLanguagesInner&gt;**](GetCampaignTargeting200ResponseLanguagesInner.md) | | [optional] |
10
12
  | **location_targeting_type** | **String** | Who the location targeting reaches, see GoogleLocationTargetingType. Null when Google reports a legacy value (SEARCH_INTEREST) this API does not set. | [optional] |
11
13
  | **cached_at** | **Time** | When this targeting was fetched from Google. Null when it was never served from cache. | [optional] |
@@ -19,6 +21,8 @@ require 'zernio-sdk'
19
21
  instance = Zernio::GetCampaignTargeting200Response.new(
20
22
  devices: null,
21
23
  locations: null,
24
+ excluded_locations: null,
25
+ excluded_locations_editable: null,
22
26
  languages: null,
23
27
  location_targeting_type: null,
24
28
  cached_at: null,
@@ -0,0 +1,28 @@
1
+ # Zernio::GetCampaignTargeting200ResponseExcludedLocationsInner
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **geo_target_id** | **String** | Numeric id from Google&#39;s geoTargetConstants/{id}. | [optional] |
8
+ | **negative** | **Boolean** | Always true here. | [optional] |
9
+ | **name** | **String** | | [optional] |
10
+ | **canonical_name** | **String** | | [optional] |
11
+ | **type** | **String** | | [optional] |
12
+ | **country_code** | **String** | | [optional] |
13
+
14
+ ## Example
15
+
16
+ ```ruby
17
+ require 'zernio-sdk'
18
+
19
+ instance = Zernio::GetCampaignTargeting200ResponseExcludedLocationsInner.new(
20
+ geo_target_id: null,
21
+ negative: null,
22
+ name: null,
23
+ canonical_name: null,
24
+ type: null,
25
+ country_code: null
26
+ )
27
+ ```
28
+
@@ -10,6 +10,7 @@
10
10
  | **location_targeting_type** | **String** | The value read back from Google after the edit. | [optional] |
11
11
  | **devices** | [**Array&lt;UpdateCampaignTargeting200ResponseDevicesInner&gt;**](UpdateCampaignTargeting200ResponseDevicesInner.md) | | [optional] |
12
12
  | **locations** | [**Array&lt;UpdateCampaignTargeting200ResponseLocationsInner&gt;**](UpdateCampaignTargeting200ResponseLocationsInner.md) | | [optional] |
13
+ | **excluded_locations** | [**Array&lt;UpdateCampaignTargeting200ResponseExcludedLocationsInner&gt;**](UpdateCampaignTargeting200ResponseExcludedLocationsInner.md) | The negative (excluded) location criteria read back after the edit, same item shape as &#x60;locations&#x60;. | [optional] |
13
14
  | **languages** | [**Array&lt;UpdateCampaignTargeting200ResponseLanguagesInner&gt;**](UpdateCampaignTargeting200ResponseLanguagesInner.md) | | [optional] |
14
15
 
15
16
  ## Example
@@ -24,6 +25,7 @@ instance = Zernio::UpdateCampaignTargeting200Response.new(
24
25
  location_targeting_type: null,
25
26
  devices: null,
26
27
  locations: null,
28
+ excluded_locations: null,
27
29
  languages: null
28
30
  )
29
31
  ```
@@ -0,0 +1,28 @@
1
+ # Zernio::UpdateCampaignTargeting200ResponseExcludedLocationsInner
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **geo_target_id** | **String** | | [optional] |
8
+ | **negative** | **Boolean** | | [optional] |
9
+ | **name** | **String** | | [optional] |
10
+ | **canonical_name** | **String** | | [optional] |
11
+ | **type** | **String** | | [optional] |
12
+ | **country_code** | **String** | | [optional] |
13
+
14
+ ## Example
15
+
16
+ ```ruby
17
+ require 'zernio-sdk'
18
+
19
+ instance = Zernio::UpdateCampaignTargeting200ResponseExcludedLocationsInner.new(
20
+ geo_target_id: null,
21
+ negative: null,
22
+ name: null,
23
+ canonical_name: null,
24
+ type: null,
25
+ country_code: null
26
+ )
27
+ ```
28
+
@@ -7,6 +7,7 @@
7
7
  | **devices** | [**Array&lt;UpdateCampaignTargetingRequestTargetingDevicesInner&gt;**](UpdateCampaignTargetingRequestTargetingDevicesInner.md) | Devices to include. Devices not listed become excluded (negative) criteria, same contract as the existing devices-only edit. | [optional] |
8
8
  | **locations** | [**UpdateCampaignTargetingRequestTargetingLocations**](UpdateCampaignTargetingRequestTargetingLocations.md) | | [optional] |
9
9
  | **languages** | **Array&lt;String&gt;** | Google&#39;s language codes (ISO 639-1, plus variants such as &#x60;zh_CN&#x60;), e.g. [\&quot;en\&quot;, \&quot;de\&quot;]. | [optional] |
10
+ | **excluded_locations** | [**UpdateCampaignTargetingRequestTargetingExcludedLocations**](UpdateCampaignTargetingRequestTargetingExcludedLocations.md) | | [optional] |
10
11
  | **location_targeting_type** | [**GoogleLocationTargetingType**](GoogleLocationTargetingType.md) | | [optional] |
11
12
 
12
13
  ## Example
@@ -18,6 +19,7 @@ instance = Zernio::UpdateCampaignTargetingRequestTargeting.new(
18
19
  devices: null,
19
20
  locations: null,
20
21
  languages: null,
22
+ excluded_locations: null,
21
23
  location_targeting_type: null
22
24
  )
23
25
  ```
@@ -0,0 +1,49 @@
1
+ # Zernio::UpdateCampaignTargetingRequestTargetingExcludedLocations
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::UpdateCampaignTargetingRequestTargetingExcludedLocations.openapi_one_of
15
+ # =>
16
+ # [
17
+ # :'Array<String>',
18
+ # :'UpdateCampaignTargetingRequestTargetingExcludedLocationsOneOf'
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::UpdateCampaignTargetingRequestTargetingExcludedLocations.build(data)
32
+ # => #<Array<String>:0x00007fdd4aab02a0>
33
+
34
+ Zernio::UpdateCampaignTargetingRequestTargetingExcludedLocations.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
+ - `Array<String>`
47
+ - `UpdateCampaignTargetingRequestTargetingExcludedLocationsOneOf`
48
+ - `nil` (if no type matches)
49
+
@@ -0,0 +1,26 @@
1
+ # Zernio::UpdateCampaignTargetingRequestTargetingExcludedLocationsOneOf
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **countries** | **Array&lt;String&gt;** | | [optional] |
8
+ | **regions** | [**Array&lt;UpdateCampaignTargetingRequestTargetingLocationsOneOfRegionsInner&gt;**](UpdateCampaignTargetingRequestTargetingLocationsOneOfRegionsInner.md) | | [optional] |
9
+ | **cities** | [**Array&lt;UpdateCampaignTargetingRequestTargetingLocationsOneOfRegionsInner&gt;**](UpdateCampaignTargetingRequestTargetingLocationsOneOfRegionsInner.md) | | [optional] |
10
+ | **zips** | [**Array&lt;UpdateCampaignTargetingRequestTargetingLocationsOneOfRegionsInner&gt;**](UpdateCampaignTargetingRequestTargetingLocationsOneOfRegionsInner.md) | | [optional] |
11
+ | **metros** | [**Array&lt;UpdateCampaignTargetingRequestTargetingLocationsOneOfRegionsInner&gt;**](UpdateCampaignTargetingRequestTargetingLocationsOneOfRegionsInner.md) | | [optional] |
12
+
13
+ ## Example
14
+
15
+ ```ruby
16
+ require 'zernio-sdk'
17
+
18
+ instance = Zernio::UpdateCampaignTargetingRequestTargetingExcludedLocationsOneOf.new(
19
+ countries: null,
20
+ regions: null,
21
+ cities: null,
22
+ zips: null,
23
+ metros: null
24
+ )
25
+ ```
26
+
@@ -2180,8 +2180,8 @@ module Zernio
2180
2180
  return data, status_code, headers
2181
2181
  end
2182
2182
 
2183
- # Read a Google campaign's device, location, and language targeting
2184
- # Google Ads compliance requires geo, language, budget, and bidding targeting set at creation to stay editable afterwards; this reads the campaign state so an integrator can build an editor around it. Cached for the quota window (10 minutes fresh, up to 7 days last-good), not always a live read. Google only; every other platform returns 501. `devices` lists the device criteria the campaign carries, which depends on its channel: Search campaigns have MOBILE, DESKTOP and TABLET, Display campaigns also have CONNECTED_TV. `bidModifier` is Google's bid adjustment for that device, `null` when it has none, and `0` when the device is switched off; `included` is false for exactly that case.
2183
+ # Read a Google campaign's device, location, excluded location, and language targeting
2184
+ # Google Ads compliance requires geo, language, budget, and bidding targeting set at creation to stay editable afterwards; this reads the campaign state so an integrator can build an editor around it. Cached for the quota window (10 minutes fresh, up to 7 days last-good), not always a live read. Google only; every other platform returns 501. `devices` lists the device criteria the campaign carries, which depends on its channel: Search campaigns have MOBILE, DESKTOP and TABLET, Display campaigns also have CONNECTED_TV. `bidModifier` is Google's bid adjustment for that device, `null` when it has none, and `0` when the device is switched off; `included` is false for exactly that case. `excludedLocations` lists the campaign's negative location criteria (the places it never serves in). `locations` still lists every location criterion, each flagged with `negative`, so a client reading the targeted set filters `negative: false`.
2185
2185
  # @param campaign_id [String] Google platform campaign ID
2186
2186
  # @param [Hash] opts the optional parameters
2187
2187
  # @option opts [String] :platform Disambiguates when the same campaignId string exists on more than one connected platform.
@@ -2191,8 +2191,8 @@ module Zernio
2191
2191
  data
2192
2192
  end
2193
2193
 
2194
- # Read a Google campaign&#39;s device, location, and language targeting
2195
- # Google Ads compliance requires geo, language, budget, and bidding targeting set at creation to stay editable afterwards; this reads the campaign state so an integrator can build an editor around it. Cached for the quota window (10 minutes fresh, up to 7 days last-good), not always a live read. Google only; every other platform returns 501. &#x60;devices&#x60; lists the device criteria the campaign carries, which depends on its channel: Search campaigns have MOBILE, DESKTOP and TABLET, Display campaigns also have CONNECTED_TV. &#x60;bidModifier&#x60; is Google&#39;s bid adjustment for that device, &#x60;null&#x60; when it has none, and &#x60;0&#x60; when the device is switched off; &#x60;included&#x60; is false for exactly that case.
2194
+ # Read a Google campaign&#39;s device, location, excluded location, and language targeting
2195
+ # Google Ads compliance requires geo, language, budget, and bidding targeting set at creation to stay editable afterwards; this reads the campaign state so an integrator can build an editor around it. Cached for the quota window (10 minutes fresh, up to 7 days last-good), not always a live read. Google only; every other platform returns 501. &#x60;devices&#x60; lists the device criteria the campaign carries, which depends on its channel: Search campaigns have MOBILE, DESKTOP and TABLET, Display campaigns also have CONNECTED_TV. &#x60;bidModifier&#x60; is Google&#39;s bid adjustment for that device, &#x60;null&#x60; when it has none, and &#x60;0&#x60; when the device is switched off; &#x60;included&#x60; is false for exactly that case. &#x60;excludedLocations&#x60; lists the campaign&#39;s negative location criteria (the places it never serves in). &#x60;locations&#x60; still lists every location criterion, each flagged with &#x60;negative&#x60;, so a client reading the targeted set filters &#x60;negative: false&#x60;.
2196
2196
  # @param campaign_id [String] Google platform campaign ID
2197
2197
  # @param [Hash] opts the optional parameters
2198
2198
  # @option opts [String] :platform Disambiguates when the same campaignId string exists on more than one connected platform.
@@ -4865,8 +4865,8 @@ module Zernio
4865
4865
  return data, status_code, headers
4866
4866
  end
4867
4867
 
4868
- # Edit a Google campaign's device, location, or language targeting
4869
- # Google Ads compliance row M.10: geo and language targeting set at creation must stay editable afterwards. Send at least one of `devices`, `locations`, `languages`, `locationTargetingType`; each provided field REPLACES that field's existing criteria on the campaign (a full set, not a delta). Fields left out of the body are untouched. Google only; every other platform returns 501. `devices` is the full set of device bid modifiers: a supported device you leave out is switched off with a bid modifier of 0, since Google cannot remove a device criterion. A device the campaign's channel does not carry, and a set that switches every device off, both return 422. `locations` accepts the same shapes as campaign creation: a bare array of ISO country codes, or an object with `countries`/`regions`/`cities`/`zips`/`metros` key lists (`key` from GET /v1/ads/targeting/search?dimension=geo). Negative (excluded) locations are left untouched by this endpoint. An empty location list returns 400 instead of removing every criterion: a Google campaign with no location criteria targets every country, so omit `locations` to leave targeting alone. The removes and the creates go out in ONE Google `googleAds:mutate`, so a failed edit leaves the campaign's previous set intact rather than a half-applied one. `languages` is an array of Google's language codes (ISO 639-1, plus variants such as `zh_CN`); an unknown code returns 400. `locationTargetingType` switches who the location targeting reaches: `presence` (people in or regularly in the locations) or `presence_or_interest` (also people searching for or interested in them). Example: `{ \"platform\": \"google\", \"targeting\": { \"locationTargetingType\": \"presence\" } }`. The response includes the refreshed `devices`/`locations`/`languages` state read back from Google after the edit, and invalidates the cached copy `GET` on this campaign would otherwise keep serving. **Demand Gen:** Google keeps a Demand Gen campaign's locations and languages on its ad groups and refuses them on the campaign. When the campaign has one ad group they are written there and the response carries its `adGroupId` (the campaign-level `locations`/`languages` read back then stay empty). With several ad groups the call returns 400 naming them: edit each one with PUT /v1/ads/{adId} `targeting` on an ad of that ad group. Campaigns migrated from Discovery that still target on the campaign keep being written there. `devices` and `locationTargetingType` stay campaign-level.
4868
+ # Edit a Google campaign's device, location, excluded location, or language targeting
4869
+ # Google Ads compliance row M.10: geo and language targeting set at creation must stay editable afterwards. Send at least one of `devices`, `locations`, `excludedLocations`, `languages`, `locationTargetingType`; each provided field REPLACES that field's existing criteria on the campaign (a full set, not a delta). Fields left out of the body are untouched. Google only; every other platform returns 501. `devices` is the full set of device bid modifiers: a supported device you leave out is switched off with a bid modifier of 0, since Google cannot remove a device criterion. A device the campaign's channel does not carry, and a set that switches every device off, both return 422. `locations` accepts the same shapes as campaign creation: a bare array of ISO country codes, or an object with `countries`/`regions`/`cities`/`zips`/`metros` key lists (`key` from GET /v1/ads/targeting/search?dimension=geo). Excluded locations are left untouched by `locations`. An empty location list returns 400 instead of removing every criterion: a Google campaign with no location criteria targets every country, so omit `locations` to leave targeting alone. `excludedLocations` takes the same two shapes and replaces the campaign's negative location criteria (the places it never serves in), leaving the targeted `locations` untouched. An empty list (or `{}`) removes every exclusion. Radius exclusions are not supported. A place cannot be both targeted and excluded: a request whose result would leave one on both sides returns 400 before anything is written, and moving a place from one side to the other in the same request is applied atomically. Example: `{ \"platform\": \"google\", \"targeting\": { \"excludedLocations\": { \"countries\": [\"CA\"], \"regions\": [\"21137\"] } } }`. The removes and the creates go out in ONE Google `googleAds:mutate`, so a failed edit leaves the campaign's previous set intact rather than a half-applied one. `languages` is an array of Google's language codes (ISO 639-1, plus variants such as `zh_CN`); an unknown code returns 400. `locationTargetingType` switches who the location targeting reaches: `presence` (people in or regularly in the locations) or `presence_or_interest` (also people searching for or interested in them). Example: `{ \"platform\": \"google\", \"targeting\": { \"locationTargetingType\": \"presence\" } }`. The response includes the refreshed `devices`/`locations`/`excludedLocations`/`languages` state read back from Google after the edit, and invalidates the cached copy `GET` on this campaign would otherwise keep serving. **Demand Gen:** Google keeps a Demand Gen campaign's locations and languages on its ad groups and refuses them on the campaign. When the campaign has one ad group they are written there and the response carries its `adGroupId` (the campaign-level `locations`/`languages` read back then stay empty). With several ad groups the call returns 400 naming them: edit each one with PUT /v1/ads/{adId} `targeting` on an ad of that ad group. Campaigns migrated from Discovery that still target on the campaign keep being written there. `devices` and `locationTargetingType` stay campaign-level. `excludedLocations` is not available on Demand Gen yet and returns 400.
4870
4870
  # @param campaign_id [String] Google platform campaign ID
4871
4871
  # @param update_campaign_targeting_request [UpdateCampaignTargetingRequest]
4872
4872
  # @param [Hash] opts the optional parameters
@@ -4876,8 +4876,8 @@ module Zernio
4876
4876
  data
4877
4877
  end
4878
4878
 
4879
- # Edit a Google campaign&#39;s device, location, or language targeting
4880
- # Google Ads compliance row M.10: geo and language targeting set at creation must stay editable afterwards. Send at least one of &#x60;devices&#x60;, &#x60;locations&#x60;, &#x60;languages&#x60;, &#x60;locationTargetingType&#x60;; each provided field REPLACES that field&#39;s existing criteria on the campaign (a full set, not a delta). Fields left out of the body are untouched. Google only; every other platform returns 501. &#x60;devices&#x60; is the full set of device bid modifiers: a supported device you leave out is switched off with a bid modifier of 0, since Google cannot remove a device criterion. A device the campaign&#39;s channel does not carry, and a set that switches every device off, both return 422. &#x60;locations&#x60; accepts the same shapes as campaign creation: a bare array of ISO country codes, or an object with &#x60;countries&#x60;/&#x60;regions&#x60;/&#x60;cities&#x60;/&#x60;zips&#x60;/&#x60;metros&#x60; key lists (&#x60;key&#x60; from GET /v1/ads/targeting/search?dimension&#x3D;geo). Negative (excluded) locations are left untouched by this endpoint. An empty location list returns 400 instead of removing every criterion: a Google campaign with no location criteria targets every country, so omit &#x60;locations&#x60; to leave targeting alone. The removes and the creates go out in ONE Google &#x60;googleAds:mutate&#x60;, so a failed edit leaves the campaign&#39;s previous set intact rather than a half-applied one. &#x60;languages&#x60; is an array of Google&#39;s language codes (ISO 639-1, plus variants such as &#x60;zh_CN&#x60;); an unknown code returns 400. &#x60;locationTargetingType&#x60; switches who the location targeting reaches: &#x60;presence&#x60; (people in or regularly in the locations) or &#x60;presence_or_interest&#x60; (also people searching for or interested in them). Example: &#x60;{ \&quot;platform\&quot;: \&quot;google\&quot;, \&quot;targeting\&quot;: { \&quot;locationTargetingType\&quot;: \&quot;presence\&quot; } }&#x60;. The response includes the refreshed &#x60;devices&#x60;/&#x60;locations&#x60;/&#x60;languages&#x60; state read back from Google after the edit, and invalidates the cached copy &#x60;GET&#x60; on this campaign would otherwise keep serving. **Demand Gen:** Google keeps a Demand Gen campaign&#39;s locations and languages on its ad groups and refuses them on the campaign. When the campaign has one ad group they are written there and the response carries its &#x60;adGroupId&#x60; (the campaign-level &#x60;locations&#x60;/&#x60;languages&#x60; read back then stay empty). With several ad groups the call returns 400 naming them: edit each one with PUT /v1/ads/{adId} &#x60;targeting&#x60; on an ad of that ad group. Campaigns migrated from Discovery that still target on the campaign keep being written there. &#x60;devices&#x60; and &#x60;locationTargetingType&#x60; stay campaign-level.
4879
+ # Edit a Google campaign&#39;s device, location, excluded location, or language targeting
4880
+ # Google Ads compliance row M.10: geo and language targeting set at creation must stay editable afterwards. Send at least one of &#x60;devices&#x60;, &#x60;locations&#x60;, &#x60;excludedLocations&#x60;, &#x60;languages&#x60;, &#x60;locationTargetingType&#x60;; each provided field REPLACES that field&#39;s existing criteria on the campaign (a full set, not a delta). Fields left out of the body are untouched. Google only; every other platform returns 501. &#x60;devices&#x60; is the full set of device bid modifiers: a supported device you leave out is switched off with a bid modifier of 0, since Google cannot remove a device criterion. A device the campaign&#39;s channel does not carry, and a set that switches every device off, both return 422. &#x60;locations&#x60; accepts the same shapes as campaign creation: a bare array of ISO country codes, or an object with &#x60;countries&#x60;/&#x60;regions&#x60;/&#x60;cities&#x60;/&#x60;zips&#x60;/&#x60;metros&#x60; key lists (&#x60;key&#x60; from GET /v1/ads/targeting/search?dimension&#x3D;geo). Excluded locations are left untouched by &#x60;locations&#x60;. An empty location list returns 400 instead of removing every criterion: a Google campaign with no location criteria targets every country, so omit &#x60;locations&#x60; to leave targeting alone. &#x60;excludedLocations&#x60; takes the same two shapes and replaces the campaign&#39;s negative location criteria (the places it never serves in), leaving the targeted &#x60;locations&#x60; untouched. An empty list (or &#x60;{}&#x60;) removes every exclusion. Radius exclusions are not supported. A place cannot be both targeted and excluded: a request whose result would leave one on both sides returns 400 before anything is written, and moving a place from one side to the other in the same request is applied atomically. Example: &#x60;{ \&quot;platform\&quot;: \&quot;google\&quot;, \&quot;targeting\&quot;: { \&quot;excludedLocations\&quot;: { \&quot;countries\&quot;: [\&quot;CA\&quot;], \&quot;regions\&quot;: [\&quot;21137\&quot;] } } }&#x60;. The removes and the creates go out in ONE Google &#x60;googleAds:mutate&#x60;, so a failed edit leaves the campaign&#39;s previous set intact rather than a half-applied one. &#x60;languages&#x60; is an array of Google&#39;s language codes (ISO 639-1, plus variants such as &#x60;zh_CN&#x60;); an unknown code returns 400. &#x60;locationTargetingType&#x60; switches who the location targeting reaches: &#x60;presence&#x60; (people in or regularly in the locations) or &#x60;presence_or_interest&#x60; (also people searching for or interested in them). Example: &#x60;{ \&quot;platform\&quot;: \&quot;google\&quot;, \&quot;targeting\&quot;: { \&quot;locationTargetingType\&quot;: \&quot;presence\&quot; } }&#x60;. The response includes the refreshed &#x60;devices&#x60;/&#x60;locations&#x60;/&#x60;excludedLocations&#x60;/&#x60;languages&#x60; state read back from Google after the edit, and invalidates the cached copy &#x60;GET&#x60; on this campaign would otherwise keep serving. **Demand Gen:** Google keeps a Demand Gen campaign&#39;s locations and languages on its ad groups and refuses them on the campaign. When the campaign has one ad group they are written there and the response carries its &#x60;adGroupId&#x60; (the campaign-level &#x60;locations&#x60;/&#x60;languages&#x60; read back then stay empty). With several ad groups the call returns 400 naming them: edit each one with PUT /v1/ads/{adId} &#x60;targeting&#x60; on an ad of that ad group. Campaigns migrated from Discovery that still target on the campaign keep being written there. &#x60;devices&#x60; and &#x60;locationTargetingType&#x60; stay campaign-level. &#x60;excludedLocations&#x60; is not available on Demand Gen yet and returns 400.
4881
4881
  # @param campaign_id [String] Google platform campaign ID
4882
4882
  # @param update_campaign_targeting_request [UpdateCampaignTargetingRequest]
4883
4883
  # @param [Hash] opts the optional parameters
@@ -19,6 +19,12 @@ module Zernio
19
19
 
20
20
  attr_accessor :locations
21
21
 
22
+ # The negative (excluded) location criteria, same item shape as `locations` with `negative: true`.
23
+ attr_accessor :excluded_locations
24
+
25
+ # Whether PUT accepts `excludedLocations` for this campaign. False on Demand Gen, which returns 400 for any exclusion.
26
+ attr_accessor :excluded_locations_editable
27
+
22
28
  attr_accessor :languages
23
29
 
24
30
  # Who the location targeting reaches, see GoogleLocationTargetingType. Null when Google reports a legacy value (SEARCH_INTEREST) this API does not set.
@@ -57,6 +63,8 @@ module Zernio
57
63
  {
58
64
  :'devices' => :'devices',
59
65
  :'locations' => :'locations',
66
+ :'excluded_locations' => :'excludedLocations',
67
+ :'excluded_locations_editable' => :'excludedLocationsEditable',
60
68
  :'languages' => :'languages',
61
69
  :'location_targeting_type' => :'locationTargetingType',
62
70
  :'cached_at' => :'cachedAt',
@@ -79,6 +87,8 @@ module Zernio
79
87
  {
80
88
  :'devices' => :'Array<GetCampaignTargeting200ResponseDevicesInner>',
81
89
  :'locations' => :'Array<GetCampaignTargeting200ResponseLocationsInner>',
90
+ :'excluded_locations' => :'Array<GetCampaignTargeting200ResponseExcludedLocationsInner>',
91
+ :'excluded_locations_editable' => :'Boolean',
82
92
  :'languages' => :'Array<GetCampaignTargeting200ResponseLanguagesInner>',
83
93
  :'location_targeting_type' => :'String',
84
94
  :'cached_at' => :'Time',
@@ -122,6 +132,16 @@ module Zernio
122
132
  end
123
133
  end
124
134
 
135
+ if attributes.key?(:'excluded_locations')
136
+ if (value = attributes[:'excluded_locations']).is_a?(Array)
137
+ self.excluded_locations = value
138
+ end
139
+ end
140
+
141
+ if attributes.key?(:'excluded_locations_editable')
142
+ self.excluded_locations_editable = attributes[:'excluded_locations_editable']
143
+ end
144
+
125
145
  if attributes.key?(:'languages')
126
146
  if (value = attributes[:'languages']).is_a?(Array)
127
147
  self.languages = value
@@ -175,6 +195,8 @@ module Zernio
175
195
  self.class == o.class &&
176
196
  devices == o.devices &&
177
197
  locations == o.locations &&
198
+ excluded_locations == o.excluded_locations &&
199
+ excluded_locations_editable == o.excluded_locations_editable &&
178
200
  languages == o.languages &&
179
201
  location_targeting_type == o.location_targeting_type &&
180
202
  cached_at == o.cached_at &&
@@ -190,7 +212,7 @@ module Zernio
190
212
  # Calculates hash code according to all attributes.
191
213
  # @return [Integer] Hash code
192
214
  def hash
193
- [devices, locations, languages, location_targeting_type, cached_at, stale].hash
215
+ [devices, locations, excluded_locations, excluded_locations_editable, languages, location_targeting_type, cached_at, stale].hash
194
216
  end
195
217
 
196
218
  # Builds the object from hash