late-sdk 0.0.867 → 0.0.868
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/README.md +1 -0
- data/docs/AdCampaignsApi.md +1 -1
- data/docs/CreateStandaloneAdRequest.md +2 -2
- data/docs/MetaLeadFormPlatformDataContextCard.md +1 -1
- data/docs/SendInboxMessage200Response.md +2 -0
- data/docs/SendInboxMessage200ResponseWarningsInner.md +22 -0
- data/docs/SendInboxMessageRequest.md +1 -1
- data/docs/UpdateAdRequestTargeting.md +2 -2
- data/lib/zernio-sdk/api/ad_campaigns_api.rb +2 -2
- data/lib/zernio-sdk/models/create_standalone_ad_request.rb +2 -2
- data/lib/zernio-sdk/models/meta_lead_form_platform_data_context_card.rb +1 -0
- data/lib/zernio-sdk/models/send_inbox_message200_response.rb +13 -1
- data/lib/zernio-sdk/models/send_inbox_message200_response_warnings_inner.rb +243 -0
- data/lib/zernio-sdk/models/send_inbox_message_request.rb +1 -1
- data/lib/zernio-sdk/models/update_ad_request_targeting.rb +2 -2
- data/lib/zernio-sdk/version.rb +1 -1
- data/lib/zernio-sdk.rb +1 -0
- data/openapi.yaml +60 -8
- data/spec/api/ad_campaigns_api_spec.rb +1 -1
- data/spec/models/send_inbox_message200_response_spec.rb +6 -0
- data/spec/models/send_inbox_message200_response_warnings_inner_spec.rb +56 -0
- data/zernio-sdk-0.0.868.gem +0 -0
- metadata +6 -2
- data/zernio-sdk-0.0.867.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: e06fee9735411ab7442820cf2eeb02725b9a5a459ba6b29ff9ef5893374e6959
|
|
4
|
+
data.tar.gz: c174725061e8e2d70b7aa9aa7bad04ccbceac1e05618bee1ae92053d8876d7e1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4c7589a963da7ce0d3910cf22dc41813516c32c9c72af90175a01df3c4c3a85f2a841aeb5d0a6b65e73e94ceddb2c002f94c8460f6b786900b031ebdcab90730
|
|
7
|
+
data.tar.gz: 1892e404bf923cbcdc01b509b5a200af09ddb6907faa03e5d9dbff7bb37608cd7f26f0366a0e3068f90fdcc1d95cd915e7f2ccc867d8a090b8b746573548cfe3
|
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)
|
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 (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`
|
|
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** |
|
|
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.
|
|
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
|
|
8
|
-
| **negative_keywords** | [**Array<UpdateAdRequestTargetingKeywordsInner>**](UpdateAdRequestTargetingKeywordsInner.md) | Google only.
|
|
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`.
|
|
@@ -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.
|
|
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
|
|
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.
|
|
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 }.
|
data/lib/zernio-sdk/version.rb
CHANGED
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
|
@@ -28422,7 +28422,7 @@ paths:
|
|
|
28422
28422
|
description: Facebook message tag for messaging outside 24h window. Requires messagingType MESSAGE_TAG. Instagram only supports HUMAN_AGENT.
|
|
28423
28423
|
replyTo:
|
|
28424
28424
|
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.
|
|
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. 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
28426
|
location:
|
|
28427
28427
|
type: object
|
|
28428
28428
|
description: WhatsApp-only. Send a location pin.
|
|
@@ -28512,7 +28512,7 @@ paths:
|
|
|
28512
28512
|
description: Message tag (requires messagingType MESSAGE_TAG)
|
|
28513
28513
|
replyTo:
|
|
28514
28514
|
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.
|
|
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. 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
28516
|
voiceNote:
|
|
28517
28517
|
type: string
|
|
28518
28518
|
enum: ['true']
|
|
@@ -28526,6 +28526,16 @@ paths:
|
|
|
28526
28526
|
type: object
|
|
28527
28527
|
properties:
|
|
28528
28528
|
success: { type: boolean }
|
|
28529
|
+
warnings:
|
|
28530
|
+
type: array
|
|
28531
|
+
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.
|
|
28532
|
+
items:
|
|
28533
|
+
type: object
|
|
28534
|
+
required: [code, param, message]
|
|
28535
|
+
properties:
|
|
28536
|
+
code: { type: string, enum: [ignored_field] }
|
|
28537
|
+
param: { type: string, enum: [replyTo] }
|
|
28538
|
+
message: { type: string, description: Human-readable explanation of the ignored field. }
|
|
28529
28539
|
data:
|
|
28530
28540
|
type: object
|
|
28531
28541
|
properties:
|
|
@@ -43365,6 +43375,32 @@ paths:
|
|
|
43365
43375
|
- **Pinterest / X / OpenAI Ads**: status + budget only. Sending
|
|
43366
43376
|
`targeting` or `creative` returns 501 with code `unsupported_platform_operation`.
|
|
43367
43377
|
OpenAI Ads budget is lifetime-only (see `budget.type` below).
|
|
43378
|
+
|
|
43379
|
+
**Google keyword replacement:** These edits affect the ad's entire ad group,
|
|
43380
|
+
including sibling ads. Positive (`targeting.keywords`) and negative
|
|
43381
|
+
(`targeting.negativeKeywords`) sets are independent: omit a field to leave
|
|
43382
|
+
that set unchanged, or send `[]` to remove every keyword of that kind.
|
|
43383
|
+
|
|
43384
|
+
Zernio compares each supplied set with Google's live criteria by
|
|
43385
|
+
case-insensitive keyword text and match type. A matching criterion is left
|
|
43386
|
+
untouched, retaining its criterion ID, enabled/paused status, keyword-level
|
|
43387
|
+
bid overrides, labels, and criterion-associated history/statistics. Zernio
|
|
43388
|
+
does not reset its quality score; Google continues to calculate scores and
|
|
43389
|
+
statistics normally. Text comparison does not trim whitespace.
|
|
43390
|
+
|
|
43391
|
+
A bare string or an object without `matchType` means `broad`, not the
|
|
43392
|
+
existing criterion's match type. For example, resending an existing
|
|
43393
|
+
`{ "text": "plumber", "matchType": "exact" }` preserves it; sending
|
|
43394
|
+
`"plumber"` instead removes that EXACT criterion and requests a BROAD one.
|
|
43395
|
+
Changing text or match type removes criteria no longer requested and
|
|
43396
|
+
creates any missing criteria. New criteria get new IDs and do not inherit
|
|
43397
|
+
removed criteria's bid overrides, labels, or history. Historical reporting
|
|
43398
|
+
for a removed criterion is not transferred to its replacement.
|
|
43399
|
+
|
|
43400
|
+
To add keywords without replacing a set, use
|
|
43401
|
+
[POST /v1/ads/keywords](https://docs.zernio.com/ad-campaigns/add-ad-keywords).
|
|
43402
|
+
Use `PATCH /v1/ads/keywords/{keywordId}` to pause/enable one keyword, or
|
|
43403
|
+
`DELETE /v1/ads/keywords/{keywordId}` to remove it.
|
|
43368
43404
|
security:
|
|
43369
43405
|
- bearerAuth: []
|
|
43370
43406
|
parameters:
|
|
@@ -43391,14 +43427,28 @@ paths:
|
|
|
43391
43427
|
properties:
|
|
43392
43428
|
keywords:
|
|
43393
43429
|
type: array
|
|
43394
|
-
description:
|
|
43430
|
+
description: |
|
|
43431
|
+
Google only. The FULL desired set of positive keywords for the entire ad group.
|
|
43432
|
+
Omit to leave positives unchanged; [] removes all positives. Negatives are independent.
|
|
43433
|
+
Entries are strings (BROAD) or { text, matchType } with matchType exact | phrase | broad;
|
|
43434
|
+
an omitted matchType also defaults to BROAD. Matching case-insensitive text AND match type
|
|
43435
|
+
retains the existing criterion ID, status, bid overrides, labels and history without a mutation.
|
|
43436
|
+
A changed text or match type uses remove/create, without transferring the old criterion's
|
|
43437
|
+
attributes or history. See Google keyword replacement above for an EXACT-to-BROAD example.
|
|
43438
|
+
Mirrored to GET /v1/ads/keywords immediately.
|
|
43395
43439
|
items:
|
|
43396
43440
|
oneOf:
|
|
43397
43441
|
- { type: string }
|
|
43398
43442
|
- { type: object, required: [text], properties: { text: { type: string, maxLength: 80 }, matchType: { type: string, enum: [exact, phrase, broad] } } }
|
|
43399
43443
|
negativeKeywords:
|
|
43400
43444
|
type: array
|
|
43401
|
-
description:
|
|
43445
|
+
description: |
|
|
43446
|
+
Google only. The FULL desired set of negative keywords for the entire ad group,
|
|
43447
|
+
independent of positives. Omit to leave negatives unchanged; [] removes all negatives.
|
|
43448
|
+
Uses the same text/match-type identity and preservation contract as keywords above.
|
|
43449
|
+
Strings and objects without matchType default to BROAD, so resending an EXACT or PHRASE
|
|
43450
|
+
negative as a bare string requests a different criterion. Campaign negatives are separate:
|
|
43451
|
+
use /v1/ads/campaigns/{campaignId}/negative-keywords to manage those.
|
|
43402
43452
|
items:
|
|
43403
43453
|
oneOf:
|
|
43404
43454
|
- { type: string }
|
|
@@ -46114,8 +46164,9 @@ paths:
|
|
|
46114
46164
|
multiple ads per ad set are allowed (unlike `dynamicCreative` which is limited to one).
|
|
46115
46165
|
Requires `imageUrl` or `video`, `linkUrl`, and `callToAction`. When set, the top-level
|
|
46116
46166
|
`body` field is used as the `object_story_spec.link_data.message` (the preview text) and
|
|
46117
|
-
`headlines` must also be present.
|
|
46118
|
-
`
|
|
46167
|
+
`headlines` must also be present. On a video creative the copy lands in
|
|
46168
|
+
`video_data.message` / `video_data.title` instead of `link_data`. Mutually exclusive
|
|
46169
|
+
with `dynamicCreative`, `placementAssets`, `carouselCards`, and `creatives[]`.
|
|
46119
46170
|
headlines:
|
|
46120
46171
|
type: array
|
|
46121
46172
|
minItems: 1
|
|
@@ -46123,7 +46174,8 @@ paths:
|
|
|
46123
46174
|
items: { type: string, maxLength: 255 }
|
|
46124
46175
|
description: |
|
|
46125
46176
|
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
|
|
46177
|
+
The top-level `headline` field is used as the `object_story_spec.link_data.name`
|
|
46178
|
+
(`video_data.title` on a video creative).
|
|
46127
46179
|
descriptions:
|
|
46128
46180
|
type: array
|
|
46129
46181
|
minItems: 1
|
|
@@ -47259,7 +47311,7 @@ paths:
|
|
|
47259
47311
|
content: { type: array, items: { type: string } }
|
|
47260
47312
|
style: { type: string, enum: [LIST_STYLE, PARAGRAPH_STYLE] }
|
|
47261
47313
|
buttonText: { type: string }
|
|
47262
|
-
coverPhoto: { type: string }
|
|
47314
|
+
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
47315
|
- type: object
|
|
47264
47316
|
title: LinkedInLeadFormPlatformData
|
|
47265
47317
|
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 `/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).
|
|
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 (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.
|
|
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.
|
|
4
|
+
version: 0.0.868
|
|
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.
|
|
5806
|
+
- zernio-sdk-0.0.868.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
|
data/zernio-sdk-0.0.867.gem
DELETED
|
Binary file
|