late-sdk 0.0.867 → 0.0.869

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cd2956aebe225989dc7baf4548ac17b558fe58df1a01eb060792b616fecf4108
4
- data.tar.gz: 0b1778c27e23d87cf05473c53b1999a033c4228e6f3d3722d1f4001cdcc3adbb
3
+ metadata.gz: 21dccd513a863401ed4f5dc7c6480deb454a40c5c98feec0061ecce82c468a40
4
+ data.tar.gz: 5483bf9a5f28ea82b3b59e239bf051cdde5bdbf6200f9e91161e83f267449239
5
5
  SHA512:
6
- metadata.gz: 219f4ebe4ac047fa31c07117584c875a10533f695ff4c0524aa13f985a5c8226818840beedf0c31b640b99d1c76a7a66b790c3647e40e186d1c11318931b2f13
7
- data.tar.gz: 4605bd83d3cbdbd30f73154565a40ad529160a8ab64eae04b4792a240daf38ea20cbf6dab215f008bd3d3a41c8e9437515acfc26e6c43b4e137777a2bba702c4
6
+ metadata.gz: d715b4552a1dd922beb998b27904fd690378288820a84d5cc74ec3e954d5678adb365299715332712e01c6fbe7280cf35e4ce8d591874eed3c32db2d835811fa
7
+ data.tar.gz: 7ef9602d851c55e23e14bbdaf6455bba62f1a712fbfa2dd7d5a3b8df215578daf147b13793e885481f6b081828cb0464f971f2f1a66a4a8df08e1a2d10e359e2
data/README.md CHANGED
@@ -2030,6 +2030,7 @@ Class | Method | HTTP request | Description
2030
2030
  - [Zernio::SendInboxMessage200ResponseDataAttachmentsInner](docs/SendInboxMessage200ResponseDataAttachmentsInner.md)
2031
2031
  - [Zernio::SendInboxMessage200ResponseDataPartialFailure](docs/SendInboxMessage200ResponseDataPartialFailure.md)
2032
2032
  - [Zernio::SendInboxMessage200ResponseDataPartialFailurePlatformError](docs/SendInboxMessage200ResponseDataPartialFailurePlatformError.md)
2033
+ - [Zernio::SendInboxMessage200ResponseWarningsInner](docs/SendInboxMessage200ResponseWarningsInner.md)
2033
2034
  - [Zernio::SendInboxMessage400Response](docs/SendInboxMessage400Response.md)
2034
2035
  - [Zernio::SendInboxMessage400ResponsePlatformError](docs/SendInboxMessage400ResponsePlatformError.md)
2035
2036
  - [Zernio::SendInboxMessageRequest](docs/SendInboxMessageRequest.md)
@@ -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 (geo countries only, applied to the LinkedIn Campaign via PARTIAL_UPDATE), 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).
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 (geo countries only, applied to the LinkedIn Campaign via PARTIAL_UPDATE), 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
 
@@ -29,8 +29,8 @@
29
29
  | **long_headline** | **String** | Google Display only — defaults to `headline` if omitted. On LinkedIn, reused as the optional secondary description text on traffic (link) ads; omitted if not provided. | [optional] |
30
30
  | **body** | **String** | Required on legacy + attach shapes. For X/Twitter this is the tweet text (max 280 chars including a ~24-char URL when `linkUrl` is set). On LinkedIn this is the post commentary (the intro text shown above the ad). On OpenAI Ads this is the chat card's body text. Max: Google=90, Pinterest=500, OpenAI=100. | [optional] |
