late-sdk 0.0.561 → 0.0.563

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.
@@ -0,0 +1,264 @@
1
+ =begin
2
+ #Zernio API
3
+
4
+ #API reference for Zernio. Authenticate with a Bearer API key. Base URL: https://zernio.com/api
5
+
6
+ The version of the OpenAPI document: 1.0.4
7
+ Contact: support@zernio.com
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.19.0
10
+
11
+ =end
12
+
13
+ require 'date'
14
+ require 'time'
15
+
16
+ module Zernio
17
+ class RespondToPhoneNumberReviewerRequest < ApiModelBase
18
+ # Your message to the reviewer.
19
+ attr_accessor :message
20
+
21
+ # Corrected requirement documents, each keyed to its requirement.
22
+ attr_accessor :documents
23
+
24
+ # A corrected address record, keyed to its requirement.
25
+ attr_accessor :address
26
+
27
+ attr_accessor :entity_type
28
+
29
+ # Loose files (PDF/JPG/PNG/WEBP, max 10 MB each) whose links are added to your message.
30
+ attr_accessor :attachments
31
+
32
+ class EnumAttributeValidator
33
+ attr_reader :datatype
34
+ attr_reader :allowable_values
35
+
36
+ def initialize(datatype, allowable_values)
37
+ @allowable_values = allowable_values.map do |value|
38
+ case datatype.to_s
39
+ when /Integer/i
40
+ value.to_i
41
+ when /Float/i
42
+ value.to_f
43
+ else
44
+ value
45
+ end
46
+ end
47
+ end
48
+
49
+ def valid?(value)
50
+ !value || allowable_values.include?(value)
51
+ end
52
+ end
53
+
54
+ # Attribute mapping from ruby-style variable name to JSON key.
55
+ def self.attribute_map
56
+ {
57
+ :'message' => :'message',
58
+ :'documents' => :'documents',
59
+ :'address' => :'address',
60
+ :'entity_type' => :'entityType',
61
+ :'attachments' => :'attachments'
62
+ }
63
+ end
64
+
65
+ # Returns attribute mapping this model knows about
66
+ def self.acceptable_attribute_map
67
+ attribute_map
68
+ end
69
+
70
+ # Returns all the JSON keys this model knows about
71
+ def self.acceptable_attributes
72
+ acceptable_attribute_map.values
73
+ end
74
+
75
+ # Attribute type mapping.
76
+ def self.openapi_types
77
+ {
78
+ :'message' => :'String',
79
+ :'documents' => :'Array<RespondToPhoneNumberReviewerRequestDocumentsInner>',
80
+ :'address' => :'Object',
81
+ :'entity_type' => :'String',
82
+ :'attachments' => :'Array<ReplyToPhoneNumberReviewerRequestAttachmentsInner>'
83
+ }
84
+ end
85
+
86
+ # List of attributes with nullable: true
87
+ def self.openapi_nullable
88
+ Set.new([
89
+ :'entity_type',
90
+ ])
91
+ end
92
+
93
+ # Initializes the object
94
+ # @param [Hash] attributes Model attributes in the form of hash
95
+ def initialize(attributes = {})
96
+ if (!attributes.is_a?(Hash))
97
+ fail ArgumentError, "The input argument (attributes) must be a hash in `Zernio::RespondToPhoneNumberReviewerRequest` initialize method"
98
+ end
99
+
100
+ # check to see if the attribute exists and convert string to symbol for hash key
101
+ acceptable_attribute_map = self.class.acceptable_attribute_map
102
+ attributes = attributes.each_with_object({}) { |(k, v), h|
103
+ if (!acceptable_attribute_map.key?(k.to_sym))
104
+ fail ArgumentError, "`#{k}` is not a valid attribute in `Zernio::RespondToPhoneNumberReviewerRequest`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
105
+ end
106
+ h[k.to_sym] = v
107
+ }
108
+
109
+ if attributes.key?(:'message')
110
+ self.message = attributes[:'message']
111
+ end
112
+
113
+ if attributes.key?(:'documents')
114
+ if (value = attributes[:'documents']).is_a?(Array)
115
+ self.documents = value
116
+ end
117
+ end
118
+
119
+ if attributes.key?(:'address')
120
+ self.address = attributes[:'address']
121
+ end
122
+
123
+ if attributes.key?(:'entity_type')
124
+ self.entity_type = attributes[:'entity_type']
125
+ end
126
+
127
+ if attributes.key?(:'attachments')
128
+ if (value = attributes[:'attachments']).is_a?(Array)
129
+ self.attachments = value
130
+ end
131
+ end
132
+ end
133
+
134
+ # Show invalid properties with the reasons. Usually used together with valid?
135
+ # @return Array for valid properties with the reasons
136
+ def list_invalid_properties
137
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
138
+ invalid_properties = Array.new
139
+ if !@message.nil? && @message.to_s.length > 2000
140
+ invalid_properties.push('invalid value for "message", the character length must be smaller than or equal to 2000.')
141
+ end
142
+
143
+ if !@attachments.nil? && @attachments.length > 5
144
+ invalid_properties.push('invalid value for "attachments", number of items must be less than or equal to 5.')
145
+ end
146
+
147
+ invalid_properties
148
+ end
149
+
150
+ # Check to see if the all the properties in the model are valid
151
+ # @return true if the model is valid
152
+ def valid?
153
+ warn '[DEPRECATED] the `valid?` method is obsolete'
154
+ return false if !@message.nil? && @message.to_s.length > 2000
155
+ entity_type_validator = EnumAttributeValidator.new('String', ["individual", "business"])
156
+ return false unless entity_type_validator.valid?(@entity_type)
157
+ return false if !@attachments.nil? && @attachments.length > 5
158
+ true
159
+ end
160
+
161
+ # Custom attribute writer method with validation
162
+ # @param [Object] message Value to be assigned
163
+ def message=(message)
164
+ if message.nil?
165
+ fail ArgumentError, 'message cannot be nil'
166
+ end
167
+
168
+ if message.to_s.length > 2000
169
+ fail ArgumentError, 'invalid value for "message", the character length must be smaller than or equal to 2000.'
170
+ end
171
+
172
+ @message = message
173
+ end
174
+
175
+ # Custom attribute writer method checking allowed values (enum).
176
+ # @param [Object] entity_type Object to be assigned
177
+ def entity_type=(entity_type)
178
+ validator = EnumAttributeValidator.new('String', ["individual", "business"])
179
+ unless validator.valid?(entity_type)
180
+ fail ArgumentError, "invalid value for \"entity_type\", must be one of #{validator.allowable_values}."
181
+ end
182
+ @entity_type = entity_type
183
+ end
184
+
185
+ # Custom attribute writer method with validation
186
+ # @param [Object] attachments Value to be assigned
187
+ def attachments=(attachments)
188
+ if attachments.nil?
189
+ fail ArgumentError, 'attachments cannot be nil'
190
+ end
191
+
192
+ if attachments.length > 5
193
+ fail ArgumentError, 'invalid value for "attachments", number of items must be less than or equal to 5.'
194
+ end
195
+
196
+ @attachments = attachments
197
+ end
198
+
199
+ # Checks equality by comparing each attribute.
200
+ # @param [Object] Object to be compared
201
+ def ==(o)
202
+ return true if self.equal?(o)
203
+ self.class == o.class &&
204
+ message == o.message &&
205
+ documents == o.documents &&
206
+ address == o.address &&
207
+ entity_type == o.entity_type &&
208
+ attachments == o.attachments
209
+ end
210
+
211
+ # @see the `==` method
212
+ # @param [Object] Object to be compared
213
+ def eql?(o)
214
+ self == o
215
+ end
216
+
217
+ # Calculates hash code according to all attributes.
218
+ # @return [Integer] Hash code
219
+ def hash
220
+ [message, documents, address, entity_type, attachments].hash
221
+ end
222
+
223
+ # Builds the object from hash
224
+ # @param [Hash] attributes Model attributes in the form of hash
225
+ # @return [Object] Returns the model itself
226
+ def self.build_from_hash(attributes)
227
+ return nil unless attributes.is_a?(Hash)
228
+ attributes = attributes.transform_keys(&:to_sym)
229
+ transformed_hash = {}
230
+ openapi_types.each_pair do |key, type|
231
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
232
+ transformed_hash["#{key}"] = nil
233
+ elsif type =~ /\AArray<(.*)>/i
234
+ # check to ensure the input is an array given that the attribute
235
+ # is documented as an array but the input is not
236
+ if attributes[attribute_map[key]].is_a?(Array)
237
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
238
+ end
239
+ elsif !attributes[attribute_map[key]].nil?
240
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
241
+ end
242
+ end
243
+ new(transformed_hash)
244
+ end
245
+
246
+ # Returns the object in the form of hash
247
+ # @return [Hash] Returns the object in the form of hash
248
+ def to_hash
249
+ hash = {}
250
+ self.class.attribute_map.each_pair do |attr, param|
251
+ value = self.send(attr)
252
+ if value.nil?
253
+ is_nullable = self.class.openapi_nullable.include?(attr)
254
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
255
+ end
256
+
257
+ hash[param] = _to_hash(value)
258
+ end
259
+ hash
260
+ end
261
+
262
+ end
263
+
264
+ end
@@ -0,0 +1,193 @@
1
+ =begin
2
+ #Zernio API
3
+
4
+ #API reference for Zernio. Authenticate with a Bearer API key. Base URL: https://zernio.com/api
5
+
6
+ The version of the OpenAPI document: 1.0.4
7
+ Contact: support@zernio.com
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.19.0
10
+
11
+ =end
12
+
13
+ require 'date'
14
+ require 'time'
15
+
16
+ module Zernio
17
+ class RespondToPhoneNumberReviewerRequestDocumentsInner < ApiModelBase
18
+ attr_accessor :requirement_id
19
+
20
+ attr_accessor :filename
21
+
22
+ # Base64-encoded file bytes (or supply documentId instead).
23
+ attr_accessor :base64
24
+
25
+ # Id of a document already uploaded out-of-band.
26
+ attr_accessor :document_id
27
+
28
+ # Attribute mapping from ruby-style variable name to JSON key.
29
+ def self.attribute_map
30
+ {
31
+ :'requirement_id' => :'requirementId',
32
+ :'filename' => :'filename',
33
+ :'base64' => :'base64',
34
+ :'document_id' => :'documentId'
35
+ }
36
+ end
37
+
38
+ # Returns attribute mapping this model knows about
39
+ def self.acceptable_attribute_map
40
+ attribute_map
41
+ end
42
+
43
+ # Returns all the JSON keys this model knows about
44
+ def self.acceptable_attributes
45
+ acceptable_attribute_map.values
46
+ end
47
+
48
+ # Attribute type mapping.
49
+ def self.openapi_types
50
+ {
51
+ :'requirement_id' => :'String',
52
+ :'filename' => :'String',
53
+ :'base64' => :'String',
54
+ :'document_id' => :'String'
55
+ }
56
+ end
57
+
58
+ # List of attributes with nullable: true
59
+ def self.openapi_nullable
60
+ Set.new([
61
+ ])
62
+ end
63
+
64
+ # Initializes the object
65
+ # @param [Hash] attributes Model attributes in the form of hash
66
+ def initialize(attributes = {})
67
+ if (!attributes.is_a?(Hash))
68
+ fail ArgumentError, "The input argument (attributes) must be a hash in `Zernio::RespondToPhoneNumberReviewerRequestDocumentsInner` initialize method"
69
+ end
70
+
71
+ # check to see if the attribute exists and convert string to symbol for hash key
72
+ acceptable_attribute_map = self.class.acceptable_attribute_map
73
+ attributes = attributes.each_with_object({}) { |(k, v), h|
74
+ if (!acceptable_attribute_map.key?(k.to_sym))
75
+ fail ArgumentError, "`#{k}` is not a valid attribute in `Zernio::RespondToPhoneNumberReviewerRequestDocumentsInner`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
76
+ end
77
+ h[k.to_sym] = v
78
+ }
79
+
80
+ if attributes.key?(:'requirement_id')
81
+ self.requirement_id = attributes[:'requirement_id']
82
+ else
83
+ self.requirement_id = nil
84
+ end
85
+
86
+ if attributes.key?(:'filename')
87
+ self.filename = attributes[:'filename']
88
+ end
89
+
90
+ if attributes.key?(:'base64')
91
+ self.base64 = attributes[:'base64']
92
+ end
93
+
94
+ if attributes.key?(:'document_id')
95
+ self.document_id = attributes[:'document_id']
96
+ end
97
+ end
98
+
99
+ # Show invalid properties with the reasons. Usually used together with valid?
100
+ # @return Array for valid properties with the reasons
101
+ def list_invalid_properties
102
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
103
+ invalid_properties = Array.new
104
+ if @requirement_id.nil?
105
+ invalid_properties.push('invalid value for "requirement_id", requirement_id cannot be nil.')
106
+ end
107
+
108
+ invalid_properties
109
+ end
110
+
111
+ # Check to see if the all the properties in the model are valid
112
+ # @return true if the model is valid
113
+ def valid?
114
+ warn '[DEPRECATED] the `valid?` method is obsolete'
115
+ return false if @requirement_id.nil?
116
+ true
117
+ end
118
+
119
+ # Custom attribute writer method with validation
120
+ # @param [Object] requirement_id Value to be assigned
121
+ def requirement_id=(requirement_id)
122
+ if requirement_id.nil?
123
+ fail ArgumentError, 'requirement_id cannot be nil'
124
+ end
125
+
126
+ @requirement_id = requirement_id
127
+ end
128
+
129
+ # Checks equality by comparing each attribute.
130
+ # @param [Object] Object to be compared
131
+ def ==(o)
132
+ return true if self.equal?(o)
133
+ self.class == o.class &&
134
+ requirement_id == o.requirement_id &&
135
+ filename == o.filename &&
136
+ base64 == o.base64 &&
137
+ document_id == o.document_id
138
+ end
139
+
140
+ # @see the `==` method
141
+ # @param [Object] Object to be compared
142
+ def eql?(o)
143
+ self == o
144
+ end
145
+
146
+ # Calculates hash code according to all attributes.
147
+ # @return [Integer] Hash code
148
+ def hash
149
+ [requirement_id, filename, base64, document_id].hash
150
+ end
151
+
152
+ # Builds the object from hash
153
+ # @param [Hash] attributes Model attributes in the form of hash
154
+ # @return [Object] Returns the model itself
155
+ def self.build_from_hash(attributes)
156
+ return nil unless attributes.is_a?(Hash)
157
+ attributes = attributes.transform_keys(&:to_sym)
158
+ transformed_hash = {}
159
+ openapi_types.each_pair do |key, type|
160
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
161
+ transformed_hash["#{key}"] = nil
162
+ elsif type =~ /\AArray<(.*)>/i
163
+ # check to ensure the input is an array given that the attribute
164
+ # is documented as an array but the input is not
165
+ if attributes[attribute_map[key]].is_a?(Array)
166
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
167
+ end
168
+ elsif !attributes[attribute_map[key]].nil?
169
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
170
+ end
171
+ end
172
+ new(transformed_hash)
173
+ end
174
+
175
+ # Returns the object in the form of hash
176
+ # @return [Hash] Returns the object in the form of hash
177
+ def to_hash
178
+ hash = {}
179
+ self.class.attribute_map.each_pair do |attr, param|
180
+ value = self.send(attr)
181
+ if value.nil?
182
+ is_nullable = self.class.openapi_nullable.include?(attr)
183
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
184
+ end
185
+
186
+ hash[param] = _to_hash(value)
187
+ end
188
+ hash
189
+ end
190
+
191
+ end
192
+
193
+ end
@@ -11,5 +11,5 @@ Generator version: 7.19.0
11
11
  =end
