late-sdk 0.0.639 → 0.0.641

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8a1e52f2fc494ac1d77f85382297c83612bcd8e957b9dc2186d9d35a2cc2ad92
4
- data.tar.gz: dd09be0c5c864e3fa64571f2386a49c0c373c0446f25507823ed09612606d17b
3
+ metadata.gz: eb6cf5a2f51b52bf9fb5a926f1a43ec8d9e915e4395fd54ed511ffec693b9754
4
+ data.tar.gz: 68d48c7e7791631811e3db7c243ee9471d1c04700be6126bb9f06827fb60f708
5
5
  SHA512:
6
- metadata.gz: 7d127baaef1e5725924e3e0b3b185c9c0461c02c43029ea224cfb3b615e0b064ef0aede0588bafd82638e695b65002a105baf755ec78591037413e8fdf59192d
7
- data.tar.gz: 75c1561d78e50d3d7c64b9240e3601cc90206509180771f5f01efdd8ebc2b62e15187f5130c1b31e499ba72f9048a265a8ba0e41687aaffac809a760ab55cd33
6
+ metadata.gz: 55558864a54a5ebe2c0ad107b913c4d1b57b45764cc6e0c814b6376cce84400d5762208090b62f0c85488f89ba13701d29461704bfaa5a1fa59fd356ccb02d59
7
+ data.tar.gz: d06c7661e07dbc5ba98633f57ec34c5e3545c82c7612cb32b3a2cc309c96bad9d0b308ec46d2eeae0810ac7f873f87ff5e4993a44684d5f93f055a38bf248237
@@ -261,7 +261,7 @@ end
261
261
  api_instance = Zernio::AdCampaignsApi.new
262
262
  create_standalone_ad_request = Zernio::CreateStandaloneAdRequest.new({account_id: 'account_id_example', ad_account_id: 'ad_account_id_example', name: 'name_example'}) # CreateStandaloneAdRequest |
263
263
  opts = {
264
- idempotency_key: 'idempotency_key_example' # String | Optional client-generated unique key (e.g. a UUID) that makes create retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
264
+ idempotency_key: 'idempotency_key_example' # String | Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
265
265
  }
266
266
 
267
267
  begin
@@ -296,7 +296,7 @@ end
296
296
  | Name | Type | Description | Notes |
297
297
  | ---- | ---- | ----------- | ----- |
298
298
  | **create_standalone_ad_request** | [**CreateStandaloneAdRequest**](CreateStandaloneAdRequest.md) | | |
299
- | **idempotency_key** | **String** | Optional client-generated unique key (e.g. a UUID) that makes create retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409. | [optional] |
299
+ | **idempotency_key** | **String** | Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409. | [optional] |
300
300
 
301
301
  ### Return type
302
302
 
@@ -7,9 +7,10 @@
7
7
  | **account_id** | **String** | The social account ID to send from | |
8
8
  | **participant_id** | **String** | Recipient identifier. For X this is the numeric user ID; for WhatsApp, the recipient phone number in international format (digits, country code included). Provide either this or participantUsername. | [optional] |
9
9
  | **participant_username** | **String** | Recipient handle/username — an X or Bluesky handle (with or without @) or a Reddit username (with or without u/). Resolved via lookup. Provide either this or participantId. | [optional] |
10
- | **message** | **String** | Text content of the message. At least one of message, attachment, or (for WhatsApp) templateName is required. | [optional] |
10
+ | **message** | **String** | Text content of the message. At least one of message, attachment, or (for WhatsApp) templateName is required. Required when category is set (a Direct Send utility message is a text message). | [optional] |
11
11
  | **skip_dm_check** | **Boolean** | X/Twitter only. Skip the receives_your_dm eligibility check before sending. Use if you have already verified the recipient accepts DMs. | [optional][default to false] |
12
- | **template_name** | **String** | WhatsApp only. Name of the approved template to start the conversation with (required for WhatsApp). | [optional] |
12
+ | **template_name** | **String** | WhatsApp only. Name of the approved template to start the conversation with. Required for WhatsApp unless category is used instead (Direct Send). Cannot be combined with category. | [optional] |
13
+ | **category** | **String** | WhatsApp only (Meta Direct Send). Combined with message and without templateName, starts the conversation with a business-initiated UTILITY message and no pre-approved template; Meta matches or auto-creates a template asynchronously. The WhatsApp Business Account must be eligible for Direct Send, otherwise the send fails with an error telling you to use an approved message template instead. Cannot be combined with templateName (templates are already categorized at creation). Utility messages only; marketing content is not allowed under this category. Accepted on the JSON body only, not on multipart requests. | [optional] |
13
14
  | **template_language** | **String** | WhatsApp only. Template language code (e.g. en_US). | [optional] |
14
15
  | **template_params** | **Array<String>** | WhatsApp only. Template variable values as one flat array, in the order the variables appear across the whole template: text-header variables first, then body variables, then one value per dynamic URL button (in button order). Works with positional placeholders ({{1}}, {{2}}, ...) and with named placeholders ({{name}}, {{company}} - how Meta Business Manager creates templates), where values fill the named slots in order of appearance. Example - a body with {{1}}, {{2}} plus a URL button https://example.com/{{1}} takes three values: [body1, body2, buttonSuffix]. Media headers (image, video, document) are filled automatically from the approved template and take no value here (use headerMedia to override the header asset per send). | [optional] |
15
16
  | **header_media** | [**CreateInboxConversationRequestHeaderMedia**](CreateInboxConversationRequestHeaderMedia.md) | | [optional] |