31
31
  | **description** | **String** | Meta only (facebook/instagram). Link description — the secondary text shown below the headline (Meta's link_data.description; on video creatives mapped to video_data.link_description). When omitted, Meta auto-pulls the destination URL's OpenGraph description. Applies on legacy, attach, and placementAssets shapes; for multi-creative use creatives[].description (this field is the shared fallback). For multi-text variations use `descriptions` (array) instead. | [optional] |
32
- | **bodies** | **Array<String>** | Meta only. Multiple Text Options (Advantage+ Flexible Format): supply 1-5 primary-text variations and Meta optimises delivery across them, WITHOUT enabling full Dynamic Creative (`dynamicCreative`). Uses `optimization_type: DEGREES_OF_FREEDOM` on the asset feed, so multiple ads per ad set are allowed (unlike `dynamicCreative` which is limited to one). Requires `imageUrl` or `video`, `linkUrl`, and `callToAction`. When set, the top-level `body` field is used as the `object_story_spec.link_data.message` (the preview text) and `headlines` must also be present. Mutually exclusive with `dynamicCreative`, `placementAssets`, `carouselCards`, and `creatives[]`. | [optional] |
33
- | **headlines** | **Array<String>** | Meta only. Headline variations for Multiple Text Options. Must be sent alongside `bodies`. The top-level `headline` field is used as the `object_story_spec.link_data.name`. | [optional] |
32
+ | **bodies** | **Array<String>** | Meta only. Multiple Text Options (Advantage+ Flexible Format): supply 1-5 primary-text variations and Meta optimises delivery across them, WITHOUT enabling full Dynamic Creative (`dynamicCreative`). Uses `optimization_type: DEGREES_OF_FREEDOM` on the asset feed, so multiple ads per ad set are allowed (unlike `dynamicCreative` which is limited to one). Requires `imageUrl` or `video`, `linkUrl`, and `callToAction`. When set, the top-level `body` field is used as the `object_story_spec.link_data.message` (the preview text) and `headlines` must also be present. On a video creative the copy lands in `video_data.message` / `video_data.title` instead of `link_data`. Mutually exclusive with `dynamicCreative`, `placementAssets`, `carouselCards`, and `creatives[]`. | [optional] |
33
+ | **headlines** | **Array<String>** | Meta only. Headline variations for Multiple Text Options. Must be sent alongside `bodies`. The top-level `headline` field is used as the `object_story_spec.link_data.name` (`video_data.title` on a video creative). | [optional] |
34
34
  | **descriptions** | **Array<String>** | Meta only. Optional description variations for Multiple Text Options. Sent alongside `bodies` and `headlines`. | [optional] |
35
35
  | **call_to_action** | **String** | Required on legacy + attach shapes for Meta. Honoured on TikTok (passes through to the Spark Ad creative's `call_to_action`) and on LinkedIn (the CTA button on the ad; defaults to LEARN_MORE when `linkUrl` is set). LinkedIn accepts: LEARN_MORE, SIGN_UP, DOWNLOAD, SUBSCRIBE, REGISTER, JOIN, ATTEND, REQUEST_DEMO, VIEW_QUOTE, APPLY, SEE_MORE, SHOP_NOW, BUY_NOW. Ignored by Google, Pinterest, and X/Twitter. | [optional] |
36
36
  | **link_url** | **String** | Required on legacy + attach shapes (skip for multi-creative). On LinkedIn it's the ad's destination URL; required for `traffic` ads, optional for `engagement` / `awareness`. NOT required when `goal` is `lead_generation` (the ad opens a Lead Gen form instead of a destination). On LinkedIn, `imageUrl` + `linkUrl` publishes an ARTICLE-content creative; this is LinkedIn's article ad format, with the image as thumbnail and `longHeadline` as description. Required for OpenAI Ads (the chat card's target_url). | [optional] |
@@ -8,7 +8,7 @@
8
8
  | **content** | **Array<String>** | | [optional] |
9
9
  | **style** | **String** | | [optional] |
10
10
  | **button_text** | **String** | | [optional] |
11
- | **cover_photo** | **String** | | [optional] |
11
+ | **cover_photo** | **String** | Direct public JPEG or PNG image URL, up to 5 MB. Redirects, Ad Image hashes and IDs are not supported. | [optional] |
12
12
 
13
13
  ## Example
14
14
 
@@ -5,6 +5,7 @@
5
5
  | Name | Type | Description | Notes |
6
6
  | ---- | ---- | ----------- | ----- |
7
7
  | **success** | **Boolean** | | [optional] |
8
+ | **warnings** | [**Array<SendInboxMessage200ResponseWarningsInner>**](SendInboxMessage200ResponseWarningsInner.md) | Present when a successful send ignored replyTo on Instagram or Facebook Messenger. The message was sent without a quote; do not retry it to apply the reply. | [optional] |
8
9
  | **data** | [**SendInboxMessage200ResponseData**](SendInboxMessage200ResponseData.md) | | [optional] |
9
10
 
10
11
  ## Example
@@ -14,6 +15,7 @@ require 'zernio-sdk'
14
15
 
15
16
  instance = Zernio::SendInboxMessage200Response.new(
16
17
  success: null,
18
+ warnings: null,
17
19
  data: null
18
20
  )
19
21
  ```
@@ -0,0 +1,22 @@
1
+ # Zernio::SendInboxMessage200ResponseWarningsInner
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **code** | **String** | | |
8
+ | **param** | **String** | | |
9
+ | **message** | **String** | Human-readable explanation of the ignored field. | |
10
+
11
+ ## Example
12
+
13
+ ```ruby
14
+ require 'zernio-sdk'
15
+
16
+ instance = Zernio::SendInboxMessage200ResponseWarningsInner.new(
17
+ code: null,
18
+ param: null,
19
+ message: null
20
+ )
21
+ ```
22
+
@@ -19,7 +19,7 @@
19
19
  | **reply_markup** | [**SendInboxMessageRequestReplyMarkup**](SendInboxMessageRequestReplyMarkup.md) | | [optional] |
20
20
  | **messaging_type** | **String** | Facebook messaging type. Required when using messageTag. | [optional] |
21
21
  | **message_tag** | **String** | Facebook message tag for messaging outside 24h window. Requires messagingType MESSAGE_TAG. Instagram only supports HUMAN_AGENT. | [optional] |
22
- | **reply_to** | **String** | Platform message ID to quote-reply to. For WhatsApp, pass the wamid; for Telegram, the Telegram message ID (delivered as message.platformMessageId on webhooks, and as `id` on each entry of the list-messages endpoint). On Slack it threads the reply (thread_ts) instead of quoting. Silently ignored on platforms without send-side reply support, including Instagram and Facebook Messenger (Meta's Send API rejects reply_to on Instagram and does not expose it on Messenger). | [optional] |
22
+ | **reply_to** | **String** | Platform message ID to quote-reply to. For WhatsApp, pass the wamid; for Telegram, the Telegram message ID (delivered as message.platformMessageId on webhooks, and as `id` on each entry of the list-messages endpoint). On Slack it threads the reply (thread_ts) instead of quoting. Instagram and Facebook Messenger do not support send-side quote replies: the message is sent without a quote and the successful response includes a warnings entry with code ignored_field and param replyTo. Other platforms without send-side reply support ignore this field. | [optional] |
23
23
  | **location** | [**SendInboxMessageRequestLocation**](SendInboxMessageRequestLocation.md) | | [optional] |
24
24
  | **contacts** | [**Array<SendInboxMessageRequestContactsInner>**](SendInboxMessageRequestContactsInner.md) | WhatsApp-only. Send one or more contact cards. | [optional] |
25
25
 
@@ -4,8 +4,8 @@
4
4
 
5
5
  | Name | Type | Description | Notes |
6
6
  | ---- | ---- | ----------- | ----- |
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
- | **negative_keywords** | [**Array<UpdateAdRequestTargetingKeywordsInner>**](UpdateAdRequestTargetingKeywordsInner.md) | Google only. Same declarative contract as keywords, for the ad group's negative keywords. | [optional] |
7
+ | **keywords** | [**Array<UpdateAdRequestTargetingKeywordsInner>**](UpdateAdRequestTargetingKeywordsInner.md) | 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. | [optional] |
8
+ | **negative_keywords** | [**Array<UpdateAdRequestTargetingKeywordsInner>**](UpdateAdRequestTargetingKeywordsInner.md) | Google only. The FULL desired set of negative keywords for the entire ad group, independent of positives. Omit to leave negatives unchanged; [] removes all negatives. Uses the same text/match-type identity and preservation contract as keywords above. Strings and objects without matchType default to BROAD, so resending an EXACT or PHRASE negative as a bare string requests a different criterion. Campaign negatives are separate: use /v1/ads/campaigns/{campaignId}/negative-keywords to manage those. | [optional] |
9
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] |
10
10
  | **age_min** | **Integer** | | [optional] |
11
11
  | **age_max** | **Integer** | | [optional] |
@@ -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 (geo countries only, applied to the LinkedIn Campaign via PARTIAL_UPDATE), 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).
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 (geo countries only, applied to the LinkedIn Campaign via PARTIAL_UPDATE), 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 (geo countries only, applied to the LinkedIn Campaign via PARTIAL_UPDATE), 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).
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 (geo countries only, applied to the LinkedIn Campaign via PARTIAL_UPDATE), 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
@@ -86,10 +86,10 @@ module Zernio
86
86
  # Meta only (facebook/instagram). Link description — the secondary text shown below the headline (Meta's link_data.description; on video creatives mapped to video_data.link_description). When omitted, Meta auto-pulls the destination URL's OpenGraph description. Applies on legacy, attach, and placementAssets shapes; for multi-creative use creatives[].description (this field is the shared fallback). For multi-text variations use `descriptions` (array) instead.
87
87
  attr_accessor :description
88
88
 
89
- # Meta only. Multiple Text Options (Advantage+ Flexible Format): supply 1-5 primary-text variations and Meta optimises delivery across them, WITHOUT enabling full Dynamic Creative (`dynamicCreative`). Uses `optimization_type: DEGREES_OF_FREEDOM` on the asset feed, so multiple ads per ad set are allowed (unlike `dynamicCreative` which is limited to one). Requires `imageUrl` or `video`, `linkUrl`, and `callToAction`. When set, the top-level `body` field is used as the `object_story_spec.link_data.message` (the preview text) and `headlines` must also be present. Mutually exclusive with `dynamicCreative`, `placementAssets`, `carouselCards`, and `creatives[]`.
89
+ # Meta only. Multiple Text Options (Advantage+ Flexible Format): supply 1-5 primary-text variations and Meta optimises delivery across them, WITHOUT enabling full Dynamic Creative (`dynamicCreative`). Uses `optimization_type: DEGREES_OF_FREEDOM` on the asset feed, so multiple ads per ad set are allowed (unlike `dynamicCreative` which is limited to one). Requires `imageUrl` or `video`, `linkUrl`, and `callToAction`. When set, the top-level `body` field is used as the `object_story_spec.link_data.message` (the preview text) and `headlines` must also be present. On a video creative the copy lands in `video_data.message` / `video_data.title` instead of `link_data`. Mutually exclusive with `dynamicCreative`, `placementAssets`, `carouselCards`, and `creatives[]`.
90
90
  attr_accessor :bodies
91
91
 
92
- # Meta only. Headline variations for Multiple Text Options. Must be sent alongside `bodies`. The top-level `headline` field is used as the `object_story_spec.link_data.name`.
92
+ # Meta only. Headline variations for Multiple Text Options. Must be sent alongside `bodies`. The top-level `headline` field is used as the `object_story_spec.link_data.name` (`video_data.title` on a video creative).
93
93
  attr_accessor :headlines
94
94
 
95
95
  # Meta only. Optional description variations for Multiple Text Options. Sent alongside `bodies` and `headlines`.
@@ -23,6 +23,7 @@ module Zernio
23
23
 
24
24
  attr_accessor :button_text
25
25
 
26
+ # Direct public JPEG or PNG image URL, up to 5 MB. Redirects, Ad Image hashes and IDs are not supported.
26
27
  attr_accessor :cover_photo
27
28
 
28
29
  class EnumAttributeValidator
@@ -17,12 +17,16 @@ module Zernio
17
17
  class SendInboxMessage200Response < ApiModelBase
18
18
  attr_accessor :success
19
19
 
20
+ # Present when a successful send ignored replyTo on Instagram or Facebook Messenger. The message was sent without a quote; do not retry it to apply the reply.
21
+ attr_accessor :warnings
22
+
20
23
  attr_accessor :data
21
24
 
22
25
  # Attribute mapping from ruby-style variable name to JSON key.
23
26
  def self.attribute_map
24
27
  {
25
28
  :'success' => :'success',
29
+ :'warnings' => :'warnings',
26
30
  :'data' => :'data'
27
31
  }
28
32
  end
@@ -41,6 +45,7 @@ module Zernio
41
45
  def self.openapi_types
42
46
  {
43
47
  :'success' => :'Boolean',
48
+ :'warnings' => :'Array<SendInboxMessage200ResponseWarningsInner>',
44
49
  :'data' => :'SendInboxMessage200ResponseData'
45
50
  }
46
51
  end
@@ -71,6 +76,12 @@ module Zernio
71
76
  self.success = attributes[:'success']
72
77
  end
73
78
 
79
+ if attributes.key?(:'warnings')
80
+ if (value = attributes[:'warnings']).is_a?(Array)
81
+ self.warnings = value
82
+ end
83
+ end
84
+
74
85
  if attributes.key?(:'data')
75
86
  self.data = attributes[:'data']
76
87
  end
@@ -97,6 +108,7 @@ module Zernio
97
108
  return true if self.equal?(o)
98
109
  self.class == o.class &&
99
110
  success == o.success &&
111
+ warnings == o.warnings &&
100
112
  data == o.data
101
113
  end
102
114
 
@@ -109,7 +121,7 @@ module Zernio
109
121
  # Calculates hash code according to all attributes.
110
122
  # @return [Integer] Hash code
111
123
  def hash
112
- [success, data].hash
124
+ [success, warnings, data].hash
113
125
  end
114
126
 
115
127
  # Builds the object from hash
@@ -0,0 +1,243 @@
1
+ =begin
2
+ #Zernio API
3
+
4
+ #API reference for Zernio. Authenticate with a Bearer API key. Base URL: https://zernio.com/api Versioning and deprecation: all endpoints are versioned in the URL path (current version: /v1). Breaking changes only ship in a new path version; existing versions keep working. Deprecated operations are marked 'deprecated: true' in this spec and announced in the changelog (https://zernio.com/changelog) before removal. Errors: every 4xx/5xx response is application/json with a machine-readable 'code' and a human-readable 'error' message (see the ErrorResponse schema).
5
+
6
+ The version of the OpenAPI document: 1.0.4
7
+ Contact: support@zernio.com
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.19.0
10
+
11
+ =end
12
+
13
+ require 'date'
14
+ require 'time'
15
+
16
+ module Zernio
17
+ class SendInboxMessage200ResponseWarningsInner < ApiModelBase
18
+ attr_accessor :code
19
+
20
+ attr_accessor :param
21
+
22
+ # Human-readable explanation of the ignored field.
23
+ attr_accessor :message
24
+
25
+ class EnumAttributeValidator
26
+ attr_reader :datatype
27
+ attr_reader :allowable_values
28
+
29
+ def initialize(datatype, allowable_values)
30
+ @allowable_values = allowable_values.map do |value|
31
+ case datatype.to_s
32
+ when /Integer/i
33
+ value.to_i
34
+ when /Float/i
35
+ value.to_f
36
+ else
37
+ value
38
+ end
39
+ end
40
+ end
41
+
42
+ def valid?(value)
43
+ !value || allowable_values.include?(value)
44
+ end
45
+ end
46
+
47
+ # Attribute mapping from ruby-style variable name to JSON key.
48
+ def self.attribute_map
49
+ {
50
+ :'code' => :'code',
51
+ :'param' => :'param',
52
+ :'message' => :'message'
53
+ }
54
+ end
55
+
56
+ # Returns attribute mapping this model knows about
57
+ def self.acceptable_attribute_map
58
+ attribute_map
59
+ end
60
+
61
+ # Returns all the JSON keys this model knows about
62
+ def self.acceptable_attributes
63
+ acceptable_attribute_map.values
64
+ end
65
+
66
+ # Attribute type mapping.
67
+ def self.openapi_types
68
+ {
69
+ :'code' => :'String',
70
+ :'param' => :'String',
71
+ :'message' => :'String'
72
+ }
73
+ end
74
+
75
+ # List of attributes with nullable: true
76
+ def self.openapi_nullable
77
+ Set.new([
78
+ ])
79
+ end
80
+
81
+ # Initializes the object
82
+ # @param [Hash] attributes Model attributes in the form of hash
83
+ def initialize(attributes = {})
84
+ if (!attributes.is_a?(Hash))
85
+ fail ArgumentError, "The input argument (attributes) must be a hash in `Zernio::SendInboxMessage200ResponseWarningsInner` initialize method"
86
+ end
87
+
88
+ # check to see if the attribute exists and convert string to symbol for hash key
89
+ acceptable_attribute_map = self.class.acceptable_attribute_map
90
+ attributes = attributes.each_with_object({}) { |(k, v), h|
91
+ if (!acceptable_attribute_map.key?(k.to_sym))
92
+ fail ArgumentError, "`#{k}` is not a valid attribute in `Zernio::SendInboxMessage200ResponseWarningsInner`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
93
+ end
94
+ h[k.to_sym] = v
95
+ }
96
+
97
+ if attributes.key?(:'code')
98
+ self.code = attributes[:'code']
99
+ else
100
+ self.code = nil
101
+ end
102
+
103
+ if attributes.key?(:'param')
104
+ self.param = attributes[:'param']
105
+ else
106
+ self.param = nil
107
+ end
108
+
109
+ if attributes.key?(:'message')
110
+ self.message = attributes[:'message']
111
+ else
112
+ self.message = nil
113
+ end
114
+ end
115
+
116
+ # Show invalid properties with the reasons. Usually used together with valid?
117
+ # @return Array for valid properties with the reasons
118
+ def list_invalid_properties
119
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
120
+ invalid_properties = Array.new
121
+ if @code.nil?
122
+ invalid_properties.push('invalid value for "code", code cannot be nil.')
123
+ end
124
+
125
+ if @param.nil?
126
+ invalid_properties.push('invalid value for "param", param cannot be nil.')
127
+ end
128
+
129
+ if @message.nil?
130
+ invalid_properties.push('invalid value for "message", message cannot be nil.')
131
+ end
132
+
133
+ invalid_properties
134
+ end
135
+
136
+ # Check to see if the all the properties in the model are valid
137
+ # @return true if the model is valid
138
+ def valid?
139
+ warn '[DEPRECATED] the `valid?` method is obsolete'
140
+ return false if @code.nil?
141
+ code_validator = EnumAttributeValidator.new('String', ["ignored_field"])
142
+ return false unless code_validator.valid?(@code)
143
+ return false if @param.nil?
144
+ param_validator = EnumAttributeValidator.new('String', ["replyTo"])
145
+ return false unless param_validator.valid?(@param)
146
+ return false if @message.nil?
147
+ true
148
+ end
149
+
150
+ # Custom attribute writer method checking allowed values (enum).
151
+ # @param [Object] code Object to be assigned
152
+ def code=(code)
153
+ validator = EnumAttributeValidator.new('String', ["ignored_field"])
154
+ unless validator.valid?(code)
155
+ fail ArgumentError, "invalid value for \"code\", must be one of #{validator.allowable_values}."
156
+ end
157
+ @code = code
158
+ end
159
+
160
+ # Custom attribute writer method checking allowed values (enum).
161
+ # @param [Object] param Object to be assigned
162
+ def param=(param)
163
+ validator = EnumAttributeValidator.new('String', ["replyTo"])
164
+ unless validator.valid?(param)
165
+ fail ArgumentError, "invalid value for \"param\", must be one of #{validator.allowable_values}."
166
+ end
167
+ @param = param
168
+ end
169
+
170
+ # Custom attribute writer method with validation
171
+ # @param [Object] message Value to be assigned
172
+ def message=(message)
173
+ if message.nil?
174
+ fail ArgumentError, 'message cannot be nil'
175
+ end
176
+
177
+ @message = message
178
+ end
179
+
180
+ # Checks equality by comparing each attribute.
181
+ # @param [Object] Object to be compared
182
+ def ==(o)
183
+ return true if self.equal?(o)
184
+ self.class == o.class &&
185
+ code == o.code &&
186
+ param == o.param &&
187
+ message == o.message
188
+ end
189
+
190
+ # @see the `==` method
191
+ # @param [Object] Object to be compared
192
+ def eql?(o)
193
+ self == o
194
+ end
195
+
196
+ # Calculates hash code according to all attributes.
197
+ # @return [Integer] Hash code
198
+ def hash
199
+ [code, param, message].hash
200
+ end
201
+
202
+ # Builds the object from hash
203
+ # @param [Hash] attributes Model attributes in the form of hash
204
+ # @return [Object] Returns the model itself
205
+ def self.build_from_hash(attributes)
206
+ return nil unless attributes.is_a?(Hash)
207
+ attributes = attributes.transform_keys(&:to_sym)
208
+ transformed_hash = {}
209
+ openapi_types.each_pair do |key, type|
210
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
211
+ transformed_hash["#{key}"] = nil
212
+ elsif type =~ /\AArray<(.*)>/i
213
+ # check to ensure the input is an array given that the attribute
214
+ # is documented as an array but the input is not
215
+ if attributes[attribute_map[key]].is_a?(Array)
216
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
217
+ end
218
+ elsif !attributes[attribute_map[key]].nil?
219
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
220
+ end
221
+ end
222
+ new(transformed_hash)
223
+ end
224
+
225
+ # Returns the object in the form of hash
226
+ # @return [Hash] Returns the object in the form of hash
227
+ def to_hash
228
+ hash = {}
229
+ self.class.attribute_map.each_pair do |attr, param|
230
+ value = self.send(attr)
231
+ if value.nil?
232
+ is_nullable = self.class.openapi_nullable.include?(attr)
233
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
234
+ end
235
+
236
+ hash[param] = _to_hash(value)
237
+ end
238
+ hash
239
+ end
240
+
241
+ end
242
+
243
+ end
@@ -57,7 +57,7 @@ module Zernio
57
57
  # Facebook message tag for messaging outside 24h window. Requires messagingType MESSAGE_TAG. Instagram only supports HUMAN_AGENT.
