late-sdk 0.0.866 → 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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -0
  3. data/docs/AdCampaignsApi.md +1 -1
  4. data/docs/CreateStandaloneAdRequest.md +2 -2
  5. data/docs/CreateWhatsAppTemplateRequest.md +1 -1
  6. data/docs/MetaLeadFormPlatformDataContextCard.md +1 -1
  7. data/docs/SendInboxMessage200Response.md +2 -0
  8. data/docs/SendInboxMessage200ResponseWarningsInner.md +22 -0
  9. data/docs/SendInboxMessageRequest.md +1 -1
  10. data/docs/UpdateAdRequestTargeting.md +2 -2
  11. data/docs/UpdateWhatsAppTemplateByIdRequest.md +1 -1
  12. data/docs/UpdateWhatsAppTemplateRequest.md +1 -1
  13. data/docs/WhatsAppApi.md +2 -2
  14. data/lib/zernio-sdk/api/ad_campaigns_api.rb +2 -2
  15. data/lib/zernio-sdk/api/contacts_api.rb +1 -1
  16. data/lib/zernio-sdk/api/whats_app_api.rb +4 -4
  17. data/lib/zernio-sdk/models/create_broadcast_request.rb +2 -2
  18. data/lib/zernio-sdk/models/create_contact_request.rb +2 -2
  19. data/lib/zernio-sdk/models/create_sequence_request.rb +2 -2
  20. data/lib/zernio-sdk/models/create_standalone_ad_request.rb +2 -2
  21. data/lib/zernio-sdk/models/create_whats_app_template_request.rb +1 -1
  22. data/lib/zernio-sdk/models/meta_lead_form_platform_data_context_card.rb +1 -0
  23. data/lib/zernio-sdk/models/send_inbox_message200_response.rb +13 -1
  24. data/lib/zernio-sdk/models/send_inbox_message200_response_warnings_inner.rb +243 -0
  25. data/lib/zernio-sdk/models/send_inbox_message_request.rb +1 -1
  26. data/lib/zernio-sdk/models/update_ad_request_targeting.rb +2 -2
  27. data/lib/zernio-sdk/models/update_whats_app_template_by_id_request.rb +1 -1
  28. data/lib/zernio-sdk/models/update_whats_app_template_request.rb +1 -1
  29. data/lib/zernio-sdk/version.rb +1 -1
  30. data/lib/zernio-sdk.rb +1 -0
  31. data/openapi.yaml +73 -19
  32. data/spec/api/ad_campaigns_api_spec.rb +1 -1
  33. data/spec/api/whats_app_api_spec.rb +2 -2
  34. data/spec/models/create_broadcast_request_spec.rb +1 -1
  35. data/spec/models/create_contact_request_spec.rb +1 -1
  36. data/spec/models/create_sequence_request_spec.rb +1 -1
  37. data/spec/models/send_inbox_message200_response_spec.rb +6 -0
  38. data/spec/models/send_inbox_message200_response_warnings_inner_spec.rb +56 -0
  39. data/zernio-sdk-0.0.868.gem +0 -0
  40. metadata +6 -2
  41. data/zernio-sdk-0.0.866.gem +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b1a2a59a99fe5bb83f086d7af933f094650296841fb6143544a4a021e5f37bfb
4
- data.tar.gz: 29a19f49c31a9d2151631165863c3f3c256d65ceff02d783b921bf041ebf7616
3
+ metadata.gz: e06fee9735411ab7442820cf2eeb02725b9a5a459ba6b29ff9ef5893374e6959
4
+ data.tar.gz: c174725061e8e2d70b7aa9aa7bad04ccbceac1e05618bee1ae92053d8876d7e1
5
5
  SHA512:
6
- metadata.gz: 757430666d942813e54631db56881a199ca9d6e643aeaacc6b081a6a42189c53a932748d577845ba52c4c008db2dbd2f76dc36e06041347428e046589c5acfb0
7
- data.tar.gz: 0d69b80144a6488059b8c8df64fba387752ed9b862db7a28b705b05f9da599aafa5420d2310ca7201929eccfc0412555299488a9b2f35ad5e85a13d434069de6
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)
@@ -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] |
@@ -13,7 +13,7 @@
13
13
  | **library_template_name** | **String** | Name of a pre-built template from Meta's template library (e.g., \"appointment_reminder\", \"auto_pay_reminder_1\", \"address_update\"). When provided, the template is pre-approved by Meta with no review wait. Omit components when using this field. | [optional] |
14
14
  | **library_template_body_inputs** | **Object** | Optional body customizations for library templates. Available options depend on the template (e.g., add_contact_number, add_learn_more_link, add_security_recommendation, add_track_package_link, code_expiration_minutes). | [optional] |
15
15
  | **library_template_button_inputs** | [**Array<CreateWhatsAppTemplateRequestLibraryTemplateButtonInputsInner>**](CreateWhatsAppTemplateRequestLibraryTemplateButtonInputsInner.md) | Optional button customizations for library templates. Each item specifies button type and configuration (e.g., URL, phone number, quick reply). | [optional] |