@@ -26,6 +27,7 @@ instance = Zernio::CreateInboxConversationRequest.new(
26
27
  message: null,
27
28
  skip_dm_check: null,
28
29
  template_name: null,
30
+ category: null,
29
31
  template_language: null,
30
32
  template_params: null,
31
33
  header_media: null
@@ -6,7 +6,7 @@
6
6
  | ---- | ---- | ----------- | ----- |
7
7
  | **cost_type** | **String** | Campaign cost model (billing event). Defaults to `CPM`. Required when `unitCost` is set so the manual bid applies to an explicit cost model. | [optional] |
8
8
  | **unit_cost** | **Float** | Manual bid in WHOLE account-currency units (e.g. 2.5 = $2.50). Requires `costType`. Omit for LinkedIn's automated (max delivery) bidding. LinkedIn enforces its own per-audience min/max bid bounds. | [optional] |
9
- | **optimization_target_type** | **String** | Campaign `optimizationTargetType` (e.g. `MAX_CLICK`, `TARGET_COST_PER_CLICK`, `MAX_IMPRESSION`). Forwarded verbatim LinkedIn validates compatibility with the objective and `costType`. Omit for the objective-derived default. | [optional] |
9
+ | **optimization_target_type** | **String** | Campaign `optimizationTargetType` (e.g. `MAX_CLICK`, `TARGET_COST_PER_CLICK`, `MAX_IMPRESSION`). Forwarded verbatim, LinkedIn validates compatibility with the objective and `costType`. Omit for the objective-derived default: `awareness` gets `MAX_IMPRESSION`, `video_views` gets `MAX_VIDEO_VIEW`, and every other goal gets `MAX_CLICK`. `lead_generation` and `conversions` also get `MAX_CLICK`, because `MAX_LEAD` and `MAX_CONVERSION` need a lead gen form or a conversion rule that neither creation flow attaches. The default applies only to `SPONSORED_UPDATES` campaigns (every boost, and the image, video and carousel standalone ads), never to the `TEXT_AD`, `DYNAMIC` and `SPONSORED_INMAILS` campaigns the other creative formats produce. It is also skipped when `unitCost` or a non-`CPM` `costType` is set, since those select manual bidding and the bid is then yours to choose. | [optional] |
10
10
  | **creative_selection** | **String** | How LinkedIn rotates creatives within the campaign. Defaults to `OPTIMIZED`. | [optional] |
11
11
  | **audience_expansion_enabled** | **Boolean** | Enable LinkedIn audience expansion. Defaults to false. | [optional] |
12
12
  | **offsite_delivery_enabled** | **Boolean** | Deliver on the LinkedIn Audience Network. Defaults to false. | [optional] |
data/docs/MessagesApi.md CHANGED
@@ -99,7 +99,7 @@ end
99
99
 
100
100
  Create conversation
101
101
 
102
- Initiate a new direct message conversation with a specified user. If a conversation already exists with the recipient, the message is added to the existing thread. Supported platforms: X/Twitter, Bluesky, Reddit, and WhatsApp. Other platforms return PLATFORM_NOT_SUPPORTED. WhatsApp: this is the endpoint for sending an approved template message to a phone number. Provide templateName, templateLanguage, and templateParams (variable values for the text header, body and dynamic URL buttons, in that order), with the recipient phone in participantId. A template is required because WhatsApp does not permit freeform messages to open a conversation; a missing template returns TEMPLATE_REQUIRED. Templates with media headers (image, video, document) are handled automatically: Zernio reads the approved template definition and fills the header at send time with the template's approved sample asset. To send a DIFFERENT asset per message (e.g. a distinct invoice PDF for each recipient), pass the headerMedia field with a public link (or a Meta media id); it overrides the sample for that send. Calling this for a number you already have a thread with simply sends the template into that thread, which also makes it the way to re-engage a contact after the 24-hour customer-service window has closed. Once the recipient replies (opening the 24h window), send freeform messages with the send-message endpoint (POST /v1/inbox/conversations/{conversationId}/messages). Template fields are accepted on the JSON body only, not on multipart requests. DM eligibility (X/Twitter): Before sending, the endpoint checks if the recipient accepts DMs from your account (via the receives_your_dm field). If not, a 422 error with code DM_NOT_ALLOWED is returned. You can skip this check with skipDmCheck: true if you have already verified eligibility. X API tier requirement: DM write endpoints require X API Pro tier ($5,000/month) or Enterprise access. This applies to BYOK (Bring Your Own Key) users who provide their own X API credentials. Rate limits (X/Twitter only): X's DM API enforces 200 requests per 15 minutes, 1,000 per 24 hours per connected X account, and 15,000 per 24 hours per X developer app (shared across all DM endpoints). These limits do NOT apply to other platforms. WhatsApp sends are governed by Meta's per-number messaging tiers (unique business-initiated conversations per 24 hours) and per-number throughput instead.
102
+ Initiate a new direct message conversation with a specified user. If a conversation already exists with the recipient, the message is added to the existing thread. Supported platforms: X/Twitter, Bluesky, Reddit, and WhatsApp. Other platforms return PLATFORM_NOT_SUPPORTED. WhatsApp: this is the endpoint for sending an approved template message to a phone number. Provide templateName, templateLanguage, and templateParams (variable values for the text header, body and dynamic URL buttons, in that order), with the recipient phone in participantId. A template is required because WhatsApp does not permit freeform messages to open a conversation; a missing template returns TEMPLATE_REQUIRED. Templates with media headers (image, video, document) are handled automatically: Zernio reads the approved template definition and fills the header at send time with the template's approved sample asset. To send a DIFFERENT asset per message (e.g. a distinct invoice PDF for each recipient), pass the headerMedia field with a public link (or a Meta media id); it overrides the sample for that send. Calling this for a number you already have a thread with simply sends the template into that thread, which also makes it the way to re-engage a contact after the 24-hour customer-service window has closed. Once the recipient replies (opening the 24h window), send freeform messages with the send-message endpoint (POST /v1/inbox/conversations/{conversationId}/messages). Template fields are accepted on the JSON body only, not on multipart requests. Alternatively, WhatsApp Business Accounts eligible for Meta Direct Send can open a conversation with a business-initiated utility text message and no template: pass category: 'utility' together with message (and no templateName). See the category field below. DM eligibility (X/Twitter): Before sending, the endpoint checks if the recipient accepts DMs from your account (via the receives_your_dm field). If not, a 422 error with code DM_NOT_ALLOWED is returned. You can skip this check with skipDmCheck: true if you have already verified eligibility. X API tier requirement: DM write endpoints require X API Pro tier ($5,000/month) or Enterprise access. This applies to BYOK (Bring Your Own Key) users who provide their own X API credentials. Rate limits (X/Twitter only): X's DM API enforces 200 requests per 15 minutes, 1,000 per 24 hours per connected X account, and 15,000 per 24 hours per X developer app (shared across all DM endpoints). These limits do NOT apply to other platforms. WhatsApp sends are governed by Meta's per-number messaging tiers (unique business-initiated conversations per 24 hours) and per-number throughput instead.
103
103
 
104
104
  ### Examples
105
105
 
@@ -770,11 +770,11 @@ end
770
770
 
771
771
  ## send_inbox_message
772
772
 
773
- > <SendInboxMessage200Response> send_inbox_message(conversation_id, send_inbox_message_request)
773
+ > <SendInboxMessage200Response> send_inbox_message(conversation_id, send_inbox_message_request, opts)
774
774
 
775
775
  Send message
776
776
 
777
- Send a message in a conversation. Supports text, attachments, quick replies, buttons, templates, and message tags. Attachment and interactive message support varies by platform. WhatsApp template messages: to send an approved template into this conversation (required when the 24-hour customer-service window is closed), use the `template` field with a single element carrying the template reference: `{ \"elements\": [{ \"name\": ..., \"language\": ..., \"components\": [...] }] }`. See the `template` field below for the exact shape. To send a template to a phone number you have no conversation with yet, use the create-conversation endpoint (POST /v1/inbox/conversations) instead. WhatsApp rich interactive messages (list, CTA URL, Flow, location request) are available via the `interactive` field. Tap events are delivered through the `message.received` webhook with WhatsApp-specific `metadata` fields (`interactiveType`, `interactiveId`, `flowResponseJson`, `flowResponseData`).
777
+ Send a message in a conversation. Supports text, attachments, quick replies, buttons, templates, and message tags. Attachment and interactive message support varies by platform. WhatsApp template messages: to send an approved template into this conversation (required when the 24-hour customer-service window is closed), use the `template` field with a single element carrying the template reference: `{ \"elements\": [{ \"name\": ..., \"language\": ..., \"components\": [...] }] }`. See the `template` field below for the exact shape. To send a template to a phone number you have no conversation with yet, use the create-conversation endpoint (POST /v1/inbox/conversations) instead. WhatsApp rich interactive messages (list, CTA URL, Flow, location request) are available via the `interactive` field. Tap events are delivered through the `message.received` webhook with WhatsApp-specific `metadata` fields (`interactiveType`, `interactiveId`, `flowResponseJson`, `flowResponseData`). **Idempotency:** send an `Idempotency-Key` header to make retries safe (e.g. after a client-side timeout where delivery is unknown): same key + same body replays the original response (with `Idempotent-Replayed: true`) instead of sending the message a second time; same key + different body returns 422; a key still in flight returns 409. Works for JSON and multipart (file upload) requests alike. Keys are retained for 24 hours.
778
778
 
779
779
  ### Examples
780
780
 
@@ -790,10 +790,13 @@ end
790
790
  api_instance = Zernio::MessagesApi.new
791
791
  conversation_id = 'conversation_id_example' # String | The conversation ID (id field from list conversations endpoint). This is the platform-specific conversation identifier, not an internal database ID.
792
792
  send_inbox_message_request = Zernio::SendInboxMessageRequest.new({account_id: 'account_id_example'}) # SendInboxMessageRequest |
793
+ opts = {
794
+ idempotency_key: 'idempotency_key_example' # String | Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
795
+ }
793
796
 
794
797
  begin
795
798
  # Send message
796
- result = api_instance.send_inbox_message(conversation_id, send_inbox_message_request)
799
+ result = api_instance.send_inbox_message(conversation_id, send_inbox_message_request, opts)
797
800
  p result
798
801
  rescue Zernio::ApiError => e
799
802
  puts "Error when calling MessagesApi->send_inbox_message: #{e}"
@@ -804,12 +807,12 @@ end
804
807
 
805
808
  This returns an Array which contains the response data, status code and headers.
806
809
 
807
- > <Array(<SendInboxMessage200Response>, Integer, Hash)> send_inbox_message_with_http_info(conversation_id, send_inbox_message_request)
810
+ > <Array(<SendInboxMessage200Response>, Integer, Hash)> send_inbox_message_with_http_info(conversation_id, send_inbox_message_request, opts)
808
811
 
809
812
  ```ruby
810
813
  begin
811
814
  # Send message
812
- data, status_code, headers = api_instance.send_inbox_message_with_http_info(conversation_id, send_inbox_message_request)
815
+ data, status_code, headers = api_instance.send_inbox_message_with_http_info(conversation_id, send_inbox_message_request, opts)
813
816
  p status_code # => 2xx
814
817
  p headers # => { ... }
815
818
  p data # => <SendInboxMessage200Response>
@@ -824,6 +827,7 @@ end
824
827
  | ---- | ---- | ----------- | ----- |
825
828
  | **conversation_id** | **String** | The conversation ID (id field from list conversations endpoint). This is the platform-specific conversation identifier, not an internal database ID. | |
826
829
  | **send_inbox_message_request** | [**SendInboxMessageRequest**](SendInboxMessageRequest.md) | | |
830
+ | **idempotency_key** | **String** | Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409. | [optional] |
827
831
 
828
832
  ### Return type
829
833
 
data/docs/ProfilesApi.md CHANGED
@@ -33,7 +33,7 @@ end
33
33
  api_instance = Zernio::ProfilesApi.new
34
34
  create_profile_request = Zernio::CreateProfileRequest.new({name: 'name_example'}) # CreateProfileRequest |
35
35
  opts = {
36
- idempotency_key: 'idempotency_key_example' # String | Optional client-generated unique key (e.g. a UUID) that makes create retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
36
+ idempotency_key: 'idempotency_key_example' # String | Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
37
37
  }
38
38
 
39
39
  begin
@@ -68,7 +68,7 @@ end
68
68
  | Name | Type | Description | Notes |
69
69
  | ---- | ---- | ----------- | ----- |
70
70
  | **create_profile_request** | [**CreateProfileRequest**](CreateProfileRequest.md) | | |
71
- | **idempotency_key** | **String** | Optional client-generated unique key (e.g. a UUID) that makes create retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409. | [optional] |
71
+ | **idempotency_key** | **String** | Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409. | [optional] |
72
72
 
73
73
  ### Return type
74
74
 
data/docs/SMSApi.md CHANGED
@@ -1157,7 +1157,7 @@ end
1157
1157
  api_instance = Zernio::SMSApi.new
1158
1158
  send_sms_request = Zernio::SendSmsRequest.new({from: 'from_example', to: 'to_example'}) # SendSmsRequest |
1159
1159
  opts = {
1160
- idempotency_key: 'idempotency_key_example' # String | Optional client-generated unique key (e.g. a UUID) that makes send retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
1160
+ idempotency_key: 'idempotency_key_example' # String | Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
1161
1161
  }
1162
1162
 
1163
1163
  begin
@@ -1192,7 +1192,7 @@ end
1192
1192
  | Name | Type | Description | Notes |
1193
1193
  | ---- | ---- | ----------- | ----- |
1194
1194
  | **send_sms_request** | [**SendSmsRequest**](SendSmsRequest.md) | | |
1195
- | **idempotency_key** | **String** | Optional client-generated unique key (e.g. a UUID) that makes send retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409. | [optional] |
1195
+ | **idempotency_key** | **String** | Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409. | [optional] |
1196
1196
 
1197
1197
  ### Return type
1198
1198
 
@@ -7,6 +7,7 @@
7
7
  | **account_id** | **String** | Social account ID | |
8
8
  | **message** | **String** | Message text | [optional] |
9
9
  | **attachment_url** | **String** | URL of the attachment to send (image, video, audio, or file). The URL must be publicly accessible. For binary file uploads, use multipart/form-data instead. | [optional] |
10
+ | **category** | **String** | WhatsApp only (Meta Direct Send). Sends this message as a business-initiated UTILITY message without an approved template, for example outside the 24-hour customer service window; Meta matches or auto-creates a template asynchronously. The WhatsApp Business Account must be eligible for Direct Send, otherwise the send fails with an error telling you to use an approved message template instead. Supported only for text messages (link preview ok) and interactive messages (reply buttons, CTA URL buttons, voice-call button, header of text/image/video/document). Cannot be combined with template, attachments, location, or contacts. Utility messages only; marketing content is not allowed under this category. Accepted on the JSON body only, not on multipart requests. | [optional] |
10
11
  | **attachment_type** | **String** | Type of attachment. Defaults to file if not specified. | [optional] |
11
12
  | **attachment_name** | **String** | WhatsApp only. Display name for a document sent via attachmentUrl with attachmentType: file (e.g. \&quot;Report.pdf\&quot;). Maps to the recipient&#39;s file name; without it WhatsApp derives the name from the URL and shows \&quot;Untitled\&quot;. Ignored for image/video/audio and for binary uploads (which use the uploaded file&#39;s name). | [optional] |
12
13
  | **voice_note** | **Boolean** | WhatsApp only. When &#x60;true&#x60; on an audio attachment, the message is sent as a voice message (PTT) — the recipient sees the waveform + voice-note UI instead of a basic audio attachment. The audio file MUST be &#x60;.ogg&#x60; encoded with the OPUS codec (mono) per Meta&#39;s voice-message contract; other formats are rejected by WhatsApp. Ignored for non-audio attachments. | [optional] |
@@ -30,6 +31,7 @@ instance = Zernio::SendInboxMessageRequest.new(
30
31
  account_id: null,
31
32
  message: null,
32
33
  attachment_url: null,
34
+ category: null,
33
35
  attachment_type: null,
34
36
  attachment_name: null,
35
37
  voice_note: null,
data/docs/VoiceApi.md CHANGED
@@ -39,7 +39,7 @@ end
39
39
  api_instance = Zernio::VoiceApi.new
40
40
  create_voice_call_request = Zernio::CreateVoiceCallRequest.new({to: 'to_example'}) # CreateVoiceCallRequest |
41
41
  opts = {
42
- idempotency_key: 'idempotency_key_example' # String | Optional client-generated unique key (e.g. a UUID) that makes dial retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
42
+ idempotency_key: 'idempotency_key_example' # String | Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
43
43
  }
44
44
 
45
45
  begin
@@ -74,7 +74,7 @@ end
74
74
  | Name | Type | Description | Notes |
75
75
  | ---- | ---- | ----------- | ----- |
76
76
  | **create_voice_call_request** | [**CreateVoiceCallRequest**](CreateVoiceCallRequest.md) | | |
77
- | **idempotency_key** | **String** | Optional client-generated unique key (e.g. a UUID) that makes dial retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409. | [optional] |
77
+ | **idempotency_key** | **String** | Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409. | [optional] |
78
78
 
79
79
  ### Return type
80
80
 
@@ -756,7 +756,7 @@ end
756
756
  api_instance = Zernio::WhatsAppCallingApi.new
757
757
  initiate_whats_app_call_request = Zernio::InitiateWhatsAppCallRequest.new({account_id: 'account_id_example', to: 'to_example'}) # InitiateWhatsAppCallRequest |
758
758
  opts = {
759
- idempotency_key: 'idempotency_key_example' # String | Optional client-generated unique key (e.g. a UUID) that makes dial retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
759
+ idempotency_key: 'idempotency_key_example' # String | Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
760
760
  }
761
761
 
762
762
  begin
@@ -791,7 +791,7 @@ end
791
791
  | Name | Type | Description | Notes |
792
792
  | ---- | ---- | ----------- | ----- |
793
793
  | **initiate_whats_app_call_request** | [**InitiateWhatsAppCallRequest**](InitiateWhatsAppCallRequest.md) | | |
794
- | **idempotency_key** | **String** | Optional client-generated unique key (e.g. a UUID) that makes dial retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409. | [optional] |
794
+ | **idempotency_key** | **String** | Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409. | [optional] |
795
795
 
796
796
  ### Return type
797
797
 
@@ -234,7 +234,7 @@ module Zernio
234
234
  # Creates a paid ad with custom creative across Meta, Google Ads, Pinterest, TikTok, X/Twitter, LinkedIn, and OpenAI Ads (ChatGPT Ads). Supports three mutually-exclusive request shapes selected by the body, a legacy single-creative shape (all platforms, default), a Meta-only multi-creative shape via the creatives array (one ad set with N ads sharing budget and targeting), and an attach shape via adSetId that adds one new ad to an existing ad set, inheriting its budget, targeting, and schedule (Meta, TikTok, and LinkedIn; on LinkedIn adSetId is the existing Campaign id, and the budget, schedule, targeting and bidding fields must be omitted). Per-platform required fields, budget minimums, and video-ad rules are documented on each property below. LinkedIn creates a Single Image or Single Video Ad backed by a Direct Sponsored Content \"dark post\" authored by a Company Page (see `organizationId`); supported goals are engagement, traffic, awareness, and video_views (video ads use the `video` field; video_views requires a video), and traffic ads require `linkUrl`. **Idempotency:** this endpoint is not idempotent at the platform level (a blind retry creates a second campaign/ad set/ad). Send an `Idempotency-Key` header to make retries safe: the first request with a given key creates the ad and we store the response; a retry with the same key replays that exact response (with `Idempotent-Replayed: true`) instead of creating duplicates. Reusing a key with a different body returns 422; a key whose first request is still in flight returns 409 (retry after a short backoff). Keys are scoped to your credential and expire after 24h.
235
235
  # @param create_standalone_ad_request [CreateStandaloneAdRequest]
236
236
  # @param [Hash] opts the optional parameters
237
- # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes create retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
237
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
238
238
  # @return [CreateStandaloneAd200Response]
239
239
  def create_standalone_ad(create_standalone_ad_request, opts = {})
240
240
  data, _status_code, _headers = create_standalone_ad_with_http_info(create_standalone_ad_request, opts)
@@ -245,7 +245,7 @@ module Zernio
245
245
  # Creates a paid ad with custom creative across Meta, Google Ads, Pinterest, TikTok, X/Twitter, LinkedIn, and OpenAI Ads (ChatGPT Ads). Supports three mutually-exclusive request shapes selected by the body, a legacy single-creative shape (all platforms, default), a Meta-only multi-creative shape via the creatives array (one ad set with N ads sharing budget and targeting), and an attach shape via adSetId that adds one new ad to an existing ad set, inheriting its budget, targeting, and schedule (Meta, TikTok, and LinkedIn; on LinkedIn adSetId is the existing Campaign id, and the budget, schedule, targeting and bidding fields must be omitted). Per-platform required fields, budget minimums, and video-ad rules are documented on each property below. LinkedIn creates a Single Image or Single Video Ad backed by a Direct Sponsored Content \&quot;dark post\&quot; authored by a Company Page (see &#x60;organizationId&#x60;); supported goals are engagement, traffic, awareness, and video_views (video ads use the &#x60;video&#x60; field; video_views requires a video), and traffic ads require &#x60;linkUrl&#x60;. **Idempotency:** this endpoint is not idempotent at the platform level (a blind retry creates a second campaign/ad set/ad). Send an &#x60;Idempotency-Key&#x60; header to make retries safe: the first request with a given key creates the ad and we store the response; a retry with the same key replays that exact response (with &#x60;Idempotent-Replayed: true&#x60;) instead of creating duplicates. Reusing a key with a different body returns 422; a key whose first request is still in flight returns 409 (retry after a short backoff). Keys are scoped to your credential and expire after 24h.
246
246
  # @param create_standalone_ad_request [CreateStandaloneAdRequest]
247
247
  # @param [Hash] opts the optional parameters
248
- # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes create retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
248
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
249
249
  # @return [Array<(CreateStandaloneAd200Response, Integer, Hash)>] CreateStandaloneAd200Response data, response status code and response headers
250
250
  def create_standalone_ad_with_http_info(create_standalone_ad_request, opts = {})
251
251
  if @api_client.config.debugging
@@ -100,7 +100,7 @@ module Zernio
100
100
  end
101
101
 
102
102
  # Create conversation
103
- # Initiate a new direct message conversation with a specified user. If a conversation already exists with the recipient, the message is added to the existing thread. Supported platforms: X/Twitter, Bluesky, Reddit, and WhatsApp. Other platforms return PLATFORM_NOT_SUPPORTED. WhatsApp: this is the endpoint for sending an approved template message to a phone number. Provide templateName, templateLanguage, and templateParams (variable values for the text header, body and dynamic URL buttons, in that order), with the recipient phone in participantId. A template is required because WhatsApp does not permit freeform messages to open a conversation; a missing template returns TEMPLATE_REQUIRED. Templates with media headers (image, video, document) are handled automatically: Zernio reads the approved template definition and fills the header at send time with the template's approved sample asset. To send a DIFFERENT asset per message (e.g. a distinct invoice PDF for each recipient), pass the headerMedia field with a public link (or a Meta media id); it overrides the sample for that send. Calling this for a number you already have a thread with simply sends the template into that thread, which also makes it the way to re-engage a contact after the 24-hour customer-service window has closed. Once the recipient replies (opening the 24h window), send freeform messages with the send-message endpoint (POST /v1/inbox/conversations/{conversationId}/messages). Template fields are accepted on the JSON body only, not on multipart requests. DM eligibility (X/Twitter): Before sending, the endpoint checks if the recipient accepts DMs from your account (via the receives_your_dm field). If not, a 422 error with code DM_NOT_ALLOWED is returned. You can skip this check with skipDmCheck: true if you have already verified eligibility. X API tier requirement: DM write endpoints require X API Pro tier ($5,000/month) or Enterprise access. This applies to BYOK (Bring Your Own Key) users who provide their own X API credentials. Rate limits (X/Twitter only): X's DM API enforces 200 requests per 15 minutes, 1,000 per 24 hours per connected X account, and 15,000 per 24 hours per X developer app (shared across all DM endpoints). These limits do NOT apply to other platforms. WhatsApp sends are governed by Meta's per-number messaging tiers (unique business-initiated conversations per 24 hours) and per-number throughput instead.
103
+ # Initiate a new direct message conversation with a specified user. If a conversation already exists with the recipient, the message is added to the existing thread. Supported platforms: X/Twitter, Bluesky, Reddit, and WhatsApp. Other platforms return PLATFORM_NOT_SUPPORTED. WhatsApp: this is the endpoint for sending an approved template message to a phone number. Provide templateName, templateLanguage, and templateParams (variable values for the text header, body and dynamic URL buttons, in that order), with the recipient phone in participantId. A template is required because WhatsApp does not permit freeform messages to open a conversation; a missing template returns TEMPLATE_REQUIRED. Templates with media headers (image, video, document) are handled automatically: Zernio reads the approved template definition and fills the header at send time with the template's approved sample asset. To send a DIFFERENT asset per message (e.g. a distinct invoice PDF for each recipient), pass the headerMedia field with a public link (or a Meta media id); it overrides the sample for that send. Calling this for a number you already have a thread with simply sends the template into that thread, which also makes it the way to re-engage a contact after the 24-hour customer-service window has closed. Once the recipient replies (opening the 24h window), send freeform messages with the send-message endpoint (POST /v1/inbox/conversations/{conversationId}/messages). Template fields are accepted on the JSON body only, not on multipart requests. Alternatively, WhatsApp Business Accounts eligible for Meta Direct Send can open a conversation with a business-initiated utility text message and no template: pass category: 'utility' together with message (and no templateName). See the category field below. DM eligibility (X/Twitter): Before sending, the endpoint checks if the recipient accepts DMs from your account (via the receives_your_dm field). If not, a 422 error with code DM_NOT_ALLOWED is returned. You can skip this check with skipDmCheck: true if you have already verified eligibility. X API tier requirement: DM write endpoints require X API Pro tier ($5,000/month) or Enterprise access. This applies to BYOK (Bring Your Own Key) users who provide their own X API credentials. Rate limits (X/Twitter only): X's DM API enforces 200 requests per 15 minutes, 1,000 per 24 hours per connected X account, and 15,000 per 24 hours per X developer app (shared across all DM endpoints). These limits do NOT apply to other platforms. WhatsApp sends are governed by Meta's per-number messaging tiers (unique business-initiated conversations per 24 hours) and per-number throughput instead.
104
104
  # @param create_inbox_conversation_request [CreateInboxConversationRequest]
105
105
  # @param [Hash] opts the optional parameters
106
106
  # @return [CreateInboxConversation201Response]
@@ -110,7 +110,7 @@ module Zernio
110
110
  end
111
111
 
112
112
  # Create conversation
113
- # Initiate a new direct message conversation with a specified user. If a conversation already exists with the recipient, the message is added to the existing thread. Supported platforms: X/Twitter, Bluesky, Reddit, and WhatsApp. Other platforms return PLATFORM_NOT_SUPPORTED. WhatsApp: this is the endpoint for sending an approved template message to a phone number. Provide templateName, templateLanguage, and templateParams (variable values for the text header, body and dynamic URL buttons, in that order), with the recipient phone in participantId. A template is required because WhatsApp does not permit freeform messages to open a conversation; a missing template returns TEMPLATE_REQUIRED. Templates with media headers (image, video, document) are handled automatically: Zernio reads the approved template definition and fills the header at send time with the template&#39;s approved sample asset. To send a DIFFERENT asset per message (e.g. a distinct invoice PDF for each recipient), pass the headerMedia field with a public link (or a Meta media id); it overrides the sample for that send. Calling this for a number you already have a thread with simply sends the template into that thread, which also makes it the way to re-engage a contact after the 24-hour customer-service window has closed. Once the recipient replies (opening the 24h window), send freeform messages with the send-message endpoint (POST /v1/inbox/conversations/{conversationId}/messages). Template fields are accepted on the JSON body only, not on multipart requests. DM eligibility (X/Twitter): Before sending, the endpoint checks if the recipient accepts DMs from your account (via the receives_your_dm field). If not, a 422 error with code DM_NOT_ALLOWED is returned. You can skip this check with skipDmCheck: true if you have already verified eligibility. X API tier requirement: DM write endpoints require X API Pro tier ($5,000/month) or Enterprise access. This applies to BYOK (Bring Your Own Key) users who provide their own X API credentials. Rate limits (X/Twitter only): X&#39;s DM API enforces 200 requests per 15 minutes, 1,000 per 24 hours per connected X account, and 15,000 per 24 hours per X developer app (shared across all DM endpoints). These limits do NOT apply to other platforms. WhatsApp sends are governed by Meta&#39;s per-number messaging tiers (unique business-initiated conversations per 24 hours) and per-number throughput instead.
113
+ # Initiate a new direct message conversation with a specified user. If a conversation already exists with the recipient, the message is added to the existing thread. Supported platforms: X/Twitter, Bluesky, Reddit, and WhatsApp. Other platforms return PLATFORM_NOT_SUPPORTED. WhatsApp: this is the endpoint for sending an approved template message to a phone number. Provide templateName, templateLanguage, and templateParams (variable values for the text header, body and dynamic URL buttons, in that order), with the recipient phone in participantId. A template is required because WhatsApp does not permit freeform messages to open a conversation; a missing template returns TEMPLATE_REQUIRED. Templates with media headers (image, video, document) are handled automatically: Zernio reads the approved template definition and fills the header at send time with the template&#39;s approved sample asset. To send a DIFFERENT asset per message (e.g. a distinct invoice PDF for each recipient), pass the headerMedia field with a public link (or a Meta media id); it overrides the sample for that send. Calling this for a number you already have a thread with simply sends the template into that thread, which also makes it the way to re-engage a contact after the 24-hour customer-service window has closed. Once the recipient replies (opening the 24h window), send freeform messages with the send-message endpoint (POST /v1/inbox/conversations/{conversationId}/messages). Template fields are accepted on the JSON body only, not on multipart requests. Alternatively, WhatsApp Business Accounts eligible for Meta Direct Send can open a conversation with a business-initiated utility text message and no template: pass category: &#39;utility&#39; together with message (and no templateName). See the category field below. DM eligibility (X/Twitter): Before sending, the endpoint checks if the recipient accepts DMs from your account (via the receives_your_dm field). If not, a 422 error with code DM_NOT_ALLOWED is returned. You can skip this check with skipDmCheck: true if you have already verified eligibility. X API tier requirement: DM write endpoints require X API Pro tier ($5,000/month) or Enterprise access. This applies to BYOK (Bring Your Own Key) users who provide their own X API credentials. Rate limits (X/Twitter only): X&#39;s DM API enforces 200 requests per 15 minutes, 1,000 per 24 hours per connected X account, and 15,000 per 24 hours per X developer app (shared across all DM endpoints). These limits do NOT apply to other platforms. WhatsApp sends are governed by Meta&#39;s per-number messaging tiers (unique business-initiated conversations per 24 hours) and per-number throughput instead.
114
114
  # @param create_inbox_conversation_request [CreateInboxConversationRequest]
115
115
  # @param [Hash] opts the optional parameters
116
116
  # @return [Array<(CreateInboxConversation201Response, Integer, Hash)>] CreateInboxConversation201Response data, response status code and response headers
@@ -839,10 +839,11 @@ module Zernio
839
839
  end
840
840
 
841
841
  # Send message
842
- # Send a message in a conversation. Supports text, attachments, quick replies, buttons, templates, and message tags. Attachment and interactive message support varies by platform. WhatsApp template messages: to send an approved template into this conversation (required when the 24-hour customer-service window is closed), use the `template` field with a single element carrying the template reference: `{ \"elements\": [{ \"name\": ..., \"language\": ..., \"components\": [...] }] }`. See the `template` field below for the exact shape. To send a template to a phone number you have no conversation with yet, use the create-conversation endpoint (POST /v1/inbox/conversations) instead. WhatsApp rich interactive messages (list, CTA URL, Flow, location request) are available via the `interactive` field. Tap events are delivered through the `message.received` webhook with WhatsApp-specific `metadata` fields (`interactiveType`, `interactiveId`, `flowResponseJson`, `flowResponseData`).
842
+ # Send a message in a conversation. Supports text, attachments, quick replies, buttons, templates, and message tags. Attachment and interactive message support varies by platform. WhatsApp template messages: to send an approved template into this conversation (required when the 24-hour customer-service window is closed), use the `template` field with a single element carrying the template reference: `{ \"elements\": [{ \"name\": ..., \"language\": ..., \"components\": [...] }] }`. See the `template` field below for the exact shape. To send a template to a phone number you have no conversation with yet, use the create-conversation endpoint (POST /v1/inbox/conversations) instead. WhatsApp rich interactive messages (list, CTA URL, Flow, location request) are available via the `interactive` field. Tap events are delivered through the `message.received` webhook with WhatsApp-specific `metadata` fields (`interactiveType`, `interactiveId`, `flowResponseJson`, `flowResponseData`). **Idempotency:** send an `Idempotency-Key` header to make retries safe (e.g. after a client-side timeout where delivery is unknown): same key + same body replays the original response (with `Idempotent-Replayed: true`) instead of sending the message a second time; same key + different body returns 422; a key still in flight returns 409. Works for JSON and multipart (file upload) requests alike. Keys are retained for 24 hours.
843
843
  # @param conversation_id [String] The conversation ID (id field from list conversations endpoint). This is the platform-specific conversation identifier, not an internal database ID.
844
844
  # @param send_inbox_message_request [SendInboxMessageRequest]
845
845
  # @param [Hash] opts the optional parameters
846
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
846
847
  # @return [SendInboxMessage200Response]
847
848
  def send_inbox_message(conversation_id, send_inbox_message_request, opts = {})
848
849
  data, _status_code, _headers = send_inbox_message_with_http_info(conversation_id, send_inbox_message_request, opts)
@@ -850,10 +851,11 @@ module Zernio
850
851
  end
851
852
 
852
853
  # Send message
853
- # Send a message in a conversation. Supports text, attachments, quick replies, buttons, templates, and message tags. Attachment and interactive message support varies by platform. WhatsApp template messages: to send an approved template into this conversation (required when the 24-hour customer-service window is closed), use the &#x60;template&#x60; field with a single element carrying the template reference: &#x60;{ \&quot;elements\&quot;: [{ \&quot;name\&quot;: ..., \&quot;language\&quot;: ..., \&quot;components\&quot;: [...] }] }&#x60;. See the &#x60;template&#x60; field below for the exact shape. To send a template to a phone number you have no conversation with yet, use the create-conversation endpoint (POST /v1/inbox/conversations) instead. WhatsApp rich interactive messages (list, CTA URL, Flow, location request) are available via the &#x60;interactive&#x60; field. Tap events are delivered through the &#x60;message.received&#x60; webhook with WhatsApp-specific &#x60;metadata&#x60; fields (&#x60;interactiveType&#x60;, &#x60;interactiveId&#x60;, &#x60;flowResponseJson&#x60;, &#x60;flowResponseData&#x60;).
854
+ # Send a message in a conversation. Supports text, attachments, quick replies, buttons, templates, and message tags. Attachment and interactive message support varies by platform. WhatsApp template messages: to send an approved template into this conversation (required when the 24-hour customer-service window is closed), use the &#x60;template&#x60; field with a single element carrying the template reference: &#x60;{ \&quot;elements\&quot;: [{ \&quot;name\&quot;: ..., \&quot;language\&quot;: ..., \&quot;components\&quot;: [...] }] }&#x60;. See the &#x60;template&#x60; field below for the exact shape. To send a template to a phone number you have no conversation with yet, use the create-conversation endpoint (POST /v1/inbox/conversations) instead. WhatsApp rich interactive messages (list, CTA URL, Flow, location request) are available via the &#x60;interactive&#x60; field. Tap events are delivered through the &#x60;message.received&#x60; webhook with WhatsApp-specific &#x60;metadata&#x60; fields (&#x60;interactiveType&#x60;, &#x60;interactiveId&#x60;, &#x60;flowResponseJson&#x60;, &#x60;flowResponseData&#x60;). **Idempotency:** send an &#x60;Idempotency-Key&#x60; header to make retries safe (e.g. after a client-side timeout where delivery is unknown): same key + same body replays the original response (with &#x60;Idempotent-Replayed: true&#x60;) instead of sending the message a second time; same key + different body returns 422; a key still in flight returns 409. Works for JSON and multipart (file upload) requests alike. Keys are retained for 24 hours.
854
855
  # @param conversation_id [String] The conversation ID (id field from list conversations endpoint). This is the platform-specific conversation identifier, not an internal database ID.
855
856
  # @param send_inbox_message_request [SendInboxMessageRequest]
856
857
  # @param [Hash] opts the optional parameters
858
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
857
859
  # @return [Array<(SendInboxMessage200Response, Integer, Hash)>] SendInboxMessage200Response data, response status code and response headers
858
860
  def send_inbox_message_with_http_info(conversation_id, send_inbox_message_request, opts = {})
859
861
  if @api_client.config.debugging
@@ -867,6 +869,10 @@ module Zernio
867
869
  if @api_client.config.client_side_validation && send_inbox_message_request.nil?
868
870
  fail ArgumentError, "Missing the required parameter 'send_inbox_message_request' when calling MessagesApi.send_inbox_message"
869
871
  end
872
+ if @api_client.config.client_side_validation && !opts[:'idempotency_key'].nil? && opts[:'idempotency_key'].to_s.length > 255
873
+ fail ArgumentError, 'invalid value for "opts[:"idempotency_key"]" when calling MessagesApi.send_inbox_message, the character length must be smaller than or equal to 255.'
874
+ end
875
+
870
876
  # resource path
871
877
  local_var_path = '/v1/inbox/conversations/{conversationId}/messages'.sub('{' + 'conversationId' + '}', CGI.escape(conversation_id.to_s))
872
878
 
@@ -882,6 +888,7 @@ module Zernio
882
888
  if !content_type.nil?
883
889
  header_params['Content-Type'] = content_type
884
890
  end
891
+ header_params[:'Idempotency-Key'] = opts[:'idempotency_key'] if !opts[:'idempotency_key'].nil?
885
892
 
886
893
  # form parameters
887
894
  form_params = opts[:form_params] || {}
@@ -23,7 +23,7 @@ module Zernio
23
23
  # Creates a new profile with a name, optional description, and color. Names are unique per workspace: a duplicate returns a 409 whose details.existingProfileId carries the id of the existing profile. Send an Idempotency-Key header to make retries safe: a retried create with the same key and body replays the original 201 (same _id) instead of conflicting.
24
24
  # @param create_profile_request [CreateProfileRequest]
25
25
  # @param [Hash] opts the optional parameters
26
- # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes create retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
26
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
27
27
  # @return [ProfileCreateResponse]
28
28
  def create_profile(create_profile_request, opts = {})
29
29
  data, _status_code, _headers = create_profile_with_http_info(create_profile_request, opts)
@@ -34,7 +34,7 @@ module Zernio
34
34
  # Creates a new profile with a name, optional description, and color. Names are unique per workspace: a duplicate returns a 409 whose details.existingProfileId carries the id of the existing profile. Send an Idempotency-Key header to make retries safe: a retried create with the same key and body replays the original 201 (same _id) instead of conflicting.
35
35
  # @param create_profile_request [CreateProfileRequest]
36
36
  # @param [Hash] opts the optional parameters
37
- # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes create retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
37
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
38
38
  # @return [Array<(ProfileCreateResponse, Integer, Hash)>] ProfileCreateResponse data, response status code and response headers
39
39
  def create_profile_with_http_info(create_profile_request, opts = {})
40
40
  if @api_client.config.debugging
@@ -1072,7 +1072,7 @@ module Zernio
1072
1072
  # Sends an SMS (or MMS when `mediaUrls` is set) from one of your SMS-enabled numbers. At least one of `text` / `mediaUrls` is required. Both numbers are normalized to E.164, so `from` matches regardless of formatting and replies thread into the same inbox conversation. US numbers must have an approved carrier registration (`/v1/sms/registrations`) before messages deliver. **Idempotency:** send an `Idempotency-Key` header to make retries safe: same key + same body replays the original response instead of sending a second message; same key + different body returns 422; a key still in flight returns 409.
1073
1073
  # @param send_sms_request [SendSmsRequest]
1074
1074
  # @param [Hash] opts the optional parameters
1075
- # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes send retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
1075
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
1076
1076
  # @return [SendSms200Response]
1077
1077
  def send_sms(send_sms_request, opts = {})
1078
1078
  data, _status_code, _headers = send_sms_with_http_info(send_sms_request, opts)
@@ -1083,7 +1083,7 @@ module Zernio
1083
1083
  # Sends an SMS (or MMS when &#x60;mediaUrls&#x60; is set) from one of your SMS-enabled numbers. At least one of &#x60;text&#x60; / &#x60;mediaUrls&#x60; is required. Both numbers are normalized to E.164, so &#x60;from&#x60; matches regardless of formatting and replies thread into the same inbox conversation. US numbers must have an approved carrier registration (&#x60;/v1/sms/registrations&#x60;) before messages deliver. **Idempotency:** send an &#x60;Idempotency-Key&#x60; header to make retries safe: same key + same body replays the original response instead of sending a second message; same key + different body returns 422; a key still in flight returns 409.
1084
1084
  # @param send_sms_request [SendSmsRequest]
1085
1085
  # @param [Hash] opts the optional parameters
1086
- # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes send retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
1086
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
1087
1087
  # @return [Array<(SendSms200Response, Integer, Hash)>] SendSms200Response data, response status code and response headers
1088
1088
  def send_sms_with_http_info(send_sms_request, opts = {})
1089
1089
  if @api_client.config.debugging
@@ -23,7 +23,7 @@ module Zernio
23
23
  # Dials `to` FROM one of your voice-enabled numbers and, on answer, bridges the callee to the number's stored forward destination, or to the per-call `forwardTo` override. Destinations can be your own AI voice agent (Vapi/Retell), a phone, or a SIP endpoint. An optional `greeting` is spoken to the callee before the bridge. The 200 response means the call is dialing; the lifecycle continues asynchronously (track it via `GET /v1/voice/calls/{id}` or the `call.*` webhooks). Outbound calls are capped per rolling hour (429 when hit). **Idempotency:** send an `Idempotency-Key` header to make retries safe; same key + same body replays the original response instead of dialing (and billing) a second call.
24
24
  # @param create_voice_call_request [CreateVoiceCallRequest]
25
25
  # @param [Hash] opts the optional parameters
26
- # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes dial retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
26
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
27
27
  # @return [CreateVoiceCall200Response]
28
28
  def create_voice_call(create_voice_call_request, opts = {})
29
29
  data, _status_code, _headers = create_voice_call_with_http_info(create_voice_call_request, opts)
@@ -34,7 +34,7 @@ module Zernio
34
34
  # Dials &#x60;to&#x60; FROM one of your voice-enabled numbers and, on answer, bridges the callee to the number&#39;s stored forward destination, or to the per-call &#x60;forwardTo&#x60; override. Destinations can be your own AI voice agent (Vapi/Retell), a phone, or a SIP endpoint. An optional &#x60;greeting&#x60; is spoken to the callee before the bridge. The 200 response means the call is dialing; the lifecycle continues asynchronously (track it via &#x60;GET /v1/voice/calls/{id}&#x60; or the &#x60;call.*&#x60; webhooks). Outbound calls are capped per rolling hour (429 when hit). **Idempotency:** send an &#x60;Idempotency-Key&#x60; header to make retries safe; same key + same body replays the original response instead of dialing (and billing) a second call.
35
35
  # @param create_voice_call_request [CreateVoiceCallRequest]
36
36
  # @param [Hash] opts the optional parameters
37
- # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes dial retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
37
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
38
38
  # @return [Array<(CreateVoiceCall200Response, Integer, Hash)>] CreateVoiceCall200Response data, response status code and response headers
39
39
  def create_voice_call_with_http_info(create_voice_call_request, opts = {})
40
40
  if @api_client.config.debugging
@@ -739,7 +739,7 @@ module Zernio
739
739
  # Initiates an outbound Business-Initiated Call. The Telnyx-side SIP leg is originated server-side (Option B: SIP-first). Telnyx INVITEs Meta directly over TLS:5061 with the SIP digest credentials we captured at calling-enablement time). No client-side SDP is required; pass only `accountId` and `to`. To send the consumer the call-consent prompt instead of placing a call, pass `action: \"send_call_permission_request\"` (+ optional `bodyText`). The consumer must tap Allow in WhatsApp before `start_call` is permitted; Meta limits the prompt to 1 per consumer per 24h (2 per 7 days) and requires an open 24h service window. **Idempotency:** send an `Idempotency-Key` header to make retries safe; same key + same body replays the original response instead of dialing (and billing) a second call.
740
740
  # @param initiate_whats_app_call_request [InitiateWhatsAppCallRequest]
741
741
  # @param [Hash] opts the optional parameters
742
- # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes dial retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
742
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
743
743
  # @return [InitiateWhatsAppCall200Response]
744
744
  def initiate_whats_app_call(initiate_whats_app_call_request, opts = {})
745
745
  data, _status_code, _headers = initiate_whats_app_call_with_http_info(initiate_whats_app_call_request, opts)
@@ -750,7 +750,7 @@ module Zernio
750
750
  # Initiates an outbound Business-Initiated Call. The Telnyx-side SIP leg is originated server-side (Option B: SIP-first). Telnyx INVITEs Meta directly over TLS:5061 with the SIP digest credentials we captured at calling-enablement time). No client-side SDP is required; pass only &#x60;accountId&#x60; and &#x60;to&#x60;. To send the consumer the call-consent prompt instead of placing a call, pass &#x60;action: \&quot;send_call_permission_request\&quot;&#x60; (+ optional &#x60;bodyText&#x60;). The consumer must tap Allow in WhatsApp before &#x60;start_call&#x60; is permitted; Meta limits the prompt to 1 per consumer per 24h (2 per 7 days) and requires an open 24h service window. **Idempotency:** send an &#x60;Idempotency-Key&#x60; header to make retries safe; same key + same body replays the original response instead of dialing (and billing) a second call.
751
751
  # @param initiate_whats_app_call_request [InitiateWhatsAppCallRequest]
752
752
  # @param [Hash] opts the optional parameters
753
- # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes dial retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
753
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
754
754
  # @return [Array<(InitiateWhatsAppCall200Response, Integer, Hash)>] InitiateWhatsAppCall200Response data, response status code and response headers
755
755
  def initiate_whats_app_call_with_http_info(initiate_whats_app_call_request, opts = {})
756
756
  if @api_client.config.debugging
@@ -24,15 +24,18 @@ module Zernio
24
24
  # Recipient handle/username — an X or Bluesky handle (with or without @) or a Reddit username (with or without u/). Resolved via lookup. Provide either this or participantId.
25
25
  attr_accessor :participant_username
26
26
 
27
- # Text content of the message. At least one of message, attachment, or (for WhatsApp) templateName is required.
27
+ # Text content of the message. At least one of message, attachment, or (for WhatsApp) templateName is required. Required when category is set (a Direct Send utility message is a text message).
28
28
  attr_accessor :message
29
29
 
30
30
  # X/Twitter only. Skip the receives_your_dm eligibility check before sending. Use if you have already verified the recipient accepts DMs.
31
31
  attr_accessor :skip_dm_check
32
32
 
33
- # WhatsApp only. Name of the approved template to start the conversation with (required for WhatsApp).
33
+ # WhatsApp only. Name of the approved template to start the conversation with. Required for WhatsApp unless category is used instead (Direct Send). Cannot be combined with category.
34
34
  attr_accessor :template_name
35
35
 
36
+ # WhatsApp only (Meta Direct Send). Combined with message and without templateName, starts the conversation with a business-initiated UTILITY message and no pre-approved template; Meta matches or auto-creates a template asynchronously. The WhatsApp Business Account must be eligible for Direct Send, otherwise the send fails with an error telling you to use an approved message template instead. Cannot be combined with templateName (templates are already categorized at creation). Utility messages only; marketing content is not allowed under this category. Accepted on the JSON body only, not on multipart requests.
37
+ attr_accessor :category
38
+
36
39
  # WhatsApp only. Template language code (e.g. en_US).
37
40
  attr_accessor :template_language
38
41
 
@@ -41,6 +44,28 @@ module Zernio
41
44
 
42
45
  attr_accessor :header_media
43
46
 
47
+ class EnumAttributeValidator
48
+ attr_reader :datatype
49
+ attr_reader :allowable_values
50
+
51
+ def initialize(datatype, allowable_values)
52
+ @allowable_values = allowable_values.map do |value|
53
+ case datatype.to_s
54
+ when /Integer/i
55
+ value.to_i
56
+ when /Float/i
57
+ value.to_f
58
+ else
59
+ value
60
+ end
61
+ end
62
+ end
63
+
64
+ def valid?(value)
65
+ !value || allowable_values.include?(value)
66
+ end
67
+ end
68
+
44
69
  # Attribute mapping from ruby-style variable name to JSON key.
45
70
  def self.attribute_map
46
71
  {
@@ -50,6 +75,7 @@ module Zernio
50
75
  :'message' => :'message',
51
76
  :'skip_dm_check' => :'skipDmCheck',
52
77
  :'template_name' => :'templateName',
78
+ :'category' => :'category',
53
79
  :'template_language' => :'templateLanguage',
54
80
  :'template_params' => :'templateParams',
55
81
  :'header_media' => :'headerMedia'
@@ -75,6 +101,7 @@ module Zernio
75
101
  :'message' => :'String',
76
102
  :'skip_dm_check' => :'Boolean',
77
103
  :'template_name' => :'String',
104
+ :'category' => :'String',
78
105
  :'template_language' => :'String',
79
106
  :'template_params' => :'Array<String>',
80
107
  :'header_media' => :'CreateInboxConversationRequestHeaderMedia'
@@ -131,6 +158,10 @@ module Zernio
131
158
  self.template_name = attributes[:'template_name']
132
159
  end
133
160
 
161
+ if attributes.key?(:'category')
162
+ self.category = attributes[:'category']
163
+ end
164
+
134
165
  if attributes.key?(:'template_language')
135
166
  self.template_language = attributes[:'template_language']
136
167
  end
@@ -163,6 +194,8 @@ module Zernio
163
194
  def valid?
164
195
  warn '[DEPRECATED] the `valid?` method is obsolete'
165
196
  return false if @account_id.nil?
197
+ category_validator = EnumAttributeValidator.new('String', ["utility"])
198
+ return false unless category_validator.valid?(@category)
166
199
  true
167
200
  end
168
201
 
@@ -176,6 +209,16 @@ module Zernio
176
209
  @account_id = account_id
177
210
  end
178
211
 
212
+ # Custom attribute writer method checking allowed values (enum).
213
+ # @param [Object] category Object to be assigned
214
+ def category=(category)
215
+ validator = EnumAttributeValidator.new('String', ["utility"])
216
+ unless validator.valid?(category)
217
+ fail ArgumentError, "invalid value for \"category\", must be one of #{validator.allowable_values}."
218
+ end
219
+ @category = category
220
+ end
221
+
179
222
  # Checks equality by comparing each attribute.
180
223
  # @param [Object] Object to be compared
181
224
  def ==(o)
@@ -187,6 +230,7 @@ module Zernio
187
230
  message == o.message &&
188
231
  skip_dm_check == o.skip_dm_check &&
189
232
  template_name == o.template_name &&
233
+ category == o.category &&
190
234
  template_language == o.template_language &&
191
235
  template_params == o.template_params &&
192
236
  header_media == o.header_media
@@ -201,7 +245,7 @@ module Zernio
201
245
  # Calculates hash code according to all attributes.
202
246
  # @return [Integer] Hash code
203
247
  def hash
204
- [account_id, participant_id, participant_username, message, skip_dm_check, template_name, template_language, template_params, header_media].hash
248
+ [account_id, participant_id, participant_username, message, skip_dm_check, template_name, category, template_language, template_params, header_media].hash
205
249
  end
206
250
 
207
251
  # Builds the object from hash
@@ -22,7 +22,7 @@ module Zernio
22
22
  # Manual bid in WHOLE account-currency units (e.g. 2.5 = $2.50). Requires `costType`. Omit for LinkedIn's automated (max delivery) bidding. LinkedIn enforces its own per-audience min/max bid bounds.
23
23
  attr_accessor :unit_cost
24
24
 
25
- # Campaign `optimizationTargetType` (e.g. `MAX_CLICK`, `TARGET_COST_PER_CLICK`, `MAX_IMPRESSION`). Forwarded verbatim LinkedIn validates compatibility with the objective and `costType`. Omit for the objective-derived default.
25
+ # Campaign `optimizationTargetType` (e.g. `MAX_CLICK`, `TARGET_COST_PER_CLICK`, `MAX_IMPRESSION`). Forwarded verbatim, LinkedIn validates compatibility with the objective and `costType`. Omit for the objective-derived default: `awareness` gets `MAX_IMPRESSION`, `video_views` gets `MAX_VIDEO_VIEW`, and every other goal gets `MAX_CLICK`. `lead_generation` and `conversions` also get `MAX_CLICK`, because `MAX_LEAD` and `MAX_CONVERSION` need a lead gen form or a conversion rule that neither creation flow attaches. The default applies only to `SPONSORED_UPDATES` campaigns (every boost, and the image, video and carousel standalone ads), never to the `TEXT_AD`, `DYNAMIC` and `SPONSORED_INMAILS` campaigns the other creative formats produce. It is also skipped when `unitCost` or a non-`CPM` `costType` is set, since those select manual bidding and the bid is then yours to choose.
26
26
  attr_accessor :optimization_target_type
27
27
 
28
28
  # How LinkedIn rotates creatives within the campaign. Defaults to `OPTIMIZED`.
@@ -24,6 +24,9 @@ module Zernio
24
24
  # URL of the attachment to send (image, video, audio, or file). The URL must be publicly accessible. For binary file uploads, use multipart/form-data instead.
25
25
  attr_accessor :attachment_url
26
26
 
27
+ # WhatsApp only (Meta Direct Send). Sends this message as a business-initiated UTILITY message without an approved template, for example outside the 24-hour customer service window; Meta matches or auto-creates a template asynchronously. The WhatsApp Business Account must be eligible for Direct Send, otherwise the send fails with an error telling you to use an approved message template instead. Supported only for text messages (link preview ok) and interactive messages (reply buttons, CTA URL buttons, voice-call button, header of text/image/video/document). Cannot be combined with template, attachments, location, or contacts. Utility messages only; marketing content is not allowed under this category. Accepted on the JSON body only, not on multipart requests.
28
+ attr_accessor :category
29
+
27
30
  # Type of attachment. Defaults to file if not specified.
28
31
  attr_accessor :attachment_type
29
32
 
@@ -87,6 +90,7 @@ module Zernio
87
90
  :'account_id' => :'accountId',
88
91
  :'message' => :'message',
89
92
  :'attachment_url' => :'attachmentUrl',
93
+ :'category' => :'category',
90
94
  :'attachment_type' => :'attachmentType',
91
95
  :'attachment_name' => :'attachmentName',
92
96
  :'voice_note' => :'voiceNote',
@@ -119,6 +123,7 @@ module Zernio
119
123
  :'account_id' => :'String',
120
124
  :'message' => :'String',
121
125
  :'attachment_url' => :'String',
126
+ :'category' => :'String',
122
127
  :'attachment_type' => :'String',
123
128
  :'attachment_name' => :'String',
124
129
  :'voice_note' => :'Boolean',
@@ -171,6 +176,10 @@ module Zernio
171
176
  self.attachment_url = attributes[:'attachment_url']
172
177
  end
173
178
 
179
+ if attributes.key?(:'category')
180
+ self.category = attributes[:'category']
181
+ end
182
+
174
183
  if attributes.key?(:'attachment_type')
175
184
  self.attachment_type = attributes[:'attachment_type']
176
185
  end
@@ -255,6 +264,8 @@ module Zernio
255
264
  def valid?
256
265
  warn '[DEPRECATED] the `valid?` method is obsolete'
257
266
  return false if @account_id.nil?
267
+ category_validator = EnumAttributeValidator.new('String', ["utility"])
268
+ return false unless category_validator.valid?(@category)
258
269
  attachment_type_validator = EnumAttributeValidator.new('String', ["image", "video", "audio", "file"])
259
270
  return false unless attachment_type_validator.valid?(@attachment_type)
260
271
  return false if !@quick_replies.nil? && @quick_replies.length > 13
@@ -276,6 +287,16 @@ module Zernio
276
287
  @account_id = account_id
277
288
  end
278
289
 
290
+ # Custom attribute writer method checking allowed values (enum).
291
+ # @param [Object] category Object to be assigned
292
+ def category=(category)
293
+ validator = EnumAttributeValidator.new('String', ["utility"])
294
+ unless validator.valid?(category)
295
+ fail ArgumentError, "invalid value for \"category\", must be one of #{validator.allowable_values}."
296
+ end
297
+ @category = category
298
+ end
299
+
279
300
  # Custom attribute writer method checking allowed values (enum).
280
301
  # @param [Object] attachment_type Object to be assigned
281
302
  def attachment_type=(attachment_type)
@@ -342,6 +363,7 @@ module Zernio
342
363
  account_id == o.account_id &&
343
364
  message == o.message &&
344
365
  attachment_url == o.attachment_url &&
366
+ category == o.category &&
345
367
  attachment_type == o.attachment_type &&
346
368
  attachment_name == o.attachment_name &&
347
369
  voice_note == o.voice_note &&
@@ -366,7 +388,7 @@ module Zernio
366
388
  # Calculates hash code according to all attributes.
367
389
  # @return [Integer] Hash code
368
390
  def hash
369
- [account_id, message, attachment_url, attachment_type, attachment_name, voice_note, quick_replies, buttons, template, interactive, reply_markup, messaging_type, message_tag, reply_to, location, contacts].hash
391
+ [account_id, message, attachment_url, category, attachment_type, attachment_name, voice_note, quick_replies, buttons, template, interactive, reply_markup, messaging_type, message_tag, reply_to, location, contacts].hash
370
392
  end
371
393
 
372
394
  # Builds the object from hash
@@ -11,5 +11,5 @@ Generator version: 7.19.0
11
11
  =end
12
12
 
13
13
  module Zernio
14
- VERSION = '0.0.639'
14
+ VERSION = '0.0.641'
15
15
  end
data/openapi.yaml CHANGED
@@ -504,7 +504,20 @@ components:
504
504
  in: query
505
505
  description: Page number (1-based)
506
506
  schema: { type: integer, minimum: 1, default: 1 }
507
+ IdempotencyKeyHeader:
508
+ name: Idempotency-Key
509
+ in: header
510
+ required: false
511
+ schema: { type: string, maxLength: 255 }
512
+ description: >-
513
+ Optional client-generated unique key (e.g. a UUID) that makes retries
514
+ safe. Same key + same body replays the original response; same key +
515
+ different body → 422; key still processing → 409.
507
516
  responses:
517
+ IdempotencyKeyInFlight:
518
+ description: Same Idempotency-Key still processing; retry after a short backoff
519
+ IdempotencyKeyReused:
520
+ description: Idempotency-Key reused with a different body
508
521
  BadRequest:
509
522
  description: Invalid request
510
523
  content:
@@ -4701,8 +4714,17 @@ components:
4701
4714
  type: string
4702
4715
  description: |
4703
4716
  Campaign `optimizationTargetType` (e.g. `MAX_CLICK`, `TARGET_COST_PER_CLICK`,
4704
- `MAX_IMPRESSION`). Forwarded verbatim LinkedIn validates compatibility with
4705
- the objective and `costType`. Omit for the objective-derived default.
4717
+ `MAX_IMPRESSION`). Forwarded verbatim, LinkedIn validates compatibility with
4718
+ the objective and `costType`. Omit for the objective-derived default:
4719
+ `awareness` gets `MAX_IMPRESSION`, `video_views` gets `MAX_VIDEO_VIEW`, and
4720
+ every other goal gets `MAX_CLICK`. `lead_generation` and `conversions` also
4721
+ get `MAX_CLICK`, because `MAX_LEAD` and `MAX_CONVERSION` need a lead gen form
4722
+ or a conversion rule that neither creation flow attaches. The default applies
4723
+ only to `SPONSORED_UPDATES` campaigns (every boost, and the image, video and
4724
+ carousel standalone ads), never to the `TEXT_AD`, `DYNAMIC` and
4725
+ `SPONSORED_INMAILS` campaigns the other creative formats produce. It is also
4726
+ skipped when `unitCost` or a non-`CPM` `costType` is set, since those select
4727
+ manual bidding and the bid is then yours to choose.
4706
4728
  creativeSelection:
4707
4729
  type: string
4708
4730
  enum: [OPTIMIZED, ROUND_ROBIN]
@@ -13960,15 +13982,7 @@ paths:
13960
13982
  with the same key and body replays the original 201 (same _id)
13961
13983
  instead of conflicting.
13962
13984
  parameters:
13963
- - name: Idempotency-Key
13964
- in: header
13965
- required: false
13966
- schema: { type: string, maxLength: 255 }
13967
- description: >-
13968
- Optional client-generated unique key (e.g. a UUID) that makes
13969
- create retries safe. Same key + same body replays the original
13970
- response; same key + different body → 422; key still processing →
13971
- 409.
13985
+ - $ref: '#/components/parameters/IdempotencyKeyHeader'
13972
13986
  requestBody:
13973
13987
  required: true
13974
13988
  content:
@@ -14006,7 +14020,7 @@ paths:
14006
14020
  '402': { $ref: '#/components/responses/PaymentRequired' }
14007
14021
  '403': { description: Profile limit exceeded }
14008
14022
  '409': { description: 'A profile with this name already exists (code: profile_name_conflict); details.existingProfileId carries the id of the existing profile. Also returned while a request with the same Idempotency-Key is still processing.' }
14009
- '422': { description: Idempotency-Key reused with a different body }
14023
+ '422': { $ref: '#/components/responses/IdempotencyKeyReused' }
14010
14024
  /v1/profiles/{profileId}:
14011
14025
  get:
14012
14026
  operationId: getProfile
@@ -22657,7 +22671,7 @@ paths:
22657
22671
 
22658
22672
  Supported platforms: X/Twitter, Bluesky, Reddit, and WhatsApp. Other platforms return PLATFORM_NOT_SUPPORTED.
22659
22673
 
22660
- WhatsApp: this is the endpoint for sending an approved template message to a phone number. Provide templateName, templateLanguage, and templateParams (variable values for the text header, body and dynamic URL buttons, in that order), with the recipient phone in participantId. A template is required because WhatsApp does not permit freeform messages to open a conversation; a missing template returns TEMPLATE_REQUIRED. Templates with media headers (image, video, document) are handled automatically: Zernio reads the approved template definition and fills the header at send time with the template's approved sample asset. To send a DIFFERENT asset per message (e.g. a distinct invoice PDF for each recipient), pass the headerMedia field with a public link (or a Meta media id); it overrides the sample for that send. Calling this for a number you already have a thread with simply sends the template into that thread, which also makes it the way to re-engage a contact after the 24-hour customer-service window has closed. Once the recipient replies (opening the 24h window), send freeform messages with the send-message endpoint (POST /v1/inbox/conversations/{conversationId}/messages). Template fields are accepted on the JSON body only, not on multipart requests.
22674
+ WhatsApp: this is the endpoint for sending an approved template message to a phone number. Provide templateName, templateLanguage, and templateParams (variable values for the text header, body and dynamic URL buttons, in that order), with the recipient phone in participantId. A template is required because WhatsApp does not permit freeform messages to open a conversation; a missing template returns TEMPLATE_REQUIRED. Templates with media headers (image, video, document) are handled automatically: Zernio reads the approved template definition and fills the header at send time with the template's approved sample asset. To send a DIFFERENT asset per message (e.g. a distinct invoice PDF for each recipient), pass the headerMedia field with a public link (or a Meta media id); it overrides the sample for that send. Calling this for a number you already have a thread with simply sends the template into that thread, which also makes it the way to re-engage a contact after the 24-hour customer-service window has closed. Once the recipient replies (opening the 24h window), send freeform messages with the send-message endpoint (POST /v1/inbox/conversations/{conversationId}/messages). Template fields are accepted on the JSON body only, not on multipart requests. Alternatively, WhatsApp Business Accounts eligible for Meta Direct Send can open a conversation with a business-initiated utility text message and no template: pass category: 'utility' together with message (and no templateName). See the category field below.
22661
22675
 
22662
22676
  DM eligibility (X/Twitter): Before sending, the endpoint checks if the recipient accepts DMs from your account (via the receives_your_dm field). If not, a 422 error with code DM_NOT_ALLOWED is returned. You can skip this check with skipDmCheck: true if you have already verified eligibility.
22663
22677
 
@@ -22685,14 +22699,28 @@ paths:
22685
22699
  description: Recipient handle/username — an X or Bluesky handle (with or without @) or a Reddit username (with or without u/). Resolved via lookup. Provide either this or participantId.
22686
22700
  message:
22687
22701
  type: string
22688
- description: Text content of the message. At least one of message, attachment, or (for WhatsApp) templateName is required.
22702
+ description: 'Text content of the message. At least one of message, attachment, or (for WhatsApp) templateName is required. Required when category is set (a Direct Send utility message is a text message).'
22689
22703
  skipDmCheck:
22690
22704
  type: boolean
22691
22705
  default: false
22692
22706
  description: X/Twitter only. Skip the receives_your_dm eligibility check before sending. Use if you have already verified the recipient accepts DMs.
22693
22707
  templateName:
22694
22708
  type: string
22695
- description: WhatsApp only. Name of the approved template to start the conversation with (required for WhatsApp).
22709
+ description: 'WhatsApp only. Name of the approved template to start the conversation with. Required for WhatsApp unless category is used instead (Direct Send). Cannot be combined with category.'
22710
+ category:
22711
+ type: string
22712
+ enum: [utility]
22713
+ description: >-
22714
+ WhatsApp only (Meta Direct Send). Combined with message and without
22715
+ templateName, starts the conversation with a business-initiated
22716
+ UTILITY message and no pre-approved template; Meta matches or
22717
+ auto-creates a template asynchronously. The WhatsApp Business
22718
+ Account must be eligible for Direct Send, otherwise the send fails
22719
+ with an error telling you to use an approved message template
22720
+ instead. Cannot be combined with templateName (templates are
22721
+ already categorized at creation). Utility messages only; marketing
22722
+ content is not allowed under this category. Accepted on the JSON
22723
+ body only, not on multipart requests.
22696
22724
  templateLanguage:
22697
22725
  type: string
22698
22726
  description: WhatsApp only. Template language code (e.g. en_US).
@@ -22786,7 +22814,7 @@ paths:
22786
22814
  type: [string, "null"]
22787
22815
  description: Twitter username of the recipient
22788
22816
  '400':
22789
- description: Validation error or platform not supported
22817
+ description: 'Validation error, platform not supported, category combined with templateName or used on a non-WhatsApp account, or the WhatsApp Business Account is not eligible for Direct Send'
22790
22818
  content:
22791
22819
  application/json:
22792
22820
  schema:
@@ -23263,6 +23291,13 @@ paths:
23263
23291
  are available via the `interactive` field. Tap events are delivered through
23264
23292
  the `message.received` webhook with WhatsApp-specific `metadata` fields
23265
23293
  (`interactiveType`, `interactiveId`, `flowResponseJson`, `flowResponseData`).
23294
+
23295
+ **Idempotency:** send an `Idempotency-Key` header to make retries safe
23296
+ (e.g. after a client-side timeout where delivery is unknown): same key +
23297
+ same body replays the original response (with `Idempotent-Replayed: true`)
23298
+ instead of sending the message a second time; same key + different body
23299
+ returns 422; a key still in flight returns 409. Works for JSON and
23300
+ multipart (file upload) requests alike. Keys are retained for 24 hours.
23266
23301
  tags: [Messages]
23267
23302
  security: [{ bearerAuth: [] }]
23268
23303
  parameters:
@@ -23271,6 +23306,7 @@ paths:
23271
23306
  required: true
23272
23307
  schema: { type: string }
23273
23308
  description: The conversation ID (id field from list conversations endpoint). This is the platform-specific conversation identifier, not an internal database ID.
23309
+ - $ref: '#/components/parameters/IdempotencyKeyHeader'
23274
23310
  requestBody:
23275
23311
  required: true
23276
23312
  content:
@@ -23282,6 +23318,23 @@ paths:
23282
23318
  accountId: { type: string, description: Social account ID }
23283
23319
  message: { type: string, description: Message text }
23284
23320
  attachmentUrl: { type: string, description: "URL of the attachment to send (image, video, audio, or file). The URL must be publicly accessible. For binary file uploads, use multipart/form-data instead." }
23321
+ category:
23322
+ type: string
23323
+ enum: [utility]
23324
+ description: >-
23325
+ WhatsApp only (Meta Direct Send). Sends this message as a
23326
+ business-initiated UTILITY message without an approved template,
23327
+ for example outside the 24-hour customer service window; Meta
23328
+ matches or auto-creates a template asynchronously. The WhatsApp
23329
+ Business Account must be eligible for Direct Send, otherwise the
23330
+ send fails with an error telling you to use an approved message
23331
+ template instead. Supported only for text messages (link preview
23332
+ ok) and interactive messages (reply buttons, CTA URL buttons,
23333
+ voice-call button, header of text/image/video/document). Cannot
23334
+ be combined with template, attachments, location, or contacts.
23335
+ Utility messages only; marketing content is not allowed under
23336
+ this category. Accepted on the JSON body only, not on multipart
23337
+ requests.
23285
23338
  attachmentType:
23286
23339
  type: string
23287
23340
  enum: [image, video, audio, file]
@@ -23734,7 +23787,7 @@ paths:
23734
23787
  sentAt: { type: [string, "null"], format: date-time, description: Bluesky sent timestamp }
23735
23788
  message: { type: [string, "null"], description: Success message (Reddit only) }
23736
23789
  '400':
23737
- description: Bad request (e.g., attachment not supported for platform, validation error)
23790
+ description: 'Bad request (e.g., attachment not supported for platform, validation error, category combined with a template or attachment, category used on a non-WhatsApp account, or the WhatsApp Business Account is not eligible for Direct Send)'
23738
23791
  content:
23739
23792
  application/json:
23740
23793
  schema:
@@ -23756,6 +23809,8 @@ paths:
23756
23809
  '401': { $ref: '#/components/responses/Unauthorized' }
23757
23810
  '403':
23758
23811
  description: Inbox addon required
23812
+ '409': { $ref: '#/components/responses/IdempotencyKeyInFlight' }
23813
+ '422': { $ref: '#/components/responses/IdempotencyKeyReused' }
23759
23814
 
23760
23815
  /v1/whatsapp/media/{mediaId}:
23761
23816
  get:
@@ -26429,15 +26484,7 @@ paths:
26429
26484
  security:
26430
26485
  - bearerAuth: []
26431
26486
  parameters:
26432
- - name: Idempotency-Key
26433
- in: header
26434
- required: false
26435
- schema: { type: string, maxLength: 255 }
26436
- description: >-
26437
- Optional client-generated unique key (e.g. a UUID) that makes
26438
- dial retries safe. Same key + same body replays the original
26439
- response; same key + different body → 422; key still processing →
26440
- 409.
26487
+ - $ref: '#/components/parameters/IdempotencyKeyHeader'
26441
26488
  requestBody:
26442
26489
  required: true
26443
26490
  content:
@@ -26775,15 +26822,7 @@ paths:
26775
26822
  security:
26776
26823
  - bearerAuth: []
26777
26824
  parameters:
26778
- - name: Idempotency-Key
26779
- in: header
26780
- required: false
26781
- schema: { type: string, maxLength: 255 }
26782
- description: >-
26783
- Optional client-generated unique key (e.g. a UUID) that makes
26784
- dial retries safe. Same key + same body replays the original
26785
- response; same key + different body → 422; key still processing →
26786
- 409.
26825
+ - $ref: '#/components/parameters/IdempotencyKeyHeader'
26787
26826
  requestBody:
26788
26827
  required: true
26789
26828
  content:
@@ -27117,14 +27156,7 @@ paths:
27117
27156
  security:
27118
27157
  - bearerAuth: []
27119
27158
  parameters:
27120
- - name: Idempotency-Key
27121
- in: header
27122
- required: false
27123
- schema: { type: string, maxLength: 255 }
27124
- description: >-
27125
- Optional client-generated unique key (e.g. a UUID) that makes send
27126
- retries safe. Same key + same body replays the original response;
27127
- same key + different body → 422; key still processing → 409.
27159
+ - $ref: '#/components/parameters/IdempotencyKeyHeader'
27128
27160
  requestBody:
27129
27161
  required: true
27130
27162
  content:
@@ -27158,8 +27190,8 @@ paths:
27158
27190
  status: { type: string, enum: [sent] }
27159
27191
  '401': { $ref: '#/components/responses/Unauthorized' }
27160
27192
  '404': { description: "No SMS-enabled number matches `from`" }
27161
- '409': { description: Same Idempotency-Key still processing; retry after a short backoff }
27162
- '422': { description: Idempotency-Key reused with a different body }
27193
+ '409': { $ref: '#/components/responses/IdempotencyKeyInFlight' }
27194
+ '422': { $ref: '#/components/responses/IdempotencyKeyReused' }
27163
27195
  '502': { description: Carrier-side send failed }
27164
27196
 
27165
27197
  /v1/sms/lookup:
@@ -37800,14 +37832,7 @@ paths:
37800
37832
  security:
37801
37833
  - bearerAuth: []
37802
37834
  parameters:
37803
- - name: Idempotency-Key
37804
- in: header
37805
- required: false
37806
- schema: { type: string, maxLength: 255 }
37807
- description: >-
37808
- Optional client-generated unique key (e.g. a UUID) that makes create
37809
- retries safe. Same key + same body replays the original response;
37810
- same key + different body → 422; key still processing → 409.
37835
+ - $ref: '#/components/parameters/IdempotencyKeyHeader'
37811
37836
  requestBody:
37812
37837
  required: true
37813
37838
  content:
@@ -74,7 +74,7 @@ describe 'AdCampaignsApi' do
74
74
  # Creates a paid ad with custom creative across Meta, Google Ads, Pinterest, TikTok, X/Twitter, LinkedIn, and OpenAI Ads (ChatGPT Ads). Supports three mutually-exclusive request shapes selected by the body, a legacy single-creative shape (all platforms, default), a Meta-only multi-creative shape via the creatives array (one ad set with N ads sharing budget and targeting), and an attach shape via adSetId that adds one new ad to an existing ad set, inheriting its budget, targeting, and schedule (Meta, TikTok, and LinkedIn; on LinkedIn adSetId is the existing Campaign id, and the budget, schedule, targeting and bidding fields must be omitted). Per-platform required fields, budget minimums, and video-ad rules are documented on each property below. LinkedIn creates a Single Image or Single Video Ad backed by a Direct Sponsored Content \&quot;dark post\&quot; authored by a Company Page (see &#x60;organizationId&#x60;); supported goals are engagement, traffic, awareness, and video_views (video ads use the &#x60;video&#x60; field; video_views requires a video), and traffic ads require &#x60;linkUrl&#x60;. **Idempotency:** this endpoint is not idempotent at the platform level (a blind retry creates a second campaign/ad set/ad). Send an &#x60;Idempotency-Key&#x60; header to make retries safe: the first request with a given key creates the ad and we store the response; a retry with the same key replays that exact response (with &#x60;Idempotent-Replayed: true&#x60;) instead of creating duplicates. Reusing a key with a different body returns 422; a key whose first request is still in flight returns 409 (retry after a short backoff). Keys are scoped to your credential and expire after 24h.
75
75
  # @param create_standalone_ad_request
76
76
  # @param [Hash] opts the optional parameters
77
- # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes create retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
77
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
78
78
  # @return [CreateStandaloneAd200Response]
79
79
  describe 'create_standalone_ad test' do
80
80
  it 'should work' do
@@ -48,7 +48,7 @@ describe 'MessagesApi' do
48
48
 
49
49
  # unit tests for create_inbox_conversation
50
50
  # Create conversation
51
- # Initiate a new direct message conversation with a specified user. If a conversation already exists with the recipient, the message is added to the existing thread. Supported platforms: X/Twitter, Bluesky, Reddit, and WhatsApp. Other platforms return PLATFORM_NOT_SUPPORTED. WhatsApp: this is the endpoint for sending an approved template message to a phone number. Provide templateName, templateLanguage, and templateParams (variable values for the text header, body and dynamic URL buttons, in that order), with the recipient phone in participantId. A template is required because WhatsApp does not permit freeform messages to open a conversation; a missing template returns TEMPLATE_REQUIRED. Templates with media headers (image, video, document) are handled automatically: Zernio reads the approved template definition and fills the header at send time with the template&#39;s approved sample asset. To send a DIFFERENT asset per message (e.g. a distinct invoice PDF for each recipient), pass the headerMedia field with a public link (or a Meta media id); it overrides the sample for that send. Calling this for a number you already have a thread with simply sends the template into that thread, which also makes it the way to re-engage a contact after the 24-hour customer-service window has closed. Once the recipient replies (opening the 24h window), send freeform messages with the send-message endpoint (POST /v1/inbox/conversations/{conversationId}/messages). Template fields are accepted on the JSON body only, not on multipart requests. DM eligibility (X/Twitter): Before sending, the endpoint checks if the recipient accepts DMs from your account (via the receives_your_dm field). If not, a 422 error with code DM_NOT_ALLOWED is returned. You can skip this check with skipDmCheck: true if you have already verified eligibility. X API tier requirement: DM write endpoints require X API Pro tier ($5,000/month) or Enterprise access. This applies to BYOK (Bring Your Own Key) users who provide their own X API credentials. Rate limits (X/Twitter only): X&#39;s DM API enforces 200 requests per 15 minutes, 1,000 per 24 hours per connected X account, and 15,000 per 24 hours per X developer app (shared across all DM endpoints). These limits do NOT apply to other platforms. WhatsApp sends are governed by Meta&#39;s per-number messaging tiers (unique business-initiated conversations per 24 hours) and per-number throughput instead.
51
+ # Initiate a new direct message conversation with a specified user. If a conversation already exists with the recipient, the message is added to the existing thread. Supported platforms: X/Twitter, Bluesky, Reddit, and WhatsApp. Other platforms return PLATFORM_NOT_SUPPORTED. WhatsApp: this is the endpoint for sending an approved template message to a phone number. Provide templateName, templateLanguage, and templateParams (variable values for the text header, body and dynamic URL buttons, in that order), with the recipient phone in participantId. A template is required because WhatsApp does not permit freeform messages to open a conversation; a missing template returns TEMPLATE_REQUIRED. Templates with media headers (image, video, document) are handled automatically: Zernio reads the approved template definition and fills the header at send time with the template&#39;s approved sample asset. To send a DIFFERENT asset per message (e.g. a distinct invoice PDF for each recipient), pass the headerMedia field with a public link (or a Meta media id); it overrides the sample for that send. Calling this for a number you already have a thread with simply sends the template into that thread, which also makes it the way to re-engage a contact after the 24-hour customer-service window has closed. Once the recipient replies (opening the 24h window), send freeform messages with the send-message endpoint (POST /v1/inbox/conversations/{conversationId}/messages). Template fields are accepted on the JSON body only, not on multipart requests. Alternatively, WhatsApp Business Accounts eligible for Meta Direct Send can open a conversation with a business-initiated utility text message and no template: pass category: &#39;utility&#39; together with message (and no templateName). See the category field below. DM eligibility (X/Twitter): Before sending, the endpoint checks if the recipient accepts DMs from your account (via the receives_your_dm field). If not, a 422 error with code DM_NOT_ALLOWED is returned. You can skip this check with skipDmCheck: true if you have already verified eligibility. X API tier requirement: DM write endpoints require X API Pro tier ($5,000/month) or Enterprise access. This applies to BYOK (Bring Your Own Key) users who provide their own X API credentials. Rate limits (X/Twitter only): X&#39;s DM API enforces 200 requests per 15 minutes, 1,000 per 24 hours per connected X account, and 15,000 per 24 hours per X developer app (shared across all DM endpoints). These limits do NOT apply to other platforms. WhatsApp sends are governed by Meta&#39;s per-number messaging tiers (unique business-initiated conversations per 24 hours) and per-number throughput instead.
52
52
  # @param create_inbox_conversation_request
53
53
  # @param [Hash] opts the optional parameters
54
54
  # @return [CreateInboxConversation201Response]
@@ -180,10 +180,11 @@ describe 'MessagesApi' do
180
180
 
181
181
  # unit tests for send_inbox_message
182
182
  # Send message
183
- # Send a message in a conversation. Supports text, attachments, quick replies, buttons, templates, and message tags. Attachment and interactive message support varies by platform. WhatsApp template messages: to send an approved template into this conversation (required when the 24-hour customer-service window is closed), use the &#x60;template&#x60; field with a single element carrying the template reference: &#x60;{ \&quot;elements\&quot;: [{ \&quot;name\&quot;: ..., \&quot;language\&quot;: ..., \&quot;components\&quot;: [...] }] }&#x60;. See the &#x60;template&#x60; field below for the exact shape. To send a template to a phone number you have no conversation with yet, use the create-conversation endpoint (POST /v1/inbox/conversations) instead. WhatsApp rich interactive messages (list, CTA URL, Flow, location request) are available via the &#x60;interactive&#x60; field. Tap events are delivered through the &#x60;message.received&#x60; webhook with WhatsApp-specific &#x60;metadata&#x60; fields (&#x60;interactiveType&#x60;, &#x60;interactiveId&#x60;, &#x60;flowResponseJson&#x60;, &#x60;flowResponseData&#x60;).
183
+ # Send a message in a conversation. Supports text, attachments, quick replies, buttons, templates, and message tags. Attachment and interactive message support varies by platform. WhatsApp template messages: to send an approved template into this conversation (required when the 24-hour customer-service window is closed), use the &#x60;template&#x60; field with a single element carrying the template reference: &#x60;{ \&quot;elements\&quot;: [{ \&quot;name\&quot;: ..., \&quot;language\&quot;: ..., \&quot;components\&quot;: [...] }] }&#x60;. See the &#x60;template&#x60; field below for the exact shape. To send a template to a phone number you have no conversation with yet, use the create-conversation endpoint (POST /v1/inbox/conversations) instead. WhatsApp rich interactive messages (list, CTA URL, Flow, location request) are available via the &#x60;interactive&#x60; field. Tap events are delivered through the &#x60;message.received&#x60; webhook with WhatsApp-specific &#x60;metadata&#x60; fields (&#x60;interactiveType&#x60;, &#x60;interactiveId&#x60;, &#x60;flowResponseJson&#x60;, &#x60;flowResponseData&#x60;). **Idempotency:** send an &#x60;Idempotency-Key&#x60; header to make retries safe (e.g. after a client-side timeout where delivery is unknown): same key + same body replays the original response (with &#x60;Idempotent-Replayed: true&#x60;) instead of sending the message a second time; same key + different body returns 422; a key still in flight returns 409. Works for JSON and multipart (file upload) requests alike. Keys are retained for 24 hours.
184
184
  # @param conversation_id The conversation ID (id field from list conversations endpoint). This is the platform-specific conversation identifier, not an internal database ID.
185
185
  # @param send_inbox_message_request
186
186
  # @param [Hash] opts the optional parameters
187
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
187
188
  # @return [SendInboxMessage200Response]
188
189
  describe 'send_inbox_message test' do
189
190
  it 'should work' do
@@ -37,7 +37,7 @@ describe 'ProfilesApi' do
37
37
  # Creates a new profile with a name, optional description, and color. Names are unique per workspace: a duplicate returns a 409 whose details.existingProfileId carries the id of the existing profile. Send an Idempotency-Key header to make retries safe: a retried create with the same key and body replays the original 201 (same _id) instead of conflicting.
38
38
  # @param create_profile_request
39
39
  # @param [Hash] opts the optional parameters
40
- # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes create retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
40
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
41
41
  # @return [ProfileCreateResponse]
42
42
  describe 'create_profile test' do
43
43
  it 'should work' do
@@ -229,7 +229,7 @@ describe 'SMSApi' do
229
229
  # Sends an SMS (or MMS when &#x60;mediaUrls&#x60; is set) from one of your SMS-enabled numbers. At least one of &#x60;text&#x60; / &#x60;mediaUrls&#x60; is required. Both numbers are normalized to E.164, so &#x60;from&#x60; matches regardless of formatting and replies thread into the same inbox conversation. US numbers must have an approved carrier registration (&#x60;/v1/sms/registrations&#x60;) before messages deliver. **Idempotency:** send an &#x60;Idempotency-Key&#x60; header to make retries safe: same key + same body replays the original response instead of sending a second message; same key + different body returns 422; a key still in flight returns 409.
230
230
  # @param send_sms_request
231
231
  # @param [Hash] opts the optional parameters
232
- # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes send retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
232
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
233
233
  # @return [SendSms200Response]
234
234
  describe 'send_sms test' do
235
235
  it 'should work' do
@@ -37,7 +37,7 @@ describe 'VoiceApi' do
37
37
  # Dials &#x60;to&#x60; FROM one of your voice-enabled numbers and, on answer, bridges the callee to the number&#39;s stored forward destination, or to the per-call &#x60;forwardTo&#x60; override. Destinations can be your own AI voice agent (Vapi/Retell), a phone, or a SIP endpoint. An optional &#x60;greeting&#x60; is spoken to the callee before the bridge. The 200 response means the call is dialing; the lifecycle continues asynchronously (track it via &#x60;GET /v1/voice/calls/{id}&#x60; or the &#x60;call.*&#x60; webhooks). Outbound calls are capped per rolling hour (429 when hit). **Idempotency:** send an &#x60;Idempotency-Key&#x60; header to make retries safe; same key + same body replays the original response instead of dialing (and billing) a second call.
38
38
  # @param create_voice_call_request
39
39
  # @param [Hash] opts the optional parameters
40
- # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes dial retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
40
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
41
41
  # @return [CreateVoiceCall200Response]
42
42
  describe 'create_voice_call test' do
43
43
  it 'should work' do
@@ -167,7 +167,7 @@ describe 'WhatsAppCallingApi' do
167
167
  # Initiates an outbound Business-Initiated Call. The Telnyx-side SIP leg is originated server-side (Option B: SIP-first). Telnyx INVITEs Meta directly over TLS:5061 with the SIP digest credentials we captured at calling-enablement time). No client-side SDP is required; pass only &#x60;accountId&#x60; and &#x60;to&#x60;. To send the consumer the call-consent prompt instead of placing a call, pass &#x60;action: \&quot;send_call_permission_request\&quot;&#x60; (+ optional &#x60;bodyText&#x60;). The consumer must tap Allow in WhatsApp before &#x60;start_call&#x60; is permitted; Meta limits the prompt to 1 per consumer per 24h (2 per 7 days) and requires an open 24h service window. **Idempotency:** send an &#x60;Idempotency-Key&#x60; header to make retries safe; same key + same body replays the original response instead of dialing (and billing) a second call.
168
168
  # @param initiate_whats_app_call_request
169
169
  # @param [Hash] opts the optional parameters
170
- # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes dial retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
170
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
171
171
  # @return [InitiateWhatsAppCall200Response]
172
172
  describe 'initiate_whats_app_call test' do
173
173
  it 'should work' do
@@ -63,6 +63,16 @@ describe Zernio::CreateInboxConversationRequest do
63
63
  end
64
64
  end
65
65
 
66
+ describe 'test attribute "category"' do
67
+ it 'should work' do
68
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
69
+ # validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["utility"])
70
+ # validator.allowable_values.each do |value|
71
+ # expect { instance.category = value }.not_to raise_error
72
+ # end
73
+ end
74
+ end
75
+
66
76
  describe 'test attribute "template_language"' do
67
77
  it 'should work' do
68
78
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
@@ -45,6 +45,16 @@ describe Zernio::SendInboxMessageRequest do
45
45
  end
46
46
  end
47
47
 
48
+ describe 'test attribute "category"' do
49
+ it 'should work' do
50
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
51
+ # validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["utility"])
52
+ # validator.allowable_values.each do |value|
53
+ # expect { instance.category = value }.not_to raise_error
54
+ # end
55
+ end
56
+ end
57
+
48
58
  describe 'test attribute "attachment_type"' do
49
59
  it 'should work' do
50
60
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
Binary file
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: late-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.639
4
+ version: 0.0.641
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenAPI-Generator
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-08-02 00:00:00.000000000 Z
11
+ date: 2026-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: typhoeus
@@ -4919,7 +4919,7 @@ files:
4919
4919
  - spec/models/you_tube_video_retention_response_retention_curve_inner_spec.rb
4920
4920
  - spec/models/you_tube_video_retention_response_spec.rb
4921
4921
  - spec/spec_helper.rb
4922
- - zernio-sdk-0.0.639.gem
4922
+ - zernio-sdk-0.0.641.gem
4923
4923
  - zernio-sdk.gemspec
4924
4924
  homepage: https://openapi-generator.tech
4925
4925
  licenses:
Binary file