58
58
  attr_accessor :message_tag
59
59
 
60
- # Platform message ID to quote-reply to. For WhatsApp, pass the wamid; for Telegram, the Telegram message ID (delivered as message.platformMessageId on webhooks, and as `id` on each entry of the list-messages endpoint). On Slack it threads the reply (thread_ts) instead of quoting. Silently ignored on platforms without send-side reply support, including Instagram and Facebook Messenger (Meta's Send API rejects reply_to on Instagram and does not expose it on Messenger).
60
+ # Platform message ID to quote-reply to. For WhatsApp, pass the wamid; for Telegram, the Telegram message ID (delivered as message.platformMessageId on webhooks, and as `id` on each entry of the list-messages endpoint). On Slack it threads the reply (thread_ts) instead of quoting. Instagram and Facebook Messenger do not support send-side quote replies: the message is sent without a quote and the successful response includes a warnings entry with code ignored_field and param replyTo. Other platforms without send-side reply support ignore this field.
61
61
  attr_accessor :reply_to
62
62
 
63
63
  attr_accessor :location
@@ -16,10 +16,10 @@ require 'time'
16
16
  module Zernio
17
17
  # Meta + TikTok (demographics/interests), Google (keyword and device bid adjustment edits only), and LinkedIn (geo countries). Pinterest / X return 501.