16
- | **message_send_ttl_seconds** | **Integer** | Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 restores the 30-day default on AUTHENTICATION and UTILITY. Meta defaults to 600 for AUTHENTICATION and 30 days otherwise. If Meta later recategorises the template, it clears the TTL (read it back to check). | [optional] |
16
+ | **message_send_ttl_seconds** | **Integer** | Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 (create only) keeps the 30-day default on AUTHENTICATION and UTILITY. Meta defaults to 600 for AUTHENTICATION and 30 days otherwise. If Meta later recategorises the template, it clears the TTL (read it back to check). | [optional] |
17
17
 
18
18
  ## Example
19
19
 
@@ -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] |
@@ -6,7 +6,7 @@
6
6
  | ---- | ---- | ----------- | ----- |
7
7
  | **account_id** | **String** | WhatsApp social account ID | |
8
8
  | **components** | [**Array<WhatsAppTemplateComponent>**](WhatsAppTemplateComponent.md) | Updated template components. Optional when only message_send_ttl_seconds changes; at least one of the two is required. | [optional] |
9
- | **message_send_ttl_seconds** | **Integer** | Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 restores the 30-day default on AUTHENTICATION and UTILITY. Meta defaults to 600 for AUTHENTICATION and 30 days otherwise. If Meta later recategorises the template, it clears the TTL (read it back to check). | [optional] |
9
+ | **message_send_ttl_seconds** | **Integer** | Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 is not accepted here (Meta treats it as an empty edit); send a value in range. A TTL-only edit keeps an APPROVED template approved, no re-review. Meta defaults to 600 for AUTHENTICATION and 30 days otherwise. If Meta later recategorises the template, it clears the TTL (read it back to check). | [optional] |
10
10
 
11
11
  ## Example
12
12
 
@@ -7,7 +7,7 @@
7
7
  | **account_id** | **String** | WhatsApp social account ID | |
8
8
  | **language** | **String** | Language code of the variant to edit (e.g. en_US, es, pt_BR). Required when the family has several languages. Body only: a language query parameter on PATCH is a 400. | [optional] |
9
9
  | **components** | [**Array<WhatsAppTemplateComponent>**](WhatsAppTemplateComponent.md) | Updated template components. Optional when only message_send_ttl_seconds changes; at least one of the two is required. | [optional] |
10
- | **message_send_ttl_seconds** | **Integer** | Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 restores the 30-day default on AUTHENTICATION and UTILITY. Meta defaults to 600 for AUTHENTICATION and 30 days otherwise. If Meta later recategorises the template, it clears the TTL (read it back to check). | [optional] |
10
+ | **message_send_ttl_seconds** | **Integer** | Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 is not accepted here (Meta treats it as an empty edit); send a value in range. A TTL-only edit keeps an APPROVED template approved, no re-review. Meta defaults to 600 for AUTHENTICATION and 30 days otherwise. If Meta later recategorises the template, it clears the TTL (read it back to check). | [optional] |
11
11
 
12
12
  ## Example
13
13
 
data/docs/WhatsAppApi.md CHANGED
@@ -2615,7 +2615,7 @@ end
2615
2615
 
2616
2616
  Update template
2617
2617
 
2618
- Update one variant's components and/or its message_send_ttl_seconds. Name, language and category cannot change after creation. Meta stores one template per **name + language**, so a name identifies a family of variants, each with its own Meta id. Pass `language` to address one variant. Without it, a name with a single variant resolves to that variant; a name with several returns `409 ambiguous_template` with `details.languages`. A bare language (`es`) matches a single regional variant (`es_ES`); if the family has several regional variants for it, that is also a 409. A full code (`es_ES`) must match exactly. Variants in `PENDING_DELETION` are not part of the family. Meta only allows editing templates in `APPROVED`, `REJECTED` or `PAUSED` state; an approved template can be edited once per 24 hours and up to 10 times per 30 days. A successful update sends the variant back to Meta for review, so the `status` returned here is normally `PENDING`. The final outcome arrives on the `whatsapp.template.status_updated` webhook (which carries the variant's `templateId` and `language`). A variant already in `PENDING` cannot be edited again until Meta finishes reviewing it.
2618
+ Update one variant's components and/or its message_send_ttl_seconds. Name, language and category cannot change after creation. Meta stores one template per **name + language**, so a name identifies a family of variants, each with its own Meta id. Pass `language` to address one variant. Without it, a name with a single variant resolves to that variant; a name with several returns `409 ambiguous_template` with `details.languages`. A bare language (`es`) matches a single regional variant (`es_ES`); if the family has several regional variants for it, that is also a 409. A full code (`es_ES`) must match exactly. Variants in `PENDING_DELETION` are not part of the family. Meta only allows editing templates in `APPROVED`, `REJECTED` or `PAUSED` state; an approved template can be edited once per 24 hours and up to 10 times per 30 days. A component update sends the variant back to Meta for review, so the `status` returned here is normally `PENDING`; a TTL-only update keeps an APPROVED variant approved. The final outcome arrives on the `whatsapp.template.status_updated` webhook (which carries the variant's `templateId` and `language`). A variant already in `PENDING` cannot be edited again until Meta finishes reviewing it.
2619
2619
 
2620
2620
  ### Examples
2621
2621
 
@@ -2686,7 +2686,7 @@ end
2686
2686
 
2687
2687
  Update template by id
2688
2688
 