12
12
 
13
13
  module Zernio
14
- VERSION = '0.0.561'
14
+ VERSION = '0.0.563'
15
15
  end
data/lib/zernio-sdk.rb CHANGED
@@ -1031,6 +1031,9 @@ require 'zernio-sdk/models/request_sms_sender_id_limit_increase_request'
1031
1031
  require 'zernio-sdk/models/resend_sms_registration_otp200_response'
1032
1032
  require 'zernio-sdk/models/reserve_rf_prediction201_response'
1033
1033
  require 'zernio-sdk/models/reserve_rf_prediction_request'
1034
+ require 'zernio-sdk/models/respond_to_phone_number_reviewer200_response'
1035
+ require 'zernio-sdk/models/respond_to_phone_number_reviewer_request'
1036
+ require 'zernio-sdk/models/respond_to_phone_number_reviewer_request_documents_inner'
1034
1037
  require 'zernio-sdk/models/restore_workflow_version200_response'
1035
1038
  require 'zernio-sdk/models/restore_workflow_version200_response_workflow'
1036
1039
  require 'zernio-sdk/models/retweet_post200_response'
data/openapi.yaml CHANGED
@@ -29363,6 +29363,83 @@ paths:
29363
29363
  '404': { description: Number not found }
29364
29364
  '502': { description: Couldn't deliver the reply to the reviewer; retry. }
29365
29365
 
29366
+ /v1/phone-numbers/{id}/remediate/respond:
29367
+ post:
29368
+ operationId: respondToPhoneNumberReviewer
29369
+ tags: [Phone Numbers]
29370
+ summary: Respond to the regulatory reviewer (message + corrections)
29371
+ description: |
29372
+ Send a single response to the reviewer on a number awaiting remediation:
29373
+ a free-text message and/or corrected requirement documents, in one call.
29374
+ If corrections are present they are PATCHed onto the requirement group and
29375
+ re-submitted (the number goes back to "in review"); if a message or file
29376
+ attachments are present they are posted to the reviewer's comment thread.
29377
+ When both are present, your message is the thread comment and the resubmit
29378
+ drives the state change. At least one of message, corrections, or
29379
+ attachments is required. `documents` correct requirement slots; `attachments`
29380
+ are loose files (their links are added to your message).
29381
+ parameters:
29382
+ - name: id
29383
+ in: path
29384
+ required: true
29385
+ schema: { type: string }
29386
+ requestBody:
29387
+ required: true
29388
+ content:
29389
+ application/json:
29390
+ schema:
29391
+ type: object
29392
+ properties:
29393
+ message: { type: string, maxLength: 2000, description: Your message to the reviewer. }
29394
+ documents:
29395
+ type: array
29396
+ description: 'Corrected requirement documents, each keyed to its requirement.'
29397
+ items:
29398
+ type: object
29399
+ required: [requirementId]
29400
+ properties:
29401
+ requirementId: { type: string }
29402
+ filename: { type: string }
29403
+ base64: { type: string, description: Base64-encoded file bytes (or supply documentId instead). }
29404
+ documentId: { type: string, description: Id of a document already uploaded out-of-band. }
29405
+ address:
29406
+ type: object
29407
+ description: A corrected address record, keyed to its requirement.
29408
+ entityType:
29409
+ type: [string, 'null']
29410
+ enum: [individual, business, null]
29411
+ attachments:
29412
+ type: array
29413
+ maxItems: 5
29414
+ description: 'Loose files (PDF/JPG/PNG/WEBP, max 10 MB each) whose links are added to your message.'
29415
+ items:
29416
+ type: object
29417
+ required: [filename, base64]
29418
+ properties:
29419
+ filename: { type: string }
29420
+ base64: { type: string, description: Base64-encoded file bytes. }
29421
+ responses:
29422
+ '200':
29423
+ description: Response sent.
29424
+ content:
29425
+ application/json:
29426
+ schema:
29427
+ type: object
29428
+ properties:
29429
+ status: { type: string, enum: [resubmitted, replied], description: '`resubmitted` when corrections were submitted, `replied` when it was message-only.' }
29430
+ posted: { type: boolean, description: Whether a message/attachments were posted to the reviewer. }
29431
+ phoneNumber:
29432
+ type: object
29433
+ properties:
29434
+ id: { type: string }
29435
+ status: { type: string }
29436
+ siblingsResubmitted: { type: integer, description: Other numbers on the same registration the correction fanned out to. }
29437
+ '400': { $ref: '#/components/responses/BadRequest' }
29438
+ '401': { $ref: '#/components/responses/Unauthorized' }
29439
+ '404': { description: Number not found }
29440
+ '409': { description: Number's registration is held under our own carrier registration; nothing for you to correct. }
29441
+ '502': { description: Couldn't deliver your response to the reviewer; retry. }
29442
+
29366
29443
  /v1/whatsapp/phone-numbers/kyc:
29367
29444
  get:
29368
29445
  operationId: getWhatsAppNumberKycForm
@@ -30428,6 +30505,7 @@ paths:
30428
30505
  properties:
30429
30506
  after: { type: string }
30430
30507
  before: { type: string }
30508
+ '400': { $ref: '#/components/responses/BadRequest' }
30431
30509
  '401': { $ref: '#/components/responses/Unauthorized' }
30432
30510
  post:
30433
30511
  operationId: createWhatsAppGroupChat
@@ -30468,6 +30546,7 @@ paths:
30468
30546
  properties:
30469
30547
  groupId: { type: string }
30470
30548
  inviteLink: { type: string }
30549
+ '400': { $ref: '#/components/responses/BadRequest' }
30471
30550
  '401': { $ref: '#/components/responses/Unauthorized' }
30472
30551
 
30473
30552
  /v1/whatsapp/wa-groups/{groupId}:
@@ -30511,6 +30590,7 @@ paths:
30511
30590
  participantCount: { type: integer }
30512
30591
  createdAt: { type: integer, description: UNIX timestamp }
30513
30592
  isSuspended: { type: boolean }
30593
+ '400': { $ref: '#/components/responses/BadRequest' }
30514
30594
  '401': { $ref: '#/components/responses/Unauthorized' }
30515
30595
  '404': { $ref: '#/components/responses/NotFound' }
30516
30596
  post:
@@ -30546,6 +30626,7 @@ paths:
30546
30626
  properties:
30547
30627
  success: { type: boolean }
30548
30628
  message: { type: string }
30629
+ '400': { $ref: '#/components/responses/BadRequest' }
30549
30630
  '401': { $ref: '#/components/responses/Unauthorized' }
30550
30631
  '404': { $ref: '#/components/responses/NotFound' }
30551
30632
  delete:
@@ -30571,6 +30652,7 @@ paths:
30571
30652
  properties:
30572
30653
  success: { type: boolean }
30573
30654
  message: { type: string }
30655
+ '400': { $ref: '#/components/responses/BadRequest' }
30574
30656
  '401': { $ref: '#/components/responses/Unauthorized' }
30575
30657
  '404': { $ref: '#/components/responses/NotFound' }
30576
30658
 
@@ -30611,6 +30693,7 @@ paths:
30611
30693
  properties:
30612
30694
  success: { type: boolean }
30613
30695
  message: { type: string }
30696
+ '400': { $ref: '#/components/responses/BadRequest' }
30614
30697
  '401': { $ref: '#/components/responses/Unauthorized' }
30615
30698
  delete:
30616
30699
  operationId: removeWhatsAppGroupParticipants
@@ -30647,6 +30730,7 @@ paths:
30647
30730
  properties:
30648
30731
  success: { type: boolean }
30649
30732
  message: { type: string }
30733
+ '400': { $ref: '#/components/responses/BadRequest' }
30650
30734
  '401': { $ref: '#/components/responses/Unauthorized' }
30651
30735
 
30652
30736
  /v1/whatsapp/wa-groups/{groupId}/invite-link:
@@ -30673,6 +30757,7 @@ paths:
30673
30757
  properties:
30674
30758
  success: { type: boolean }
30675
30759
  inviteLink: { type: string }
30760
+ '400': { $ref: '#/components/responses/BadRequest' }
30676
30761
  '401': { $ref: '#/components/responses/Unauthorized' }
30677
30762
 
30678
30763
  /v1/whatsapp/wa-groups/{groupId}/join-requests:
@@ -30705,6 +30790,7 @@ paths:
30705
30790
  properties:
30706
30791
  user: { type: string, description: Phone number }
30707
30792
  timestamp: { type: integer, description: UNIX timestamp of request }
30793
+ '400': { $ref: '#/components/responses/BadRequest' }
30708
30794
  '401': { $ref: '#/components/responses/Unauthorized' }
30709
30795
  post:
30710
30796
  operationId: approveWhatsAppGroupJoinRequests
@@ -30741,6 +30827,7 @@ paths:
30741
30827
  properties:
30742
30828
  success: { type: boolean }
30743
30829
  message: { type: string }
30830
+ '400': { $ref: '#/components/responses/BadRequest' }
30744
30831
  '401': { $ref: '#/components/responses/Unauthorized' }
30745
30832
  delete:
30746
30833
  operationId: rejectWhatsAppGroupJoinRequests
@@ -30777,6 +30864,7 @@ paths:
30777
30864
  properties:
30778
30865
  success: { type: boolean }
30779
30866
  message: { type: string }
30867
+ '400': { $ref: '#/components/responses/BadRequest' }
30780
30868
  '401': { $ref: '#/components/responses/Unauthorized' }
30781
30869
 
30782
30870
  # ─── WhatsApp Flows ───────────────────────────────────────────────
@@ -240,6 +240,19 @@ describe 'PhoneNumbersApi' do
240
240
  end
241
241
  end
242
242
 
243
+ # unit tests for respond_to_phone_number_reviewer
244
+ # Respond to the regulatory reviewer (message + corrections)
245
+ # Send a single response to the reviewer on a number awaiting remediation: a free-text message and/or corrected requirement documents, in one call. If corrections are present they are PATCHed onto the requirement group and re-submitted (the number goes back to \&quot;in review\&quot;); if a message or file attachments are present they are posted to the reviewer&#39;s comment thread. When both are present, your message is the thread comment and the resubmit drives the state change. At least one of message, corrections, or attachments is required. &#x60;documents&#x60; correct requirement slots; &#x60;attachments&#x60; are loose files (their links are added to your message).
246
+ # @param id
247
+ # @param respond_to_phone_number_reviewer_request
248
+ # @param [Hash] opts the optional parameters
249
+ # @return [RespondToPhoneNumberReviewer200Response]
250
+ describe 'respond_to_phone_number_reviewer test' do
251
+ it 'should work' do
252
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
253
+ end
254
+ end
255
+
243
256
  # unit tests for review_phone_number_kyc_packet
244
257
  # Pre-review a KYC packet
245
258
  # Advisory dry-run of a regulated-KYC packet before submitting: reviews the exact documents the regulator will see (referenced by the ids from POST /v1/phone-numbers/kyc/upload-document) against the declared values and address, and returns plain-language advisories for likely decline reasons (wrong document type, mismatched address, one-sided ID scans). Non-blocking: advisories are warnings, submitting anyway is always allowed, and any review failure degrades to an empty list.