sentdm 0.46.0 → 0.47.0

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 (33) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -0
  3. data/README.md +1 -1
  4. data/lib/sentdm/client.rb +2 -2
  5. data/lib/sentdm/models/channels/sms_market.rb +1 -11
  6. data/lib/sentdm/models/channels/sms_number.rb +12 -1
  7. data/lib/sentdm/models/channels/supplied_campaign.rb +10 -0
  8. data/lib/sentdm/models/channels/supplied_compliance.rb +27 -1
  9. data/lib/sentdm/models/profiles/brand_campaign.rb +11 -1
  10. data/lib/sentdm/models/voice/call.rb +4 -3
  11. data/lib/sentdm/resources/channels/sms.rb +4 -1
  12. data/lib/sentdm/resources/profiles/campaigns.rb +4 -1
  13. data/lib/sentdm/resources/sender_profiles.rb +5 -3
  14. data/lib/sentdm/resources/voice/calls/participants.rb +5 -5
  15. data/lib/sentdm/version.rb +1 -1
  16. data/lib/sentdm.rb +1 -0
  17. data/rbi/sentdm/client.rbi +2 -2
  18. data/rbi/sentdm/models/channels/sms_market.rbi +0 -12
  19. data/rbi/sentdm/models/channels/sms_number.rbi +14 -0
  20. data/rbi/sentdm/models/channels/supplied_campaign.rbi +13 -0
  21. data/rbi/sentdm/models/channels/supplied_compliance.rbi +40 -0
  22. data/rbi/sentdm/models/profiles/brand_campaign.rbi +15 -0
  23. data/rbi/sentdm/models/voice/call.rbi +8 -6
  24. data/rbi/sentdm/resources/channels/sms.rbi +4 -1
  25. data/rbi/sentdm/resources/profiles/campaigns.rbi +4 -1
  26. data/rbi/sentdm/resources/sender_profiles.rbi +5 -3
  27. data/rbi/sentdm/resources/voice/calls/participants.rbi +5 -5
  28. data/sig/sentdm/models/channels/sms_market.rbs +0 -5
  29. data/sig/sentdm/models/channels/sms_number.rbs +10 -1
  30. data/sig/sentdm/models/channels/supplied_campaign.rbs +9 -0
  31. data/sig/sentdm/models/channels/supplied_compliance.rbs +5 -0
  32. data/sig/sentdm/models/profiles/brand_campaign.rbs +7 -0
  33. metadata +5 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 819f750414001d5ce375dfda603f82bdf86ac538321ad3c9a507211cbf03e961
4
- data.tar.gz: 438e1fa1e2c0dc0566f22a96af84026c640db01e4605635e3156fdfd81c6a0b7
3
+ metadata.gz: 81866d7bc411926fe2b70a49d5e3b2ca9dec43c084502f4ed669a60556296e90
4
+ data.tar.gz: 2563969ae582cec2f89a7e3780d95414282f4ce3c92509508366271735b94006
5
5
  SHA512:
6
- metadata.gz: 31802c8938ba238bae598ec3c37fd21103d8627752dc936f503c33ada9ba8bc7580840db2bb6572b04badc9da775a45eec55820b5b1e675dc20a3b54cfbce6e5
7
- data.tar.gz: 5a9d28dcae2395c7f925a04dd8dc825d0ca2c17df646ade6304a31fd0679ee136af4ff0f01270762cc82d2ab08e3d6b5e5b1beeed3f148576480fffc70bac936
6
+ metadata.gz: 1813be819bf55a241f3ed425b072a38e41979c952339853def9d35c0477fe4df3c1b7a94e038d02d22b91ed71d6e93cfeb12d2564a4c4f336551e5c761a1e81a
7
+ data.tar.gz: ac74075098292c34f86f72c7fbf0b2708f91135a62e27125c73ca0464dcb57dca5ac9020b07d66892fa6dc5a0b9c87f045f53f8a3fcdabdd0988cc0d0fff9d0f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.47.0](https://github.com/sentdm/sent-dm-ruby/compare/v0.46.0...v0.47.0) (2026-11-12)
4
+
5
+
6
+ ### ⚠ BREAKING CHANGES
7
+
8
+ * **api:** sync OpenAPI spec from production
9
+
10
+ ### Features
11
+
12
+ * **api:** sync OpenAPI spec from production ([1403c2d](https://github.com/sentdm/sent-dm-ruby/commit/1403c2d4d4e9ca6cbb853c760ea14475f1da03a6))
13
+
3
14
  ## [0.46.0](https://github.com/sentdm/sent-dm-ruby/compare/v0.45.0...v0.46.0) (2026-11-06)
4
15
 
5
16
 
data/README.md CHANGED
@@ -17,7 +17,7 @@ To use this gem, install via Bundler by adding the following to your application
17
17
  <!-- x-release-please-start-version -->
18
18
 
19
19
  ```ruby
20
- gem "sentdm", "~> 0.46.0"
20
+ gem "sentdm", "~> 0.47.0"
21
21
  ```
22
22
 
23
23
  <!-- x-release-please-end -->
data/lib/sentdm/client.rb CHANGED
@@ -75,8 +75,8 @@ module Sentdm
75
75
  # instead.
76
76
  #
77
77
  # **A sender is the exception.** A brand and a campaign can be inherited; a number
78
- # cannot. A profile either has a sender of its own or terminates through your
79
- # shared routes.
78
+ # cannot. A profile either has a sender of its own or reaches only the countries
79
+ # Sent runs a shared route for, and the US is not one of them.
80
80
  #
81
81
  # To act for a profile on any other resource, send `x-profile-id` with your
82
82
  # organization key rather than looking for a parallel set of endpoints.
@@ -62,14 +62,6 @@ module Sentdm
62
62
  # @return [String, nil]
63
63
  optional :reason_code, String, nil?: true
64
64
 
65
- # @!attribute sender_value
66
- # The sender itself. Null until a carrier-assigned number is procured. For a
67
- # market holding several numbers, the first active one (the first assigned while
68
- # none is active) — every number is in numbers.
69
- #
70
- # @return [String, nil]
71
- optional :sender_value, String, nil?: true
72
-
73
65
  # @!attribute status
74
66
  # Where this market's sender stands, in terms of who is holding it up —
75
67
  # PROVISIONING, ACTION_NEEDED, PENDING_REVIEW or ACTIVE. Read-only.
@@ -88,7 +80,7 @@ module Sentdm
88
80
  # @return [Symbol, Sentdm::Models::Channels::SMSMarket::Status, nil]
89
81
  optional :status, enum: -> { Sentdm::Channels::SMSMarket::Status }, nil?: true
90
82
 
91
- # @!method initialize(compliance: nil, country: nil, number_type: nil, numbers: nil, reason: nil, reason_code: nil, sender_value: nil, status: nil)
83
+ # @!method initialize(compliance: nil, country: nil, number_type: nil, numbers: nil, reason: nil, reason_code: nil, status: nil)
92
84
  # Some parameter documentations has been truncated, see
93
85
  # {Sentdm::Models::Channels::SMSMarket} for more details.
94
86
  #
@@ -112,8 +104,6 @@ module Sentdm
112
104
  #
113
105
  # @param reason_code [String, nil] Why the market is not ACTIVE, as a stable code: an ErrorCodes CHANNEL_xxx value
114
106
  #
115
- # @param sender_value [String, nil] The sender itself. Null until a carrier-assigned number is procured. For a marke
116
- #
117
107
  # @param status [Symbol, Sentdm::Models::Channels::SMSMarket::Status, nil] Where this market's sender stands, in terms of who is holding it up — PROVISIONI
118
108
 
119
109
  # Where this market's sender stands, in terms of who is holding it up —
@@ -11,6 +11,15 @@ module Sentdm
11
11
  # @return [String, nil]
12
12
  optional :area_code, String, nil?: true
13
13
 
14
+ # @!attribute campaign_id
15
+ # The campaign the number is on, or is owed for: the id of its entry in
16
+ # compliance.campaigns. Omitted for a market that registers no campaigns, and
17
+ # where the campaign is not known — a number recorded without one, or one owed on
18
+ # a campaign inherited from the organization.
19
+ #
20
+ # @return [String, nil]
21
+ optional :campaign_id, String, nil?: true
22
+
14
23
  # @!attribute sender_value
15
24
  # The number, or null while it is still to be assigned.
16
25
  #
@@ -24,7 +33,7 @@ module Sentdm
24
33
  # @return [String, nil]
25
34
  optional :status, String, nil?: true
26
35
 
27
- # @!method initialize(area_code: nil, sender_value: nil, status: nil)
36
+ # @!method initialize(area_code: nil, campaign_id: nil, sender_value: nil, status: nil)
28
37
  # Some parameter documentations has been truncated, see
29
38
  # {Sentdm::Models::Channels::SMSNumber} for more details.
30
39
  #
@@ -32,6 +41,8 @@ module Sentdm
32
41
  #
33
42
  # @param area_code [String, nil] The number's area code, e.g. 212. While the number is still to be assigned, the
34
43
  #
44
+ # @param campaign_id [String, nil] The campaign the number is on, or is owed for: the id of its entry in compliance
45
+ #
35
46
  # @param sender_value [String, nil] The number, or null while it is still to be assigned.
36
47
  #
37
48
  # @param status [String, nil] ACTIVE once the number can send; PROVISIONING while it is still to be assigned;
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sentdm
4
+ module Models
5
+ module Channels
6
+ # @type [Sentdm::Internal::Type::Converter]
7
+ SuppliedCampaign = Sentdm::Internal::Type::HashOf[Sentdm::Internal::Type::Unknown]
8
+ end
9
+ end
10
+ end
@@ -40,6 +40,30 @@ module Sentdm
40
40
  # @return [Hash{Symbol=>Object}, nil]
41
41
  optional :campaign, Sentdm::Internal::Type::HashOf[Sentdm::Internal::Type::Unknown], nil?: true
42
42
 
43
+ # @!attribute campaigns
44
+ # Every campaign this market registers, each with inherit saying whose it is —
45
+ # oldest first.
46
+ #
47
+ # A list, because a market can now be on more than one. POST
48
+ # /v3/channels/sms/compliances/US/TEN_DLC/campaigns adds a campaign of the
49
+ # customer's own beside the one it has, and a profile running on its
50
+ # organization's campaign keeps that one when it adds its own. Campaign can only
51
+ # show one of them, so it stays as it was, for callers that read it, and this is
52
+ # where the rest are.
53
+ #
54
+ # The organization's campaign reads "inherit": true and the customer's own read
55
+ # "inherit": false. Each entry is the shape of Campaign plus id, the campaign's
56
+ # own id, so several can be told apart. Campaign carries no id, because it is sent
57
+ # back to PATCH, which refuses a key it does not declare; this list is read-only.
58
+ #
59
+ # Absent for a market that registers with nobody; empty for one that registers and
60
+ # has no campaign yet.
61
+ #
62
+ # @return [Array<Hash{Symbol=>Object}>, nil]
63
+ optional :campaigns,
64
+ Sentdm::Internal::Type::ArrayOf[Sentdm::Internal::Type::HashOf[Sentdm::Internal::Type::Unknown]],
65
+ nil?: true
66
+
43
67
  # @!attribute documents
44
68
  # What has been supplied for this market.
45
69
  #
@@ -56,7 +80,7 @@ module Sentdm
56
80
  -> { Sentdm::Internal::Type::ArrayOf[Sentdm::Channels::SuppliedDocument] },
57
81
  nil?: true
58
82
 
59
- # @!method initialize(brand: nil, campaign: nil, documents: nil)
83
+ # @!method initialize(brand: nil, campaign: nil, campaigns: nil, documents: nil)
60
84
  # Some parameter documentations has been truncated, see
61
85
  # {Sentdm::Models::Channels::SuppliedCompliance} for more details.
62
86
  #
@@ -82,6 +106,8 @@ module Sentdm
82
106
  #
83
107
  # @param campaign [Hash{Symbol=>Object}, nil] The programme this market registers, with inherit saying whose it is.
84
108
  #
109
+ # @param campaigns [Array<Hash{Symbol=>Object}>, nil] Every campaign this market registers, each with inherit saying whose it is — old
110
+ #
85
111
  # @param documents [Array<Sentdm::Models::Channels::SuppliedDocument>, nil] What has been supplied for this market.
86
112
  end
87
113
  end
@@ -72,6 +72,14 @@ module Sentdm
72
72
  # @return [String, nil]
73
73
  optional :help_message, String, api_name: :helpMessage, nil?: true
74
74
 
75
+ # @!attribute is_inherited
76
+ # Whether the campaign is the organization's, which the profile runs on, rather
77
+ # than one of the profile's own. A profile running on its organization's campaign
78
+ # can hold campaigns of its own beside it, and the list returns both.
79
+ #
80
+ # @return [Boolean, nil]
81
+ optional :is_inherited, Sentdm::Internal::Type::Boolean, api_name: :isInherited
82
+
75
83
  # @!attribute message_flow
76
84
  #
77
85
  # @return [String, nil]
@@ -166,7 +174,7 @@ module Sentdm
166
174
  # @return [String, nil]
167
175
  optional :volume, String, nil?: true
168
176
 
169
- # @!method initialize(id: nil, billed_date: nil, brand_id: nil, cost: nil, created_at: nil, customer_id: nil, dca_elections_complete: nil, dca_elections_completed_at: nil, description: nil, has_submission_transaction: nil, help_keywords: nil, help_message: nil, message_flow: nil, name: nil, optin_keywords: nil, optin_message: nil, optout_keywords: nil, optout_message: nil, privacy_policy_link: nil, status: nil, submitted_at: nil, submitted_to_tcr: nil, tcr_campaign_id: nil, tcr_sync_error: nil, terms_and_conditions_link: nil, type: nil, updated_at: nil, use_cases: nil, volume: nil)
177
+ # @!method initialize(id: nil, billed_date: nil, brand_id: nil, cost: nil, created_at: nil, customer_id: nil, dca_elections_complete: nil, dca_elections_completed_at: nil, description: nil, has_submission_transaction: nil, help_keywords: nil, help_message: nil, is_inherited: nil, message_flow: nil, name: nil, optin_keywords: nil, optin_message: nil, optout_keywords: nil, optout_message: nil, privacy_policy_link: nil, status: nil, submitted_at: nil, submitted_to_tcr: nil, tcr_campaign_id: nil, tcr_sync_error: nil, terms_and_conditions_link: nil, type: nil, updated_at: nil, use_cases: nil, volume: nil)
170
178
  # Some parameter documentations has been truncated, see
171
179
  # {Sentdm::Models::Profiles::BrandCampaign} for more details.
172
180
  #
@@ -196,6 +204,8 @@ module Sentdm
196
204
  #
197
205
  # @param help_message [String, nil]
198
206
  #
207
+ # @param is_inherited [Boolean] Whether the campaign is the organization's, which the profile runs on, rather th
208
+ #
199
209
  # @param message_flow [String, nil]
200
210
  #
201
211
  # @param name [String]
@@ -63,9 +63,10 @@ module Sentdm
63
63
 
64
64
  # @!attribute failure_reason
65
65
  # Why the call did not complete: callback_timeout, invalid_answer,
66
- # insufficient_balance, destination_blocked, callback_not_configured, rejected,
67
- # no_answer, or for an agent call agent_busy or agent_unreachable. Null while the
68
- # call is live, when it completed, and when it failed without a recorded reason
66
+ # insufficient_balance, payment_method_missing, destination_blocked,
67
+ # callback_not_configured, rejected, no_answer, or for an agent call agent_busy or
68
+ # agent_unreachable. Null while the call is live, when it completed, and when it
69
+ # failed without a recorded reason
69
70
  #
70
71
  # @return [String, nil]
71
72
  optional :failure_reason, String, nil?: true
@@ -105,7 +105,10 @@ module Sentdm
105
105
  # read as `PROVISIONING` in the response's `numbers`, each with the area code it
106
106
  # was asked for. A profile inheriting your organization's campaign cannot request
107
107
  # `numbers` (`400`). `numbers` on a `TEN_DLC` market you already hold is `409`:
108
- # its numbers belong to its one campaign and are set when the market is created.
108
+ # change its campaign's numbers with `PATCH /v3/channels/sms/{country}/{type}`,
109
+ # add numbers to one of its campaigns with
110
+ # `POST /v3/channels/sms/numbers/US/TEN_DLC`, or add a new campaign with
111
+ # `POST /v3/channels/sms/compliances/US/TEN_DLC/campaigns`.
109
112
  #
110
113
  # **A market you already send in is `409`**: adding what is already there is a
111
114
  # mistake worth reporting rather than a silent no-op. A market is a
@@ -118,7 +118,10 @@ module Sentdm
118
118
  # explicitly.
119
119
  #
120
120
  # Retrieves all campaigns linked to the profile's brand, including use cases and
121
- # sample messages. Returns inherited campaigns if inherit_tcr_campaign=true.
121
+ # sample messages. A profile with inherit_tcr_campaign=true gets its
122
+ # organization's campaigns and, beside them, any campaign of its own (added with
123
+ # POST /v3/channels/sms/compliances/US/TEN_DLC/campaigns); `isInherited` says
124
+ # which is which.
122
125
  #
123
126
  # @overload list(profile_id, x_profile_id: nil, request_options: {})
124
127
  #
@@ -14,8 +14,8 @@ module Sentdm
14
14
  # instead.
15
15
  #
16
16
  # **A sender is the exception.** A brand and a campaign can be inherited; a number
17
- # cannot. A profile either has a sender of its own or terminates through your
18
- # shared routes.
17
+ # cannot. A profile either has a sender of its own or reaches only the countries
18
+ # Sent runs a shared route for, and the US is not one of them.
19
19
  #
20
20
  # To act for a profile on any other resource, send `x-profile-id` with your
21
21
  # organization key rather than looking for a parallel set of endpoints.
@@ -37,7 +37,9 @@ module Sentdm
37
37
  #
38
38
  # **A sender is not one of them.** The brand and the campaign can be inherited; a
39
39
  # number cannot. A profile either has a sender of its own — `channels.sms` — or it
40
- # has none and terminates through the shared routes for that country.
40
+ # has none and reaches only the countries Sent runs a shared route for. The US has
41
+ # none: without a `TEN_DLC` number of its own, a profile's SMS to US numbers ends
42
+ # as `FAILED` with `DELIVERY_003`.
41
43
  #
42
44
  # ## Saying what a profile owns
43
45
  #
@@ -118,11 +118,11 @@ module Sentdm
118
118
  # conference room, and answers with the participant's own call record. The
119
119
  # participant is a call of their own: it has its own id, can be looked up and hung
120
120
  # up, and is billed and reported through call.completed and call.failed like any
121
- # other call. Every participant needs a positive balance. A phone participant is
122
- # called from caller_id, which must be one of your numbers, or from the call's
123
- # owning number when omitted, and needs a destination you may call. Only a call
124
- # your answer connected to a conference can take participants: a call connected to
125
- # a user or a number answers 409.
121
+ # other call. Every participant needs a payment method on file and a positive
122
+ # balance. A phone participant is called from caller_id, which must be one of your
123
+ # numbers, or from the call's owning number when omitted, and needs a destination
124
+ # you may call. Only a call your answer connected to a conference can take
125
+ # participants: a call connected to a user or a number answers 409.
126
126
  #
127
127
  # @overload add(id, caller_id: nil, sandbox: nil, to: nil, idempotency_key: nil, x_profile_id: nil, request_options: {})
128
128
  #
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sentdm
4
- VERSION = "0.46.0"
4
+ VERSION = "0.47.0"
5
5
  end
data/lib/sentdm.rb CHANGED
@@ -135,6 +135,7 @@ require_relative "sentdm/models/channels/sms_number"
135
135
  require_relative "sentdm/models/channels/sms_number_request"
136
136
  require_relative "sentdm/models/channels/sms_retrieve_params"
137
137
  require_relative "sentdm/models/channels/sms_update_params"
138
+ require_relative "sentdm/models/channels/supplied_campaign"
138
139
  require_relative "sentdm/models/channels/supplied_compliance"
139
140
  require_relative "sentdm/models/channels/supplied_document"
140
141
  require_relative "sentdm/models/channels/voice_callback_test"
@@ -70,8 +70,8 @@ module Sentdm
70
70
  # instead.
71
71
  #
72
72
  # **A sender is the exception.** A brand and a campaign can be inherited; a number
73
- # cannot. A profile either has a sender of its own or terminates through your
74
- # shared routes.
73
+ # cannot. A profile either has a sender of its own or reaches only the countries
74
+ # Sent runs a shared route for, and the US is not one of them.
75
75
  #
76
76
  # To act for a profile on any other resource, send `x-profile-id` with your
77
77
  # organization key rather than looking for a parallel set of endpoints.
@@ -67,12 +67,6 @@ module Sentdm
67
67
  sig { returns(T.nilable(String)) }
68
68
  attr_accessor :reason_code
69
69
 
70
- # The sender itself. Null until a carrier-assigned number is procured. For a
71
- # market holding several numbers, the first active one (the first assigned while
72
- # none is active) — every number is in numbers.
73
- sig { returns(T.nilable(String)) }
74
- attr_accessor :sender_value
75
-
76
70
  # Where this market's sender stands, in terms of who is holding it up —
77
71
  # PROVISIONING, ACTION_NEEDED, PENDING_REVIEW or ACTIVE. Read-only.
78
72
  #
@@ -106,7 +100,6 @@ module Sentdm
106
100
  numbers: T::Array[Sentdm::Channels::SMSNumber::OrHash],
107
101
  reason: T.nilable(String),
108
102
  reason_code: T.nilable(String),
109
- sender_value: T.nilable(String),
110
103
  status: T.nilable(Sentdm::Channels::SMSMarket::Status::OrSymbol)
111
104
  ).returns(T.attached_class)
112
105
  end
@@ -145,10 +138,6 @@ module Sentdm
145
138
  # this rather than on reason. Omitted while ACTIVE. Read-only; when nothing more
146
139
  # specific is known it is the generic reason for the status.
147
140
  reason_code: nil,
148
- # The sender itself. Null until a carrier-assigned number is procured. For a
149
- # market holding several numbers, the first active one (the first assigned while
150
- # none is active) — every number is in numbers.
151
- sender_value: nil,
152
141
  # Where this market's sender stands, in terms of who is holding it up —
153
142
  # PROVISIONING, ACTION_NEEDED, PENDING_REVIEW or ACTIVE. Read-only.
154
143
  #
@@ -175,7 +164,6 @@ module Sentdm
175
164
  numbers: T::Array[Sentdm::Channels::SMSNumber],
176
165
  reason: T.nilable(String),
177
166
  reason_code: T.nilable(String),
178
- sender_value: T.nilable(String),
179
167
  status:
180
168
  T.nilable(Sentdm::Channels::SMSMarket::Status::TaggedSymbol)
181
169
  }
@@ -14,6 +14,13 @@ module Sentdm
14
14
  sig { returns(T.nilable(String)) }
15
15
  attr_accessor :area_code
16
16
 
17
+ # The campaign the number is on, or is owed for: the id of its entry in
18
+ # compliance.campaigns. Omitted for a market that registers no campaigns, and
19
+ # where the campaign is not known — a number recorded without one, or one owed on
20
+ # a campaign inherited from the organization.
21
+ sig { returns(T.nilable(String)) }
22
+ attr_accessor :campaign_id
23
+
17
24
  # The number, or null while it is still to be assigned.
18
25
  sig { returns(T.nilable(String)) }
19
26
  attr_accessor :sender_value
@@ -27,6 +34,7 @@ module Sentdm
27
34
  sig do
28
35
  params(
29
36
  area_code: T.nilable(String),
37
+ campaign_id: T.nilable(String),
30
38
  sender_value: T.nilable(String),
31
39
  status: T.nilable(String)
32
40
  ).returns(T.attached_class)
@@ -35,6 +43,11 @@ module Sentdm
35
43
  # The number's area code, e.g. 212. While the number is still to be assigned, the
36
44
  # area code it was asked for, or null when it was asked for in any area code.
37
45
  area_code: nil,
46
+ # The campaign the number is on, or is owed for: the id of its entry in
47
+ # compliance.campaigns. Omitted for a market that registers no campaigns, and
48
+ # where the campaign is not known — a number recorded without one, or one owed on
49
+ # a campaign inherited from the organization.
50
+ campaign_id: nil,
38
51
  # The number, or null while it is still to be assigned.
39
52
  sender_value: nil,
40
53
  # ACTIVE once the number can send; PROVISIONING while it is still to be assigned;
@@ -47,6 +60,7 @@ module Sentdm
47
60
  override.returns(
48
61
  {
49
62
  area_code: T.nilable(String),
63
+ campaign_id: T.nilable(String),
50
64
  sender_value: T.nilable(String),
51
65
  status: T.nilable(String)
52
66
  }
@@ -0,0 +1,13 @@
1
+ # typed: strong
2
+
3
+ module Sentdm
4
+ module Models
5
+ module Channels
6
+ SuppliedCampaign =
7
+ T.let(
8
+ Sentdm::Internal::Type::HashOf[Sentdm::Internal::Type::Unknown],
9
+ Sentdm::Internal::Type::Converter
10
+ )
11
+ end
12
+ end
13
+ end
@@ -44,6 +44,26 @@ module Sentdm
44
44
  sig { returns(T.nilable(T::Hash[Symbol, T.anything])) }
45
45
  attr_accessor :campaign
46
46
 
47
+ # Every campaign this market registers, each with inherit saying whose it is —
48
+ # oldest first.
49
+ #
50
+ # A list, because a market can now be on more than one. POST
51
+ # /v3/channels/sms/compliances/US/TEN_DLC/campaigns adds a campaign of the
52
+ # customer's own beside the one it has, and a profile running on its
53
+ # organization's campaign keeps that one when it adds its own. Campaign can only
54
+ # show one of them, so it stays as it was, for callers that read it, and this is
55
+ # where the rest are.
56
+ #
57
+ # The organization's campaign reads "inherit": true and the customer's own read
58
+ # "inherit": false. Each entry is the shape of Campaign plus id, the campaign's
59
+ # own id, so several can be told apart. Campaign carries no id, because it is sent
60
+ # back to PATCH, which refuses a key it does not declare; this list is read-only.
61
+ #
62
+ # Absent for a market that registers with nobody; empty for one that registers and
63
+ # has no campaign yet.
64
+ sig { returns(T.nilable(T::Array[T::Hash[Symbol, T.anything]])) }
65
+ attr_accessor :campaigns
66
+
47
67
  # What has been supplied for this market.
48
68
  #
49
69
  # Files, not values — the declared halves above carry the values. A document
@@ -77,6 +97,7 @@ module Sentdm
77
97
  params(
78
98
  brand: T.nilable(T::Hash[Symbol, T.anything]),
79
99
  campaign: T.nilable(T::Hash[Symbol, T.anything]),
100
+ campaigns: T.nilable(T::Array[T::Hash[Symbol, T.anything]]),
80
101
  documents:
81
102
  T.nilable(T::Array[Sentdm::Channels::SuppliedDocument::OrHash])
82
103
  ).returns(T.attached_class)
@@ -110,6 +131,24 @@ module Sentdm
110
131
  # refused if the caller sent this object back — which it is meant to be able to
111
132
  # do.
112
133
  campaign: nil,
134
+ # Every campaign this market registers, each with inherit saying whose it is —
135
+ # oldest first.
136
+ #
137
+ # A list, because a market can now be on more than one. POST
138
+ # /v3/channels/sms/compliances/US/TEN_DLC/campaigns adds a campaign of the
139
+ # customer's own beside the one it has, and a profile running on its
140
+ # organization's campaign keeps that one when it adds its own. Campaign can only
141
+ # show one of them, so it stays as it was, for callers that read it, and this is
142
+ # where the rest are.
143
+ #
144
+ # The organization's campaign reads "inherit": true and the customer's own read
145
+ # "inherit": false. Each entry is the shape of Campaign plus id, the campaign's
146
+ # own id, so several can be told apart. Campaign carries no id, because it is sent
147
+ # back to PATCH, which refuses a key it does not declare; this list is read-only.
148
+ #
149
+ # Absent for a market that registers with nobody; empty for one that registers and
150
+ # has no campaign yet.
151
+ campaigns: nil,
113
152
  # What has been supplied for this market.
114
153
  #
115
154
  # Files, not values — the declared halves above carry the values. A document
@@ -128,6 +167,7 @@ module Sentdm
128
167
  {
129
168
  brand: T.nilable(T::Hash[Symbol, T.anything]),
130
169
  campaign: T.nilable(T::Hash[Symbol, T.anything]),
170
+ campaigns: T.nilable(T::Array[T::Hash[Symbol, T.anything]]),
131
171
  documents: T.nilable(T::Array[Sentdm::Channels::SuppliedDocument])
132
172
  }
133
173
  )
@@ -63,6 +63,15 @@ module Sentdm
63
63
  sig { returns(T.nilable(String)) }
64
64
  attr_accessor :help_message
65
65
 
66
+ # Whether the campaign is the organization's, which the profile runs on, rather
67
+ # than one of the profile's own. A profile running on its organization's campaign
68
+ # can hold campaigns of its own beside it, and the list returns both.
69
+ sig { returns(T.nilable(T::Boolean)) }
70
+ attr_reader :is_inherited
71
+
72
+ sig { params(is_inherited: T::Boolean).void }
73
+ attr_writer :is_inherited
74
+
66
75
  sig { returns(T.nilable(String)) }
67
76
  attr_accessor :message_flow
68
77
 
@@ -152,6 +161,7 @@ module Sentdm
152
161
  has_submission_transaction: T::Boolean,
153
162
  help_keywords: T.nilable(String),
154
163
  help_message: T.nilable(String),
164
+ is_inherited: T::Boolean,
155
165
  message_flow: T.nilable(String),
156
166
  name: String,
157
167
  optin_keywords: T.nilable(String),
@@ -187,6 +197,10 @@ module Sentdm
187
197
  has_submission_transaction: nil,
188
198
  help_keywords: nil,
189
199
  help_message: nil,
200
+ # Whether the campaign is the organization's, which the profile runs on, rather
201
+ # than one of the profile's own. A profile running on its organization's campaign
202
+ # can hold campaigns of its own beside it, and the list returns both.
203
+ is_inherited: nil,
190
204
  message_flow: nil,
191
205
  name: nil,
192
206
  optin_keywords: nil,
@@ -229,6 +243,7 @@ module Sentdm
229
243
  has_submission_transaction: T::Boolean,
230
244
  help_keywords: T.nilable(String),
231
245
  help_message: T.nilable(String),
246
+ is_inherited: T::Boolean,
232
247
  message_flow: T.nilable(String),
233
248
  name: String,
234
249
  optin_keywords: T.nilable(String),
@@ -54,9 +54,10 @@ module Sentdm
54
54
  attr_accessor :ended_at
55
55
 
56
56
  # Why the call did not complete: callback_timeout, invalid_answer,
57
- # insufficient_balance, destination_blocked, callback_not_configured, rejected,
58
- # no_answer, or for an agent call agent_busy or agent_unreachable. Null while the
59
- # call is live, when it completed, and when it failed without a recorded reason
57
+ # insufficient_balance, payment_method_missing, destination_blocked,
58
+ # callback_not_configured, rejected, no_answer, or for an agent call agent_busy or
59
+ # agent_unreachable. Null while the call is live, when it completed, and when it
60
+ # failed without a recorded reason
60
61
  sig { returns(T.nilable(String)) }
61
62
  attr_accessor :failure_reason
62
63
 
@@ -179,9 +180,10 @@ module Sentdm
179
180
  # When the call ended (UTC). Null while the call is live
180
181
  ended_at: nil,
181
182
  # Why the call did not complete: callback_timeout, invalid_answer,
182
- # insufficient_balance, destination_blocked, callback_not_configured, rejected,
183
- # no_answer, or for an agent call agent_busy or agent_unreachable. Null while the
184
- # call is live, when it completed, and when it failed without a recorded reason
183
+ # insufficient_balance, payment_method_missing, destination_blocked,
184
+ # callback_not_configured, rejected, no_answer, or for an agent call agent_busy or
185
+ # agent_unreachable. Null while the call is live, when it completed, and when it
186
+ # failed without a recorded reason
185
187
  failure_reason: nil,
186
188
  # One end of a call
187
189
  from: nil,
@@ -102,7 +102,10 @@ module Sentdm
102
102
  # read as `PROVISIONING` in the response's `numbers`, each with the area code it
103
103
  # was asked for. A profile inheriting your organization's campaign cannot request
104
104
  # `numbers` (`400`). `numbers` on a `TEN_DLC` market you already hold is `409`:
105
- # its numbers belong to its one campaign and are set when the market is created.
105
+ # change its campaign's numbers with `PATCH /v3/channels/sms/{country}/{type}`,
106
+ # add numbers to one of its campaigns with
107
+ # `POST /v3/channels/sms/numbers/US/TEN_DLC`, or add a new campaign with
108
+ # `POST /v3/channels/sms/compliances/US/TEN_DLC/campaigns`.
106
109
  #
107
110
  # **A market you already send in is `409`**: adding what is already there is a
108
111
  # mistake worth reporting rather than a silent no-op. A market is a
@@ -98,7 +98,10 @@ module Sentdm
98
98
  # explicitly.
99
99
  #
100
100
  # Retrieves all campaigns linked to the profile's brand, including use cases and
101
- # sample messages. Returns inherited campaigns if inherit_tcr_campaign=true.
101
+ # sample messages. A profile with inherit_tcr_campaign=true gets its
102
+ # organization's campaigns and, beside them, any campaign of its own (added with
103
+ # POST /v3/channels/sms/compliances/US/TEN_DLC/campaigns); `isInherited` says
104
+ # which is which.
102
105
  sig do
103
106
  params(
104
107
  profile_id: String,
@@ -14,8 +14,8 @@ module Sentdm
14
14
  # instead.
15
15
  #
16
16
  # **A sender is the exception.** A brand and a campaign can be inherited; a number
17
- # cannot. A profile either has a sender of its own or terminates through your
18
- # shared routes.
17
+ # cannot. A profile either has a sender of its own or reaches only the countries
18
+ # Sent runs a shared route for, and the US is not one of them.
19
19
  #
20
20
  # To act for a profile on any other resource, send `x-profile-id` with your
21
21
  # organization key rather than looking for a parallel set of endpoints.
@@ -34,7 +34,9 @@ module Sentdm
34
34
  #
35
35
  # **A sender is not one of them.** The brand and the campaign can be inherited; a
36
36
  # number cannot. A profile either has a sender of its own — `channels.sms` — or it
37
- # has none and terminates through the shared routes for that country.
37
+ # has none and reaches only the countries Sent runs a shared route for. The US has
38
+ # none: without a `TEN_DLC` number of its own, a profile's SMS to US numbers ends
39
+ # as `FAILED` with `DELIVERY_003`.
38
40
  #
39
41
  # ## Saying what a profile owns
40
42
  #
@@ -102,11 +102,11 @@ module Sentdm
102
102
  # conference room, and answers with the participant's own call record. The
103
103
  # participant is a call of their own: it has its own id, can be looked up and hung
104
104
  # up, and is billed and reported through call.completed and call.failed like any
105
- # other call. Every participant needs a positive balance. A phone participant is
106
- # called from caller_id, which must be one of your numbers, or from the call's
107
- # owning number when omitted, and needs a destination you may call. Only a call
108
- # your answer connected to a conference can take participants: a call connected to
109
- # a user or a number answers 409.
105
+ # other call. Every participant needs a payment method on file and a positive
106
+ # balance. A phone participant is called from caller_id, which must be one of your
107
+ # numbers, or from the call's owning number when omitted, and needs a destination
108
+ # you may call. Only a call your answer connected to a conference can take
109
+ # participants: a call connected to a user or a number answers 409.
110
110
  sig do
111
111
  params(
112
112
  id: String,
@@ -9,7 +9,6 @@ module Sentdm
9
9
  numbers: ::Array[Sentdm::Channels::SMSNumber],
10
10
  reason: String?,
11
11
  reason_code: String?,
12
- sender_value: String?,
13
12
  status: Sentdm::Models::Channels::SMSMarket::status?
14
13
  }
15
14
 
@@ -30,8 +29,6 @@ module Sentdm
30
29
 
31
30
  attr_accessor reason_code: String?
32
31
 
33
- attr_accessor sender_value: String?
34
-
35
32
  attr_accessor status: Sentdm::Models::Channels::SMSMarket::status?
36
33
 
37
34
  def initialize: (
@@ -41,7 +38,6 @@ module Sentdm
41
38
  ?numbers: ::Array[Sentdm::Channels::SMSNumber],
42
39
  ?reason: String?,
43
40
  ?reason_code: String?,
44
- ?sender_value: String?,
45
41
  ?status: Sentdm::Models::Channels::SMSMarket::status?
46
42
  ) -> void
47
43
 
@@ -52,7 +48,6 @@ module Sentdm
52
48
  numbers: ::Array[Sentdm::Channels::SMSNumber],
53
49
  reason: String?,
54
50
  reason_code: String?,
55
- sender_value: String?,
56
51
  status: Sentdm::Models::Channels::SMSMarket::status?
57
52
  }
58
53
 
@@ -2,23 +2,32 @@ module Sentdm
2
2
  module Models
3
3
  module Channels
4
4
  type sms_number =
5
- { area_code: String?, sender_value: String?, status: String? }
5
+ {
6
+ area_code: String?,
7
+ campaign_id: String?,
8
+ sender_value: String?,
9
+ status: String?
10
+ }
6
11
 
7
12
  class SMSNumber < Sentdm::Internal::Type::BaseModel
8
13
  attr_accessor area_code: String?
9
14
 
15
+ attr_accessor campaign_id: String?
16
+
10
17
  attr_accessor sender_value: String?
11
18
 
12
19
  attr_accessor status: String?
13
20
 
14
21
  def initialize: (
15
22
  ?area_code: String?,
23
+ ?campaign_id: String?,
16
24
  ?sender_value: String?,
17
25
  ?status: String?
18
26
  ) -> void
19
27
 
20
28
  def to_hash: -> {
21
29
  area_code: String?,
30
+ campaign_id: String?,
22
31
  sender_value: String?,
23
32
  status: String?
24
33
  }
@@ -0,0 +1,9 @@
1
+ module Sentdm
2
+ module Models
3
+ module Channels
4
+ type supplied_campaign = ::Hash[Symbol, top]
5
+
6
+ SuppliedCampaign: Sentdm::Internal::Type::Converter
7
+ end
8
+ end
9
+ end
@@ -5,6 +5,7 @@ module Sentdm
5
5
  {
6
6
  brand: ::Hash[Symbol, top]?,
7
7
  campaign: ::Hash[Symbol, top]?,
8
+ campaigns: ::Array[Sentdm::Models::Channels::supplied_campaign]?,
8
9
  documents: ::Array[Sentdm::Channels::SuppliedDocument]?
9
10
  }
10
11
 
@@ -13,17 +14,21 @@ module Sentdm
13
14
 
14
15
  attr_accessor campaign: ::Hash[Symbol, top]?
15
16
 
17
+ attr_accessor campaigns: ::Array[Sentdm::Models::Channels::supplied_campaign]?
18
+
16
19
  attr_accessor documents: ::Array[Sentdm::Channels::SuppliedDocument]?
17
20
 
18
21
  def initialize: (
19
22
  ?brand: ::Hash[Symbol, top]?,
20
23
  ?campaign: ::Hash[Symbol, top]?,
24
+ ?campaigns: ::Array[Sentdm::Models::Channels::supplied_campaign]?,
21
25
  ?documents: ::Array[Sentdm::Channels::SuppliedDocument]?
22
26
  ) -> void
23
27
 
24
28
  def to_hash: -> {
25
29
  brand: ::Hash[Symbol, top]?,
26
30
  campaign: ::Hash[Symbol, top]?,
31
+ campaigns: ::Array[Sentdm::Models::Channels::supplied_campaign]?,
27
32
  documents: ::Array[Sentdm::Channels::SuppliedDocument]?
28
33
  }
29
34
  end
@@ -15,6 +15,7 @@ module Sentdm
15
15
  has_submission_transaction: bool,
16
16
  help_keywords: String?,
17
17
  help_message: String?,
18
+ is_inherited: bool,
18
19
  message_flow: String?,
19
20
  name: String,
20
21
  optin_keywords: String?,
@@ -69,6 +70,10 @@ module Sentdm
69
70
 
70
71
  attr_accessor help_message: String?
71
72
 
73
+ attr_reader is_inherited: bool?
74
+
75
+ def is_inherited=: (bool) -> bool
76
+
72
77
  attr_accessor message_flow: String?
73
78
 
74
79
  attr_reader name: String?
@@ -126,6 +131,7 @@ module Sentdm
126
131
  ?has_submission_transaction: bool,
127
132
  ?help_keywords: String?,
128
133
  ?help_message: String?,
134
+ ?is_inherited: bool,
129
135
  ?message_flow: String?,
130
136
  ?name: String,
131
137
  ?optin_keywords: String?,
@@ -158,6 +164,7 @@ module Sentdm
158
164
  has_submission_transaction: bool,
159
165
  help_keywords: String?,
160
166
  help_message: String?,
167
+ is_inherited: bool,
161
168
  message_flow: String?,
162
169
  name: String,
163
170
  optin_keywords: String?,
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sentdm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.46.0
4
+ version: 0.47.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sent
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-11-06 00:00:00.000000000 Z
11
+ date: 2026-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cgi
@@ -149,6 +149,7 @@ files:
149
149
  - lib/sentdm/models/channels/sms_number_request.rb
150
150
  - lib/sentdm/models/channels/sms_retrieve_params.rb
151
151
  - lib/sentdm/models/channels/sms_update_params.rb
152
+ - lib/sentdm/models/channels/supplied_campaign.rb
152
153
  - lib/sentdm/models/channels/supplied_compliance.rb
153
154
  - lib/sentdm/models/channels/supplied_document.rb
154
155
  - lib/sentdm/models/channels/voice_callback_test.rb
@@ -487,6 +488,7 @@ files:
487
488
  - rbi/sentdm/models/channels/sms_number_request.rbi
488
489
  - rbi/sentdm/models/channels/sms_retrieve_params.rbi
489
490
  - rbi/sentdm/models/channels/sms_update_params.rbi
491
+ - rbi/sentdm/models/channels/supplied_campaign.rbi
490
492
  - rbi/sentdm/models/channels/supplied_compliance.rbi
491
493
  - rbi/sentdm/models/channels/supplied_document.rbi
492
494
  - rbi/sentdm/models/channels/voice_callback_test.rbi
@@ -824,6 +826,7 @@ files:
824
826
  - sig/sentdm/models/channels/sms_number_request.rbs
825
827
  - sig/sentdm/models/channels/sms_retrieve_params.rbs
826
828
  - sig/sentdm/models/channels/sms_update_params.rbs
829
+ - sig/sentdm/models/channels/supplied_campaign.rbs
827
830
  - sig/sentdm/models/channels/supplied_compliance.rbs
828
831
  - sig/sentdm/models/channels/supplied_document.rbs
829
832
  - sig/sentdm/models/channels/voice_callback_test.rbs