late-sdk 0.0.699 → 0.0.700

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/docs/CommentAutomationsApi.md +1 -1
  3. data/docs/CreateCommentAutomation200ResponseAutomation.md +2 -0
  4. data/docs/CreateCommentAutomationRequest.md +2 -0
  5. data/docs/GetCommentAutomation200ResponseAutomation.md +2 -0
  6. data/docs/GetCommentAutomation200ResponseLogsInner.md +2 -0
  7. data/docs/ListCommentAutomations200ResponseAutomationsInner.md +2 -0
  8. data/docs/UpdateCommentAutomation200ResponseAutomation.md +2 -0
  9. data/docs/UpdateCommentAutomationRequest.md +2 -0
  10. data/lib/zernio-sdk/api/comment_automations_api.rb +2 -2
  11. data/lib/zernio-sdk/models/create_comment_automation200_response_automation.rb +11 -1
  12. data/lib/zernio-sdk/models/create_comment_automation_request.rb +13 -1
  13. data/lib/zernio-sdk/models/get_comment_automation200_response_automation.rb +11 -1
  14. data/lib/zernio-sdk/models/get_comment_automation200_response_logs_inner.rb +23 -1
  15. data/lib/zernio-sdk/models/list_comment_automations200_response_automations_inner.rb +11 -1
  16. data/lib/zernio-sdk/models/update_comment_automation200_response_automation.rb +11 -1
  17. data/lib/zernio-sdk/models/update_comment_automation_request.rb +11 -1
  18. data/lib/zernio-sdk/version.rb +1 -1
  19. data/openapi.yaml +14 -0
  20. data/spec/api/comment_automations_api_spec.rb +1 -1
  21. data/spec/models/create_comment_automation200_response_automation_spec.rb +6 -0
  22. data/spec/models/create_comment_automation_request_spec.rb +6 -0
  23. data/spec/models/get_comment_automation200_response_automation_spec.rb +6 -0
  24. data/spec/models/get_comment_automation200_response_logs_inner_spec.rb +10 -0
  25. data/spec/models/list_comment_automations200_response_automations_inner_spec.rb +6 -0
  26. data/spec/models/update_comment_automation200_response_automation_spec.rb +6 -0
  27. data/spec/models/update_comment_automation_request_spec.rb +6 -0
  28. data/zernio-sdk-0.0.700.gem +0 -0
  29. metadata +2 -2
  30. data/zernio-sdk-0.0.699.gem +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3fb33de4d7dd838d42a3323ba80b110598cbfff7518479097bf3a1344fdbaa57
4
- data.tar.gz: ed1ce12a00297b1bf42737004ecdf54b3000abfd05600a8e4ef7d451585d9598
3
+ metadata.gz: eb848997fd20b7c6c8c0b434bbbca6c9d76f3c978f178ce1c05f42c75ec75260
4
+ data.tar.gz: 1daf1b78ae8d29ce75780d20c5ed5cb7424a3fe000ed9debff7454d32861049f
5
5
  SHA512:
6
- metadata.gz: 187e6e1b4fcd2aa2097e48bbb6acb53754a8a296a832b4c12806ae1b5efc0ce2b8290c8edb4275afef5b073eb7ec5e796c46d595c478113224d31ecb21f259ab
7
- data.tar.gz: ec9b8ee1e802cc5550cc3b5ac4a8942f641143092d008900fa311c03a93ba8bc7cc04cf572911d1f9b24022f4f28e75b7ce1d96f57b65b91a5b62fdef4cb58f7
6
+ metadata.gz: 1d5c204fcfab4aac709dd636224fd82dce7a86de9b42e0f1b4696849d6d2c343d5f241e43be313b78219dd7fd31bfeeedb814d8614ccd61bc967d615513fbad4
7
+ data.tar.gz: cd1aef01962db5814472d904fdebc71c0da59cd36ddb5f22ef1deef0e82e922eeb044f7a78839c36d13bfdf9e7b5a0f1a832258c354f1aeba439308df2ca03c7
@@ -18,7 +18,7 @@ All URIs are relative to *https://zernio.com/api*
18
18
 
19
19
  Create comment-to-DM automation
20
20
 