2689
- Update one variant's components and/or its message_send_ttl_seconds by its Meta id. Name, language and category cannot change. Meta only allows editing templates in `APPROVED`, `REJECTED` or `PAUSED` state; an approved template can be edited once per 24 hours and up to 10 times per 30 days. A successful update sends the variant back to Meta for review, so the `status` returned here is normally `PENDING`. The final outcome arrives on the `whatsapp.template.status_updated` webhook (which carries the variant's `templateId` and `language`). A variant already in `PENDING` cannot be edited again until Meta finishes reviewing it.
2689
+ Update one variant's components and/or its message_send_ttl_seconds by its Meta id. Name, language and category cannot change. Meta only allows editing templates in `APPROVED`, `REJECTED` or `PAUSED` state; an approved template can be edited once per 24 hours and up to 10 times per 30 days. A component update sends the variant back to Meta for review, so the `status` returned here is normally `PENDING`; a TTL-only update keeps an APPROVED variant approved. The final outcome arrives on the `whatsapp.template.status_updated` webhook (which carries the variant's `templateId` and `language`). A variant already in `PENDING` cannot be edited again until Meta finishes reviewing it.
2690
2690
 
2691
2691
  ### Examples
2692
2692
 
@@ -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
@@ -379,7 +379,7 @@ module Zernio
379
379
  if @api_client.config.debugging
380
380
  @api_client.config.logger.debug 'Calling API: ContactsApi.list_contacts ...'
381
381
  end
382
- allowable_values = ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp", "slack"]
382
+ allowable_values = ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp", "slack", "sms"]
383
383
  if @api_client.config.client_side_validation && opts[:'platform'] && !allowable_values.include?(opts[:'platform'])
384
384
  fail ArgumentError, "invalid value for \"platform\", must be one of #{allowable_values}"
385
385
  end
@@ -2581,7 +2581,7 @@ module Zernio
2581
2581
  end
2582
2582
 
2583
2583
  # Update template
2584
- # Update one variant's components and/or its message_send_ttl_seconds. Name, language and category cannot change after creation. Meta stores one template per **name + language**, so a name identifies a family of variants, each with its own Meta id. Pass `language` to address one variant. Without it, a name with a single variant resolves to that variant; a name with several returns `409 ambiguous_template` with `details.languages`. A bare language (`es`) matches a single regional variant (`es_ES`); if the family has several regional variants for it, that is also a 409. A full code (`es_ES`) must match exactly. Variants in `PENDING_DELETION` are not part of the family. Meta only allows editing templates in `APPROVED`, `REJECTED` or `PAUSED` state; an approved template can be edited once per 24 hours and up to 10 times per 30 days. A successful update sends the variant back to Meta for review, so the `status` returned here is normally `PENDING`. The final outcome arrives on the `whatsapp.template.status_updated` webhook (which carries the variant's `templateId` and `language`). A variant already in `PENDING` cannot be edited again until Meta finishes reviewing it.
2584
+ # Update one variant's components and/or its message_send_ttl_seconds. Name, language and category cannot change after creation. Meta stores one template per **name + language**, so a name identifies a family of variants, each with its own Meta id. Pass `language` to address one variant. Without it, a name with a single variant resolves to that variant; a name with several returns `409 ambiguous_template` with `details.languages`. A bare language (`es`) matches a single regional variant (`es_ES`); if the family has several regional variants for it, that is also a 409. A full code (`es_ES`) must match exactly. Variants in `PENDING_DELETION` are not part of the family. Meta only allows editing templates in `APPROVED`, `REJECTED` or `PAUSED` state; an approved template can be edited once per 24 hours and up to 10 times per 30 days. A component update sends the variant back to Meta for review, so the `status` returned here is normally `PENDING`; a TTL-only update keeps an APPROVED variant approved. The final outcome arrives on the `whatsapp.template.status_updated` webhook (which carries the variant's `templateId` and `language`). A variant already in `PENDING` cannot be edited again until Meta finishes reviewing it.
2585
2585
  # @param template_name [String] Template name (the family).
2586
2586
  # @param update_whats_app_template_request [UpdateWhatsAppTemplateRequest]
2587
2587
  # @param [Hash] opts the optional parameters
@@ -2592,7 +2592,7 @@ module Zernio
2592
2592
  end
2593
2593
 
2594
2594
  # Update template
2595
- # Update one variant's components and/or its message_send_ttl_seconds. Name, language and category cannot change after creation. Meta stores one template per **name + language**, so a name identifies a family of variants, each with its own Meta id. Pass `language` to address one variant. Without it, a name with a single variant resolves to that variant; a name with several returns `409 ambiguous_template` with `details.languages`. A bare language (`es`) matches a single regional variant (`es_ES`); if the family has several regional variants for it, that is also a 409. A full code (`es_ES`) must match exactly. Variants in `PENDING_DELETION` are not part of the family. Meta only allows editing templates in `APPROVED`, `REJECTED` or `PAUSED` state; an approved template can be edited once per 24 hours and up to 10 times per 30 days. A successful update sends the variant back to Meta for review, so the `status` returned here is normally `PENDING`. The final outcome arrives on the `whatsapp.template.status_updated` webhook (which carries the variant's `templateId` and `language`). A variant already in `PENDING` cannot be edited again until Meta finishes reviewing it.
2595
+ # Update one variant's components and/or its message_send_ttl_seconds. Name, language and category cannot change after creation. Meta stores one template per **name + language**, so a name identifies a family of variants, each with its own Meta id. Pass `language` to address one variant. Without it, a name with a single variant resolves to that variant; a name with several returns `409 ambiguous_template` with `details.languages`. A bare language (`es`) matches a single regional variant (`es_ES`); if the family has several regional variants for it, that is also a 409. A full code (`es_ES`) must match exactly. Variants in `PENDING_DELETION` are not part of the family. Meta only allows editing templates in `APPROVED`, `REJECTED` or `PAUSED` state; an approved template can be edited once per 24 hours and up to 10 times per 30 days. A component update sends the variant back to Meta for review, so the `status` returned here is normally `PENDING`; a TTL-only update keeps an APPROVED variant approved. The final outcome arrives on the `whatsapp.template.status_updated` webhook (which carries the variant's `templateId` and `language`). A variant already in `PENDING` cannot be edited again until Meta finishes reviewing it.
2596
2596
  # @param template_name [String] Template name (the family).