18
18
  class UpdateAdRequestTargeting < ApiModelBase
19
- # 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.
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
21
21
 
22
- # Google only. Same declarative contract as keywords, for the ad group's negative keywords.
22
+ # Google only. The FULL desired set of negative keywords for the entire ad group, independent of positives. Omit to leave negatives unchanged; [] removes all negatives. Uses the same text/match-type identity and preservation contract as keywords above. Strings and objects without matchType default to BROAD, so resending an EXACT or PHRASE negative as a bare string requests a different criterion. Campaign negatives are separate: use /v1/ads/campaigns/{campaignId}/negative-keywords to manage those.
23
23
  attr_accessor :negative_keywords
24
24
 
25
25
  # 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 }.
@@ -11,5 +11,5 @@ Generator version: 7.19.0
11
11
  =end
12
12
 
13
13
  module Zernio
14
- VERSION = '0.0.867'
14
+ VERSION = '0.0.869'
15
15
  end
data/lib/zernio-sdk.rb CHANGED
@@ -1348,6 +1348,7 @@ require 'zernio-sdk/models/send_inbox_message200_response_data'
1348
1348
  require 'zernio-sdk/models/send_inbox_message200_response_data_attachments_inner'
1349
1349
  require 'zernio-sdk/models/send_inbox_message200_response_data_partial_failure'
