late-sdk 0.0.886 → 0.0.888
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/docs/AdCampaignsApi.md +1 -1
- data/docs/SendInboxMessage400Response.md +5 -1
- data/docs/TargetingSpec.md +1 -1
- data/lib/zernio-sdk/api/ad_campaigns_api.rb +2 -2
- data/lib/zernio-sdk/models/send_inbox_message400_response.rb +36 -4
- data/lib/zernio-sdk/models/targeting_spec.rb +1 -1
- data/lib/zernio-sdk/models/update_ad_request_targeting.rb +1 -1
- data/lib/zernio-sdk/version.rb +1 -1
- data/openapi.yaml +25 -11
- data/spec/api/ad_campaigns_api_spec.rb +1 -1
- data/spec/models/send_inbox_message400_response_spec.rb +17 -1
- data/zernio-sdk-0.0.888.gem +0 -0
- metadata +2 -2
- data/zernio-sdk-0.0.886.gem +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a83427f1872fe2252d1f723cdfb3d2a59fddc4c4856b05fdb0f011fee2243ada
|
|
4
|
+
data.tar.gz: 1457d5205407e5abf9202595287176c9b48a77556a963082398397399d37387a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ec90eb31ba88acd4984cba382d1b5a149b735b5a36c9d76a3b54868a31b9d0903bd1bd8f9aa26a79af81dafc9939a87b9607cf4d43ffea3e72523097a2a3e183
|
|
7
|
+
data.tar.gz: 4596258907db67701384571a8a34e092fffef4bd8ecd8c6b2df2036133fb11e9e8f60a5cecdb0fd61eefbc2495a7517a57ede1d59febd4b54f1c79183020ffe4
|
data/docs/AdCampaignsApi.md
CHANGED
|
@@ -2183,7 +2183,7 @@ end
|
|
|
2183
2183
|
|
|
2184
2184
|
Update ad
|
|
2185
2185
|
|
|
2186
|
-
Patch one or more fields on an ad. Status, budget, targeting, and creative changes are propagated to the platform. Per-platform support: - **Meta** (Facebook + Instagram): all fields supported. - **TikTok**: status, budget, targeting (via `/v2/adgroup/update/`), and creative (via `/v2/ad/update/` patch-style: `headline` is ignored, `body` becomes `ad_text`). - **Google**: status, budget, KEYWORD edits via `targeting.keywords` / `targeting.negativeKeywords`, and DEVICE bid adjustments via `targeting.devices`. Each list you send becomes the FULL new set of its kind (criteria not in the list are removed); a kind left out is untouched. Any other `targeting` field returns 400: Google cannot mutate broad targeting post-create without recreating the campaign. `creative` returns 501. - **LinkedIn**: status, budget, targeting (
|
|
2186
|
+
Patch one or more fields on an ad. Status, budget, targeting, and creative changes are propagated to the platform. Per-platform support: - **Meta** (Facebook + Instagram): all fields supported. - **TikTok**: status, budget, targeting (via `/v2/adgroup/update/`), and creative (via `/v2/ad/update/` patch-style: `headline` is ignored, `body` becomes `ad_text`). - **Google**: status, budget, KEYWORD edits via `targeting.keywords` / `targeting.negativeKeywords`, and DEVICE bid adjustments via `targeting.devices`. Each list you send becomes the FULL new set of its kind (criteria not in the list are removed); a kind left out is untouched. Any other `targeting` field returns 400: Google cannot mutate broad targeting post-create without recreating the campaign. `creative` returns 501. - **LinkedIn**: status, budget, targeting (countries or regions, excludedLocations (countries), the B2B facets, and audience segments; applied to the LinkedIn Campaign via PARTIAL_UPDATE, and REPLACES the campaign's entire targetingCriteria, not a merge), and creative (uploads new media, creates a replacement inline creative on the same campaign, pauses the old one). - **Pinterest / X / OpenAI Ads**: status + budget only. Sending `targeting` or `creative` returns 501 with code `unsupported_platform_operation`. OpenAI Ads budget is lifetime-only (see `budget.type` below). **Google keyword replacement:** These edits affect the ad's entire ad group, including sibling ads. Positive (`targeting.keywords`) and negative (`targeting.negativeKeywords`) sets are independent: omit a field to leave that set unchanged, or send `[]` to remove every keyword of that kind. Zernio compares each supplied set with Google's live criteria by case-insensitive keyword text and match type. A matching criterion is left untouched, retaining its criterion ID, enabled/paused status, keyword-level bid overrides, labels, and criterion-associated history/statistics. Zernio does not reset its quality score; Google continues to calculate scores and statistics normally. Text comparison does not trim whitespace. A bare string or an object without `matchType` means `broad`, not the existing criterion's match type. For example, resending an existing `{ \"text\": \"plumber\", \"matchType\": \"exact\" }` preserves it; sending `\"plumber\"` instead removes that EXACT criterion and requests a BROAD one. Changing text or match type removes criteria no longer requested and creates any missing criteria. New criteria get new IDs and do not inherit removed criteria's bid overrides, labels, or history. Historical reporting for a removed criterion is not transferred to its replacement. To add keywords without replacing a set, use [POST /v1/ads/keywords](https://docs.zernio.com/ad-campaigns/add-ad-keywords). Use `PATCH /v1/ads/keywords/{keywordId}` to pause/enable one keyword, or `DELETE /v1/ads/keywords/{keywordId}` to remove it.
|
|
2187
2187
|
|
|
2188
2188
|
### Examples
|
|
2189
2189
|
|
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
| Name | Type | Description | Notes |
|
|
6
6
|
| ---- | ---- | ----------- | ----- |
|
|
7
7
|
| **error** | **String** | | [optional] |
|
|
8
|
-
| **
|
|
8
|
+
| **type** | **String** | Present on Meta pass-through rejections: platform_error when Meta rejected the send (see platform/platformError below), invalid_request_error for validation failures. | [optional] |
|
|
9
|
+
| **code** | **String** | Stable machine-readable reason. PLATFORM_LIMITATION covers a capability the platform does not offer (e.g. Bluesky and Reddit DMs reject media); MISSING_PARTICIPANT means the stored conversation has no recipient to send to; DIRECT_SEND_NOT_ELIGIBLE and DIRECT_SEND_BLOCKED mean the WhatsApp Business Account needs Meta to grant or restore Direct Send access; DIRECT_SEND_LIMITED is temporary, Meta lifts it on its own; platform_api_error means Meta itself rejected the send (see platformError). | [optional] |
|
|
10
|
+
| **platform** | **String** | Present alongside code platform_api_error. The platform that rejected the send (e.g. instagram, facebook). | [optional] |
|
|
9
11
|
| **platform_error** | [**SendInboxMessage400ResponsePlatformError**](SendInboxMessage400ResponsePlatformError.md) | | [optional] |
|
|
10
12
|
|
|
11
13
|
## Example
|
|
@@ -15,7 +17,9 @@ require 'zernio-sdk'
|
|
|
15
17
|
|
|
16
18
|
instance = Zernio::SendInboxMessage400Response.new(
|
|
17
19
|
error: null,
|
|
20
|
+
type: null,
|
|
18
21
|
code: null,
|
|
22
|
+
platform: null,
|
|
19
23
|
platform_error: null
|
|
20
24
|
)
|
|
21
25
|
```
|
data/docs/TargetingSpec.md
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
| **company_sizes** | **Array<String>** | LinkedIn B2B only. | [optional] |
|
|
26
26
|
| **seniorities** | **Array<String>** | LinkedIn B2B only. | [optional] |
|
|
27
27
|
| **job_functions** | **Array<String>** | LinkedIn B2B only. | [optional] |
|
|
28
|
-
| **audience_include** | **Array<String>** | Platform audience IDs to include, as returned by GET /v1/ads/audiences (Meta custom audience ids, TikTok audience ids, Pinterest customer list ids, LinkedIn segment ids (
|
|
28
|
+
| **audience_include** | **Array<String>** | Platform audience IDs to include, as returned by GET /v1/ads/audiences (Meta custom audience ids, TikTok audience ids, Pinterest customer list ids, LinkedIn segment ids (the platformAudienceId from GET /v1/ads/audiences; Zernio resolves it to the targetable LinkedIn ad segment, an unknown id returns 400), Google user list ids, X custom audience ids). Not supported on OpenAI (400). | [optional] |
|
|
29
29
|
| **audience_exclude** | **Array<String>** | Platform audience IDs to exclude; same ID formats as audienceInclude. Not supported on OpenAI (400). | [optional] |
|
|
30
30
|
|
|
31
31
|
## Example
|
|
@@ -2264,7 +2264,7 @@ module Zernio
|
|
|
2264
2264
|
end
|
|
2265
2265
|
|
|
2266
2266
|
# Update ad
|
|
2267
|
-
# Patch one or more fields on an ad. Status, budget, targeting, and creative changes are propagated to the platform. Per-platform support: - **Meta** (Facebook + Instagram): all fields supported. - **TikTok**: status, budget, targeting (via `/v2/adgroup/update/`), and creative (via `/v2/ad/update/` patch-style: `headline` is ignored, `body` becomes `ad_text`). - **Google**: status, budget, KEYWORD edits via `targeting.keywords` / `targeting.negativeKeywords`, and DEVICE bid adjustments via `targeting.devices`. Each list you send becomes the FULL new set of its kind (criteria not in the list are removed); a kind left out is untouched. Any other `targeting` field returns 400: Google cannot mutate broad targeting post-create without recreating the campaign. `creative` returns 501. - **LinkedIn**: status, budget, targeting (
|
|
2267
|
+
# Patch one or more fields on an ad. Status, budget, targeting, and creative changes are propagated to the platform. Per-platform support: - **Meta** (Facebook + Instagram): all fields supported. - **TikTok**: status, budget, targeting (via `/v2/adgroup/update/`), and creative (via `/v2/ad/update/` patch-style: `headline` is ignored, `body` becomes `ad_text`). - **Google**: status, budget, KEYWORD edits via `targeting.keywords` / `targeting.negativeKeywords`, and DEVICE bid adjustments via `targeting.devices`. Each list you send becomes the FULL new set of its kind (criteria not in the list are removed); a kind left out is untouched. Any other `targeting` field returns 400: Google cannot mutate broad targeting post-create without recreating the campaign. `creative` returns 501. - **LinkedIn**: status, budget, targeting (countries or regions, excludedLocations (countries), the B2B facets, and audience segments; applied to the LinkedIn Campaign via PARTIAL_UPDATE, and REPLACES the campaign's entire targetingCriteria, not a merge), and creative (uploads new media, creates a replacement inline creative on the same campaign, pauses the old one). - **Pinterest / X / OpenAI Ads**: status + budget only. Sending `targeting` or `creative` returns 501 with code `unsupported_platform_operation`. OpenAI Ads budget is lifetime-only (see `budget.type` below). **Google keyword replacement:** These edits affect the ad's entire ad group, including sibling ads. Positive (`targeting.keywords`) and negative (`targeting.negativeKeywords`) sets are independent: omit a field to leave that set unchanged, or send `[]` to remove every keyword of that kind. Zernio compares each supplied set with Google's live criteria by case-insensitive keyword text and match type. A matching criterion is left untouched, retaining its criterion ID, enabled/paused status, keyword-level bid overrides, labels, and criterion-associated history/statistics. Zernio does not reset its quality score; Google continues to calculate scores and statistics normally. Text comparison does not trim whitespace. A bare string or an object without `matchType` means `broad`, not the existing criterion's match type. For example, resending an existing `{ \"text\": \"plumber\", \"matchType\": \"exact\" }` preserves it; sending `\"plumber\"` instead removes that EXACT criterion and requests a BROAD one. Changing text or match type removes criteria no longer requested and creates any missing criteria. New criteria get new IDs and do not inherit removed criteria's bid overrides, labels, or history. Historical reporting for a removed criterion is not transferred to its replacement. To add keywords without replacing a set, use [POST /v1/ads/keywords](https://docs.zernio.com/ad-campaigns/add-ad-keywords). Use `PATCH /v1/ads/keywords/{keywordId}` to pause/enable one keyword, or `DELETE /v1/ads/keywords/{keywordId}` to remove it.
|
|
2268
2268
|
# @param ad_id [String]
|
|
2269
2269
|
# @param update_ad_request [UpdateAdRequest]
|
|
2270
2270
|
# @param [Hash] opts the optional parameters
|
|
@@ -2275,7 +2275,7 @@ module Zernio
|
|
|
2275
2275
|
end
|
|
2276
2276
|
|
|
2277
2277
|
# Update ad
|
|
2278
|
-
# Patch one or more fields on an ad. Status, budget, targeting, and creative changes are propagated to the platform. Per-platform support: - **Meta** (Facebook + Instagram): all fields supported. - **TikTok**: status, budget, targeting (via `/v2/adgroup/update/`), and creative (via `/v2/ad/update/` patch-style: `headline` is ignored, `body` becomes `ad_text`). - **Google**: status, budget, KEYWORD edits via `targeting.keywords` / `targeting.negativeKeywords`, and DEVICE bid adjustments via `targeting.devices`. Each list you send becomes the FULL new set of its kind (criteria not in the list are removed); a kind left out is untouched. Any other `targeting` field returns 400: Google cannot mutate broad targeting post-create without recreating the campaign. `creative` returns 501. - **LinkedIn**: status, budget, targeting (
|
|
2278
|
+
# Patch one or more fields on an ad. Status, budget, targeting, and creative changes are propagated to the platform. Per-platform support: - **Meta** (Facebook + Instagram): all fields supported. - **TikTok**: status, budget, targeting (via `/v2/adgroup/update/`), and creative (via `/v2/ad/update/` patch-style: `headline` is ignored, `body` becomes `ad_text`). - **Google**: status, budget, KEYWORD edits via `targeting.keywords` / `targeting.negativeKeywords`, and DEVICE bid adjustments via `targeting.devices`. Each list you send becomes the FULL new set of its kind (criteria not in the list are removed); a kind left out is untouched. Any other `targeting` field returns 400: Google cannot mutate broad targeting post-create without recreating the campaign. `creative` returns 501. - **LinkedIn**: status, budget, targeting (countries or regions, excludedLocations (countries), the B2B facets, and audience segments; applied to the LinkedIn Campaign via PARTIAL_UPDATE, and REPLACES the campaign's entire targetingCriteria, not a merge), and creative (uploads new media, creates a replacement inline creative on the same campaign, pauses the old one). - **Pinterest / X / OpenAI Ads**: status + budget only. Sending `targeting` or `creative` returns 501 with code `unsupported_platform_operation`. OpenAI Ads budget is lifetime-only (see `budget.type` below). **Google keyword replacement:** These edits affect the ad's entire ad group, including sibling ads. Positive (`targeting.keywords`) and negative (`targeting.negativeKeywords`) sets are independent: omit a field to leave that set unchanged, or send `[]` to remove every keyword of that kind. Zernio compares each supplied set with Google's live criteria by case-insensitive keyword text and match type. A matching criterion is left untouched, retaining its criterion ID, enabled/paused status, keyword-level bid overrides, labels, and criterion-associated history/statistics. Zernio does not reset its quality score; Google continues to calculate scores and statistics normally. Text comparison does not trim whitespace. A bare string or an object without `matchType` means `broad`, not the existing criterion's match type. For example, resending an existing `{ \"text\": \"plumber\", \"matchType\": \"exact\" }` preserves it; sending `\"plumber\"` instead removes that EXACT criterion and requests a BROAD one. Changing text or match type removes criteria no longer requested and creates any missing criteria. New criteria get new IDs and do not inherit removed criteria's bid overrides, labels, or history. Historical reporting for a removed criterion is not transferred to its replacement. To add keywords without replacing a set, use [POST /v1/ads/keywords](https://docs.zernio.com/ad-campaigns/add-ad-keywords). Use `PATCH /v1/ads/keywords/{keywordId}` to pause/enable one keyword, or `DELETE /v1/ads/keywords/{keywordId}` to remove it.
|
|
2279
2279
|
# @param ad_id [String]
|
|
2280
2280
|
# @param update_ad_request [UpdateAdRequest]
|
|
2281
2281
|
# @param [Hash] opts the optional parameters
|
|
@@ -17,9 +17,15 @@ module Zernio
|
|
|
17
17
|
class SendInboxMessage400Response < ApiModelBase
|
|
18
18
|
attr_accessor :error
|
|
19
19
|
|
|
20
|
-
#
|
|
20
|
+
# Present on Meta pass-through rejections: platform_error when Meta rejected the send (see platform/platformError below), invalid_request_error for validation failures.
|
|
21
|
+
attr_accessor :type
|
|
22
|
+
|
|
23
|
+
# Stable machine-readable reason. PLATFORM_LIMITATION covers a capability the platform does not offer (e.g. Bluesky and Reddit DMs reject media); MISSING_PARTICIPANT means the stored conversation has no recipient to send to; DIRECT_SEND_NOT_ELIGIBLE and DIRECT_SEND_BLOCKED mean the WhatsApp Business Account needs Meta to grant or restore Direct Send access; DIRECT_SEND_LIMITED is temporary, Meta lifts it on its own; platform_api_error means Meta itself rejected the send (see platformError).
|
|
21
24
|
attr_accessor :code
|
|
22
25
|
|
|
26
|
+
# Present alongside code platform_api_error. The platform that rejected the send (e.g. instagram, facebook).
|
|
27
|
+
attr_accessor :platform
|
|
28
|
+
|
|
23
29
|
attr_accessor :platform_error
|
|
24
30
|
|
|
25
31
|
class EnumAttributeValidator
|
|
@@ -48,7 +54,9 @@ module Zernio
|
|
|
48
54
|
def self.attribute_map
|
|
49
55
|
{
|
|
50
56
|
:'error' => :'error',
|
|
57
|
+
:'type' => :'type',
|
|
51
58
|
:'code' => :'code',
|
|
59
|
+
:'platform' => :'platform',
|
|
52
60
|
:'platform_error' => :'platformError'
|
|
53
61
|
}
|
|
54
62
|
end
|
|
@@ -67,7 +75,9 @@ module Zernio
|
|
|
67
75
|
def self.openapi_types
|
|
68
76
|
{
|
|
69
77
|
:'error' => :'String',
|
|
78
|
+
:'type' => :'String',
|
|
70
79
|
:'code' => :'String',
|
|
80
|
+
:'platform' => :'String',
|
|
71
81
|
:'platform_error' => :'SendInboxMessage400ResponsePlatformError'
|
|
72
82
|
}
|
|
73
83
|
end
|
|
@@ -98,10 +108,18 @@ module Zernio
|
|
|
98
108
|
self.error = attributes[:'error']
|
|
99
109
|
end
|
|
100
110
|
|
|
111
|
+
if attributes.key?(:'type')
|
|
112
|
+
self.type = attributes[:'type']
|
|
113
|
+
end
|
|
114
|
+
|
|
101
115
|
if attributes.key?(:'code')
|
|
102
116
|
self.code = attributes[:'code']
|
|
103
117
|
end
|
|
104
118
|
|
|
119
|
+
if attributes.key?(:'platform')
|
|
120
|
+
self.platform = attributes[:'platform']
|
|
121
|
+
end
|
|
122
|
+
|
|
105
123
|
if attributes.key?(:'platform_error')
|
|
106
124
|
self.platform_error = attributes[:'platform_error']
|
|
107
125
|
end
|
|
@@ -119,15 +137,27 @@ module Zernio
|
|
|
119
137
|
# @return true if the model is valid
|
|
120
138
|
def valid?
|
|
121
139
|
warn '[DEPRECATED] the `valid?` method is obsolete'
|
|
122
|
-
|
|
140
|
+
type_validator = EnumAttributeValidator.new('String', ["platform_error", "invalid_request_error"])
|
|
141
|
+
return false unless type_validator.valid?(@type)
|
|
142
|
+
code_validator = EnumAttributeValidator.new('String', ["PLATFORM_LIMITATION", "MISSING_PARTICIPANT", "DIRECT_SEND_NOT_ELIGIBLE", "DIRECT_SEND_LIMITED", "DIRECT_SEND_BLOCKED", "platform_api_error"])
|
|
123
143
|
return false unless code_validator.valid?(@code)
|
|
124
144
|
true
|
|
125
145
|
end
|
|
126
146
|
|
|
147
|
+
# Custom attribute writer method checking allowed values (enum).
|
|
148
|
+
# @param [Object] type Object to be assigned
|
|
149
|
+
def type=(type)
|
|
150
|
+
validator = EnumAttributeValidator.new('String', ["platform_error", "invalid_request_error"])
|
|
151
|
+
unless validator.valid?(type)
|
|
152
|
+
fail ArgumentError, "invalid value for \"type\", must be one of #{validator.allowable_values}."
|
|
153
|
+
end
|
|
154
|
+
@type = type
|
|
155
|
+
end
|
|
156
|
+
|
|
127
157
|
# Custom attribute writer method checking allowed values (enum).
|
|
128
158
|
# @param [Object] code Object to be assigned
|
|
129
159
|
def code=(code)
|
|
130
|
-
validator = EnumAttributeValidator.new('String', ["PLATFORM_LIMITATION", "MISSING_PARTICIPANT", "DIRECT_SEND_NOT_ELIGIBLE", "DIRECT_SEND_LIMITED", "DIRECT_SEND_BLOCKED"])
|
|
160
|
+
validator = EnumAttributeValidator.new('String', ["PLATFORM_LIMITATION", "MISSING_PARTICIPANT", "DIRECT_SEND_NOT_ELIGIBLE", "DIRECT_SEND_LIMITED", "DIRECT_SEND_BLOCKED", "platform_api_error"])
|
|
131
161
|
unless validator.valid?(code)
|
|
132
162
|
fail ArgumentError, "invalid value for \"code\", must be one of #{validator.allowable_values}."
|
|
133
163
|
end
|
|
@@ -140,7 +170,9 @@ module Zernio
|
|
|
140
170
|
return true if self.equal?(o)
|
|
141
171
|
self.class == o.class &&
|
|
142
172
|
error == o.error &&
|
|
173
|
+
type == o.type &&
|
|
143
174
|
code == o.code &&
|
|
175
|
+
platform == o.platform &&
|
|
144
176
|
platform_error == o.platform_error
|
|
145
177
|
end
|
|
146
178
|
|
|
@@ -153,7 +185,7 @@ module Zernio
|
|
|
153
185
|
# Calculates hash code according to all attributes.
|
|
154
186
|
# @return [Integer] Hash code
|
|
155
187
|
def hash
|
|
156
|
-
[error, code, platform_error].hash
|
|
188
|
+
[error, type, code, platform, platform_error].hash
|
|
157
189
|
end
|
|
158
190
|
|
|
159
191
|
# Builds the object from hash
|
|
@@ -78,7 +78,7 @@ module Zernio
|
|
|
78
78
|
# LinkedIn B2B only.
|
|
79
79
|
attr_accessor :job_functions
|
|
80
80
|
|
|
81
|
-
# Platform audience IDs to include, as returned by GET /v1/ads/audiences (Meta custom audience ids, TikTok audience ids, Pinterest customer list ids, LinkedIn segment ids (
|
|
81
|
+
# Platform audience IDs to include, as returned by GET /v1/ads/audiences (Meta custom audience ids, TikTok audience ids, Pinterest customer list ids, LinkedIn segment ids (the platformAudienceId from GET /v1/ads/audiences; Zernio resolves it to the targetable LinkedIn ad segment, an unknown id returns 400), Google user list ids, X custom audience ids). Not supported on OpenAI (400).
|
|
82
82
|
attr_accessor :audience_include
|
|
83
83
|
|
|
84
84
|
# Platform audience IDs to exclude; same ID formats as audienceInclude. Not supported on OpenAI (400).
|
|
@@ -14,7 +14,7 @@ require 'date'
|
|
|
14
14
|
require 'time'
|
|
15
15
|
|
|
16
16
|
module Zernio
|
|
17
|
-
# Meta + TikTok (demographics/interests), Google (keyword and device bid adjustment edits only), and LinkedIn (
|
|
17
|
+
# Meta + TikTok (demographics/interests), Google (keyword and device bid adjustment edits only), and LinkedIn (countries or regions required). Pinterest / X return 501.
|
|
18
18
|
class UpdateAdRequestTargeting < ApiModelBase
|
|
19
19
|
# Google only. The FULL desired set of positive keywords for the entire ad group. Omit to leave positives unchanged; [] removes all positives. Negatives are independent. Entries are strings (BROAD) or { text, matchType } with matchType exact | phrase | broad; an omitted matchType also defaults to BROAD. Matching case-insensitive text AND match type retains the existing criterion ID, status, bid overrides, labels and history without a mutation. A changed text or match type uses remove/create, without transferring the old criterion's attributes or history. See Google keyword replacement above for an EXACT-to-BROAD example. Mirrored to GET /v1/ads/keywords immediately.
|
|
20
20
|
attr_accessor :keywords
|
data/lib/zernio-sdk/version.rb
CHANGED
data/openapi.yaml
CHANGED
|
@@ -8907,7 +8907,7 @@ components:
|
|
|
8907
8907
|
companySizes: { type: array, items: { type: string }, description: "LinkedIn B2B only." }
|
|
8908
8908
|
seniorities: { type: array, items: { type: string }, description: "LinkedIn B2B only." }
|
|
8909
8909
|
jobFunctions: { type: array, items: { type: string }, description: "LinkedIn B2B only." }
|
|
8910
|
-
audienceInclude: { type: array, items: { type: string }, description: 'Platform audience IDs to include, as returned by GET /v1/ads/audiences (Meta custom audience ids, TikTok audience ids, Pinterest customer list ids, LinkedIn segment ids (
|
|
8910
|
+
audienceInclude: { type: array, items: { type: string }, description: 'Platform audience IDs to include, as returned by GET /v1/ads/audiences (Meta custom audience ids, TikTok audience ids, Pinterest customer list ids, LinkedIn segment ids (the platformAudienceId from GET /v1/ads/audiences; Zernio resolves it to the targetable LinkedIn ad segment, an unknown id returns 400), Google user list ids, X custom audience ids). Not supported on OpenAI (400).' }
|
|
8911
8911
|
audienceExclude: { type: array, items: { type: string }, description: 'Platform audience IDs to exclude; same ID formats as audienceInclude. Not supported on OpenAI (400).' }
|
|
8912
8912
|
Ad:
|
|
8913
8913
|
type: object
|
|
@@ -29326,17 +29326,24 @@ paths:
|
|
|
29326
29326
|
fbtraceId: { type: string, description: "Meta fbtrace_id, quote this in a Meta bug report" }
|
|
29327
29327
|
type: { type: string, description: "Meta error type (e.g. OAuthException)" }
|
|
29328
29328
|
'400':
|
|
29329
|
-
description: 'Bad request (e.g., attachment not supported for platform, validation error, category combined with a template or attachment, category used on a non-WhatsApp account, or the WhatsApp Business Account is not eligible for Direct Send)'
|
|
29329
|
+
description: 'Bad request (e.g., attachment not supported for platform, validation error, category combined with a template or attachment, category used on a non-WhatsApp account, or the WhatsApp Business Account is not eligible for Direct Send). Meta rejections (e.g. sending outside the messaging window) arrive with code platform_api_error, type platform_error, and platform + platformError set.'
|
|
29330
29330
|
content:
|
|
29331
29331
|
application/json:
|
|
29332
29332
|
schema:
|
|
29333
29333
|
type: object
|
|
29334
29334
|
properties:
|
|
29335
29335
|
error: { type: string }
|
|
29336
|
+
type:
|
|
29337
|
+
type: string
|
|
29338
|
+
description: "Present on Meta pass-through rejections: platform_error when Meta rejected the send (see platform/platformError below), invalid_request_error for validation failures."
|
|
29339
|
+
enum: [platform_error, invalid_request_error]
|
|
29336
29340
|
code:
|
|
29337
29341
|
type: string
|
|
29338
|
-
description: "Stable machine-readable reason. PLATFORM_LIMITATION covers a capability the platform does not offer (e.g. Bluesky and Reddit DMs reject media); MISSING_PARTICIPANT means the stored conversation has no recipient to send to; DIRECT_SEND_NOT_ELIGIBLE and DIRECT_SEND_BLOCKED mean the WhatsApp Business Account needs Meta to grant or restore Direct Send access; DIRECT_SEND_LIMITED is temporary, Meta lifts it on its own."
|
|
29339
|
-
enum: [PLATFORM_LIMITATION, MISSING_PARTICIPANT, DIRECT_SEND_NOT_ELIGIBLE, DIRECT_SEND_LIMITED, DIRECT_SEND_BLOCKED]
|
|
29342
|
+
description: "Stable machine-readable reason. PLATFORM_LIMITATION covers a capability the platform does not offer (e.g. Bluesky and Reddit DMs reject media); MISSING_PARTICIPANT means the stored conversation has no recipient to send to; DIRECT_SEND_NOT_ELIGIBLE and DIRECT_SEND_BLOCKED mean the WhatsApp Business Account needs Meta to grant or restore Direct Send access; DIRECT_SEND_LIMITED is temporary, Meta lifts it on its own; platform_api_error means Meta itself rejected the send (see platformError)."
|
|
29343
|
+
enum: [PLATFORM_LIMITATION, MISSING_PARTICIPANT, DIRECT_SEND_NOT_ELIGIBLE, DIRECT_SEND_LIMITED, DIRECT_SEND_BLOCKED, platform_api_error]
|
|
29344
|
+
platform:
|
|
29345
|
+
type: string
|
|
29346
|
+
description: "Present alongside code platform_api_error. The platform that rejected the send (e.g. instagram, facebook)."
|
|
29340
29347
|
platformError:
|
|
29341
29348
|
type: object
|
|
29342
29349
|
description: "Instagram/Facebook only. Meta's own diagnostic fields for the rejected send, passed through verbatim so you can tell failure classes apart and quote them to Meta. Absent when the failure did not come from Meta."
|
|
@@ -29352,9 +29359,14 @@ paths:
|
|
|
29352
29359
|
upstream failure (for example WhatsApp 131000) does not say whether
|
|
29353
29360
|
the message was delivered. Retrying this request may deliver the
|
|
29354
29361
|
message twice. Retry only if your use case tolerates a duplicate.
|
|
29362
|
+
Meta 5xx failures also arrive as a platform_error envelope (code
|
|
29363
|
+
platform_api_error, with platform and platformError set).
|
|
29355
29364
|
'401': { $ref: '#/components/responses/Unauthorized' }
|
|
29356
29365
|
'403':
|
|
29357
|
-
description: Inbox addon required
|
|
29366
|
+
description: 'Inbox addon required, or Meta rejected the send outside the messaging window (type platform_error, code platform_api_error, platform, platformError with code/subcode/fbtraceId/type)'
|
|
29367
|
+
content:
|
|
29368
|
+
application/json:
|
|
29369
|
+
schema: { $ref: '#/components/schemas/ErrorResponse' }
|
|
29358
29370
|
'409': { $ref: '#/components/responses/IdempotencyKeyInFlight' }
|
|
29359
29371
|
'422': { $ref: '#/components/responses/IdempotencyKeyReused' }
|
|
29360
29372
|
|
|
@@ -44193,9 +44205,11 @@ paths:
|
|
|
44193
44205
|
list are removed); a kind left out is untouched. Any other `targeting` field
|
|
44194
44206
|
returns 400: Google cannot mutate broad targeting post-create without recreating
|
|
44195
44207
|
the campaign. `creative` returns 501.
|
|
44196
|
-
- **LinkedIn**: status, budget, targeting (
|
|
44197
|
-
|
|
44198
|
-
|
|
44208
|
+
- **LinkedIn**: status, budget, targeting (countries or regions, excludedLocations (countries),
|
|
44209
|
+
the B2B facets, and audience segments; applied to the LinkedIn Campaign via
|
|
44210
|
+
PARTIAL_UPDATE, and REPLACES the campaign's entire targetingCriteria, not a merge),
|
|
44211
|
+
and creative (uploads new media, creates a replacement inline creative on the same
|
|
44212
|
+
campaign, pauses the old one).
|
|
44199
44213
|
- **Pinterest / X / OpenAI Ads**: status + budget only. Sending
|
|
44200
44214
|
`targeting` or `creative` returns 501 with code `unsupported_platform_operation`.
|
|
44201
44215
|
OpenAI Ads budget is lifetime-only (see `budget.type` below).
|
|
@@ -44246,8 +44260,8 @@ paths:
|
|
|
44246
44260
|
type: object
|
|
44247
44261
|
description: |
|
|
44248
44262
|
Meta + TikTok (demographics/interests), Google (keyword and device
|
|
44249
|
-
bid adjustment edits only), and LinkedIn (
|
|
44250
|
-
return 501.
|
|
44263
|
+
bid adjustment edits only), and LinkedIn (countries or regions required).
|
|
44264
|
+
Pinterest / X return 501.
|
|
44251
44265
|
properties:
|
|
44252
44266
|
keywords:
|
|
44253
44267
|
type: array
|
|
@@ -44348,7 +44362,7 @@ paths:
|
|
|
44348
44362
|
ad: { $ref: '#/components/schemas/Ad' }
|
|
44349
44363
|
message: { type: string }
|
|
44350
44364
|
'400':
|
|
44351
|
-
description: 'Invalid status transition, budget below minimum,
|
|
44365
|
+
description: 'Invalid status transition, budget below minimum, a LinkedIn creative update without imageUrl or videoUrl, or a LinkedIn targeting update without countries or regions'
|
|
44352
44366
|
'401': { $ref: '#/components/responses/Unauthorized' }
|
|
44353
44367
|
'403':
|
|
44354
44368
|
description: 'Returned with code `ads_allowance_exceeded` when the team has no payment method on file and has reached the 500 free live ads: add a card to resume.'
|
|
@@ -453,7 +453,7 @@ describe 'AdCampaignsApi' do
|
|
|
453
453
|
|
|
454
454
|
# unit tests for update_ad
|
|
455
455
|
# Update ad
|
|
456
|
-
# Patch one or more fields on an ad. Status, budget, targeting, and creative changes are propagated to the platform. Per-platform support: - **Meta** (Facebook + Instagram): all fields supported. - **TikTok**: status, budget, targeting (via `/v2/adgroup/update/`), and creative (via `/v2/ad/update/` patch-style: `headline` is ignored, `body` becomes `ad_text`). - **Google**: status, budget, KEYWORD edits via `targeting.keywords` / `targeting.negativeKeywords`, and DEVICE bid adjustments via `targeting.devices`. Each list you send becomes the FULL new set of its kind (criteria not in the list are removed); a kind left out is untouched. Any other `targeting` field returns 400: Google cannot mutate broad targeting post-create without recreating the campaign. `creative` returns 501. - **LinkedIn**: status, budget, targeting (
|
|
456
|
+
# Patch one or more fields on an ad. Status, budget, targeting, and creative changes are propagated to the platform. Per-platform support: - **Meta** (Facebook + Instagram): all fields supported. - **TikTok**: status, budget, targeting (via `/v2/adgroup/update/`), and creative (via `/v2/ad/update/` patch-style: `headline` is ignored, `body` becomes `ad_text`). - **Google**: status, budget, KEYWORD edits via `targeting.keywords` / `targeting.negativeKeywords`, and DEVICE bid adjustments via `targeting.devices`. Each list you send becomes the FULL new set of its kind (criteria not in the list are removed); a kind left out is untouched. Any other `targeting` field returns 400: Google cannot mutate broad targeting post-create without recreating the campaign. `creative` returns 501. - **LinkedIn**: status, budget, targeting (countries or regions, excludedLocations (countries), the B2B facets, and audience segments; applied to the LinkedIn Campaign via PARTIAL_UPDATE, and REPLACES the campaign's entire targetingCriteria, not a merge), and creative (uploads new media, creates a replacement inline creative on the same campaign, pauses the old one). - **Pinterest / X / OpenAI Ads**: status + budget only. Sending `targeting` or `creative` returns 501 with code `unsupported_platform_operation`. OpenAI Ads budget is lifetime-only (see `budget.type` below). **Google keyword replacement:** These edits affect the ad's entire ad group, including sibling ads. Positive (`targeting.keywords`) and negative (`targeting.negativeKeywords`) sets are independent: omit a field to leave that set unchanged, or send `[]` to remove every keyword of that kind. Zernio compares each supplied set with Google's live criteria by case-insensitive keyword text and match type. A matching criterion is left untouched, retaining its criterion ID, enabled/paused status, keyword-level bid overrides, labels, and criterion-associated history/statistics. Zernio does not reset its quality score; Google continues to calculate scores and statistics normally. Text comparison does not trim whitespace. A bare string or an object without `matchType` means `broad`, not the existing criterion's match type. For example, resending an existing `{ \"text\": \"plumber\", \"matchType\": \"exact\" }` preserves it; sending `\"plumber\"` instead removes that EXACT criterion and requests a BROAD one. Changing text or match type removes criteria no longer requested and creates any missing criteria. New criteria get new IDs and do not inherit removed criteria's bid overrides, labels, or history. Historical reporting for a removed criterion is not transferred to its replacement. To add keywords without replacing a set, use [POST /v1/ads/keywords](https://docs.zernio.com/ad-campaigns/add-ad-keywords). Use `PATCH /v1/ads/keywords/{keywordId}` to pause/enable one keyword, or `DELETE /v1/ads/keywords/{keywordId}` to remove it.
|
|
457
457
|
# @param ad_id
|
|
458
458
|
# @param update_ad_request
|
|
459
459
|
# @param [Hash] opts the optional parameters
|
|
@@ -33,16 +33,32 @@ describe Zernio::SendInboxMessage400Response do
|
|
|
33
33
|
end
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
+
describe 'test attribute "type"' do
|
|
37
|
+
it 'should work' do
|
|
38
|
+
# assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
|
|
39
|
+
# validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["platform_error", "invalid_request_error"])
|
|
40
|
+
# validator.allowable_values.each do |value|
|
|
41
|
+
# expect { instance.type = value }.not_to raise_error
|
|
42
|
+
# end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
36
46
|
describe 'test attribute "code"' do
|
|
37
47
|
it 'should work' do
|
|
38
48
|
# assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
|
|
39
|
-
# validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["PLATFORM_LIMITATION", "MISSING_PARTICIPANT", "DIRECT_SEND_NOT_ELIGIBLE", "DIRECT_SEND_LIMITED", "DIRECT_SEND_BLOCKED"])
|
|
49
|
+
# validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["PLATFORM_LIMITATION", "MISSING_PARTICIPANT", "DIRECT_SEND_NOT_ELIGIBLE", "DIRECT_SEND_LIMITED", "DIRECT_SEND_BLOCKED", "platform_api_error"])
|
|
40
50
|
# validator.allowable_values.each do |value|
|
|
41
51
|
# expect { instance.code = value }.not_to raise_error
|
|
42
52
|
# end
|
|
43
53
|
end
|
|
44
54
|
end
|
|
45
55
|
|
|
56
|
+
describe 'test attribute "platform"' do
|
|
57
|
+
it 'should work' do
|
|
58
|
+
# assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
46
62
|
describe 'test attribute "platform_error"' do
|
|
47
63
|
it 'should work' do
|
|
48
64
|
# assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
|
|
Binary file
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: late-sdk
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.888
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- OpenAPI-Generator
|
|
@@ -6067,7 +6067,7 @@ files:
|
|
|
6067
6067
|
- spec/models/you_tube_video_retention_response_retention_curve_inner_spec.rb
|
|
6068
6068
|
- spec/models/you_tube_video_retention_response_spec.rb
|
|
6069
6069
|
- spec/spec_helper.rb
|
|
6070
|
-
- zernio-sdk-0.0.
|
|
6070
|
+
- zernio-sdk-0.0.888.gem
|
|
6071
6071
|
- zernio-sdk.gemspec
|
|
6072
6072
|
homepage: https://openapi-generator.tech
|
|
6073
6073
|
licenses:
|
data/zernio-sdk-0.0.886.gem
DELETED
|
Binary file
|