2597
2597
  # @param update_whats_app_template_request [UpdateWhatsAppTemplateRequest]
2598
2598
  # @param [Hash] opts the optional parameters
@@ -2655,7 +2655,7 @@ module Zernio
2655
2655
  end
2656
2656
 
2657
2657
  # Update template by id
2658
- # Update one variant's components and/or its message_send_ttl_seconds by its Meta id. Name, language and category cannot change. Meta only allows editing templates in `APPROVED`, `REJECTED` or `PAUSED` state; an approved template can be edited once per 24 hours and up to 10 times per 30 days. A successful update sends the variant back to Meta for review, so the `status` returned here is normally `PENDING`. The final outcome arrives on the `whatsapp.template.status_updated` webhook (which carries the variant's `templateId` and `language`). A variant already in `PENDING` cannot be edited again until Meta finishes reviewing it.
2658
+ # Update one variant's components and/or its message_send_ttl_seconds by its Meta id. Name, language and category cannot change. Meta only allows editing templates in `APPROVED`, `REJECTED` or `PAUSED` state; an approved template can be edited once per 24 hours and up to 10 times per 30 days. A component update sends the variant back to Meta for review, so the `status` returned here is normally `PENDING`; a TTL-only update keeps an APPROVED variant approved. The final outcome arrives on the `whatsapp.template.status_updated` webhook (which carries the variant's `templateId` and `language`). A variant already in `PENDING` cannot be edited again until Meta finishes reviewing it.
2659
2659
  # @param template_id [String] Meta template id (numeric).
2660
2660
  # @param update_whats_app_template_by_id_request [UpdateWhatsAppTemplateByIdRequest]
2661
2661
  # @param [Hash] opts the optional parameters
@@ -2666,7 +2666,7 @@ module Zernio
2666
2666
  end
2667
2667
 
2668
2668
  # Update template by id
2669
- # Update one variant's components and/or its message_send_ttl_seconds by its Meta id. Name, language and category cannot change. Meta only allows editing templates in `APPROVED`, `REJECTED` or `PAUSED` state; an approved template can be edited once per 24 hours and up to 10 times per 30 days. A successful update sends the variant back to Meta for review, so the `status` returned here is normally `PENDING`. The final outcome arrives on the `whatsapp.template.status_updated` webhook (which carries the variant's `templateId` and `language`). A variant already in `PENDING` cannot be edited again until Meta finishes reviewing it.
2669
+ # Update one variant's components and/or its message_send_ttl_seconds by its Meta id. Name, language and category cannot change. Meta only allows editing templates in `APPROVED`, `REJECTED` or `PAUSED` state; an approved template can be edited once per 24 hours and up to 10 times per 30 days. A component update sends the variant back to Meta for review, so the `status` returned here is normally `PENDING`; a TTL-only update keeps an APPROVED variant approved. The final outcome arrives on the `whatsapp.template.status_updated` webhook (which carries the variant's `templateId` and `language`). A variant already in `PENDING` cannot be edited again until Meta finishes reviewing it.
2670
2670
  # @param template_id [String] Meta template id (numeric).
2671
2671
  # @param update_whats_app_template_by_id_request [UpdateWhatsAppTemplateByIdRequest]
2672
2672
  # @param [Hash] opts the optional parameters
@@ -185,7 +185,7 @@ module Zernio
185
185
  return false if @profile_id.nil?
186
186
  return false if @account_id.nil?
187
187
  return false if @platform.nil?