1350
1350
  require 'zernio-sdk/models/send_inbox_message200_response_data_partial_failure_platform_error'
1351
+ require 'zernio-sdk/models/send_inbox_message200_response_warnings_inner'
1351
1352
  require 'zernio-sdk/models/send_inbox_message400_response'
1352
1353
  require 'zernio-sdk/models/send_inbox_message400_response_platform_error'
1353
1354
  require 'zernio-sdk/models/send_inbox_message_request'
data/openapi.yaml CHANGED
@@ -16079,6 +16079,11 @@ paths:
16079
16079
  application/json:
16080
16080
  schema: { $ref: '#/components/schemas/ErrorResponse' }
16081
16081
  '404': { $ref: '#/components/responses/NotFound' }
16082
+ '409':
16083
+ description: 'The requested scheduledFor collides with another post already occupying that slot in the same queue (code: queue_slot_conflict). Choose a different time, omit scheduledFor and let the queue assign the next open slot, or send queueId: null to schedule this post outside the queue.'
16084
+ content:
16085
+ application/json:
16086
+ schema: { $ref: '#/components/schemas/ErrorResponse' }
16082
16087
  delete:
16083
16088
  x-resource-group: "publishing"
16084
16089
  operationId: deletePost
@@ -28422,7 +28427,7 @@ paths:
28422
28427
  description: Facebook message tag for messaging outside 24h window. Requires messagingType MESSAGE_TAG. Instagram only supports HUMAN_AGENT.
