sentdm 0.33.0 → 0.34.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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +7 -0
  3. data/README.md +1 -1
  4. data/lib/sentdm/models/channel_event_payload.rb +16 -6
  5. data/lib/sentdm/models/conversation_messages_list.rb +100 -13
  6. data/lib/sentdm/models/inbound_message_event_payload.rb +70 -3
  7. data/lib/sentdm/models/me_retrieve_response.rb +21 -1
  8. data/lib/sentdm/models/message_event_payload.rb +23 -1
  9. data/lib/sentdm/models/message_retrieve_activities_response.rb +23 -1
  10. data/lib/sentdm/models/message_retrieve_status_response.rb +100 -13
  11. data/lib/sentdm/models/template_create_params.rb +11 -1
  12. data/lib/sentdm/models/webhook_create_params.rb +31 -1
  13. data/lib/sentdm/models/webhook_list_events_response.rb +176 -3
  14. data/lib/sentdm/models/webhook_update_params.rb +31 -1
  15. data/lib/sentdm/resources/me.rb +5 -0
  16. data/lib/sentdm/resources/templates.rb +3 -1
  17. data/lib/sentdm/resources/webhooks.rb +9 -3
  18. data/lib/sentdm/version.rb +1 -1
  19. data/rbi/sentdm/models/channel_event_payload.rbi +20 -8
  20. data/rbi/sentdm/models/conversation_messages_list.rbi +122 -19
  21. data/rbi/sentdm/models/inbound_message_event_payload.rbi +110 -2
  22. data/rbi/sentdm/models/me_retrieve_response.rbi +35 -0
  23. data/rbi/sentdm/models/message_event_payload.rbi +28 -0
  24. data/rbi/sentdm/models/message_retrieve_activities_response.rbi +26 -0
  25. data/rbi/sentdm/models/message_retrieve_status_response.rbi +122 -19
  26. data/rbi/sentdm/models/template_create_params.rbi +15 -0
  27. data/rbi/sentdm/models/webhook_create_params.rbi +61 -0
  28. data/rbi/sentdm/models/webhook_list_events_response.rbi +272 -3
  29. data/rbi/sentdm/models/webhook_update_params.rbi +61 -0
  30. data/rbi/sentdm/resources/me.rbi +5 -0
  31. data/rbi/sentdm/resources/templates.rbi +6 -0
  32. data/rbi/sentdm/resources/webhooks.rbi +15 -1
  33. data/sig/sentdm/models/channel_event_payload.rbs +5 -0
  34. data/sig/sentdm/models/conversation_messages_list.rbs +56 -8
  35. data/sig/sentdm/models/inbound_message_event_payload.rbs +37 -0
  36. data/sig/sentdm/models/me_retrieve_response.rbs +7 -0
  37. data/sig/sentdm/models/message_event_payload.rbs +10 -0
  38. data/sig/sentdm/models/message_retrieve_activities_response.rbs +10 -0
  39. data/sig/sentdm/models/message_retrieve_status_response.rbs +56 -8
  40. data/sig/sentdm/models/template_create_params.rbs +7 -0
  41. data/sig/sentdm/models/webhook_create_params.rbs +29 -0
  42. data/sig/sentdm/models/webhook_list_events_response.rbs +107 -0
  43. data/sig/sentdm/models/webhook_update_params.rbs +29 -0
  44. data/sig/sentdm/resources/templates.rbs +1 -0
  45. data/sig/sentdm/resources/webhooks.rbs +2 -0
  46. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 88e9bb540faf8a7261b5e38bb2b040df80d8f02124ae52f313d7d0019fe84042
4
- data.tar.gz: 52b07edc509cd9c60d586cffede3b951ba9e8f8de1b34776c1b9d86655dd2dfc
3
+ metadata.gz: 8b4444164d11b8913195b89a66ba9d140e5edaca680199f80156774e39f3f893
4
+ data.tar.gz: 38b18a67c9dc58ed79f990686d0363fbab3138b66c9a2e3b20eb76ba0d4d4988
5
5
  SHA512:
6
- metadata.gz: 83049b88e719812408bf187ebb7d8723c45368fc89ff7d21dce6cdd2cdd2c74f892da306081d5b9af50df59668a69160b91a11bd6796d978560738bbfd3a0fc5
7
- data.tar.gz: 95eb98fb732c34e1ce224cfdfec45193477bd8aae18e5daf6d5da3bee50a3018c712304da29fbf146b2f92c330d512d617a82fbeb77dd4f1a25f4752c2566929
6
+ metadata.gz: bd38b5407cb704af0bf1cfecccb4f4bdcc2b5b173ac638d7c3f4c8e5a6039a019637d46114d6c082ebc420f7ad3532cfd128493f56d7bff51c62abc62cf34461
7
+ data.tar.gz: 3a79e6d405c70edc8e4479f28dc4955c0e0a3fbfaa59da458848c831e99650d90e87c672316609514fb9d5bd4d2b61d194d3f54a31d6c7ecac9340b12117e887
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.34.0](https://github.com/sentdm/sent-dm-ruby/compare/v0.33.0...v0.34.0) (2026-09-30)
4
+
5
+
6
+ ### Features
7
+
8
+ * **api:** sync OpenAPI spec from production ([d7d4ecf](https://github.com/sentdm/sent-dm-ruby/commit/d7d4ecf5dd378e69ee6f5148b816554ebbf1a6bf))
9
+
3
10
  ## [0.33.0](https://github.com/sentdm/sent-dm-ruby/compare/v0.32.0...v0.33.0) (2026-09-30)
4
11
 
5
12
 
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.33.0"
20
+ gem "sentdm", "~> 0.34.0"
21
21
  ```
22
22
 
23
23
  <!-- x-release-please-end -->
@@ -61,14 +61,22 @@ module Sentdm
61
61
  optional :number_type, String, nil?: true
62
62
 
63
63
  # @!attribute reason
64
- # Why the market reached this state, when a reason was given — a correction
65
- # explained, or a campaign lapse. Free text, passed through from the registry or
66
- # carrier that wrote it, so treat it as a message to show a human rather than a
67
- # value to branch on.
64
+ # Why the market reached this state, as a sentence to show a person: the specific
65
+ # explanation when one was given (a correction explained, a campaign lapse),
66
+ # otherwise what reason_code means for this market. Not a value to branch on.
68
67
  #
69
68
  # @return [String, nil]
70
69
  optional :reason, String, nil?: true
71
70
 
71
+ # @!attribute reason_code
72
+ # Why the market is not ACTIVE, as a stable code: an ErrorCodes CHANNEL_xxx value
73
+ # such as CHANNEL_001 (something you owe) or CHANNEL_002 (a correction was
74
+ # requested). The same code the channels resource reports for the market. Switch
75
+ # on this rather than on reason. Omitted while ACTIVE.
76
+ #
77
+ # @return [String, nil]
78
+ optional :reason_code, String, nil?: true
79
+
72
80
  # @!attribute sender_value
73
81
  # The sender itself — a number in E.164, or an alphanumeric sender ID.
74
82
  #
@@ -107,7 +115,7 @@ module Sentdm
107
115
  # @return [String, nil]
108
116
  optional :updated_at, String
109
117
 
110
- # @!method initialize(country:, account_id: nil, channel: nil, compliance: nil, number_type: nil, reason: nil, sender_value: nil, status: nil, updated_at: nil)
118
+ # @!method initialize(country:, account_id: nil, channel: nil, compliance: nil, number_type: nil, reason: nil, reason_code: nil, sender_value: nil, status: nil, updated_at: nil)
111
119
  # Some parameter documentations has been truncated, see
112
120
  # {Sentdm::Models::ChannelEventPayload} for more details.
113
121
  #
@@ -142,7 +150,9 @@ module Sentdm
142
150
  #
143
151
  # @param number_type [String, nil] The kind of sender the market uses, for example TEN_DLC, LOCAL, or
144
152
  #
145
- # @param reason [String, nil] Why the market reached this state, when a reason was given — a correction explai
153
+ # @param reason [String, nil] Why the market reached this state, as a sentence to show a person: the specific
154
+ #
155
+ # @param reason_code [String, nil] Why the market is not ACTIVE, as a stable code: an ErrorCodes CHANNEL_xxx value
146
156
  #
147
157
  # @param sender_value [String, nil] The sender itself — a number in E.164, or an alphanumeric sender ID.
148
158
  #
@@ -94,6 +94,24 @@ module Sentdm
94
94
  # @return [Float, nil]
95
95
  optional :price, Float, nil?: true
96
96
 
97
+ # @!attribute reason
98
+ # A human-readable sentence for reason_code, for example "Insufficient balance".
99
+ # Omitted whenever reason_code is.
100
+ #
101
+ # @return [String, nil]
102
+ optional :reason, String, nil?: true
103
+
104
+ # @!attribute reason_code
105
+ # Why the message is at its current status, as a stable platform code such as
106
+ # DELIVERY_007, BUSINESS_003 or DELIVERY_003. Present when the current status is
107
+ # FAILED, FILTERED or BLOCKED and the lifecycle was loaded; omitted otherwise.
108
+ # Switch on this rather than on reason: the code is stable, the wording may be
109
+ # improved. It is the platform's classification of the outcome, never a carrier or
110
+ # vendor code.
111
+ #
112
+ # @return [String, nil]
113
+ optional :reason_code, String, nil?: true
114
+
97
115
  # @!attribute region_code
98
116
  #
99
117
  # @return [String, nil]
@@ -119,7 +137,7 @@ module Sentdm
119
137
  # @return [String, nil]
120
138
  optional :template_name, String, nil?: true
121
139
 
122
- # @!method initialize(id: nil, active_contact_price: nil, channel: nil, contact_id: nil, created_at: nil, customer_id: nil, direction: nil, events: nil, message_body: nil, phone: nil, phone_international: nil, price: nil, region_code: nil, status: nil, template_category: nil, template_id: nil, template_name: nil)
140
+ # @!method initialize(id: nil, active_contact_price: nil, channel: nil, contact_id: nil, created_at: nil, customer_id: nil, direction: nil, events: nil, message_body: nil, phone: nil, phone_international: nil, price: nil, reason: nil, reason_code: nil, region_code: nil, status: nil, template_category: nil, template_id: nil, template_name: nil)
123
141
  # Some parameter documentations has been truncated, see
124
142
  # {Sentdm::Models::ConversationMessagesList::Message} for more details.
125
143
  #
@@ -154,6 +172,10 @@ module Sentdm
154
172
  #
155
173
  # @param price [Float, nil]
156
174
  #
175
+ # @param reason [String, nil] A human-readable sentence for reason_code, for example "Insufficient balance". O
176
+ #
177
+ # @param reason_code [String, nil] Why the message is at its current status, as a stable platform code such as
178
+ #
157
179
  # @param region_code [String]
158
180
  #
159
181
  # @param status [String]
@@ -180,12 +202,37 @@ module Sentdm
180
202
  # @return [String, nil]
181
203
  optional :description, String, nil?: true
182
204
 
183
- # @!method initialize(status:, timestamp:, description: nil)
205
+ # @!attribute reason
206
+ # A human-readable sentence for reason_code. Omitted whenever reason_code is.
207
+ #
208
+ # @return [String, nil]
209
+ optional :reason, String, nil?: true
210
+
211
+ # @!attribute reason_code
212
+ # Why the message reached this status, as a stable platform code such as
213
+ # DELIVERY_007. Present on FAILED, FILTERED and BLOCKED events; omitted on every
214
+ # status that needs no explanation. Same wire name and vocabulary as on the
215
+ # activities list and the webhook.
216
+ #
217
+ # @return [String, nil]
218
+ optional :reason_code, String, nil?: true
219
+
220
+ # @!method initialize(status:, timestamp:, description: nil, reason: nil, reason_code: nil)
221
+ # Some parameter documentations has been truncated, see
222
+ # {Sentdm::Models::ConversationMessagesList::Message::Event} for more details.
223
+ #
184
224
  # Represents a status change event in a message's lifecycle (v3)
185
225
  #
186
226
  # @param status [String]
227
+ #
187
228
  # @param timestamp [Time]
229
+ #
188
230
  # @param description [String, nil]
231
+ #
232
+ # @param reason [String, nil] A human-readable sentence for reason_code. Omitted whenever reason_code is.
233
+ #
234
+ # @param reason_code [String, nil] Why the message reached this status, as a stable platform code such as
235
+ # DELIVERY\_
189
236
  end
190
237
 
191
238
  # @see Sentdm::Models::ConversationMessagesList::Message#message_body
@@ -332,32 +379,72 @@ module Sentdm
332
379
 
333
380
  class Media < Sentdm::Internal::Type::BaseModel
334
381
  # @!attribute media_type
335
- # One of Constants.MmsMediaTypes when known. Advisory — the carrier reads the
336
- # fetched object's Content-Type, not this.
382
+ # One of MmsMediaTypes when the content type is known. Advisory — a reader should
383
+ # trust the fetched object's own Content-Type.
337
384
  #
338
385
  # @return [String, nil]
339
386
  optional :media_type, String, api_name: :mediaType, nil?: true
340
387
 
388
+ # @!attribute mime_type
389
+ # Content type as the provider declared it. Null when it declared none.
390
+ #
391
+ # @return [String, nil]
392
+ optional :mime_type, String, api_name: :mimeType, nil?: true
393
+
394
+ # @!attribute size_bytes
395
+ # Size as the provider declared it. Never measured here — nothing downloads the
396
+ # file.
397
+ #
398
+ # @return [Integer, nil]
399
+ optional :size_bytes, Integer, api_name: :sizeBytes, nil?: true
400
+
401
+ # @!attribute source_hash_sha256
402
+ # Inbound only: the SHA-256 the provider declared alongside the attachment, when
403
+ # it declared one. Relayed to the customer so they can verify what they fetch
404
+ # matches what the carrier said it sent. It is the only integrity signal available
405
+ # on an attachment nobody here has read.
406
+ #
407
+ # @return [String, nil]
408
+ optional :source_hash_sha256, String, api_name: :sourceHashSha256, nil?: true
409
+
341
410
  # @!attribute url
411
+ # Where the file lives. Outbound: the URL the customer gave us and the carrier
412
+ # fetched. Inbound: the URL the carrier hosts it at, relayed unchanged.
342
413
  #
343
414
  # @return [String, nil]
344
- optional :url, String
415
+ optional :url, String, nil?: true
345
416
 
346
- # @!method initialize(media_type: nil, url: nil)
417
+ # @!method initialize(media_type: nil, mime_type: nil, size_bytes: nil, source_hash_sha256: nil, url: nil)
347
418
  # Some parameter documentations has been truncated, see
348
419
  # {Sentdm::Models::ConversationMessagesList::Message::MessageBody::Media} for more
349
420
  # details.
350
421
  #
351
- # One attachment on a message: a customer-supplied public URL handed to the
352
- # carrier as-is.
422
+ # One attachment on a message, in either direction — and in both, a URL somebody
423
+ # else hosts.
424
+ #
425
+ # Outbound: the customer supplied a public URL and we handed it to the carrier.
426
+ # Inbound: the carrier hosts the file and we record where. sent.dm never holds the
427
+ # bytes, so there is no key, no expiry bookkeeping and nothing minted per read —
428
+ # what is stored is what is served.
429
+ #
430
+ # An inbound link expires on the carrier's own schedule and is unauthenticated.
431
+ # That is the customer's to manage, and it is documented where they will see it
432
+ # rather than only here — a recipient who needs an attachment to outlive that
433
+ # window copies it on receipt.
434
+ #
435
+ # Storing a presigned URL is the specific mistake this shape still avoids:
436
+ # M260826130000 and M260826140000 exist because RCS assets were stored as signed
437
+ # URLs and went stale. Nothing here is signed.
438
+ #
439
+ # @param media_type [String, nil] One of MmsMediaTypes when the content type is known. Advisory — a reader should
440
+ #
441
+ # @param mime_type [String, nil] Content type as the provider declared it. Null when it declared none.
353
442
  #
354
- # A URL and nothing else. sent.dm never takes custody of MMS media — the customer hosts it and we
355
- # pass the link through at send time — so there is no storage key, size or expiry to record. If we ever
356
- # do host attachments, that belongs with the change that introduces the hosting, not here.
443
+ # @param size_bytes [Integer, nil] Size as the provider declared it. Never measured here — nothing downloads the fi
357
444
  #
358
- # @param media_type [String, nil] One of Constants.MmsMediaTypes when known. Advisory — the carrier reads the
445
+ # @param source_hash_sha256 [String, nil] Inbound only: the SHA-256 the provider declared alongside the attachment, when i
359
446
  #
360
- # @param url [String]
447
+ # @param url [String, nil] Where the file lives. Outbound: the URL the customer gave us and the carrier fet
361
448
  end
362
449
  end
363
450
  end
@@ -22,11 +22,28 @@ module Sentdm
22
22
  optional :account_id, String
23
23
 
24
24
  # @!attribute channel
25
- # The channel the message arrived on, for example sms or whatsapp.
25
+ # The channel the message arrived on, for example sms or mms.
26
26
  #
27
27
  # @return [String, nil]
28
28
  optional :channel, String
29
29
 
30
+ # @!attribute media
31
+ # Attachments the contact sent, present only on channels that carry them (mms
32
+ # today) and omitted entirely otherwise.
33
+ #
34
+ # Each url points at the carrier's own copy of the file — sent.dm records where
35
+ # the attachment is, not the attachment itself. The link is unauthenticated and
36
+ # expires on the carrier's schedule, which differs between them: assume days, not
37
+ # months. Download what you need on receipt; re-reading the message through GET
38
+ # /v3/messages/{id} returns the same stored link, not a fresh one, so once it
39
+ # lapses the entry remains with whatever the carrier declared about the file but
40
+ # the file is no longer reachable.
41
+ #
42
+ # @return [Array<Sentdm::Models::InboundMessageEventPayload::Media>, nil]
43
+ optional :media,
44
+ -> { Sentdm::Internal::Type::ArrayOf[Sentdm::InboundMessageEventPayload::Media] },
45
+ nil?: true
46
+
30
47
  # @!attribute message_id
31
48
  # The inbound message.
32
49
  #
@@ -54,7 +71,7 @@ module Sentdm
54
71
  # @return [String, nil]
55
72
  optional :updated_at, String
56
73
 
57
- # @!method initialize(inbound_number:, received_at:, account_id: nil, channel: nil, message_id: nil, outbound_number: nil, text: nil, updated_at: nil)
74
+ # @!method initialize(inbound_number:, received_at:, account_id: nil, channel: nil, media: nil, message_id: nil, outbound_number: nil, text: nil, updated_at: nil)
58
75
  # Some parameter documentations has been truncated, see
59
76
  # {Sentdm::Models::InboundMessageEventPayload} for more details.
60
77
  #
@@ -67,7 +84,9 @@ module Sentdm
67
84
  #
68
85
  # @param account_id [String] The account the message belongs to.
69
86
  #
70
- # @param channel [String] The channel the message arrived on, for example sms or whatsapp.
87
+ # @param channel [String] The channel the message arrived on, for example sms or mms.
88
+ #
89
+ # @param media [Array<Sentdm::Models::InboundMessageEventPayload::Media>, nil] Attachments the contact sent, present only on channels that carry them (mms toda
71
90
  #
72
91
  # @param message_id [String] The inbound message.
73
92
  #
@@ -76,6 +95,54 @@ module Sentdm
76
95
  # @param text [String, nil] The message body. Sent as null when the inbound message carried no text, for
77
96
  #
78
97
  # @param updated_at [String] When the message was received, in UTC (yyyy-MM-ddTHH:mm:ssZ). Same value as
98
+
99
+ class Media < Sentdm::Internal::Type::BaseModel
100
+ # @!attribute hash_sha256
101
+ # SHA-256 of the file as the carrier declared it, when it declares one. Verify
102
+ # what you download against this — sent.dm never reads the bytes, so it is the
103
+ # only integrity signal available.
104
+ #
105
+ # @return [String, nil]
106
+ optional :hash_sha256, String, nil?: true
107
+
108
+ # @!attribute mime_type
109
+ # Content type as the carrier reported it, for example image/jpeg.
110
+ #
111
+ # @return [String, nil]
112
+ optional :mime_type, String, nil?: true
113
+
114
+ # @!attribute size_bytes
115
+ # Size in bytes as the carrier declared it. Absent when it declared none.
116
+ #
117
+ # @return [Integer, nil]
118
+ optional :size_bytes, Integer, nil?: true
119
+
120
+ # @!attribute url
121
+ # Where the carrier hosts the attachment.
122
+ #
123
+ # This link expires and is not authenticated. sent.dm relays it rather than
124
+ # copying the file, so how long it stays fetchable is the carrier's decision and
125
+ # differs between them — assume days, not months. Anyone holding the URL can fetch
126
+ # it until it lapses. Copy the file on receipt if you need it to outlive that
127
+ # window; do not store this URL as a permanent reference.
128
+ #
129
+ # @return [String, nil]
130
+ optional :url, String, nil?: true
131
+
132
+ # @!method initialize(hash_sha256: nil, mime_type: nil, size_bytes: nil, url: nil)
133
+ # Some parameter documentations has been truncated, see
134
+ # {Sentdm::Models::InboundMessageEventPayload::Media} for more details.
135
+ #
136
+ # One attachment on an inbound message.
137
+ #
138
+ # @param hash_sha256 [String, nil] SHA-256 of the file as the carrier declared it, when it declares one. Verify wha
139
+ #
140
+ # @param mime_type [String, nil] Content type as the carrier reported it, for example image/jpeg.
141
+ #
142
+ # @param size_bytes [Integer, nil] Size in bytes as the carrier declared it. Absent when it declared none.
143
+ #
144
+ # @param url [String, nil] Where the carrier hosts the attachment.
145
+ end
79
146
  end
80
147
  end
81
148
  end
@@ -77,6 +77,24 @@ module Sentdm
77
77
  # @return [String, nil]
78
78
  optional :email, String, nil?: true
79
79
 
80
+ # @!attribute enable_template_auto_creation_for_sp
81
+ # Whether this account may mark a template for automatic creation on its sender
82
+ # profiles. Granted by Sent per account and off by default, so it is what a
83
+ # template-create form reads to decide whether to offer the option at all —
84
+ # marking a template without it does nothing.
85
+ #
86
+ # Top-level rather than inside settings, which is written for type: "profile" only
87
+ # and so would never carry it to the account type that can act on it.
88
+ #
89
+ # This is the capability, not the stored flag: a profile reports false whatever
90
+ # its own row holds. A sender profile owns no sender profiles, so a template it
91
+ # marked would have nothing to be created on and the fan-out would never read the
92
+ # flag. The admin GET /customers/{id} reports the stored value instead, because
93
+ # that is the one an operator granted.
94
+ #
95
+ # @return [Boolean, nil]
96
+ optional :enable_template_auto_creation_for_sp, Sentdm::Internal::Type::Boolean
97
+
80
98
  # @!attribute icon
81
99
  # Account icon URL
82
100
  #
@@ -155,7 +173,7 @@ module Sentdm
155
173
  # @return [String, nil]
156
174
  optional :type, String
157
175
 
158
- # @!method initialize(id: nil, channels: nil, created_at: nil, description: nil, email: nil, icon: nil, name: nil, organization_id: nil, profiles: nil, sending_phone_number: nil, sending_phone_number_profile_id: nil, settings: nil, short_name: nil, status: nil, type: nil)
176
+ # @!method initialize(id: nil, channels: nil, created_at: nil, description: nil, email: nil, enable_template_auto_creation_for_sp: nil, icon: nil, name: nil, organization_id: nil, profiles: nil, sending_phone_number: nil, sending_phone_number_profile_id: nil, settings: nil, short_name: nil, status: nil, type: nil)
159
177
  # Some parameter documentations has been truncated, see
160
178
  # {Sentdm::Models::MeRetrieveResponse::Data} for more details.
161
179
  #
@@ -173,6 +191,8 @@ module Sentdm
173
191
  #
174
192
  # @param email [String, nil] Contact email address
175
193
  #
194
+ # @param enable_template_auto_creation_for_sp [Boolean] Whether this account may mark a template for automatic creation on its sender pr
195
+ #
176
196
  # @param icon [String, nil] Account icon URL
177
197
  #
178
198
  # @param name [String] Account name
@@ -51,6 +51,24 @@ module Sentdm
51
51
  # @return [String, nil]
52
52
  optional :outbound_number, String
53
53
 
54
+ # @!attribute reason
55
+ # A human-readable sentence for ReasonCode, for example "The recipient is not
56
+ # registered on this channel". Omitted whenever reason_code is.
57
+ #
58
+ # @return [String, nil]
59
+ optional :reason, String, nil?: true
60
+
61
+ # @!attribute reason_code
62
+ # Why the message reached this status, as a stable platform code such as
63
+ # DELIVERY_007 or BUSINESS_003. Present on message.failed, message.filtered and
64
+ # message.blocked; omitted on every status that needs no explanation. Switch on
65
+ # this rather than on Reason: the code is stable, the wording may be improved. It
66
+ # is the platform's classification of the outcome and never a carrier or vendor
67
+ # code.
68
+ #
69
+ # @return [String, nil]
70
+ optional :reason_code, String, nil?: true
71
+
54
72
  # @!attribute schedule_reason
55
73
  # message.scheduled only: why the message is held, either because you scheduled it
56
74
  # or because the recipient is inside a protected quiet-hours window. Omitted on
@@ -85,7 +103,7 @@ module Sentdm
85
103
  # @return [String, nil]
86
104
  optional :updated_at, String
87
105
 
88
- # @!method initialize(message_status:, account_id: nil, agent_id: nil, body: nil, channel: nil, message_id: nil, outbound_number: nil, schedule_reason: nil, scheduled_at: nil, template_id: nil, template_name: nil, updated_at: nil)
106
+ # @!method initialize(message_status:, account_id: nil, agent_id: nil, body: nil, channel: nil, message_id: nil, outbound_number: nil, reason: nil, reason_code: nil, schedule_reason: nil, scheduled_at: nil, template_id: nil, template_name: nil, updated_at: nil)
89
107
  # Some parameter documentations has been truncated, see
90
108
  # {Sentdm::Models::MessageEventPayload} for more details.
91
109
  #
@@ -107,6 +125,10 @@ module Sentdm
107
125
  #
108
126
  # @param outbound_number [String] The recipient's number in E.164 format.
109
127
  #
128
+ # @param reason [String, nil] A human-readable sentence for ReasonCode, for example "The recipient is not regi
129
+ #
130
+ # @param reason_code [String, nil] Why the message reached this status, as a stable platform code such as
131
+ #
110
132
  # @param schedule_reason [String, nil] message.scheduled only: why the message is held, either because you scheduled it
111
133
  #
112
134
  # @param scheduled_at [String, nil] message.scheduled only: when the held message will be released for delivery, in
@@ -98,6 +98,23 @@ module Sentdm
98
98
  # @return [String, nil]
99
99
  optional :price, String, nil?: true
100
100
 
101
+ # @!attribute reason
102
+ # A human-readable sentence for reason_code, for example "The recipient is not
103
+ # registered on this channel" Omitted whenever reason_code is.
104
+ #
105
+ # @return [String, nil]
106
+ optional :reason, String, nil?: true
107
+
108
+ # @!attribute reason_code
109
+ # Why the message reached this status, as a stable platform code such as
110
+ # DELIVERY_007 or BUSINESS_003. Present on FAILED, FILTERED and BLOCKED
111
+ # activities; omitted on every status that needs no explanation. Switch on this
112
+ # rather than on reason: the code is stable, the wording may be improved. Same
113
+ # wire name and vocabulary as on the message and the webhook.
114
+ #
115
+ # @return [String, nil]
116
+ optional :reason_code, String, nil?: true
117
+
101
118
  # @!attribute scheduled_at
102
119
  # SCHEDULED activities only: when the held message will be released for delivery,
103
120
  # in UTC. Same wire name as on the send response, the message and the webhook.
@@ -120,7 +137,7 @@ module Sentdm
120
137
  # @return [Time, nil]
121
138
  optional :timestamp, Time
122
139
 
123
- # @!method initialize(active_contact_price: nil, description: nil, from: nil, price: nil, scheduled_at: nil, status: nil, timestamp: nil)
140
+ # @!method initialize(active_contact_price: nil, description: nil, from: nil, price: nil, reason: nil, reason_code: nil, scheduled_at: nil, status: nil, timestamp: nil)
124
141
  # Some parameter documentations has been truncated, see
125
142
  # {Sentdm::Models::MessageRetrieveActivitiesResponse::Data::Activity} for more
126
143
  # details.
@@ -139,6 +156,11 @@ module Sentdm
139
156
  #
140
157
  # @param price [String, nil] Channel cost for this activity (e.g., SMS/WhatsApp provider cost), formatted to
141
158
  #
159
+ # @param reason [String, nil] A human-readable sentence for reason_code, for example "The recipient is not reg
160
+ #
161
+ # @param reason_code [String, nil] Why the message reached this status, as a stable platform code such as
162
+ # DELIVERY\_
163
+ #
142
164
  # @param scheduled_at [Time, nil] SCHEDULED activities only: when the held message will be released for delivery,
143
165
  #
144
166
  # @param status [String] Activity status. Outbound: QUEUED, PROCESSED, ROUTED, SCHEDULED, SENT, DELIVERED
@@ -122,6 +122,24 @@ module Sentdm
122
122
  # @return [Float, nil]
123
123
  optional :price, Float, nil?: true
124
124
 
125
+ # @!attribute reason
126
+ # A human-readable sentence for reason_code, for example "Insufficient balance".
127
+ # Omitted whenever reason_code is.
128
+ #
129
+ # @return [String, nil]
130
+ optional :reason, String, nil?: true
131
+
132
+ # @!attribute reason_code
133
+ # Why the message is at its current status, as a stable platform code such as
134
+ # DELIVERY_007, BUSINESS_003 or DELIVERY_003. Present when the current status is
135
+ # FAILED, FILTERED or BLOCKED and the lifecycle was loaded; omitted otherwise.
136
+ # Switch on this rather than on reason: the code is stable, the wording may be
137
+ # improved. It is the platform's classification of the outcome, never a carrier or
138
+ # vendor code.
139
+ #
140
+ # @return [String, nil]
141
+ optional :reason_code, String, nil?: true
142
+
125
143
  # @!attribute region_code
126
144
  #
127
145
  # @return [String, nil]
@@ -147,7 +165,7 @@ module Sentdm
147
165
  # @return [String, nil]
148
166
  optional :template_name, String, nil?: true
149
167
 
150
- # @!method initialize(id: nil, active_contact_price: nil, channel: nil, contact_id: nil, created_at: nil, customer_id: nil, direction: nil, events: nil, message_body: nil, phone: nil, phone_international: nil, price: nil, region_code: nil, status: nil, template_category: nil, template_id: nil, template_name: nil)
168
+ # @!method initialize(id: nil, active_contact_price: nil, channel: nil, contact_id: nil, created_at: nil, customer_id: nil, direction: nil, events: nil, message_body: nil, phone: nil, phone_international: nil, price: nil, reason: nil, reason_code: nil, region_code: nil, status: nil, template_category: nil, template_id: nil, template_name: nil)
151
169
  # Some parameter documentations has been truncated, see
152
170
  # {Sentdm::Models::MessageRetrieveStatusResponse::Data} for more details.
153
171
  #
@@ -182,6 +200,10 @@ module Sentdm
182
200
  #
183
201
  # @param price [Float, nil]
184
202
  #
203
+ # @param reason [String, nil] A human-readable sentence for reason_code, for example "Insufficient balance". O
204
+ #
205
+ # @param reason_code [String, nil] Why the message is at its current status, as a stable platform code such as
206
+ #
185
207
  # @param region_code [String]
186
208
  #
187
209
  # @param status [String]
@@ -208,12 +230,37 @@ module Sentdm
208
230
  # @return [String, nil]
209
231
  optional :description, String, nil?: true
210
232
 
211
- # @!method initialize(status:, timestamp:, description: nil)
233
+ # @!attribute reason
234
+ # A human-readable sentence for reason_code. Omitted whenever reason_code is.
235
+ #
236
+ # @return [String, nil]
237
+ optional :reason, String, nil?: true
238
+
239
+ # @!attribute reason_code
240
+ # Why the message reached this status, as a stable platform code such as
241
+ # DELIVERY_007. Present on FAILED, FILTERED and BLOCKED events; omitted on every
242
+ # status that needs no explanation. Same wire name and vocabulary as on the
243
+ # activities list and the webhook.
244
+ #
245
+ # @return [String, nil]
246
+ optional :reason_code, String, nil?: true
247
+
248
+ # @!method initialize(status:, timestamp:, description: nil, reason: nil, reason_code: nil)
249
+ # Some parameter documentations has been truncated, see
250
+ # {Sentdm::Models::MessageRetrieveStatusResponse::Data::Event} for more details.
251
+ #
212
252
  # Represents a status change event in a message's lifecycle (v3)
213
253
  #
214
254
  # @param status [String]
255
+ #
215
256
  # @param timestamp [Time]
257
+ #
216
258
  # @param description [String, nil]
259
+ #
260
+ # @param reason [String, nil] A human-readable sentence for reason_code. Omitted whenever reason_code is.
261
+ #
262
+ # @param reason_code [String, nil] Why the message reached this status, as a stable platform code such as
263
+ # DELIVERY\_
217
264
  end
218
265
 
219
266
  # @see Sentdm::Models::MessageRetrieveStatusResponse::Data#message_body
@@ -356,32 +403,72 @@ module Sentdm
356
403
 
357
404
  class Media < Sentdm::Internal::Type::BaseModel
358
405
  # @!attribute media_type
359
- # One of Constants.MmsMediaTypes when known. Advisory — the carrier reads the
360
- # fetched object's Content-Type, not this.
406
+ # One of MmsMediaTypes when the content type is known. Advisory — a reader should
407
+ # trust the fetched object's own Content-Type.
361
408
  #
362
409
  # @return [String, nil]
363
410
  optional :media_type, String, api_name: :mediaType, nil?: true
364
411
 
412
+ # @!attribute mime_type
413
+ # Content type as the provider declared it. Null when it declared none.
414
+ #
415
+ # @return [String, nil]
416
+ optional :mime_type, String, api_name: :mimeType, nil?: true
417
+
418
+ # @!attribute size_bytes
419
+ # Size as the provider declared it. Never measured here — nothing downloads the
420
+ # file.
421
+ #
422
+ # @return [Integer, nil]
423
+ optional :size_bytes, Integer, api_name: :sizeBytes, nil?: true
424
+
425
+ # @!attribute source_hash_sha256
426
+ # Inbound only: the SHA-256 the provider declared alongside the attachment, when
427
+ # it declared one. Relayed to the customer so they can verify what they fetch
428
+ # matches what the carrier said it sent. It is the only integrity signal available
429
+ # on an attachment nobody here has read.
430
+ #
431
+ # @return [String, nil]
432
+ optional :source_hash_sha256, String, api_name: :sourceHashSha256, nil?: true
433
+
365
434
  # @!attribute url
435
+ # Where the file lives. Outbound: the URL the customer gave us and the carrier
436
+ # fetched. Inbound: the URL the carrier hosts it at, relayed unchanged.
366
437
  #
367
438
  # @return [String, nil]
368
- optional :url, String
439
+ optional :url, String, nil?: true
369
440
 
370
- # @!method initialize(media_type: nil, url: nil)
441
+ # @!method initialize(media_type: nil, mime_type: nil, size_bytes: nil, source_hash_sha256: nil, url: nil)
371
442
  # Some parameter documentations has been truncated, see
372
443
  # {Sentdm::Models::MessageRetrieveStatusResponse::Data::MessageBody::Media} for
373
444
  # more details.
374
445
  #
375
- # One attachment on a message: a customer-supplied public URL handed to the
376
- # carrier as-is.
446
+ # One attachment on a message, in either direction — and in both, a URL somebody
447
+ # else hosts.
448
+ #
449
+ # Outbound: the customer supplied a public URL and we handed it to the carrier.
450
+ # Inbound: the carrier hosts the file and we record where. sent.dm never holds the
451
+ # bytes, so there is no key, no expiry bookkeeping and nothing minted per read —
452
+ # what is stored is what is served.
453
+ #
454
+ # An inbound link expires on the carrier's own schedule and is unauthenticated.
455
+ # That is the customer's to manage, and it is documented where they will see it
456
+ # rather than only here — a recipient who needs an attachment to outlive that
457
+ # window copies it on receipt.
458
+ #
459
+ # Storing a presigned URL is the specific mistake this shape still avoids:
460
+ # M260826130000 and M260826140000 exist because RCS assets were stored as signed
461
+ # URLs and went stale. Nothing here is signed.
462
+ #
463
+ # @param media_type [String, nil] One of MmsMediaTypes when the content type is known. Advisory — a reader should
464
+ #
465
+ # @param mime_type [String, nil] Content type as the provider declared it. Null when it declared none.
377
466
  #
378
- # A URL and nothing else. sent.dm never takes custody of MMS media — the customer hosts it and we
379
- # pass the link through at send time — so there is no storage key, size or expiry to record. If we ever
380
- # do host attachments, that belongs with the change that introduces the hosting, not here.
467
+ # @param size_bytes [Integer, nil] Size as the provider declared it. Never measured here — nothing downloads the fi
381
468
  #
382
- # @param media_type [String, nil] One of Constants.MmsMediaTypes when known. Advisory — the carrier reads the
469
+ # @param source_hash_sha256 [String, nil] Inbound only: the SHA-256 the provider declared alongside the attachment, when i
383
470
  #
384
- # @param url [String]
471
+ # @param url [String, nil] Where the file lives. Outbound: the URL the customer gave us and the carrier fet
385
472
  end
386
473
  end
387
474
  end