188
- platform_validator = EnumAttributeValidator.new('String', ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp"])
188
+ platform_validator = EnumAttributeValidator.new('String', ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp", "sms", "slack"])
189
189
  return false unless platform_validator.valid?(@platform)
190
190
  return false if @name.nil?
191
191
  true
@@ -214,7 +214,7 @@ module Zernio
214
214
  # Custom attribute writer method checking allowed values (enum).
215
215
  # @param [Object] platform Object to be assigned
216
216
  def platform=(platform)
217
- validator = EnumAttributeValidator.new('String', ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp"])
217
+ validator = EnumAttributeValidator.new('String', ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp", "sms", "slack"])
218
218
  unless validator.valid?(platform)
219
219
  fail ArgumentError, "invalid value for \"platform\", must be one of #{validator.allowable_values}."
220
220
  end
@@ -202,7 +202,7 @@ module Zernio
202
202
  warn '[DEPRECATED] the `valid?` method is obsolete'
203
203
  return false if @profile_id.nil?
204
204
  return false if @name.nil?
205
- platform_validator = EnumAttributeValidator.new('String', ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp", "slack"])
205
+ platform_validator = EnumAttributeValidator.new('String', ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp", "slack", "sms"])
206
206
  return false unless platform_validator.valid?(@platform)
207
207
  true
208
208
  end
@@ -230,7 +230,7 @@ module Zernio
230
230
  # Custom attribute writer method checking allowed values (enum).
231
231
  # @param [Object] platform Object to be assigned
232
232
  def platform=(platform)
233
- validator = EnumAttributeValidator.new('String', ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp", "slack"])
233
+ validator = EnumAttributeValidator.new('String', ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp", "slack", "sms"])
234
234
  unless validator.valid?(platform)
235
235
  fail ArgumentError, "invalid value for \"platform\", must be one of #{validator.allowable_values}."
236
236
  end
@@ -191,7 +191,7 @@ module Zernio
191
191
  return false if @profile_id.nil?
192
192
  return false if @account_id.nil?
193
193
  return false if @platform.nil?
194
- platform_validator = EnumAttributeValidator.new('String', ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp"])
194
+ platform_validator = EnumAttributeValidator.new('String', ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp", "slack"])
195
195
  return false unless platform_validator.valid?(@platform)
196
196
  return false if @name.nil?
197
197
  true
@@ -220,7 +220,7 @@ module Zernio
220
220
  # Custom attribute writer method checking allowed values (enum).
221
221
  # @param [Object] platform Object to be assigned
222
222
  def platform=(platform)
223
- validator = EnumAttributeValidator.new('String', ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp"])
223
+ validator = EnumAttributeValidator.new('String', ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp", "slack"])
224
224
  unless validator.valid?(platform)
225
225
  fail ArgumentError, "invalid value for \"platform\", must be one of #{validator.allowable_values}."
226
226
  end
@@ -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`.
@@ -42,7 +42,7 @@ module Zernio
42
42
  # Optional button customizations for library templates. Each item specifies button type and configuration (e.g., URL, phone number, quick reply).
43
43
  attr_accessor :library_template_button_inputs
44
44
 
45
- # Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 restores the 30-day default on AUTHENTICATION and UTILITY. Meta defaults to 600 for AUTHENTICATION and 30 days otherwise. If Meta later recategorises the template, it clears the TTL (read it back to check).
45
+ # Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 (create only) keeps the 30-day default on AUTHENTICATION and UTILITY. Meta defaults to 600 for AUTHENTICATION and 30 days otherwise. If Meta later recategorises the template, it clears the TTL (read it back to check).
46
46
  attr_accessor :message_send_ttl_seconds
47
47
 
48
48
  class EnumAttributeValidator
@@ -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 }.
@@ -21,7 +21,7 @@ module Zernio
21
21
  # Updated template components. Optional when only message_send_ttl_seconds changes; at least one of the two is required.
22
22
  attr_accessor :components
23
23
 
24
- # Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 restores the 30-day default on AUTHENTICATION and UTILITY. Meta defaults to 600 for AUTHENTICATION and 30 days otherwise. If Meta later recategorises the template, it clears the TTL (read it back to check).
24
+ # Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 is not accepted here (Meta treats it as an empty edit); send a value in range. A TTL-only edit keeps an APPROVED template approved, no re-review. Meta defaults to 600 for AUTHENTICATION and 30 days otherwise. If Meta later recategorises the template, it clears the TTL (read it back to check).
25
25
  attr_accessor :message_send_ttl_seconds
26
26
 
27
27
  # Attribute mapping from ruby-style variable name to JSON key.
@@ -24,7 +24,7 @@ module Zernio
24
24
  # Updated template components. Optional when only message_send_ttl_seconds changes; at least one of the two is required.
25
25
  attr_accessor :components
26
26
 
27
- # Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 restores the 30-day default on AUTHENTICATION and UTILITY. Meta defaults to 600 for AUTHENTICATION and 30 days otherwise. If Meta later recategorises the template, it clears the TTL (read it back to check).
27
+ # Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 is not accepted here (Meta treats it as an empty edit); send a value in range. A TTL-only edit keeps an APPROVED template approved, no re-review. Meta defaults to 600 for AUTHENTICATION and 30 days otherwise. If Meta later recategorises the template, it clears the TTL (read it back to check).
28
28
  attr_accessor :message_send_ttl_seconds
29
29
 
30
30
  # Attribute mapping from ruby-style variable name to JSON key.
@@ -11,5 +11,5 @@ Generator version: 7.19.0
11
11
  =end
12
12
 
13
13
  module Zernio
14
- VERSION = '0.0.866'
14
+ VERSION = '0.0.868'
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
@@ -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. 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).'
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. 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).'
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:
@@ -31329,7 +31339,7 @@ paths:
31329
31339
  type: string
31330
31340
  message_send_ttl_seconds:
31331
31341
  type: integer
31332
- description: 'Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 restores the 30-day default on AUTHENTICATION and UTILITY. Meta defaults to 600 for AUTHENTICATION and 30 days otherwise. If Meta later recategorises the template, it clears the TTL (read it back to check).'
31342
+ description: 'Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 (create only) keeps the 30-day default on AUTHENTICATION and UTILITY. Meta defaults to 600 for AUTHENTICATION and 30 days otherwise. If Meta later recategorises the template, it clears the TTL (read it back to check).'
31333
31343
  examples:
31334
31344
  custom:
31335
31345
  summary: Custom template (requires review)
@@ -31482,8 +31492,9 @@ paths:
31482
31492
  must match exactly. Variants in `PENDING_DELETION` are not part of the family.
31483
31493
 
31484
31494
  Meta only allows editing templates in `APPROVED`, `REJECTED` or `PAUSED` state; an approved
31485
- template can be edited once per 24 hours and up to 10 times per 30 days. A successful update
31486
- sends the variant back to Meta for review, so the `status` returned here is normally `PENDING`.
31495
+ template can be edited once per 24 hours and up to 10 times per 30 days. A component update
31496
+ sends the variant back to Meta for review, so the `status` returned here is normally `PENDING`;
31497
+ a TTL-only update keeps an APPROVED variant approved.
31487
31498
  The final outcome arrives on the `whatsapp.template.status_updated` webhook (which carries the
31488
31499
  variant's `templateId` and `language`). A variant already in `PENDING` cannot be edited again
31489
31500
  until Meta finishes reviewing it.
@@ -31519,7 +31530,7 @@ paths:
31519
31530
  $ref: '#/components/schemas/WhatsAppTemplateComponent'
31520
31531
  message_send_ttl_seconds:
31521
31532
  type: integer
31522
- description: 'Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 restores the 30-day default on AUTHENTICATION and UTILITY. Meta defaults to 600 for AUTHENTICATION and 30 days otherwise. If Meta later recategorises the template, it clears the TTL (read it back to check).'
31533
+ description: 'Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 is not accepted here (Meta treats it as an empty edit); send a value in range. A TTL-only edit keeps an APPROVED template approved, no re-review. Meta defaults to 600 for AUTHENTICATION and 30 days otherwise. If Meta later recategorises the template, it clears the TTL (read it back to check).'
31523
31534
  example:
31524
31535
  accountId: "507f1f77bcf86cd799439011"
31525
31536
  language: "es"
@@ -31695,8 +31706,9 @@ paths:
31695
31706
  Update one variant's components and/or its message_send_ttl_seconds by its Meta id. Name, language and category cannot change.
31696
31707
 
31697
31708
  Meta only allows editing templates in `APPROVED`, `REJECTED` or `PAUSED` state; an approved
31698
- template can be edited once per 24 hours and up to 10 times per 30 days. A successful update
31699
- sends the variant back to Meta for review, so the `status` returned here is normally `PENDING`.
31709
+ template can be edited once per 24 hours and up to 10 times per 30 days. A component update
31710
+ sends the variant back to Meta for review, so the `status` returned here is normally `PENDING`;
31711
+ a TTL-only update keeps an APPROVED variant approved.
31700
31712
  The final outcome arrives on the `whatsapp.template.status_updated` webhook (which carries the
31701
31713
  variant's `templateId` and `language`). A variant already in `PENDING` cannot be edited again
31702
31714
  until Meta finishes reviewing it.
@@ -31729,7 +31741,7 @@ paths:
31729
31741
  $ref: '#/components/schemas/WhatsAppTemplateComponent'
31730
31742
  message_send_ttl_seconds:
31731
31743
  type: integer
31732
- description: 'Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 restores the 30-day default on AUTHENTICATION and UTILITY. Meta defaults to 600 for AUTHENTICATION and 30 days otherwise. If Meta later recategorises the template, it clears the TTL (read it back to check).'
31744
+ description: 'Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 is not accepted here (Meta treats it as an empty edit); send a value in range. A TTL-only edit keeps an APPROVED template approved, no re-review. Meta defaults to 600 for AUTHENTICATION and 30 days otherwise. If Meta later recategorises the template, it clears the TTL (read it back to check).'
31733
31745
  responses:
31734
31746
  '200':
31735
31747
  description: Template updated successfully
@@ -38981,7 +38993,7 @@ paths:
38981
38993
  - { name: search, in: query, schema: { type: string }, description: 'Case-insensitive substring match on the contact name, email and company. Phone numbers and other platform identifiers are not matched: they live on the contact channel, not on the contact. To reach a contact from an inbox webhook, use the conversation.contactId it already carries.' }
38982
38994
  - { name: tag, in: query, schema: { type: string } }
38983
38995
  - { name: tags, in: query, schema: { type: string }, description: 'Comma-separated tags, matches contacts carrying any of them' }
38984
- - { name: platform, in: query, schema: { type: string, enum: [instagram, facebook, telegram, twitter, bluesky, reddit, whatsapp, slack] } }
38996
+ - { name: platform, in: query, schema: { type: string, enum: [instagram, facebook, telegram, twitter, bluesky, reddit, whatsapp, slack, sms] } }
38985
38997
  - { name: isSubscribed, in: query, schema: { type: string, enum: ['true', 'false'] } }
38986
38998
  - { name: limit, in: query, schema: { type: integer, default: 50, maximum: 200 } }
38987
38999
  - { name: skip, in: query, schema: { type: integer, default: 0 } }
@@ -39052,7 +39064,7 @@ paths:
39052
39064
  isSubscribed: { type: boolean, default: true }
39053
39065
  notes: { type: string }
39054
39066
  accountId: { type: string, description: Optional. Creates a channel if provided with platform + platformIdentifier }
39055
- platform: { type: string, enum: [instagram, facebook, telegram, twitter, bluesky, reddit, whatsapp, slack], description: 'Channel platform. Only the enum values support contact channels; any other platform is rejected with code platform_not_supported.' }
39067
+ platform: { type: string, enum: [instagram, facebook, telegram, twitter, bluesky, reddit, whatsapp, slack, sms], description: 'Channel platform. Only the enum values support contact channels; any other platform is rejected with code platform_not_supported.' }
39056
39068
  platformIdentifier: { type: string }
39057
39069
  displayIdentifier: { type: string }
39058
39070
  responses:
@@ -39523,7 +39535,7 @@ paths:
39523
39535
  properties:
39524
39536
  profileId: { type: string }
39525
39537
  accountId: { type: string }
39526
- platform: { type: string, enum: [instagram, facebook, telegram, twitter, bluesky, reddit, whatsapp] }
39538
+ platform: { type: string, enum: [instagram, facebook, telegram, twitter, bluesky, reddit, whatsapp, sms, slack] }
39527
39539
  name: { type: string }
39528
39540
  description: { type: string }
39529
39541
  message:
@@ -40478,7 +40490,7 @@ paths:
40478
40490
  properties:
40479
40491
  profileId: { type: string }
40480
40492
  accountId: { type: string }
40481
- platform: { type: string, enum: [instagram, facebook, telegram, twitter, bluesky, reddit, whatsapp] }
40493
+ platform: { type: string, enum: [instagram, facebook, telegram, twitter, bluesky, reddit, whatsapp, slack] }
40482
40494
  name: { type: string }
40483
40495
  description: { type: string }
40484
40496
  steps:
@@ -43363,6 +43375,32 @@ paths:
43363
43375
  - **Pinterest / X / OpenAI Ads**: status + budget only. Sending
43364
43376
  `targeting` or `creative` returns 501 with code `unsupported_platform_operation`.
43365
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.
43366
43404
  security:
43367
43405
  - bearerAuth: []
43368
43406
  parameters:
@@ -43389,14 +43427,28 @@ paths:
43389
43427
  properties:
43390
43428
  keywords:
43391
43429
  type: array
43392
- 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."
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.
43393
43439
  items:
43394
43440
  oneOf:
43395
43441
  - { type: string }
43396
43442
  - { type: object, required: [text], properties: { text: { type: string, maxLength: 80 }, matchType: { type: string, enum: [exact, phrase, broad] } } }
43397
43443
  negativeKeywords:
43398
43444
  type: array
43399
- description: "Google only. Same declarative contract as keywords, for the ad group's negative keywords."
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.
43400
43452
  items:
43401
43453
  oneOf:
43402
43454
  - { type: string }
@@ -46112,8 +46164,9 @@ paths:
46112
46164
  multiple ads per ad set are allowed (unlike `dynamicCreative` which is limited to one).
46113
46165
  Requires `imageUrl` or `video`, `linkUrl`, and `callToAction`. When set, the top-level
46114
46166
  `body` field is used as the `object_story_spec.link_data.message` (the preview text) and
46115
- `headlines` must also be present. Mutually exclusive with `dynamicCreative`,
46116
- `placementAssets`, `carouselCards`, and `creatives[]`.
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[]`.
46117
46170
  headlines:
46118
46171
  type: array
46119
46172
  minItems: 1
@@ -46121,7 +46174,8 @@ paths:
46121
46174
  items: { type: string, maxLength: 255 }
46122
46175
  description: |
46123
46176
  Meta only. Headline variations for Multiple Text Options. Must be sent alongside `bodies`.
46124
- 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).
46125
46179
  descriptions:
46126
46180
  type: array
46127
46181
  minItems: 1
@@ -47257,7 +47311,7 @@ paths:
47257
47311
  content: { type: array, items: { type: string } }
47258
47312
  style: { type: string, enum: [LIST_STYLE, PARAGRAPH_STYLE] }
47259
47313
  buttonText: { type: string }
47260
- 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." }
47261
47315
  - type: object
47262
47316
  title: LinkedInLeadFormPlatformData
47263
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 &#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
@@ -498,7 +498,7 @@ describe 'WhatsAppApi' do
498
498
 
499
499
  # unit tests for update_whats_app_template
500
500
  # Update template
501
- # Update one variant&#39;s components and/or its message_send_ttl_seconds. Name, language and category cannot change after creation. Meta stores one template per **name + language**, so a name identifies a family of variants, each with its own Meta id. Pass &#x60;language&#x60; to address one variant. Without it, a name with a single variant resolves to that variant; a name with several returns &#x60;409 ambiguous_template&#x60; with &#x60;details.languages&#x60;. A bare language (&#x60;es&#x60;) matches a single regional variant (&#x60;es_ES&#x60;); if the family has several regional variants for it, that is also a 409. A full code (&#x60;es_ES&#x60;) must match exactly. Variants in &#x60;PENDING_DELETION&#x60; are not part of the family. Meta only allows editing templates in &#x60;APPROVED&#x60;, &#x60;REJECTED&#x60; or &#x60;PAUSED&#x60; state; an approved template can be edited once per 24 hours and up to 10 times per 30 days. A successful update sends the variant back to Meta for review, so the &#x60;status&#x60; returned here is normally &#x60;PENDING&#x60;. The final outcome arrives on the &#x60;whatsapp.template.status_updated&#x60; webhook (which carries the variant&#39;s &#x60;templateId&#x60; and &#x60;language&#x60;). A variant already in &#x60;PENDING&#x60; cannot be edited again until Meta finishes reviewing it.
501
+ # Update one variant&#39;s components and/or its message_send_ttl_seconds. Name, language and category cannot change after creation. Meta stores one template per **name + language**, so a name identifies a family of variants, each with its own Meta id. Pass &#x60;language&#x60; to address one variant. Without it, a name with a single variant resolves to that variant; a name with several returns &#x60;409 ambiguous_template&#x60; with &#x60;details.languages&#x60;. A bare language (&#x60;es&#x60;) matches a single regional variant (&#x60;es_ES&#x60;); if the family has several regional variants for it, that is also a 409. A full code (&#x60;es_ES&#x60;) must match exactly. Variants in &#x60;PENDING_DELETION&#x60; are not part of the family. Meta only allows editing templates in &#x60;APPROVED&#x60;, &#x60;REJECTED&#x60; or &#x60;PAUSED&#x60; state; an approved template can be edited once per 24 hours and up to 10 times per 30 days. A component update sends the variant back to Meta for review, so the &#x60;status&#x60; returned here is normally &#x60;PENDING&#x60;; a TTL-only update keeps an APPROVED variant approved. The final outcome arrives on the &#x60;whatsapp.template.status_updated&#x60; webhook (which carries the variant&#39;s &#x60;templateId&#x60; and &#x60;language&#x60;). A variant already in &#x60;PENDING&#x60; cannot be edited again until Meta finishes reviewing it.
502
502
  # @param template_name Template name (the family).
503
503
  # @param update_whats_app_template_request
504
504
  # @param [Hash] opts the optional parameters
@@ -511,7 +511,7 @@ describe 'WhatsAppApi' do
511
511
 
512
512
  # unit tests for update_whats_app_template_by_id
513
513
  # Update template by id
514
- # Update one variant&#39;s components and/or its message_send_ttl_seconds by its Meta id. Name, language and category cannot change. Meta only allows editing templates in &#x60;APPROVED&#x60;, &#x60;REJECTED&#x60; or &#x60;PAUSED&#x60; state; an approved template can be edited once per 24 hours and up to 10 times per 30 days. A successful update sends the variant back to Meta for review, so the &#x60;status&#x60; returned here is normally &#x60;PENDING&#x60;. The final outcome arrives on the &#x60;whatsapp.template.status_updated&#x60; webhook (which carries the variant&#39;s &#x60;templateId&#x60; and &#x60;language&#x60;). A variant already in &#x60;PENDING&#x60; cannot be edited again until Meta finishes reviewing it.
514
+ # Update one variant&#39;s components and/or its message_send_ttl_seconds by its Meta id. Name, language and category cannot change. Meta only allows editing templates in &#x60;APPROVED&#x60;, &#x60;REJECTED&#x60; or &#x60;PAUSED&#x60; state; an approved template can be edited once per 24 hours and up to 10 times per 30 days. A component update sends the variant back to Meta for review, so the &#x60;status&#x60; returned here is normally &#x60;PENDING&#x60;; a TTL-only update keeps an APPROVED variant approved. The final outcome arrives on the &#x60;whatsapp.template.status_updated&#x60; webhook (which carries the variant&#39;s &#x60;templateId&#x60; and &#x60;language&#x60;). A variant already in &#x60;PENDING&#x60; cannot be edited again until Meta finishes reviewing it.
515
515
  # @param template_id Meta template id (numeric).
516
516
  # @param update_whats_app_template_by_id_request
517
517
  # @param [Hash] opts the optional parameters
@@ -42,7 +42,7 @@ describe Zernio::CreateBroadcastRequest do
42
42
  describe 'test attribute "platform"' do
43
43
  it 'should work' do
44
44
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
45
- # validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp"])
45
+ # validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp", "sms", "slack"])
46
46
  # validator.allowable_values.each do |value|
47
47
  # expect { instance.platform = value }.not_to raise_error
48
48
  # end
@@ -78,7 +78,7 @@ describe Zernio::CreateContactRequest do
78
78
  describe 'test attribute "platform"' do
79
79
  it 'should work' do
80
80
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
81
- # validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp", "slack"])
81
+ # validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp", "slack", "sms"])
82
82
  # validator.allowable_values.each do |value|
83
83
  # expect { instance.platform = value }.not_to raise_error
84
84
  # end
@@ -42,7 +42,7 @@ describe Zernio::CreateSequenceRequest do
42
42
  describe 'test attribute "platform"' do
43
43
  it 'should work' do
44
44
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
45
- # validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp"])
45
+ # validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["instagram", "facebook", "telegram", "twitter", "bluesky", "reddit", "whatsapp", "slack"])
46
46
  # validator.allowable_values.each do |value|
47
47
  # expect { instance.platform = value }.not_to raise_error
48
48
  # end
@@ -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.866
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.866.gem
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
Binary file