28423
28428
  replyTo:
28424
28429
  type: string
28425
- description: 'Platform message ID to quote-reply to. For WhatsApp, pass the wamid; for Telegram, the Telegram message ID (delivered as message.platformMessageId on webhooks, and as `id` on each entry of the list-messages endpoint). On Slack it threads the reply (thread_ts) instead of quoting. Silently ignored on platforms without send-side reply support, including Instagram and Facebook Messenger (Meta''s Send API rejects reply_to on Instagram and does not expose it on Messenger).'
28430
+ description: 'Platform message ID to quote-reply to. For WhatsApp, pass the wamid; for Telegram, the Telegram message ID (delivered as message.platformMessageId on webhooks, and as `id` on each entry of the list-messages endpoint). On Slack it threads the reply (thread_ts) instead of quoting. Instagram and Facebook Messenger do not support send-side quote replies: the message is sent without a quote and the successful response includes a warnings entry with code ignored_field and param replyTo. Other platforms without send-side reply support ignore this field.'
28426
28431
  location:
28427
28432
  type: object
28428
28433
  description: WhatsApp-only. Send a location pin.
@@ -28512,7 +28517,7 @@ paths:
28512
28517
  description: Message tag (requires messagingType MESSAGE_TAG)
28513
28518
  replyTo:
28514
28519
  type: string
28515
- description: 'Platform message ID to quote-reply to. For WhatsApp, pass the wamid; for Telegram, the Telegram message ID (delivered as message.platformMessageId on webhooks, and as `id` on each entry of the list-messages endpoint). On Slack it threads the reply (thread_ts) instead of quoting. Silently ignored on platforms without send-side reply support, including Instagram and Facebook Messenger (Meta''s Send API rejects reply_to on Instagram and does not expose it on Messenger).'
28520
+ description: 'Platform message ID to quote-reply to. For WhatsApp, pass the wamid; for Telegram, the Telegram message ID (delivered as message.platformMessageId on webhooks, and as `id` on each entry of the list-messages endpoint). On Slack it threads the reply (thread_ts) instead of quoting. Instagram and Facebook Messenger do not support send-side quote replies: the message is sent without a quote and the successful response includes a warnings entry with code ignored_field and param replyTo. Other platforms without send-side reply support ignore this field.'
28516
28521
  voiceNote:
28517
28522
  type: string
28518
28523
  enum: ['true']
@@ -28526,6 +28531,16 @@ paths:
28526
28531
  type: object
28527
28532
  properties:
28528
28533
  success: { type: boolean }
28534
+ warnings:
28535
+ type: array
28536
+ description: Present when a successful send ignored replyTo on Instagram or Facebook Messenger. The message was sent without a quote; do not retry it to apply the reply.
28537
+ items:
28538
+ type: object
28539
+ required: [code, param, message]
28540
+ properties:
28541
+ code: { type: string, enum: [ignored_field] }
28542
+ param: { type: string, enum: [replyTo] }
28543
+ message: { type: string, description: Human-readable explanation of the ignored field. }
28529
28544
  data:
28530
28545
  type: object
28531
28546
  properties:
@@ -43365,6 +43380,32 @@ paths:
43365
43380
  - **Pinterest / X / OpenAI Ads**: status + budget only. Sending
43366
43381
  `targeting` or `creative` returns 501 with code `unsupported_platform_operation`.
43367
43382
  OpenAI Ads budget is lifetime-only (see `budget.type` below).