21
- Create a keyword-triggered DM automation on an Instagram or Facebook account. When someone comments a matching keyword (or, with `trigger: story_reply`, replies to your Instagram story with one), they automatically receive a DM. Triggers (`trigger`): * `comment` (default): fires on keyword comments on a post or reel. * `story_reply`: fires when someone replies to your Instagram story with a keyword, and answers them with a DM. Set `platformPostId` to a story media id to scope to one story, or omit it to match replies to any story. Targeting (comment trigger): * Per-post: set `platformPostId` to scope to one specific post (only one active per-post automation is allowed per post). * Account-wide (\"any post\"): omit `platformPostId` (and `postId`). The automation evaluates every comment on every post on the account. You can stack unlimited account-wide automations, each with its own keyword set, and they all run independently. Per-post automations take priority on their post. Audience (`audience`, Instagram only): restrict the automation to followers or non-followers, and/or to accounts above a follower count. Instagram only reveals the follow relationship for people who have messaged the account, so `audience.whenUnknown` decides what happens for everyone else - including `verify`, which sends a one-tap confirmation DM (`followGate`) and then delivers the real DM automatically. People we already know follow you skip the tap entirely. Links in the DM's buttons can be click-tracked (`linkTracking`, on by default) and clickers optionally tagged (`clickTag`) for segmentation. Stats returned include delivered, read, and link clicks.
21
+ Create a keyword-triggered DM automation on an Instagram or Facebook account. When someone comments a matching keyword (or, with `trigger: story_reply`, replies to your Instagram story with one), they automatically receive a DM. Triggers (`trigger`): * `comment` (default): fires on keyword comments on a post or reel. * `story_reply`: fires when someone replies to your Instagram story with a keyword, and answers them with a DM. Set `platformPostId` to a story media id to scope to one story, or omit it to match replies to any story. Targeting (comment trigger): * Per-post: set `platformPostId` to scope to one specific post (only one active per-post automation is allowed per post). * Account-wide (\"any post\"): omit `platformPostId` (and `postId`). The automation evaluates every comment on every post on the account. You can stack unlimited account-wide automations, each with its own keyword set, and they all run independently. Per-post automations take priority on their post. Audience (`audience`, Instagram only): restrict the automation to followers or non-followers, and/or to accounts above a follower count. Instagram only reveals the follow relationship for people who have messaged the account, so `audience.whenUnknown` decides what happens for everyone else - including `verify`, which sends a one-tap confirmation DM (`followGate`) and then delivers the real DM automatically. People we already know follow you skip the tap entirely. Set `alsoMatchInDms: true` on a `comment` automation to also answer people who send a keyword as a direct message instead of commenting it. One automation then covers both doors, and each door is deduplicated separately (someone who already got the DM from their comment still gets it if they later DM the keyword). Requires at least one keyword. Links in the DM's buttons can be click-tracked (`linkTracking`, on by default) and clickers optionally tagged (`clickTag`) for segmentation. Stats returned include delivered, read, and link clicks.
22
22
 
23
23
  ### Examples
24
24
 
@@ -25,6 +25,7 @@
25
25
  | **comment_reply_delay_seconds** | **Integer** | Seconds waited before the public reply is posted. Absent when it follows the DM immediately. | [optional] |
26
26
  | **audience** | [**CommentAutomationAudience**](CommentAutomationAudience.md) | | [optional] |
27
27
  | **follow_gate** | [**CommentAutomationFollowGate**](CommentAutomationFollowGate.md) | | [optional] |
28
+ | **also_match_in_dms** | **Boolean** | Whether these keywords also fire on a plain inbound DM. | [optional] |
28
29
  | **is_active** | **Boolean** | | [optional] |
29
30
  | **stats** | [**CreateCommentAutomation200ResponseAutomationStats**](CreateCommentAutomation200ResponseAutomationStats.md) | | [optional] |
30
31
  | **created_at** | **Time** | | [optional] |
@@ -56,6 +57,7 @@ instance = Zernio::CreateCommentAutomation200ResponseAutomation.new(
56
57
  comment_reply_delay_seconds: null,
57
58
  audience: null,
58
59
  follow_gate: null,
60
+ also_match_in_dms: null,
59
61
  is_active: null,
60
62
  stats: null,
61
63
  created_at: null
@@ -25,6 +25,7 @@
25
25
  | **click_tag** | **String** | Optional tag applied to a contact when they click a tracked link (requires linkTracking). Lets you segment clickers for broadcasts/sequences. | [optional] |
26
26
  | **dm_delay_seconds** | **Integer** | Seconds to wait after the trigger before sending the DM. Omit or send 0 to reply immediately (the default). Max 86400 (24h). The trigger is still matched and deduplicated the moment the comment arrives, so a delay only moves when the response is sent. | [optional] |
27
27
  | **comment_reply_delay_seconds** | **Integer** | Seconds to wait before posting the public comment reply. Omit or send 0 to post it right after the DM (the default). The reply never goes out before the DM, so a value below dmDelaySeconds is raised to it. Ignored when trigger=story_reply, which has no public reply. | [optional] |
28
+ | **also_match_in_dms** | **Boolean** | Also fire these keywords on a plain inbound DM, so the automation answers people who message the keyword instead of commenting it. Requires at least one keyword (an empty keyword list means 'match anything', which would answer every inbound message) and is rejected on story_reply automations, which already trigger on DMs. Dedup is per door: a contact who already received the DM from their comment can still receive it from a DM. | [optional][default to false] |
28
29
  | **audience** | [**CommentAutomationAudience**](CommentAutomationAudience.md) | | [optional] |
29
30
  | **follow_gate** | [**CommentAutomationFollowGate**](CommentAutomationFollowGate.md) | | [optional] |
30
31
 
@@ -55,6 +56,7 @@ instance = Zernio::CreateCommentAutomationRequest.new(
55
56
  click_tag: null,
56
57
  dm_delay_seconds: null,
57
58
  comment_reply_delay_seconds: null,
59
+ also_match_in_dms: null,
58
60
  audience: null,
59
61
  follow_gate: null
60
62
  )
@@ -28,6 +28,7 @@
28
28
  | **comment_reply_delay_seconds** | **Integer** | Seconds waited before the public reply is posted. Absent when it follows the DM immediately. | [optional] |
29
29
  | **audience** | [**CommentAutomationAudience**](CommentAutomationAudience.md) | | [optional] |
30
30
  | **follow_gate** | [**CommentAutomationFollowGate**](CommentAutomationFollowGate.md) | | [optional] |
31
+ | **also_match_in_dms** | **Boolean** | Whether these keywords also fire on a plain inbound DM. | [optional] |
31
32
  | **is_active** | **Boolean** | | [optional] |
32
33
  | **stats** | [**CreateCommentAutomation200ResponseAutomationStats**](CreateCommentAutomation200ResponseAutomationStats.md) | | [optional] |
33
34
  | **created_at** | **Time** | | [optional] |
@@ -63,6 +64,7 @@ instance = Zernio::GetCommentAutomation200ResponseAutomation.new(
63
64
  comment_reply_delay_seconds: null,
64
65
  audience: null,
65
66
  follow_gate: null,
67
+ also_match_in_dms: null,
66
68
  is_active: null,
67
69
  stats: null,
68
70
  created_at: null,
@@ -9,6 +9,7 @@
9
9
  | **commenter_id** | **String** | | [optional] |
10
10
  | **commenter_name** | **String** | | [optional] |
11
11
  | **comment_text** | **String** | | [optional] |
12
+ | **source** | **String** | Which door triggered this send. Absent on rows written before this field existed (all of those are comment-triggered). | [optional] |
12
13
  | **status** | **String** | DM outcome. 'pending' = the automation has a dmDelaySeconds and the response is queued but not sent yet. 'gated' = the follow-gate confirmation DM went out and we are waiting for the tap; it flips to 'sent' or 'skipped' when they tap. | [optional] |
13
14
  | **audience_outcome** | **String** | How the audience rule resolved. Absent on automations without one. | [optional] |
14
15
  | **commenter_is_follower** | **Boolean** | Follow relationship at decision time. Absent when Instagram would not tell us (the commenter never messaged the account). | [optional] |
@@ -30,6 +31,7 @@ instance = Zernio::GetCommentAutomation200ResponseLogsInner.new(
30
31
  commenter_id: null,
31
32
  commenter_name: null,
32
33
  comment_text: null,
34
+ source: null,
33
35
  status: null,
34
36
  audience_outcome: null,
35
37
  commenter_is_follower: null,
@@ -25,6 +25,7 @@
25
25
  | **click_tag** | **String** | Tag applied to a contact when they click a tracked link. | [optional] |
26
26
  | **dm_delay_seconds** | **Integer** | Seconds waited after the trigger before the DM is sent. Absent when the DM goes out immediately. | [optional] |
27
27
  | **comment_reply_delay_seconds** | **Integer** | Seconds waited before the public reply is posted. Absent when it follows the DM immediately. | [optional] |
28
+ | **also_match_in_dms** | **Boolean** | Whether these keywords also fire on a plain inbound DM. | [optional] |
28
29
  | **is_active** | **Boolean** | | [optional] |
29
30
  | **stats** | [**ListCommentAutomations200ResponseAutomationsInnerStats**](ListCommentAutomations200ResponseAutomationsInnerStats.md) | | [optional] |
30
31
  | **created_at** | **Time** | | [optional] |
@@ -56,6 +57,7 @@ instance = Zernio::ListCommentAutomations200ResponseAutomationsInner.new(
56
57
  click_tag: null,
57
58
  dm_delay_seconds: null,
58
59
  comment_reply_delay_seconds: null,
60
+ also_match_in_dms: null,
59
61
  is_active: null,
60
62
  stats: null,
61
63
  created_at: null
@@ -18,6 +18,7 @@
18
18
  | **comment_reply_variations** | **Array<String>** | Alternate public replies rotated at random with commentReply. Omitted when none. | [optional] |
19
19
  | **audience** | [**CommentAutomationAudience**](CommentAutomationAudience.md) | | [optional] |
20
20
  | **follow_gate** | [**CommentAutomationFollowGate**](CommentAutomationFollowGate.md) | | [optional] |
21
+ | **also_match_in_dms** | **Boolean** | Whether these keywords also fire on a plain inbound DM. | [optional] |
21
22
  | **is_active** | **Boolean** | | [optional] |
22
23
  | **updated_at** | **Time** | | [optional] |
23
24
 
@@ -41,6 +42,7 @@ instance = Zernio::UpdateCommentAutomation200ResponseAutomation.new(
41
42
  comment_reply_variations: null,
42
43
  audience: null,
43
44
  follow_gate: null,
45
+ also_match_in_dms: null,
44
46
  is_active: null,
45
47
  updated_at: null
46
48
  )
@@ -18,6 +18,7 @@
18
18
  | **comment_reply_variations** | **Array<String>** | Alternate public replies for random rotation. Pass [] to clear. | [optional] |
19
19
  | **link_tracking** | **Boolean** | Wrap link buttons in a tracked redirect to count clicks. Pass false to send links untouched. | [optional] |
20
20
  | **click_tag** | **String** | Tag applied to a contact when they click a tracked link (requires linkTracking). Empty string clears it. | [optional] |
21
+ | **also_match_in_dms** | **Boolean** | Also fire these keywords on a plain inbound DM. Enabling it requires the automation to end up with at least one keyword (this request's keywords if you send them, otherwise the stored ones) and is rejected on story_reply automations. | [optional] |
21
22
  | **dm_delay_seconds** | **Integer** | Seconds to wait after the trigger before sending the DM. Send 0 to clear the delay and reply immediately. | [optional] |
22
23
  | **comment_reply_delay_seconds** | **Integer** | Seconds to wait before posting the public comment reply. Send 0 to clear it. The reply never goes out before the DM. | [optional] |
23
24
  | **audience** | [**CommentAutomationAudience**](CommentAutomationAudience.md) | | [optional] |
@@ -44,6 +45,7 @@ instance = Zernio::UpdateCommentAutomationRequest.new(
44
45
  comment_reply_variations: null,
45
46
  link_tracking: null,
46
47
  click_tag: null,
48
+ also_match_in_dms: null,
47
49
  dm_delay_seconds: null,
48
50
  comment_reply_delay_seconds: null,
49
51
  audience: null,
@@ -20,7 +20,7 @@ module Zernio
20
20
  @api_client = api_client
21
21
  end
22
22
  # Create comment-to-DM automation
23
- # Create a keyword-triggered DM automation on an Instagram or Facebook account. When someone comments a matching keyword (or, with `trigger: story_reply`, replies to your Instagram story with one), they automatically receive a DM. Triggers (`trigger`): * `comment` (default): fires on keyword comments on a post or reel. * `story_reply`: fires when someone replies to your Instagram story with a keyword, and answers them with a DM. Set `platformPostId` to a story media id to scope to one story, or omit it to match replies to any story. Targeting (comment trigger): * Per-post: set `platformPostId` to scope to one specific post (only one active per-post automation is allowed per post). * Account-wide (\"any post\"): omit `platformPostId` (and `postId`). The automation evaluates every comment on every post on the account. You can stack unlimited account-wide automations, each with its own keyword set, and they all run independently. Per-post automations take priority on their post. Audience (`audience`, Instagram only): restrict the automation to followers or non-followers, and/or to accounts above a follower count. Instagram only reveals the follow relationship for people who have messaged the account, so `audience.whenUnknown` decides what happens for everyone else - including `verify`, which sends a one-tap confirmation DM (`followGate`) and then delivers the real DM automatically. People we already know follow you skip the tap entirely. Links in the DM's buttons can be click-tracked (`linkTracking`, on by default) and clickers optionally tagged (`clickTag`) for segmentation. Stats returned include delivered, read, and link clicks.
23
+ # Create a keyword-triggered DM automation on an Instagram or Facebook account. When someone comments a matching keyword (or, with `trigger: story_reply`, replies to your Instagram story with one), they automatically receive a DM. Triggers (`trigger`): * `comment` (default): fires on keyword comments on a post or reel. * `story_reply`: fires when someone replies to your Instagram story with a keyword, and answers them with a DM. Set `platformPostId` to a story media id to scope to one story, or omit it to match replies to any story. Targeting (comment trigger): * Per-post: set `platformPostId` to scope to one specific post (only one active per-post automation is allowed per post). * Account-wide (\"any post\"): omit `platformPostId` (and `postId`). The automation evaluates every comment on every post on the account. You can stack unlimited account-wide automations, each with its own keyword set, and they all run independently. Per-post automations take priority on their post. Audience (`audience`, Instagram only): restrict the automation to followers or non-followers, and/or to accounts above a follower count. Instagram only reveals the follow relationship for people who have messaged the account, so `audience.whenUnknown` decides what happens for everyone else - including `verify`, which sends a one-tap confirmation DM (`followGate`) and then delivers the real DM automatically. People we already know follow you skip the tap entirely. Set `alsoMatchInDms: true` on a `comment` automation to also answer people who send a keyword as a direct message instead of commenting it. One automation then covers both doors, and each door is deduplicated separately (someone who already got the DM from their comment still gets it if they later DM the keyword). Requires at least one keyword. Links in the DM's buttons can be click-tracked (`linkTracking`, on by default) and clickers optionally tagged (`clickTag`) for segmentation. Stats returned include delivered, read, and link clicks.
24
24
  # @param create_comment_automation_request [CreateCommentAutomationRequest]
25
25
  # @param [Hash] opts the optional parameters
26
26
  # @return [CreateCommentAutomation200Response]
@@ -30,7 +30,7 @@ module Zernio
30
30
  end
31
31
 
32
32
  # Create comment-to-DM automation
33
- # Create a keyword-triggered DM automation on an Instagram or Facebook account. When someone comments a matching keyword (or, with `trigger: story_reply`, replies to your Instagram story with one), they automatically receive a DM. Triggers (`trigger`): * `comment` (default): fires on keyword comments on a post or reel. * `story_reply`: fires when someone replies to your Instagram story with a keyword, and answers them with a DM. Set `platformPostId` to a story media id to scope to one story, or omit it to match replies to any story. Targeting (comment trigger): * Per-post: set `platformPostId` to scope to one specific post (only one active per-post automation is allowed per post). * Account-wide (\"any post\"): omit `platformPostId` (and `postId`). The automation evaluates every comment on every post on the account. You can stack unlimited account-wide automations, each with its own keyword set, and they all run independently. Per-post automations take priority on their post. Audience (`audience`, Instagram only): restrict the automation to followers or non-followers, and/or to accounts above a follower count. Instagram only reveals the follow relationship for people who have messaged the account, so `audience.whenUnknown` decides what happens for everyone else - including `verify`, which sends a one-tap confirmation DM (`followGate`) and then delivers the real DM automatically. People we already know follow you skip the tap entirely. Links in the DM's buttons can be click-tracked (`linkTracking`, on by default) and clickers optionally tagged (`clickTag`) for segmentation. Stats returned include delivered, read, and link clicks.
33
+ # Create a keyword-triggered DM automation on an Instagram or Facebook account. When someone comments a matching keyword (or, with `trigger: story_reply`, replies to your Instagram story with one), they automatically receive a DM. Triggers (`trigger`): * `comment` (default): fires on keyword comments on a post or reel. * `story_reply`: fires when someone replies to your Instagram story with a keyword, and answers them with a DM. Set `platformPostId` to a story media id to scope to one story, or omit it to match replies to any story. Targeting (comment trigger): * Per-post: set `platformPostId` to scope to one specific post (only one active per-post automation is allowed per post). * Account-wide (\"any post\"): omit `platformPostId` (and `postId`). The automation evaluates every comment on every post on the account. You can stack unlimited account-wide automations, each with its own keyword set, and they all run independently. Per-post automations take priority on their post. Audience (`audience`, Instagram only): restrict the automation to followers or non-followers, and/or to accounts above a follower count. Instagram only reveals the follow relationship for people who have messaged the account, so `audience.whenUnknown` decides what happens for everyone else - including `verify`, which sends a one-tap confirmation DM (`followGate`) and then delivers the real DM automatically. People we already know follow you skip the tap entirely. Set `alsoMatchInDms: true` on a `comment` automation to also answer people who send a keyword as a direct message instead of commenting it. One automation then covers both doors, and each door is deduplicated separately (someone who already got the DM from their comment still gets it if they later DM the keyword). Requires at least one keyword. Links in the DM's buttons can be click-tracked (`linkTracking`, on by default) and clickers optionally tagged (`clickTag`) for segmentation. Stats returned include delivered, read, and link clicks.
34
34
  # @param create_comment_automation_request [CreateCommentAutomationRequest]
35
35
  # @param [Hash] opts the optional parameters
36
36
  # @return [Array<(CreateCommentAutomation200Response, Integer, Hash)>] CreateCommentAutomation200Response data, response status code and response headers
@@ -65,6 +65,9 @@ module Zernio
65
65
 
66
66
  attr_accessor :follow_gate
67
67
 
68
+ # Whether these keywords also fire on a plain inbound DM.
69
+ attr_accessor :also_match_in_dms
70
+
68
71
  attr_accessor :is_active
69
72
 
70
73
  attr_accessor :stats
@@ -117,6 +120,7 @@ module Zernio
117
120
  :'comment_reply_delay_seconds' => :'commentReplyDelaySeconds',
118
121
  :'audience' => :'audience',
119
122
  :'follow_gate' => :'followGate',
123
+ :'also_match_in_dms' => :'alsoMatchInDms',
120
124
  :'is_active' => :'isActive',
121
125
  :'stats' => :'stats',
122
126
  :'created_at' => :'createdAt'
@@ -157,6 +161,7 @@ module Zernio
157
161
  :'comment_reply_delay_seconds' => :'Integer',
158
162
  :'audience' => :'CommentAutomationAudience',
159
163
  :'follow_gate' => :'CommentAutomationFollowGate',
164
+ :'also_match_in_dms' => :'Boolean',
160
165
  :'is_active' => :'Boolean',
161
166
  :'stats' => :'CreateCommentAutomation200ResponseAutomationStats',
162
167
  :'created_at' => :'Time'
@@ -280,6 +285,10 @@ module Zernio
280
285
  self.follow_gate = attributes[:'follow_gate']
281
286
  end
282
287
 
288
+ if attributes.key?(:'also_match_in_dms')
289
+ self.also_match_in_dms = attributes[:'also_match_in_dms']
290
+ end
291
+
283
292
  if attributes.key?(:'is_active')
284
293
  self.is_active = attributes[:'is_active']
285
294
  end
@@ -358,6 +367,7 @@ module Zernio
358
367
  comment_reply_delay_seconds == o.comment_reply_delay_seconds &&
359
368
  audience == o.audience &&
360
369
  follow_gate == o.follow_gate &&
370
+ also_match_in_dms == o.also_match_in_dms &&
361
371
  is_active == o.is_active &&
362
372
  stats == o.stats &&
363
373
  created_at == o.created_at
@@ -372,7 +382,7 @@ module Zernio
372
382
  # Calculates hash code according to all attributes.
373
383
  # @return [Integer] Hash code
374
384
  def hash
375
- [id, name, platform, trigger, platform_post_id, keywords, match_mode, exclude_keywords, typo_tolerance, dm_message, buttons, template, comment_reply, dm_message_variations, comment_reply_variations, link_tracking, click_tag, dm_delay_seconds, comment_reply_delay_seconds, audience, follow_gate, is_active, stats, created_at].hash
385
+ [id, name, platform, trigger, platform_post_id, keywords, match_mode, exclude_keywords, typo_tolerance, dm_message, buttons, template, comment_reply, dm_message_variations, comment_reply_variations, link_tracking, click_tag, dm_delay_seconds, comment_reply_delay_seconds, audience, follow_gate, also_match_in_dms, is_active, stats, created_at].hash
376
386
  end
377
387
 
378
388
  # Builds the object from hash
@@ -77,6 +77,9 @@ module Zernio
77
77
  # Seconds to wait before posting the public comment reply. Omit or send 0 to post it right after the DM (the default). The reply never goes out before the DM, so a value below dmDelaySeconds is raised to it. Ignored when trigger=story_reply, which has no public reply.
78
78
  attr_accessor :comment_reply_delay_seconds
79
79
 
80
+ # Also fire these keywords on a plain inbound DM, so the automation answers people who message the keyword instead of commenting it. Requires at least one keyword (an empty keyword list means 'match anything', which would answer every inbound message) and is rejected on story_reply automations, which already trigger on DMs. Dedup is per door: a contact who already received the DM from their comment can still receive it from a DM.
81
+ attr_accessor :also_match_in_dms
82
+
80
83
  attr_accessor :audience
81
84
 
82
85
  attr_accessor :follow_gate
@@ -127,6 +130,7 @@ module Zernio
127
130
  :'click_tag' => :'clickTag',
128
131
  :'dm_delay_seconds' => :'dmDelaySeconds',
129
132
  :'comment_reply_delay_seconds' => :'commentReplyDelaySeconds',
133
+ :'also_match_in_dms' => :'alsoMatchInDms',
130
134
  :'audience' => :'audience',
131
135
  :'follow_gate' => :'followGate'
132
136
  }
@@ -166,6 +170,7 @@ module Zernio
166
170
  :'click_tag' => :'String',
167
171
  :'dm_delay_seconds' => :'Integer',
168
172
  :'comment_reply_delay_seconds' => :'Integer',
173
+ :'also_match_in_dms' => :'Boolean',
169
174
  :'audience' => :'CommentAutomationAudience',
170
175
  :'follow_gate' => :'CommentAutomationFollowGate'
171
176
  }
@@ -302,6 +307,12 @@ module Zernio
302
307
  self.comment_reply_delay_seconds = attributes[:'comment_reply_delay_seconds']
303
308
  end
304
309
 
310
+ if attributes.key?(:'also_match_in_dms')
311
+ self.also_match_in_dms = attributes[:'also_match_in_dms']
312
+ else
313
+ self.also_match_in_dms = false
314
+ end
315
+
305
316
  if attributes.key?(:'audience')
306
317
  self.audience = attributes[:'audience']
307
318
  end
@@ -549,6 +560,7 @@ module Zernio
549
560
  click_tag == o.click_tag &&
550
561
  dm_delay_seconds == o.dm_delay_seconds &&
551
562
  comment_reply_delay_seconds == o.comment_reply_delay_seconds &&
563
+ also_match_in_dms == o.also_match_in_dms &&
552
564
  audience == o.audience &&
553
565
  follow_gate == o.follow_gate
554
566
  end
@@ -562,7 +574,7 @@ module Zernio
562
574
  # Calculates hash code according to all attributes.
563
575
  # @return [Integer] Hash code
564
576
  def hash
565
- [profile_id, account_id, trigger, platform_post_id, post_id, post_title, name, keywords, match_mode, exclude_keywords, typo_tolerance, dm_message, buttons, template, comment_reply, dm_message_variations, comment_reply_variations, link_tracking, click_tag, dm_delay_seconds, comment_reply_delay_seconds, audience, follow_gate].hash
577
+ [profile_id, account_id, trigger, platform_post_id, post_id, post_title, name, keywords, match_mode, exclude_keywords, typo_tolerance, dm_message, buttons, template, comment_reply, dm_message_variations, comment_reply_variations, link_tracking, click_tag, dm_delay_seconds, comment_reply_delay_seconds, also_match_in_dms, audience, follow_gate].hash
566
578
  end
567
579
 
568
580
  # Builds the object from hash
@@ -71,6 +71,9 @@ module Zernio
71
71
 
72
72
  attr_accessor :follow_gate
73
73
 
74
+ # Whether these keywords also fire on a plain inbound DM.
75
+ attr_accessor :also_match_in_dms
76
+
74
77
  attr_accessor :is_active
75
78
 
76
79
  attr_accessor :stats
@@ -128,6 +131,7 @@ module Zernio
128
131
  :'comment_reply_delay_seconds' => :'commentReplyDelaySeconds',
129
132
  :'audience' => :'audience',
130
133
  :'follow_gate' => :'followGate',
134
+ :'also_match_in_dms' => :'alsoMatchInDms',
131
135
  :'is_active' => :'isActive',
132
136
  :'stats' => :'stats',
133
137
  :'created_at' => :'createdAt',
@@ -172,6 +176,7 @@ module Zernio
172
176
  :'comment_reply_delay_seconds' => :'Integer',
173
177
  :'audience' => :'CommentAutomationAudience',
174
178
  :'follow_gate' => :'CommentAutomationFollowGate',
179
+ :'also_match_in_dms' => :'Boolean',
175
180
  :'is_active' => :'Boolean',
176
181
  :'stats' => :'CreateCommentAutomation200ResponseAutomationStats',
177
182
  :'created_at' => :'Time',
@@ -308,6 +313,10 @@ module Zernio
308
313
  self.follow_gate = attributes[:'follow_gate']
309
314
  end
310
315
 
316
+ if attributes.key?(:'also_match_in_dms')
317
+ self.also_match_in_dms = attributes[:'also_match_in_dms']
318
+ end
319
+
311
320
  if attributes.key?(:'is_active')
312
321
  self.is_active = attributes[:'is_active']
313
322
  end
@@ -393,6 +402,7 @@ module Zernio
393
402
  comment_reply_delay_seconds == o.comment_reply_delay_seconds &&
394
403
  audience == o.audience &&
395
404
  follow_gate == o.follow_gate &&
405
+ also_match_in_dms == o.also_match_in_dms &&
396
406
  is_active == o.is_active &&
397
407
  stats == o.stats &&
398
408
  created_at == o.created_at &&
@@ -408,7 +418,7 @@ module Zernio
408
418
  # Calculates hash code according to all attributes.
409
419
  # @return [Integer] Hash code
410
420
  def hash
411
- [id, name, platform, trigger, account_id, platform_post_id, post_id, post_title, keywords, match_mode, exclude_keywords, typo_tolerance, dm_message, buttons, template, comment_reply, dm_message_variations, comment_reply_variations, link_tracking, click_tag, dm_delay_seconds, comment_reply_delay_seconds, audience, follow_gate, is_active, stats, created_at, updated_at].hash
421
+ [id, name, platform, trigger, account_id, platform_post_id, post_id, post_title, keywords, match_mode, exclude_keywords, typo_tolerance, dm_message, buttons, template, comment_reply, dm_message_variations, comment_reply_variations, link_tracking, click_tag, dm_delay_seconds, comment_reply_delay_seconds, audience, follow_gate, also_match_in_dms, is_active, stats, created_at, updated_at].hash
412
422
  end
413
423
 
414
424
  # Builds the object from hash
@@ -25,6 +25,9 @@ module Zernio
25
25
 
26
26
  attr_accessor :comment_text
27
27
 
28
+ # Which door triggered this send. Absent on rows written before this field existed (all of those are comment-triggered).
29
+ attr_accessor :source
30
+
28
31
  # DM outcome. 'pending' = the automation has a dmDelaySeconds and the response is queued but not sent yet. 'gated' = the follow-gate confirmation DM went out and we are waiting for the tap; it flips to 'sent' or 'skipped' when they tap.
29
32
  attr_accessor :status
30
33
 
@@ -80,6 +83,7 @@ module Zernio
80
83
  :'commenter_id' => :'commenterId',
81
84
  :'commenter_name' => :'commenterName',
82
85
  :'comment_text' => :'commentText',
86
+ :'source' => :'source',
83
87
  :'status' => :'status',
84
88
  :'audience_outcome' => :'audienceOutcome',
85
89
  :'commenter_is_follower' => :'commenterIsFollower',
@@ -110,6 +114,7 @@ module Zernio
110
114
  :'commenter_id' => :'String',
111
115
  :'commenter_name' => :'String',
112
116
  :'comment_text' => :'String',
117
+ :'source' => :'String',
113
118
  :'status' => :'String',
114
119
  :'audience_outcome' => :'String',
115
120
  :'commenter_is_follower' => :'Boolean',
@@ -164,6 +169,10 @@ module Zernio
164
169
  self.comment_text = attributes[:'comment_text']
165
170
  end
166
171
 
172
+ if attributes.key?(:'source')
173
+ self.source = attributes[:'source']
174
+ end
175
+
167
176
  if attributes.key?(:'status')
168
177
  self.status = attributes[:'status']
169
178
  end
@@ -213,6 +222,8 @@ module Zernio
213
222
  # @return true if the model is valid
214
223
  def valid?
215
224
  warn '[DEPRECATED] the `valid?` method is obsolete'
225
+ source_validator = EnumAttributeValidator.new('String', ["comment", "story_reply", "dm"])
226
+ return false unless source_validator.valid?(@source)
216
227
  status_validator = EnumAttributeValidator.new('String', ["pending", "sent", "failed", "skipped", "gated"])
217
228
  return false unless status_validator.valid?(@status)
218
229
  audience_outcome_validator = EnumAttributeValidator.new('String', ["passed", "blocked", "gate_sent", "gate_passed", "gate_failed"])
@@ -222,6 +233,16 @@ module Zernio
222
233
  true
223
234
  end
224
235
 
236
+ # Custom attribute writer method checking allowed values (enum).
237
+ # @param [Object] source Object to be assigned
238
+ def source=(source)
239
+ validator = EnumAttributeValidator.new('String', ["comment", "story_reply", "dm"])
240
+ unless validator.valid?(source)
241
+ fail ArgumentError, "invalid value for \"source\", must be one of #{validator.allowable_values}."
242
+ end
243
+ @source = source
244
+ end
245
+
225
246
  # Custom attribute writer method checking allowed values (enum).
226
247
  # @param [Object] status Object to be assigned
227
248
  def status=(status)
@@ -262,6 +283,7 @@ module Zernio
262
283
  commenter_id == o.commenter_id &&
263
284
  commenter_name == o.commenter_name &&
264
285
  comment_text == o.comment_text &&
286
+ source == o.source &&
265
287
  status == o.status &&
266
288
  audience_outcome == o.audience_outcome &&
267
289
  commenter_is_follower == o.commenter_is_follower &&
@@ -282,7 +304,7 @@ module Zernio
282
304
  # Calculates hash code according to all attributes.
283
305
  # @return [Integer] Hash code
284
306
  def hash
285
- [id, comment_id, commenter_id, commenter_name, comment_text, status, audience_outcome, commenter_is_follower, commenter_follower_count, error, comment_reply_status, comment_reply_error, next_due_at, created_at].hash
307
+ [id, comment_id, commenter_id, commenter_name, comment_text, source, status, audience_outcome, commenter_is_follower, commenter_follower_count, error, comment_reply_status, comment_reply_error, next_due_at, created_at].hash
286
308
  end
287
309
 
288
310
  # Builds the object from hash
@@ -67,6 +67,9 @@ module Zernio
67
67
  # Seconds waited before the public reply is posted. Absent when it follows the DM immediately.
68
68
  attr_accessor :comment_reply_delay_seconds
69
69
 
70
+ # Whether these keywords also fire on a plain inbound DM.
71
+ attr_accessor :also_match_in_dms
72
+
70
73
  attr_accessor :is_active
71
74
 
72
75
  attr_accessor :stats
@@ -119,6 +122,7 @@ module Zernio
119
122
  :'click_tag' => :'clickTag',
120
123
  :'dm_delay_seconds' => :'dmDelaySeconds',
121
124
  :'comment_reply_delay_seconds' => :'commentReplyDelaySeconds',
125
+ :'also_match_in_dms' => :'alsoMatchInDms',
122
126
  :'is_active' => :'isActive',
123
127
  :'stats' => :'stats',
124
128
  :'created_at' => :'createdAt'
@@ -159,6 +163,7 @@ module Zernio
159
163
  :'click_tag' => :'String',
160
164
  :'dm_delay_seconds' => :'Integer',
161
165
  :'comment_reply_delay_seconds' => :'Integer',
166
+ :'also_match_in_dms' => :'Boolean',
162
167
  :'is_active' => :'Boolean',
163
168
  :'stats' => :'ListCommentAutomations200ResponseAutomationsInnerStats',
164
169
  :'created_at' => :'Time'
@@ -281,6 +286,10 @@ module Zernio
281
286
  self.comment_reply_delay_seconds = attributes[:'comment_reply_delay_seconds']
282
287
  end
283
288
 
289
+ if attributes.key?(:'also_match_in_dms')
290
+ self.also_match_in_dms = attributes[:'also_match_in_dms']
291
+ end
292
+
284
293
  if attributes.key?(:'is_active')
285
294
  self.is_active = attributes[:'is_active']
286
295
  end
@@ -371,6 +380,7 @@ module Zernio
371
380
  click_tag == o.click_tag &&
372
381
  dm_delay_seconds == o.dm_delay_seconds &&
373
382
  comment_reply_delay_seconds == o.comment_reply_delay_seconds &&
383
+ also_match_in_dms == o.also_match_in_dms &&
374
384
  is_active == o.is_active &&
375
385
  stats == o.stats &&
376
386
  created_at == o.created_at
@@ -385,7 +395,7 @@ module Zernio
385
395
  # Calculates hash code according to all attributes.
386
396
  # @return [Integer] Hash code
387
397
  def hash
388
- [id, name, platform, trigger, account_id, platform_post_id, post_title, keywords, match_mode, exclude_keywords, typo_tolerance, dm_message, buttons, template, comment_reply, dm_message_variations, comment_reply_variations, link_tracking, click_tag, dm_delay_seconds, comment_reply_delay_seconds, is_active, stats, created_at].hash
398
+ [id, name, platform, trigger, account_id, platform_post_id, post_title, keywords, match_mode, exclude_keywords, typo_tolerance, dm_message, buttons, template, comment_reply, dm_message_variations, comment_reply_variations, link_tracking, click_tag, dm_delay_seconds, comment_reply_delay_seconds, also_match_in_dms, is_active, stats, created_at].hash
389
399
  end
390
400
 
391
401
  # Builds the object from hash
@@ -49,6 +49,9 @@ module Zernio
49
49
 
50
50
  attr_accessor :follow_gate
51
51
 
52
+ # Whether these keywords also fire on a plain inbound DM.
53
+ attr_accessor :also_match_in_dms
54
+
52
55
  attr_accessor :is_active
53
56
 
54
57
  attr_accessor :updated_at
@@ -92,6 +95,7 @@ module Zernio
92
95
  :'comment_reply_variations' => :'commentReplyVariations',
93
96
  :'audience' => :'audience',
94
97
  :'follow_gate' => :'followGate',
98
+ :'also_match_in_dms' => :'alsoMatchInDms',
95
99
  :'is_active' => :'isActive',
96
100
  :'updated_at' => :'updatedAt'
97
101
  }
@@ -124,6 +128,7 @@ module Zernio
124
128
  :'comment_reply_variations' => :'Array<String>',
125
129
  :'audience' => :'CommentAutomationAudience',
126
130
  :'follow_gate' => :'CommentAutomationFollowGate',
131
+ :'also_match_in_dms' => :'Boolean',
127
132
  :'is_active' => :'Boolean',
128
133
  :'updated_at' => :'Time'
129
134
  }
@@ -218,6 +223,10 @@ module Zernio
218
223
  self.follow_gate = attributes[:'follow_gate']
219
224
  end
220
225
 
226
+ if attributes.key?(:'also_match_in_dms')
227
+ self.also_match_in_dms = attributes[:'also_match_in_dms']
228
+ end
229
+
221
230
  if attributes.key?(:'is_active')
222
231
  self.is_active = attributes[:'is_active']
223
232
  end
@@ -273,6 +282,7 @@ module Zernio
273
282
  comment_reply_variations == o.comment_reply_variations &&
274
283
  audience == o.audience &&
275
284
  follow_gate == o.follow_gate &&
285
+ also_match_in_dms == o.also_match_in_dms &&
276
286
  is_active == o.is_active &&
277
287
  updated_at == o.updated_at
278
288
  end
@@ -286,7 +296,7 @@ module Zernio
286
296
  # Calculates hash code according to all attributes.
287
297
  # @return [Integer] Hash code
288
298
  def hash
289
- [id, name, keywords, match_mode, exclude_keywords, typo_tolerance, dm_message, buttons, template, comment_reply, dm_message_variations, comment_reply_variations, audience, follow_gate, is_active, updated_at].hash
299
+ [id, name, keywords, match_mode, exclude_keywords, typo_tolerance, dm_message, buttons, template, comment_reply, dm_message_variations, comment_reply_variations, audience, follow_gate, also_match_in_dms, is_active, updated_at].hash
290
300
  end
291
301
 
292
302
  # Builds the object from hash
@@ -52,6 +52,9 @@ module Zernio
52
52
  # Tag applied to a contact when they click a tracked link (requires linkTracking). Empty string clears it.
53
53
  attr_accessor :click_tag
54
54
 
55
+ # Also fire these keywords on a plain inbound DM. Enabling it requires the automation to end up with at least one keyword (this request's keywords if you send them, otherwise the stored ones) and is rejected on story_reply automations.
56
+ attr_accessor :also_match_in_dms
57
+
55
58
  # Seconds to wait after the trigger before sending the DM. Send 0 to clear the delay and reply immediately.
56
59
  attr_accessor :dm_delay_seconds
57
60
 
@@ -103,6 +106,7 @@ module Zernio
103
106
  :'comment_reply_variations' => :'commentReplyVariations',
104
107
  :'link_tracking' => :'linkTracking',
105
108
  :'click_tag' => :'clickTag',
109
+ :'also_match_in_dms' => :'alsoMatchInDms',
106
110
  :'dm_delay_seconds' => :'dmDelaySeconds',
107
111
  :'comment_reply_delay_seconds' => :'commentReplyDelaySeconds',
108
112
  :'audience' => :'audience',
@@ -138,6 +142,7 @@ module Zernio
138
142
  :'comment_reply_variations' => :'Array<String>',
139
143
  :'link_tracking' => :'Boolean',
140
144
  :'click_tag' => :'String',
145
+ :'also_match_in_dms' => :'Boolean',
141
146
  :'dm_delay_seconds' => :'Integer',
142
147
  :'comment_reply_delay_seconds' => :'Integer',
143
148
  :'audience' => :'CommentAutomationAudience',
@@ -235,6 +240,10 @@ module Zernio
235
240
  self.click_tag = attributes[:'click_tag']
236
241
  end
237
242
 
243
+ if attributes.key?(:'also_match_in_dms')
244
+ self.also_match_in_dms = attributes[:'also_match_in_dms']
245
+ end
246
+
238
247
  if attributes.key?(:'dm_delay_seconds')
239
248
  self.dm_delay_seconds = attributes[:'dm_delay_seconds']
240
249
  end
@@ -427,6 +436,7 @@ module Zernio
427
436
  comment_reply_variations == o.comment_reply_variations &&
428
437
  link_tracking == o.link_tracking &&
429
438
  click_tag == o.click_tag &&
439
+ also_match_in_dms == o.also_match_in_dms &&
430
440
  dm_delay_seconds == o.dm_delay_seconds &&
431
441
  comment_reply_delay_seconds == o.comment_reply_delay_seconds &&
432
442
  audience == o.audience &&
@@ -443,7 +453,7 @@ module Zernio
443
453
  # Calculates hash code according to all attributes.
444
454
  # @return [Integer] Hash code
445
455
  def hash
446
- [name, trigger, keywords, match_mode, exclude_keywords, typo_tolerance, dm_message, buttons, template, comment_reply, dm_message_variations, comment_reply_variations, link_tracking, click_tag, dm_delay_seconds, comment_reply_delay_seconds, audience, follow_gate, is_active].hash
456
+ [name, trigger, keywords, match_mode, exclude_keywords, typo_tolerance, dm_message, buttons, template, comment_reply, dm_message_variations, comment_reply_variations, link_tracking, click_tag, also_match_in_dms, dm_delay_seconds, comment_reply_delay_seconds, audience, follow_gate, is_active].hash
447
457
  end
448
458
 
449
459
  # 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.699'
14
+ VERSION = '0.0.700'
15
15
  end
data/openapi.yaml CHANGED
@@ -36147,6 +36147,7 @@ paths:
36147
36147
  clickTag: { type: string, description: "Tag applied to a contact when they click a tracked link." }
36148
36148
  dmDelaySeconds: { type: integer, description: "Seconds waited after the trigger before the DM is sent. Absent when the DM goes out immediately." }
36149
36149
  commentReplyDelaySeconds: { type: integer, description: "Seconds waited before the public reply is posted. Absent when it follows the DM immediately." }
36150
+ alsoMatchInDms: { type: boolean, description: "Whether these keywords also fire on a plain inbound DM." }
36150
36151
  isActive: { type: boolean }
36151
36152
  stats:
36152
36153
  type: object
@@ -36194,6 +36195,12 @@ paths:
36194
36195
  confirmation DM (`followGate`) and then delivers the real DM automatically. People we
36195
36196
  already know follow you skip the tap entirely.
36196
36197
 
36198
+ Set `alsoMatchInDms: true` on a `comment` automation to also answer people who send
36199
+ a keyword as a direct message instead of commenting it. One automation then covers
36200
+ both doors, and each door is deduplicated separately (someone who already got the DM
36201
+ from their comment still gets it if they later DM the keyword). Requires at least one
36202
+ keyword.
36203
+
36197
36204
  Links in the DM's buttons can be click-tracked (`linkTracking`, on by default) and
36198
36205
  clickers optionally tagged (`clickTag`) for segmentation. Stats returned include
36199
36206
  delivered, read, and link clicks.
@@ -36245,6 +36252,7 @@ paths:
36245
36252
  clickTag: { type: string, description: "Optional tag applied to a contact when they click a tracked link (requires linkTracking). Lets you segment clickers for broadcasts/sequences." }
36246
36253
  dmDelaySeconds: { type: integer, minimum: 0, maximum: 86400, description: "Seconds to wait after the trigger before sending the DM. Omit or send 0 to reply immediately (the default). Max 86400 (24h). The trigger is still matched and deduplicated the moment the comment arrives, so a delay only moves when the response is sent." }
36247
36254
  commentReplyDelaySeconds: { type: integer, minimum: 0, maximum: 86400, description: "Seconds to wait before posting the public comment reply. Omit or send 0 to post it right after the DM (the default). The reply never goes out before the DM, so a value below dmDelaySeconds is raised to it. Ignored when trigger=story_reply, which has no public reply." }
36255
+ alsoMatchInDms: { type: boolean, default: false, description: "Also fire these keywords on a plain inbound DM, so the automation answers people who message the keyword instead of commenting it. Requires at least one keyword (an empty keyword list means 'match anything', which would answer every inbound message) and is rejected on story_reply automations, which already trigger on DMs. Dedup is per door: a contact who already received the DM from their comment can still receive it from a DM." }
36248
36256
  audience: { $ref: '#/components/schemas/CommentAutomationAudience' }
36249
36257
  followGate: { $ref: '#/components/schemas/CommentAutomationFollowGate' }
36250
36258
  responses:
@@ -36284,6 +36292,7 @@ paths:
36284
36292
  commentReplyDelaySeconds: { type: integer, description: "Seconds waited before the public reply is posted. Absent when it follows the DM immediately." }
36285
36293
  audience: { $ref: '#/components/schemas/CommentAutomationAudience' }
36286
36294
  followGate: { $ref: '#/components/schemas/CommentAutomationFollowGate' }
36295
+ alsoMatchInDms: { type: boolean, description: "Whether these keywords also fire on a plain inbound DM." }
36287
36296
  isActive: { type: boolean }
36288
36297
  stats: { type: object, properties: { totalTriggered: { type: integer }, totalSent: { type: integer }, totalFailed: { type: integer } } }
36289
36298
  createdAt: { type: string, format: date-time }
@@ -36342,6 +36351,7 @@ paths:
36342
36351
  commentReplyDelaySeconds: { type: integer, description: "Seconds waited before the public reply is posted. Absent when it follows the DM immediately." }
36343
36352
  audience: { $ref: '#/components/schemas/CommentAutomationAudience' }
36344
36353
  followGate: { $ref: '#/components/schemas/CommentAutomationFollowGate' }
36354
+ alsoMatchInDms: { type: boolean, description: "Whether these keywords also fire on a plain inbound DM." }
36345
36355
  isActive: { type: boolean }
36346
36356
  stats: { type: object, properties: { totalTriggered: { type: integer }, totalSent: { type: integer }, totalFailed: { type: integer } } }
36347
36357
  createdAt: { type: string, format: date-time }
@@ -36356,6 +36366,7 @@ paths:
36356
36366
  commenterId: { type: string }
36357
36367
  commenterName: { type: string }
36358
36368
  commentText: { type: string }
36369
+ source: { type: string, enum: [comment, story_reply, dm], description: "Which door triggered this send. Absent on rows written before this field existed (all of those are comment-triggered)." }
36359
36370
  status: { type: string, enum: [pending, sent, failed, skipped, gated], description: "DM outcome. 'pending' = the automation has a dmDelaySeconds and the response is queued but not sent yet. 'gated' = the follow-gate confirmation DM went out and we are waiting for the tap; it flips to 'sent' or 'skipped' when they tap." }
36360
36371
  audienceOutcome: { type: string, enum: [passed, blocked, gate_sent, gate_passed, gate_failed], description: "How the audience rule resolved. Absent on automations without one." }
36361
36372
  commenterIsFollower: { type: boolean, description: "Follow relationship at decision time. Absent when Instagram would not tell us (the commenter never messaged the account)." }
@@ -36416,6 +36427,7 @@ paths:
36416
36427
  description: "Alternate public replies for random rotation. Pass [] to clear."
36417
36428
  linkTracking: { type: boolean, description: "Wrap link buttons in a tracked redirect to count clicks. Pass false to send links untouched." }
36418
36429
  clickTag: { type: string, description: "Tag applied to a contact when they click a tracked link (requires linkTracking). Empty string clears it." }
36430
+ alsoMatchInDms: { type: boolean, description: "Also fire these keywords on a plain inbound DM. Enabling it requires the automation to end up with at least one keyword (this request's keywords if you send them, otherwise the stored ones) and is rejected on story_reply automations." }
36419
36431
  dmDelaySeconds: { type: integer, minimum: 0, maximum: 86400, description: "Seconds to wait after the trigger before sending the DM. Send 0 to clear the delay and reply immediately." }
36420
36432
  commentReplyDelaySeconds: { type: integer, minimum: 0, maximum: 86400, description: "Seconds to wait before posting the public comment reply. Send 0 to clear it. The reply never goes out before the DM." }
36421
36433
  audience: { $ref: '#/components/schemas/CommentAutomationAudience' }
@@ -36451,6 +36463,7 @@ paths:
36451
36463
  commentReplyVariations: { type: array, items: { type: string }, description: "Alternate public replies rotated at random with commentReply. Omitted when none." }
36452
36464
  audience: { $ref: '#/components/schemas/CommentAutomationAudience' }
36453
36465
  followGate: { $ref: '#/components/schemas/CommentAutomationFollowGate' }
36466
+ alsoMatchInDms: { type: boolean, description: "Whether these keywords also fire on a plain inbound DM." }
36454
36467
  isActive: { type: boolean }
36455
36468
  updatedAt: { type: string, format: date-time }
36456
36469
  '401': { $ref: '#/components/responses/Unauthorized' }
@@ -36503,6 +36516,7 @@ paths:
36503
36516
  commenterId: { type: string }
36504
36517
  commenterName: { type: string }
36505
36518
  commentText: { type: string }
36519
+ source: { type: string, enum: [comment, story_reply, dm], description: "Which door triggered this send. Absent on rows written before this field existed (all of those are comment-triggered)." }
36506
36520
  status: { type: string, enum: [pending, sent, failed, skipped, gated], description: "DM outcome. 'pending' = the automation has a dmDelaySeconds and the response is queued but not sent yet. 'gated' = the follow-gate confirmation DM went out and we are waiting for the tap; it flips to 'sent' or 'skipped' when they tap." }
36507
36521
  audienceOutcome: { type: string, enum: [passed, blocked, gate_sent, gate_passed, gate_failed], description: "How the audience rule resolved. Absent on automations without one." }
36508
36522
  commenterIsFollower: { type: boolean, description: "Follow relationship at decision time. Absent when Instagram would not tell us (the commenter never messaged the account)." }
@@ -34,7 +34,7 @@ describe 'CommentAutomationsApi' do
34
34
 
35
35
  # unit tests for create_comment_automation
36
36
  # Create comment-to-DM automation
37
- # Create a keyword-triggered DM automation on an Instagram or Facebook account. When someone comments a matching keyword (or, with &#x60;trigger: story_reply&#x60;, replies to your Instagram story with one), they automatically receive a DM. Triggers (&#x60;trigger&#x60;): * &#x60;comment&#x60; (default): fires on keyword comments on a post or reel. * &#x60;story_reply&#x60;: fires when someone replies to your Instagram story with a keyword, and answers them with a DM. Set &#x60;platformPostId&#x60; to a story media id to scope to one story, or omit it to match replies to any story. Targeting (comment trigger): * Per-post: set &#x60;platformPostId&#x60; to scope to one specific post (only one active per-post automation is allowed per post). * Account-wide (\&quot;any post\&quot;): omit &#x60;platformPostId&#x60; (and &#x60;postId&#x60;). The automation evaluates every comment on every post on the account. You can stack unlimited account-wide automations, each with its own keyword set, and they all run independently. Per-post automations take priority on their post. Audience (&#x60;audience&#x60;, Instagram only): restrict the automation to followers or non-followers, and/or to accounts above a follower count. Instagram only reveals the follow relationship for people who have messaged the account, so &#x60;audience.whenUnknown&#x60; decides what happens for everyone else - including &#x60;verify&#x60;, which sends a one-tap confirmation DM (&#x60;followGate&#x60;) and then delivers the real DM automatically. People we already know follow you skip the tap entirely. Links in the DM&#39;s buttons can be click-tracked (&#x60;linkTracking&#x60;, on by default) and clickers optionally tagged (&#x60;clickTag&#x60;) for segmentation. Stats returned include delivered, read, and link clicks.
37
+ # Create a keyword-triggered DM automation on an Instagram or Facebook account. When someone comments a matching keyword (or, with &#x60;trigger: story_reply&#x60;, replies to your Instagram story with one), they automatically receive a DM. Triggers (&#x60;trigger&#x60;): * &#x60;comment&#x60; (default): fires on keyword comments on a post or reel. * &#x60;story_reply&#x60;: fires when someone replies to your Instagram story with a keyword, and answers them with a DM. Set &#x60;platformPostId&#x60; to a story media id to scope to one story, or omit it to match replies to any story. Targeting (comment trigger): * Per-post: set &#x60;platformPostId&#x60; to scope to one specific post (only one active per-post automation is allowed per post). * Account-wide (\&quot;any post\&quot;): omit &#x60;platformPostId&#x60; (and &#x60;postId&#x60;). The automation evaluates every comment on every post on the account. You can stack unlimited account-wide automations, each with its own keyword set, and they all run independently. Per-post automations take priority on their post. Audience (&#x60;audience&#x60;, Instagram only): restrict the automation to followers or non-followers, and/or to accounts above a follower count. Instagram only reveals the follow relationship for people who have messaged the account, so &#x60;audience.whenUnknown&#x60; decides what happens for everyone else - including &#x60;verify&#x60;, which sends a one-tap confirmation DM (&#x60;followGate&#x60;) and then delivers the real DM automatically. People we already know follow you skip the tap entirely. Set &#x60;alsoMatchInDms: true&#x60; on a &#x60;comment&#x60; automation to also answer people who send a keyword as a direct message instead of commenting it. One automation then covers both doors, and each door is deduplicated separately (someone who already got the DM from their comment still gets it if they later DM the keyword). Requires at least one keyword. Links in the DM&#39;s buttons can be click-tracked (&#x60;linkTracking&#x60;, on by default) and clickers optionally tagged (&#x60;clickTag&#x60;) for segmentation. Stats returned include delivered, read, and link clicks.
38
38
  # @param create_comment_automation_request
39
39
  # @param [Hash] opts the optional parameters
40
40
  # @return [CreateCommentAutomation200Response]
@@ -161,6 +161,12 @@ describe Zernio::CreateCommentAutomation200ResponseAutomation do
161
161
  end
162
162
  end
163
163
 
164
+ describe 'test attribute "also_match_in_dms"' do
165
+ it 'should work' do
166
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
167
+ end
168
+ end
169
+
164
170
  describe 'test attribute "is_active"' do
165
171
  it 'should work' do
166
172
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
@@ -161,6 +161,12 @@ describe Zernio::CreateCommentAutomationRequest do
161
161
  end
162
162
  end
163
163
 
164
+ describe 'test attribute "also_match_in_dms"' do
165
+ it 'should work' do
166
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
167
+ end
168
+ end
169
+
164
170
  describe 'test attribute "audience"' do
165
171
  it 'should work' do
166
172
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
@@ -179,6 +179,12 @@ describe Zernio::GetCommentAutomation200ResponseAutomation do
179
179
  end
180
180
  end
181
181
 
182
+ describe 'test attribute "also_match_in_dms"' do
183
+ it 'should work' do
184
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
185
+ end
186
+ end
187
+
182
188
  describe 'test attribute "is_active"' do
183
189
  it 'should work' do
184
190
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
@@ -57,6 +57,16 @@ describe Zernio::GetCommentAutomation200ResponseLogsInner do
57
57
  end
58
58
  end
59
59
 
60
+ describe 'test attribute "source"' do
61
+ it 'should work' do
62
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
63
+ # validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["comment", "story_reply", "dm"])
64
+ # validator.allowable_values.each do |value|
65
+ # expect { instance.source = value }.not_to raise_error
66
+ # end
67
+ end
68
+ end
69
+
60
70
  describe 'test attribute "status"' do
61
71
  it 'should work' do
62
72
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
@@ -165,6 +165,12 @@ describe Zernio::ListCommentAutomations200ResponseAutomationsInner do
165
165
  end
166
166
  end
167
167
 
168
+ describe 'test attribute "also_match_in_dms"' do
169
+ it 'should work' do
170
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
171
+ end
172
+ end
173
+
168
174
  describe 'test attribute "is_active"' do
169
175
  it 'should work' do
170
176
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
@@ -115,6 +115,12 @@ describe Zernio::UpdateCommentAutomation200ResponseAutomation do
115
115
  end
116
116
  end
117
117
 
118
+ describe 'test attribute "also_match_in_dms"' do
119
+ it 'should work' do
120
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
121
+ end
122
+ end
123
+
118
124
  describe 'test attribute "is_active"' do
119
125
  it 'should work' do
120
126
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
@@ -119,6 +119,12 @@ describe Zernio::UpdateCommentAutomationRequest do
119
119
  end
120
120
  end
121
121
 
122
+ describe 'test attribute "also_match_in_dms"' do
123
+ it 'should work' do
124
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
125
+ end
126
+ end
127
+
122
128
  describe 'test attribute "dm_delay_seconds"' do
123
129
  it 'should work' do
124
130
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: late-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.699
4
+ version: 0.0.700
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenAPI-Generator
@@ -5042,7 +5042,7 @@ files:
5042
5042
  - spec/models/you_tube_video_retention_response_retention_curve_inner_spec.rb
5043
5043
  - spec/models/you_tube_video_retention_response_spec.rb
5044
5044
  - spec/spec_helper.rb
5045
- - zernio-sdk-0.0.699.gem
5045
+ - zernio-sdk-0.0.700.gem
5046
5046
  - zernio-sdk.gemspec
5047
5047
  homepage: https://openapi-generator.tech
5048
5048
  licenses:
Binary file