43383
+
43384
+ **Google keyword replacement:** These edits affect the ad's entire ad group,
43385
+ including sibling ads. Positive (`targeting.keywords`) and negative
43386
+ (`targeting.negativeKeywords`) sets are independent: omit a field to leave
43387
+ that set unchanged, or send `[]` to remove every keyword of that kind.
43388
+
43389
+ Zernio compares each supplied set with Google's live criteria by
43390
+ case-insensitive keyword text and match type. A matching criterion is left
43391
+ untouched, retaining its criterion ID, enabled/paused status, keyword-level
43392
+ bid overrides, labels, and criterion-associated history/statistics. Zernio
43393
+ does not reset its quality score; Google continues to calculate scores and
43394
+ statistics normally. Text comparison does not trim whitespace.
43395
+
43396
+ A bare string or an object without `matchType` means `broad`, not the
43397
+ existing criterion's match type. For example, resending an existing
43398
+ `{ "text": "plumber", "matchType": "exact" }` preserves it; sending
43399
+ `"plumber"` instead removes that EXACT criterion and requests a BROAD one.
43400
+ Changing text or match type removes criteria no longer requested and
43401
+ creates any missing criteria. New criteria get new IDs and do not inherit
43402
+ removed criteria's bid overrides, labels, or history. Historical reporting
43403
+ for a removed criterion is not transferred to its replacement.
43404
+
43405
+ To add keywords without replacing a set, use
43406
+ [POST /v1/ads/keywords](https://docs.zernio.com/ad-campaigns/add-ad-keywords).
43407
+ Use `PATCH /v1/ads/keywords/{keywordId}` to pause/enable one keyword, or
43408
+ `DELETE /v1/ads/keywords/{keywordId}` to remove it.
43368
43409
  security:
43369
43410
  - bearerAuth: []
43370
43411
  parameters:
@@ -43391,14 +43432,28 @@ paths:
43391
43432
  properties:
43392
43433
  keywords:
43393
43434
  type: array
43394
- description: "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."
43435
+ description: |
43436
+ Google only. The FULL desired set of positive keywords for the entire ad group.
43437
+ Omit to leave positives unchanged; [] removes all positives. Negatives are independent.
43438
+ Entries are strings (BROAD) or { text, matchType } with matchType exact | phrase | broad;
43439
+ an omitted matchType also defaults to BROAD. Matching case-insensitive text AND match type
43440
+ retains the existing criterion ID, status, bid overrides, labels and history without a mutation.
43441
+ A changed text or match type uses remove/create, without transferring the old criterion's
43442
+ attributes or history. See Google keyword replacement above for an EXACT-to-BROAD example.
43443
+ Mirrored to GET /v1/ads/keywords immediately.
43395
43444
  items:
43396
43445
  oneOf:
43397
43446
  - { type: string }
43398
43447
  - { type: object, required: [text], properties: { text: { type: string, maxLength: 80 }, matchType: { type: string, enum: [exact, phrase, broad] } } }
43399
43448
  negativeKeywords:
43400
43449
  type: array
43401
- description: "Google only. Same declarative contract as keywords, for the ad group's negative keywords."
43450
+ description: |
43451
+ Google only. The FULL desired set of negative keywords for the entire ad group,
43452
+ independent of positives. Omit to leave negatives unchanged; [] removes all negatives.
43453
+ Uses the same text/match-type identity and preservation contract as keywords above.
43454
+ Strings and objects without matchType default to BROAD, so resending an EXACT or PHRASE
43455
+ negative as a bare string requests a different criterion. Campaign negatives are separate:
43456
+ use /v1/ads/campaigns/{campaignId}/negative-keywords to manage those.
43402
43457
  items:
43403
43458
  oneOf:
43404
43459
  - { type: string }
@@ -46114,8 +46169,9 @@ paths:
46114
46169
  multiple ads per ad set are allowed (unlike `dynamicCreative` which is limited to one).
46115
46170
  Requires `imageUrl` or `video`, `linkUrl`, and `callToAction`. When set, the top-level
46116
46171
  `body` field is used as the `object_story_spec.link_data.message` (the preview text) and
46117
- `headlines` must also be present. Mutually exclusive with `dynamicCreative`,
46118
- `placementAssets`, `carouselCards`, and `creatives[]`.
46172
+ `headlines` must also be present. On a video creative the copy lands in
46173
+ `video_data.message` / `video_data.title` instead of `link_data`. Mutually exclusive
46174
+ with `dynamicCreative`, `placementAssets`, `carouselCards`, and `creatives[]`.
46119
46175
  headlines:
46120
46176
  type: array
46121
46177
  minItems: 1
@@ -46123,7 +46179,8 @@ paths:
46123
46179
  items: { type: string, maxLength: 255 }
46124
46180
  description: |
46125
46181
  Meta only. Headline variations for Multiple Text Options. Must be sent alongside `bodies`.
46126
- The top-level `headline` field is used as the `object_story_spec.link_data.name`.
46182
+ The top-level `headline` field is used as the `object_story_spec.link_data.name`
46183
+ (`video_data.title` on a video creative).
46127
46184
  descriptions:
46128
46185
  type: array
46129
46186
  minItems: 1
@@ -47259,7 +47316,7 @@ paths:
47259
47316
  content: { type: array, items: { type: string } }
47260
47317
  style: { type: string, enum: [LIST_STYLE, PARAGRAPH_STYLE] }
47261
47318
  buttonText: { type: string }
47262
- coverPhoto: { type: string }
47319
+ coverPhoto: { type: string, format: uri, description: "Direct public JPEG or PNG image URL, up to 5 MB. Redirects, Ad Image hashes and IDs are not supported." }
47263
47320
  - type: object
47264
47321
  title: LinkedInLeadFormPlatformData
47265
47322
  required: [adAccountId, headline, description, questions]
@@ -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 &#x60;/v2/adgroup/update/&#x60;), and creative (via &#x60;/v2/ad/update/&#x60; patch-style — &#x60;headline&#x60; is ignored, &#x60;body&#x60; becomes &#x60;ad_text&#x60;). - **Google**: status, budget, KEYWORD edits via &#x60;targeting.keywords&#x60; / &#x60;targeting.negativeKeywords&#x60;, and DEVICE bid adjustments via &#x60;targeting.devices&#x60; — 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 &#x60;targeting&#x60; field returns 400: Google cannot mutate broad targeting post-create without recreating the campaign. &#x60;creative&#x60; returns 501. - **LinkedIn**: status, budget, targeting (geo countries only, applied to the LinkedIn Campaign via PARTIAL_UPDATE), 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 &#x60;targeting&#x60; or &#x60;creative&#x60; returns 501 with code &#x60;unsupported_platform_operation&#x60;. OpenAI Ads budget is lifetime-only (see &#x60;budget.type&#x60; below).
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 &#x60;/v2/adgroup/update/&#x60;), and creative (via &#x60;/v2/ad/update/&#x60; patch-style — &#x60;headline&#x60; is ignored, &#x60;body&#x60; becomes &#x60;ad_text&#x60;). - **Google**: status, budget, KEYWORD edits via &#x60;targeting.keywords&#x60; / &#x60;targeting.negativeKeywords&#x60;, and DEVICE bid adjustments via &#x60;targeting.devices&#x60; — 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 &#x60;targeting&#x60; field returns 400: Google cannot mutate broad targeting post-create without recreating the campaign. &#x60;creative&#x60; returns 501. - **LinkedIn**: status, budget, targeting (geo countries only, applied to the LinkedIn Campaign via PARTIAL_UPDATE), 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 &#x60;targeting&#x60; or &#x60;creative&#x60; returns 501 with code &#x60;unsupported_platform_operation&#x60;. OpenAI Ads budget is lifetime-only (see &#x60;budget.type&#x60; below). **Google keyword replacement:** These edits affect the ad&#39;s entire ad group, including sibling ads. Positive (&#x60;targeting.keywords&#x60;) and negative (&#x60;targeting.negativeKeywords&#x60;) sets are independent: omit a field to leave that set unchanged, or send &#x60;[]&#x60; to remove every keyword of that kind. Zernio compares each supplied set with Google&#39;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 &#x60;matchType&#x60; means &#x60;broad&#x60;, not the existing criterion&#39;s match type. For example, resending an existing &#x60;{ \&quot;text\&quot;: \&quot;plumber\&quot;, \&quot;matchType\&quot;: \&quot;exact\&quot; }&#x60; preserves it; sending &#x60;\&quot;plumber\&quot;&#x60; 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&#39;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 &#x60;PATCH /v1/ads/keywords/{keywordId}&#x60; to pause/enable one keyword, or &#x60;DELETE /v1/ads/keywords/{keywordId}&#x60; to remove it.
457
457
  # @param ad_id
458
458
  # @param update_ad_request
459
459
  # @param [Hash] opts the optional parameters
@@ -33,6 +33,12 @@ describe Zernio::SendInboxMessage200Response do
33
33
  end
34
34
  end
35
35
 
36
+ describe 'test attribute "warnings"' do
37
+ it 'should work' do
38
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
39
+ end
40
+ end
41
+
36
42
  describe 'test attribute "data"' do
37
43
  it 'should work' do
38
44
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
@@ -0,0 +1,56 @@
1
+ =begin
2
+ #Zernio API
3
+
4
+ #API reference for Zernio. Authenticate with a Bearer API key. Base URL: https://zernio.com/api Versioning and deprecation: all endpoints are versioned in the URL path (current version: /v1). Breaking changes only ship in a new path version; existing versions keep working. Deprecated operations are marked 'deprecated: true' in this spec and announced in the changelog (https://zernio.com/changelog) before removal. Errors: every 4xx/5xx response is application/json with a machine-readable 'code' and a human-readable 'error' message (see the ErrorResponse schema).
5
+
6
+ The version of the OpenAPI document: 1.0.4
7
+ Contact: support@zernio.com
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.19.0
10
+
11
+ =end
12
+
13
+ require 'spec_helper'
14
+ require 'json'
15
+ require 'date'
16
+
17
+ # Unit tests for Zernio::SendInboxMessage200ResponseWarningsInner
18
+ # Automatically generated by openapi-generator (https://openapi-generator.tech)
19
+ # Please update as you see appropriate
20
+ describe Zernio::SendInboxMessage200ResponseWarningsInner do
21
+ #let(:instance) { Zernio::SendInboxMessage200ResponseWarningsInner.new }
22
+
23
+ describe 'test an instance of SendInboxMessage200ResponseWarningsInner' do
24
+ it 'should create an instance of SendInboxMessage200ResponseWarningsInner' do
25
+ # uncomment below to test the instance creation
26
+ #expect(instance).to be_instance_of(Zernio::SendInboxMessage200ResponseWarningsInner)
27
+ end
28
+ end
29
+
30
+ describe 'test attribute "code"' do
31
+ it 'should work' do
32
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
33
+ # validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["ignored_field"])
34
+ # validator.allowable_values.each do |value|
35
+ # expect { instance.code = value }.not_to raise_error
36
+ # end
37
+ end
38
+ end
39
+
40
+ describe 'test attribute "param"' do
41
+ it 'should work' do
42
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
43
+ # validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["replyTo"])
44
+ # validator.allowable_values.each do |value|
45
+ # expect { instance.param = value }.not_to raise_error
46
+ # end
47
+ end
48
+ end
49
+
50
+ describe 'test attribute "message"' do
51
+ it 'should work' do
52
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
53
+ end
54
+ end
55
+
56
+ end
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.867
4
+ version: 0.0.869
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenAPI-Generator
@@ -1447,6 +1447,7 @@ files:
1447
1447
  - docs/SendInboxMessage200ResponseDataAttachmentsInner.md
1448
1448
  - docs/SendInboxMessage200ResponseDataPartialFailure.md
1449
1449
  - docs/SendInboxMessage200ResponseDataPartialFailurePlatformError.md
1450
+ - docs/SendInboxMessage200ResponseWarningsInner.md
1450
1451
  - docs/SendInboxMessage400Response.md
1451
1452
  - docs/SendInboxMessage400ResponsePlatformError.md
1452
1453
  - docs/SendInboxMessageRequest.md
@@ -3380,6 +3381,7 @@ files:
3380
3381
  - lib/zernio-sdk/models/send_inbox_message200_response_data_attachments_inner.rb
3381
3382
  - lib/zernio-sdk/models/send_inbox_message200_response_data_partial_failure.rb
3382
3383
  - lib/zernio-sdk/models/send_inbox_message200_response_data_partial_failure_platform_error.rb
3384
+ - lib/zernio-sdk/models/send_inbox_message200_response_warnings_inner.rb
3383
3385
  - lib/zernio-sdk/models/send_inbox_message400_response.rb
3384
3386
  - lib/zernio-sdk/models/send_inbox_message400_response_platform_error.rb
3385
3387
  - lib/zernio-sdk/models/send_inbox_message_request.rb
@@ -5289,6 +5291,7 @@ files:
5289
5291
  - spec/models/send_inbox_message200_response_data_partial_failure_spec.rb
5290
5292
  - spec/models/send_inbox_message200_response_data_spec.rb
5291
5293
  - spec/models/send_inbox_message200_response_spec.rb
5294
+ - spec/models/send_inbox_message200_response_warnings_inner_spec.rb
5292
5295
  - spec/models/send_inbox_message400_response_platform_error_spec.rb
5293
5296
  - spec/models/send_inbox_message400_response_spec.rb
5294
5297
  - spec/models/send_inbox_message_request_buttons_inner_spec.rb
@@ -5800,7 +5803,7 @@ files:
5800
5803
  - spec/models/you_tube_video_retention_response_retention_curve_inner_spec.rb
5801
5804
  - spec/models/you_tube_video_retention_response_spec.rb
5802
5805
  - spec/spec_helper.rb
5803
- - zernio-sdk-0.0.867.gem
5806
+ - zernio-sdk-0.0.869.gem
5804
5807
  - zernio-sdk.gemspec
5805
5808
  homepage: https://openapi-generator.tech
5806
5809
  licenses:
@@ -6960,6 +6963,7 @@ test_files:
6960
6963
  - spec/models/update_google_business_location_details_request_profile_spec.rb
6961
6964
  - spec/models/create_standalone_ad_request_regions_inner_spec.rb
6962
6965
  - spec/models/create_phone_number_port_in201_response_orders_inner_spec.rb
6966
+ - spec/models/send_inbox_message200_response_warnings_inner_spec.rb
6963
6967
  - spec/models/search_available_phone_numbers200_response_spec.rb
6964
6968
  - spec/models/list_comment_automation_logs200_response_misses_samples_inner_spec.rb
6965
6969
  - spec/models/update_whats_app_template200_response_template_spec.rb
Binary file