diff --git a/Bandwidth.Standard.sln b/Bandwidth.Standard.sln index 0f431e7d..069bd587 100644 --- a/Bandwidth.Standard.sln +++ b/Bandwidth.Standard.sln @@ -2,7 +2,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bandwidth.Standard", "src\Bandwidth.Standard\Bandwidth.Standard.csproj", "{0549B4D2-AA34-4364-B222-071E3996A3CD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bandwidth.Standard", "src\Bandwidth.Standard\Bandwidth.Standard.csproj", "{BB69D1F9-DD5B-4C98-A9DA-F49165DCD0DA}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bandwidth.Standard.Test", "src\Bandwidth.Standard.Test\Bandwidth.Standard.Test.csproj", "{19F1DEBC-DE5E-4517-8062-F000CD499087}" EndProject @@ -12,10 +12,10 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0549B4D2-AA34-4364-B222-071E3996A3CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0549B4D2-AA34-4364-B222-071E3996A3CD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0549B4D2-AA34-4364-B222-071E3996A3CD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0549B4D2-AA34-4364-B222-071E3996A3CD}.Release|Any CPU.Build.0 = Release|Any CPU + {BB69D1F9-DD5B-4C98-A9DA-F49165DCD0DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BB69D1F9-DD5B-4C98-A9DA-F49165DCD0DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BB69D1F9-DD5B-4C98-A9DA-F49165DCD0DA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BB69D1F9-DD5B-4C98-A9DA-F49165DCD0DA}.Release|Any CPU.Build.0 = Release|Any CPU {19F1DEBC-DE5E-4517-8062-F000CD499087}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {19F1DEBC-DE5E-4517-8062-F000CD499087}.Debug|Any CPU.Build.0 = Debug|Any CPU {19F1DEBC-DE5E-4517-8062-F000CD499087}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/api/openapi.yaml b/api/openapi.yaml index 9deea06c..e1c30bbb 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -389,7 +389,10 @@ paths: url: https://messaging.bandwidth.com/api/v2 /users/{accountId}/messages: get: - description: Returns a list of messages based on query parameters. + description: | + Returns a list of messages based on query parameters. + + **Rate Limit:** This endpoint is rate limited to 3500 requests per 5 minutes per Source IP address. Exceeding the limit returns HTTP 429 with a `Retry-After` header. operationId: listMessages parameters: - description: Your Bandwidth Account ID. @@ -699,6 +702,12 @@ paths: schema: $ref: '#/components/schemas/messagingRequestError' description: Not Found + "405": + content: + application/json: + schema: + $ref: '#/components/schemas/messagingRequestError' + description: Method Not Allowed "415": content: application/json: @@ -708,9 +717,21 @@ paths: "429": content: application/json: + example: + type: rate_limit_exceeded + description: Rate limit exceeded. Wait for Retry-After time before + sending another request. schema: $ref: '#/components/schemas/messagingRequestError' description: Too Many Requests + headers: + Retry-After: + description: The number of seconds to wait before retrying the request. + explode: false + schema: + example: 300 + type: integer + style: simple "500": content: application/json: @@ -7409,6 +7430,24 @@ components: schema: $ref: '#/components/schemas/multiChannelError' description: Internal Server Error + listMessagesTooManyRequestsError: + content: + application/json: + example: + type: rate_limit_exceeded + description: Rate limit exceeded. Wait for Retry-After time before sending + another request. + schema: + $ref: '#/components/schemas/messagingRequestError' + description: Too Many Requests + headers: + Retry-After: + description: The number of seconds to wait before retrying the request. + explode: false + schema: + example: 300 + type: integer + style: simple createCallResponse: content: application/json: @@ -8735,7 +8774,9 @@ components: rbmMessageMedia: properties: media: - $ref: '#/components/schemas/rbmMessageContentFile' + items: + $ref: '#/components/schemas/rbmMessageContentFile' + type: array suggestions: description: An array of suggested actions for the recipient. items: @@ -13623,13 +13664,11 @@ components: description: Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number - included in all webhook payloads. example: acde070d-8c4c-4f0d-9d8a-162843c10333 - format: uuid type: string internalTicketNumberForWebhook: description: Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number. example: acde070d-8c4c-4f0d-9d8a-162843c10333 - format: uuid type: string businessContactPhoneNumber: description: Contact telephone number @@ -13929,7 +13968,6 @@ components: description: Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number. example: acde070d-8c4c-4f0d-9d8a-162843c10333 - format: uuid type: string type: object verificationDenialWebhook: @@ -13965,7 +14003,6 @@ components: description: Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number. example: acde070d-8c4c-4f0d-9d8a-162843c10333 - format: uuid type: string phoneNumber: description: Toll-free telephone number in E.164 format. @@ -14015,7 +14052,6 @@ components: description: Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number. example: acde070d-8c4c-4f0d-9d8a-162843c10333 - format: uuid type: string type: object blockedWebhook: @@ -14038,7 +14074,6 @@ components: description: Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number. example: acde070d-8c4c-4f0d-9d8a-162843c10333 - format: uuid type: string blocked: description: Whether a Toll-Free Verification is blocked. This attribute @@ -14522,7 +14557,6 @@ components: tracking the verification status of a toll-free number - included in all webhook payloads. example: acde070d-8c4c-4f0d-9d8a-162843c10333 - format: uuid type: string declineReasonDescription: description: Explanation for why a verification request was declined. diff --git a/bandwidth.yml b/bandwidth.yml index 22b13cec..7c08f291 100644 --- a/bandwidth.yml +++ b/bandwidth.yml @@ -163,7 +163,13 @@ paths: /users/{accountId}/messages: get: summary: List Messages - description: Returns a list of messages based on query parameters. + description: > + Returns a list of messages based on query parameters. + + + **Rate Limit:** This endpoint is rate limited to 3500 requests per 5 + minutes per Source IP address. Exceeding the limit returns HTTP 429 with + a `Retry-After` header. operationId: listMessages tags: - Messages @@ -207,10 +213,12 @@ paths: $ref: '#/components/responses/messagingForbiddenError' '404': $ref: '#/components/responses/messagingNotFoundError' + '405': + $ref: '#/components/responses/messagingMethodNotAllowedError' '415': $ref: '#/components/responses/messagingInvalidMediaTypeError' '429': - $ref: '#/components/responses/messagingTooManyRequestsError' + $ref: '#/components/responses/listMessagesTooManyRequestsError' '500': $ref: '#/components/responses/messagingInternalServerError' post: @@ -2257,7 +2265,9 @@ components: type: object properties: media: - $ref: '#/components/schemas/rbmMessageContentFile' + type: array + items: + $ref: '#/components/schemas/rbmMessageContentFile' suggestions: $ref: '#/components/schemas/multiChannelFullActions' required: @@ -5875,7 +5885,6 @@ components: type: object internalTicketNumber: type: string - format: uuid description: >- Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number - included in all webhook @@ -5883,7 +5892,6 @@ components: example: acde070d-8c4c-4f0d-9d8a-162843c10333 internalTicketNumberForWebhook: type: string - format: uuid description: >- Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number. @@ -6752,6 +6760,21 @@ components: - type: internal-server-error description: Internal server error. No further information available source: {} + listMessagesTooManyRequestsError: + description: Too Many Requests + headers: + Retry-After: + description: The number of seconds to wait before retrying the request. + schema: + type: integer + example: 300 + content: + application/json: + schema: + $ref: "#/components/schemas/messagingRequestError" + example: + type: rate_limit_exceeded + description: Rate limit exceeded. Wait for Retry-After time before sending another request. createCallResponse: description: Created headers: diff --git a/docs/BlockedWebhook.md b/docs/BlockedWebhook.md index 2447c63a..6c1987a3 100644 --- a/docs/BlockedWebhook.md +++ b/docs/BlockedWebhook.md @@ -7,7 +7,7 @@ Name | Type | Description | Notes **AccountId** | **string** | User's account ID. | [optional] **PhoneNumber** | **string** | Toll-free telephone number in E.164 format. | [optional] **Status** | **TfvCallbackStatusEnum** | | [optional] -**InternalTicketNumber** | **Guid** | Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number. | [optional] +**InternalTicketNumber** | **string** | Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number. | [optional] **Blocked** | **bool** | Whether a Toll-Free Verification is blocked. This attribute will only be defined when the number is blocked. | [optional] **BlockedReason** | **string** | The reason why the Toll-Free Verification is blocked. This attribute will only be defined when the number is blocked. | [optional] diff --git a/docs/FailureWebhook.md b/docs/FailureWebhook.md index 74fefe57..ee69d41d 100644 --- a/docs/FailureWebhook.md +++ b/docs/FailureWebhook.md @@ -9,7 +9,7 @@ Name | Type | Description | Notes **ErrorCode** | **string** | An error code indicating what error was encountered. This code can be interpreted as an HTTP status code in regards to the error that was encountered. | [optional] **ErrorMessage** | **string** | A description of the error that was encountered. | [optional] **Errors** | **List<string>** | Details of the errors that were encountered when processing the request. | [optional] -**InternalTicketNumber** | **Guid** | Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number. | [optional] +**InternalTicketNumber** | **string** | Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number. | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/docs/MessagesApi.md b/docs/MessagesApi.md index ddd281a3..b850fd91 100644 --- a/docs/MessagesApi.md +++ b/docs/MessagesApi.md @@ -121,7 +121,7 @@ catch (ApiException e) List Messages -Returns a list of messages based on query parameters. +Returns a list of messages based on query parameters. **Rate Limit:** This endpoint is rate limited to 3500 requests per 5 minutes per Source IP address. Exceeding the limit returns HTTP 429 with a `Retry-After` header. ### Example ```csharp @@ -267,8 +267,9 @@ catch (ApiException e) | **401** | Unauthorized | - | | **403** | Forbidden | - | | **404** | Not Found | - | +| **405** | Method Not Allowed | - | | **415** | Unsupported Media Type | - | -| **429** | Too Many Requests | - | +| **429** | Too Many Requests | * Retry-After - The number of seconds to wait before retrying the request.
| | **500** | Internal Server Error | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/docs/MultiChannelChannelListRBMObjectAllOfContent.md b/docs/MultiChannelChannelListRBMObjectAllOfContent.md index bd919a25..74015b4a 100644 --- a/docs/MultiChannelChannelListRBMObjectAllOfContent.md +++ b/docs/MultiChannelChannelListRBMObjectAllOfContent.md @@ -7,7 +7,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **Text** | **string** | The text associated with the message. Must be 3270 characters or less | **Suggestions** | [**List<MultiChannelAction>**](MultiChannelAction.md) | An array of suggested actions for the recipient. | [optional] -**Media** | [**RbmMessageContentFile**](RbmMessageContentFile.md) | | +**Media** | [**List<RbmMessageContentFile>**](RbmMessageContentFile.md) | | **Orientation** | **StandaloneCardOrientationEnum** | | **ThumbnailImageAlignment** | **ThumbnailAlignmentEnum** | | **CardContent** | [**RbmCardContent**](RbmCardContent.md) | | diff --git a/docs/RbmMessageMedia.md b/docs/RbmMessageMedia.md index 7a0e5aad..cc1c7349 100644 --- a/docs/RbmMessageMedia.md +++ b/docs/RbmMessageMedia.md @@ -4,7 +4,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**Media** | [**RbmMessageContentFile**](RbmMessageContentFile.md) | | +**Media** | [**List<RbmMessageContentFile>**](RbmMessageContentFile.md) | | **Suggestions** | [**List<MultiChannelAction>**](MultiChannelAction.md) | An array of suggested actions for the recipient. | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/docs/TfvStatus.md b/docs/TfvStatus.md index 3986ec94..8ffb666f 100644 --- a/docs/TfvStatus.md +++ b/docs/TfvStatus.md @@ -6,7 +6,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **PhoneNumber** | **string** | Toll-free telephone number in E.164 format. | [optional] **Status** | **TfvStatusEnum** | | [optional] -**InternalTicketNumber** | **Guid** | Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number - included in all webhook payloads. | [optional] +**InternalTicketNumber** | **string** | Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number - included in all webhook payloads. | [optional] **DeclineReasonDescription** | **string** | Explanation for why a verification request was declined. | [optional] **ResubmitAllowed** | **bool** | Whether a Toll-Free Verification request qualifies for resubmission via PUT. | [optional] **CreatedDateTime** | **DateTime** | Date and time the verification request was created. | [optional] diff --git a/docs/VerificationDenialWebhook.md b/docs/VerificationDenialWebhook.md index 8764138c..87564364 100644 --- a/docs/VerificationDenialWebhook.md +++ b/docs/VerificationDenialWebhook.md @@ -8,7 +8,7 @@ Name | Type | Description | Notes **AdditionalDenialReasons** | [**List<AdditionalDenialReason>**](AdditionalDenialReason.md) | An optional list of denial reasons in addition to declineReasonDescription when multiple reasons apply. | [optional] **DeclineReasonDescription** | **string** | Explanation for why a verification request was declined. | [optional] **DenialStatusCode** | **int** | Reason code for denial. | [optional] -**InternalTicketNumber** | **Guid** | Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number. | [optional] +**InternalTicketNumber** | **string** | Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number. | [optional] **PhoneNumber** | **string** | Toll-free telephone number in E.164 format. | [optional] **ResubmitAllowed** | **bool** | Whether a Toll-Free Verification request qualifies for resubmission via PUT. | [optional] **Status** | **string** | | [optional] [default to "UNVERIFIED"] diff --git a/docs/VerificationWebhook.md b/docs/VerificationWebhook.md index beb3236c..36710752 100644 --- a/docs/VerificationWebhook.md +++ b/docs/VerificationWebhook.md @@ -7,7 +7,7 @@ Name | Type | Description | Notes **AccountId** | **string** | User's account ID. | [optional] **PhoneNumber** | **string** | Toll-free telephone number in E.164 format. | [optional] **Status** | **TfvCallbackStatusEnum** | | [optional] -**InternalTicketNumber** | **Guid** | Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number. | [optional] +**InternalTicketNumber** | **string** | Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number. | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/src/Bandwidth.Standard.Test/Smoke/MultiChannelIntegrationTests.cs b/src/Bandwidth.Standard.Test/Smoke/MultiChannelIntegrationTests.cs index fd379c72..bf8db67a 100644 --- a/src/Bandwidth.Standard.Test/Smoke/MultiChannelIntegrationTests.cs +++ b/src/Bandwidth.Standard.Test/Smoke/MultiChannelIntegrationTests.cs @@ -81,14 +81,14 @@ public void CreateMultiChannelSMSMessageTest() Assert.IsType(response.Data); Assert.IsType>(response.Data.Links); Assert.IsType(response.Data.Data); - Assert.IsType(response.Data.Data.Id); + Assert.IsType(response.Data.Data.Id); Assert.IsType(response.Data.Data.Time); Assert.IsType(response.Data.Data.Direction); - Assert.Equal(response.Data.Data.Direction, MessageDirectionEnum.Out); - Assert.IsType>(response.Data.Data.To); - Assert.IsType(response.Data.Data.Tag); + Assert.Equal(MessageDirectionEnum.Out, response.Data.Data.Direction); + Assert.IsType>(response.Data.Data.To); + Assert.IsType(response.Data.Data.Tag); Assert.IsType(response.Data.Data.Priority); - Assert.Equal(response.Data.Data.Priority, PriorityEnum.High); + Assert.Equal(PriorityEnum.High, response.Data.Data.Priority); Assert.IsType(response.Data.Data.Expiration); Assert.IsType>(response.Data.Data.ChannelList); @@ -133,14 +133,14 @@ public void CreateMultiChannelMMSMessageTest() Assert.IsType(response.Data); Assert.IsType>(response.Data.Links); Assert.IsType(response.Data.Data); - Assert.IsType(response.Data.Data.Id); + Assert.IsType(response.Data.Data.Id); Assert.IsType(response.Data.Data.Time); Assert.IsType(response.Data.Data.Direction); - Assert.Equal(response.Data.Data.Direction, MessageDirectionEnum.Out); - Assert.IsType>(response.Data.Data.To); - Assert.IsType(response.Data.Data.Tag); + Assert.Equal(MessageDirectionEnum.Out, response.Data.Data.Direction); + Assert.IsType>(response.Data.Data.To); + Assert.IsType(response.Data.Data.Tag); Assert.IsType(response.Data.Data.Priority); - Assert.Equal(response.Data.Data.Priority, PriorityEnum.High); + Assert.Equal(PriorityEnum.High, response.Data.Data.Priority); Assert.IsType(response.Data.Data.Expiration); Assert.IsType>(response.Data.Data.ChannelList); @@ -149,12 +149,12 @@ public void CreateMultiChannelMMSMessageTest() } /// - /// Test CreateMultiChannelRBMMessage + /// Test CreateMultiChannelRBMTextMessage /// [Fact] - public void CreateMultiChannelRBMMessageTest() + public void CreateMultiChannelRBMTextMessageTest() { - MultiChannelChannelListRequestObject channelListObject = new MultiChannelChannelListRequestObject( + MultiChannelChannelListRequestObject channelListRBMObject = new MultiChannelChannelListRequestObject( new MultiChannelChannelListRBMObject( from: bwNumber, applicationId: messagingApplicationId, @@ -166,7 +166,7 @@ public void CreateMultiChannelRBMMessageTest() new MultiChannelAction(new RbmActionDial( type: RbmActionTypeEnum.DIALPHONE, text: "Call Us", - postbackData: new byte[]{1, 2, 3}, + postbackData: new byte[] {1, 2, 3}, phoneNumber: bwNumber )) } @@ -180,7 +180,7 @@ public void CreateMultiChannelRBMMessageTest() tag: "tag", priority: PriorityEnum.High, expiration: DateTime.UtcNow.AddMinutes(1), - channelList: new List { channelListObject } + channelList: new List { channelListRBMObject } ); var response = instance.CreateMultiChannelMessageWithHttpInfo(accountId, multiChannelMessageRequest); @@ -190,19 +190,307 @@ public void CreateMultiChannelRBMMessageTest() Assert.IsType(response.Data); Assert.IsType>(response.Data.Links); Assert.IsType(response.Data.Data); - Assert.IsType(response.Data.Data.Id); + Assert.IsType(response.Data.Data.Id); Assert.IsType(response.Data.Data.Time); Assert.IsType(response.Data.Data.Direction); - Assert.Equal(response.Data.Data.Direction, MessageDirectionEnum.Out); - Assert.IsType>(response.Data.Data.To); - Assert.IsType(response.Data.Data.Tag); + Assert.Equal(MessageDirectionEnum.Out, response.Data.Data.Direction); + Assert.IsType>(response.Data.Data.To); + Assert.IsType(response.Data.Data.Tag); Assert.IsType(response.Data.Data.Priority); - Assert.Equal(response.Data.Data.Priority, PriorityEnum.High); + Assert.Equal(PriorityEnum.High, response.Data.Data.Priority); Assert.IsType(response.Data.Data.Expiration); Assert.IsType>(response.Data.Data.ChannelList); + Assert.IsType(response.Data.Data.ChannelList[0].ActualInstance); + var channelListObject = (MultiChannelChannelListRBMResponseObject)response.Data.Data.ChannelList[0].ActualInstance; + Assert.Equal(bwNumber, channelListObject.From); + Assert.Equal(messagingApplicationId, channelListObject.ApplicationId); + Assert.Equal(MultiChannelMessageChannelEnum.RBM, channelListObject.Channel); + Assert.Equal(bwNumber, channelListObject.Owner); + Assert.IsType(channelListObject.Content.ActualInstance); + var rbmContent = (RbmMessageContentText)channelListObject.Content.ActualInstance; + Assert.IsType(rbmContent.Text); + Assert.IsType>(rbmContent.Suggestions); + Assert.IsType(rbmContent.Suggestions[0]); + Assert.IsType(rbmContent.Suggestions[0].ActualInstance); + var rbmActionDial = (RbmActionDial)rbmContent.Suggestions[0].ActualInstance; + Assert.Equal(RbmActionTypeEnum.DIALPHONE, rbmActionDial.Type); + Assert.IsType(rbmActionDial.Text); + Assert.IsType(rbmActionDial.PostbackData); + Assert.IsType(rbmActionDial.PhoneNumber); + } - // Add more assertions when C# generator supports discriminator mapping - // Assert.IsType(response.Data.Data.ChannelList[0].ActualInstance); + /// + /// Test CreateMultiChannelRBMMediaMessage + /// + [Fact] + public void CreateMultiChannelRBMMediaMessageTest() + { + MultiChannelChannelListRequestObject channelListRBMObject = new MultiChannelChannelListRequestObject( + new MultiChannelChannelListRBMObject( + from: bwNumber, + applicationId: messagingApplicationId, + channel: MultiChannelMessageChannelEnum.RBM, + content: new MultiChannelChannelListRBMObjectAllOfContent( + new RbmMessageMedia( + media: new List { + new RbmMessageContentFile( + fileUrl: "https://test.url/", + thumbnailUrl: "https://test.url/" + ) + }, + suggestions: new List { + new MultiChannelAction(new RbmActionDial( + type: RbmActionTypeEnum.DIALPHONE, + text: "Call Us", + postbackData: new byte[] {1, 2, 3}, + phoneNumber: bwNumber + )) + } + ) + ) + ) + ); + + MultiChannelMessageRequest multiChannelMessageRequest = new MultiChannelMessageRequest( + to: Environment.GetEnvironmentVariable("USER_NUMBER"), + tag: "tag", + priority: PriorityEnum.High, + expiration: DateTime.UtcNow.AddMinutes(1), + channelList: new List { channelListRBMObject } + ); + + var response = instance.CreateMultiChannelMessageWithHttpInfo(accountId, multiChannelMessageRequest); + Assert.IsType>(response); + Assert.Equal(HttpStatusCode.Accepted, response.StatusCode); + Assert.NotNull(response.Data); + Assert.IsType(response.Data); + Assert.IsType>(response.Data.Links); + Assert.IsType(response.Data.Data); + Assert.IsType(response.Data.Data.Id); + Assert.IsType(response.Data.Data.Time); + Assert.IsType(response.Data.Data.Direction); + Assert.Equal(MessageDirectionEnum.Out, response.Data.Data.Direction); + Assert.IsType>(response.Data.Data.To); + Assert.IsType(response.Data.Data.Tag); + Assert.IsType(response.Data.Data.Priority); + Assert.Equal(PriorityEnum.High, response.Data.Data.Priority); + Assert.IsType(response.Data.Data.Expiration); + Assert.IsType>(response.Data.Data.ChannelList); + Assert.IsType(response.Data.Data.ChannelList[0].ActualInstance); + var channelListObject = (MultiChannelChannelListRBMResponseObject)response.Data.Data.ChannelList[0].ActualInstance; + Assert.Equal(bwNumber, channelListObject.From); + Assert.Equal(messagingApplicationId, channelListObject.ApplicationId); + Assert.Equal(MultiChannelMessageChannelEnum.RBM, channelListObject.Channel); + Assert.Equal(bwNumber, channelListObject.Owner); + Assert.IsType(channelListObject.Content.ActualInstance); + var rbmContent = (RbmMessageMedia)channelListObject.Content.ActualInstance; + Assert.IsType>(rbmContent.Media); + Assert.IsType(rbmContent.Media[0]); + Assert.IsType(rbmContent.Media[0].FileUrl); + Assert.IsType(rbmContent.Media[0].ThumbnailUrl); + Assert.IsType>(rbmContent.Suggestions); + Assert.IsType(rbmContent.Suggestions[0]); + Assert.IsType(rbmContent.Suggestions[0].ActualInstance); + var rbmActionDial = (RbmActionDial)rbmContent.Suggestions[0].ActualInstance; + Assert.Equal(RbmActionTypeEnum.DIALPHONE, rbmActionDial.Type); + Assert.IsType(rbmActionDial.Text); + Assert.IsType(rbmActionDial.PostbackData); + Assert.IsType(rbmActionDial.PhoneNumber); + } + + /// + /// Test CreateMultiChannelRBMRichStandaloneMessageTest + /// + [Fact] + public void CreateMultiChannelRBMRichStandaloneMessageTest() + { + MultiChannelChannelListRequestObject channelListRBMObject = new MultiChannelChannelListRequestObject( + new MultiChannelChannelListRBMObject( + from: bwNumber, + applicationId: messagingApplicationId, + channel: MultiChannelMessageChannelEnum.RBM, + content: new MultiChannelChannelListRBMObjectAllOfContent( + new RbmMessageContentRichCard( + new RbmStandaloneCard( + orientation: StandaloneCardOrientationEnum.VERTICAL, + thumbnailImageAlignment: ThumbnailAlignmentEnum.LEFT, + cardContent: new RbmCardContent( + title: "TestTitle", + description: "TestDescription", + media: new RbmCardContentMedia( + fileUrl: "https://test.url/", + thumbnailUrl: "https://test.url/", + height: RbmMediaHeightEnum.MEDIUM + ), + suggestions: new List { + new MultiChannelAction(new RbmActionDial( + type: RbmActionTypeEnum.DIALPHONE, + text: "Call Us", + postbackData: new byte[] {1, 2, 3}, + phoneNumber: bwNumber + )) + } + ) + ) + ) + ) + ) + ); + + MultiChannelMessageRequest multiChannelMessageRequest = new MultiChannelMessageRequest( + to: Environment.GetEnvironmentVariable("USER_NUMBER"), + tag: "tag", + priority: PriorityEnum.High, + expiration: DateTime.UtcNow.AddMinutes(1), + channelList: new List { channelListRBMObject } + ); + + var response = instance.CreateMultiChannelMessageWithHttpInfo(accountId, multiChannelMessageRequest); + Assert.IsType>(response); + Assert.Equal(HttpStatusCode.Accepted, response.StatusCode); + Assert.NotNull(response.Data); + Assert.IsType(response.Data); + Assert.IsType>(response.Data.Links); + Assert.IsType(response.Data.Data); + Assert.IsType(response.Data.Data.Id); + Assert.IsType(response.Data.Data.Time); + Assert.IsType(response.Data.Data.Direction); + Assert.Equal(MessageDirectionEnum.Out, response.Data.Data.Direction); + Assert.IsType>(response.Data.Data.To); + Assert.IsType(response.Data.Data.Tag); + Assert.IsType(response.Data.Data.Priority); + Assert.Equal(PriorityEnum.High, response.Data.Data.Priority); + Assert.IsType(response.Data.Data.Expiration); + Assert.IsType>(response.Data.Data.ChannelList); + Assert.IsType(response.Data.Data.ChannelList[0].ActualInstance); + var channelListObject = (MultiChannelChannelListRBMResponseObject)response.Data.Data.ChannelList[0].ActualInstance; + Assert.Equal(bwNumber, channelListObject.From); + Assert.Equal(messagingApplicationId, channelListObject.ApplicationId); + Assert.Equal(MultiChannelMessageChannelEnum.RBM, channelListObject.Channel); + Assert.Equal(bwNumber, channelListObject.Owner); + Assert.IsType(channelListObject.Content.ActualInstance); + var rbmContentRichCard = (RbmMessageContentRichCard)channelListObject.Content.ActualInstance; + Assert.IsType(rbmContentRichCard.ActualInstance); + var rbmContent = (RbmStandaloneCard)rbmContentRichCard.ActualInstance; + Assert.Equal(StandaloneCardOrientationEnum.VERTICAL, rbmContent.Orientation); + Assert.Equal(ThumbnailAlignmentEnum.LEFT, rbmContent.ThumbnailImageAlignment); + Assert.IsType(rbmContent.CardContent); + var cardContent = rbmContent.CardContent; + Assert.IsType(cardContent.Title); + Assert.IsType(cardContent.Description); + Assert.IsType(cardContent.Media); + var cardMedia = cardContent.Media; + Assert.IsType(cardMedia.FileUrl); + Assert.IsType(cardMedia.ThumbnailUrl); + Assert.Equal(RbmMediaHeightEnum.MEDIUM, cardMedia.Height); + Assert.IsType>(cardContent.Suggestions); + Assert.IsType(cardContent.Suggestions[0]); + Assert.IsType(cardContent.Suggestions[0].ActualInstance); + var rbmActionDial = (RbmActionDial)cardContent.Suggestions[0].ActualInstance; + Assert.Equal(RbmActionTypeEnum.DIALPHONE, rbmActionDial.Type); + Assert.IsType(rbmActionDial.Text); + Assert.IsType(rbmActionDial.PostbackData); + Assert.IsType(rbmActionDial.PhoneNumber); + } + + /// + /// Test CreateMultiChannelRBMRichCarouselMessageTest + /// + [Fact] + public void CreateMultiChannelRBMRichCarouselMessageTest() + { + MultiChannelChannelListRequestObject channelListRBMObject = new MultiChannelChannelListRequestObject( + new MultiChannelChannelListRBMObject( + from: bwNumber, + applicationId: messagingApplicationId, + channel: MultiChannelMessageChannelEnum.RBM, + content: new MultiChannelChannelListRBMObjectAllOfContent( + new RbmMessageContentRichCard( + new RbmMessageCarouselCard( + cardWidth: CardWidthEnum.MEDIUM, + cardContents: new List { + new RbmCardContent( + title: "TestTitle", + description: "TestDescription", + media: new RbmCardContentMedia( + fileUrl: "https://test.url/", + thumbnailUrl: "https://test.url/", + height: RbmMediaHeightEnum.MEDIUM + ), + suggestions: new List { + new MultiChannelAction(new RbmActionDial( + type: RbmActionTypeEnum.DIALPHONE, + text: "Call Us", + postbackData: new byte[] {1, 2, 3}, + phoneNumber: bwNumber + )) + } + ), + new RbmCardContent( + title: "TestTitle2" + ) + } + ) + ) + ) + ) + ); + + MultiChannelMessageRequest multiChannelMessageRequest = new MultiChannelMessageRequest( + to: Environment.GetEnvironmentVariable("USER_NUMBER"), + tag: "tag", + priority: PriorityEnum.High, + expiration: DateTime.UtcNow.AddMinutes(1), + channelList: new List { channelListRBMObject } + ); + + var response = instance.CreateMultiChannelMessageWithHttpInfo(accountId, multiChannelMessageRequest); + Assert.IsType>(response); + Assert.Equal(HttpStatusCode.Accepted, response.StatusCode); + Assert.NotNull(response.Data); + Assert.IsType(response.Data); + Assert.IsType>(response.Data.Links); + Assert.IsType(response.Data.Data); + Assert.IsType(response.Data.Data.Id); + Assert.IsType(response.Data.Data.Time); + Assert.IsType(response.Data.Data.Direction); + Assert.Equal(MessageDirectionEnum.Out, response.Data.Data.Direction); + Assert.IsType>(response.Data.Data.To); + Assert.IsType(response.Data.Data.Tag); + Assert.IsType(response.Data.Data.Priority); + Assert.Equal(PriorityEnum.High, response.Data.Data.Priority); + Assert.IsType(response.Data.Data.Expiration); + Assert.IsType>(response.Data.Data.ChannelList); + Assert.IsType(response.Data.Data.ChannelList[0].ActualInstance); + var channelListObject = (MultiChannelChannelListRBMResponseObject)response.Data.Data.ChannelList[0].ActualInstance; + Assert.Equal(bwNumber, channelListObject.From); + Assert.Equal(messagingApplicationId, channelListObject.ApplicationId); + Assert.Equal(MultiChannelMessageChannelEnum.RBM, channelListObject.Channel); + Assert.Equal(bwNumber, channelListObject.Owner); + Assert.IsType(channelListObject.Content.ActualInstance); + var rbmContentRichCard = (RbmMessageContentRichCard)channelListObject.Content.ActualInstance; + Assert.IsType(rbmContentRichCard.ActualInstance); + var rbmContent = (RbmMessageCarouselCard)rbmContentRichCard.ActualInstance; + Assert.Equal(CardWidthEnum.MEDIUM, rbmContent.CardWidth); + Assert.IsType>(rbmContent.CardContents); + Assert.IsType(rbmContent.CardContents[0]); + Assert.IsType(rbmContent.CardContents[0].Title); + Assert.IsType(rbmContent.CardContents[0].Description); + Assert.IsType(rbmContent.CardContents[0].Media); + var cardMedia = rbmContent.CardContents[0].Media; + Assert.IsType(cardMedia.FileUrl); + Assert.IsType(cardMedia.ThumbnailUrl); + Assert.Equal(RbmMediaHeightEnum.MEDIUM, cardMedia.Height); + Assert.IsType>(rbmContent.CardContents[0].Suggestions); + Assert.IsType(rbmContent.CardContents[0].Suggestions[0]); + Assert.IsType(rbmContent.CardContents[0].Suggestions[0].ActualInstance); + var rbmActionDial = (RbmActionDial)rbmContent.CardContents[0].Suggestions[0].ActualInstance; + Assert.Equal(RbmActionTypeEnum.DIALPHONE, rbmActionDial.Type); + Assert.IsType(rbmActionDial.Text); + Assert.IsType(rbmActionDial.PostbackData); + Assert.IsType(rbmActionDial.PhoneNumber); + Assert.IsType(rbmContent.CardContents[1]); + Assert.IsType(rbmContent.CardContents[1].Title); } } } diff --git a/src/Bandwidth.Standard.Test/Unit/Model/BlockedWebhookTests.cs b/src/Bandwidth.Standard.Test/Unit/Model/BlockedWebhookTests.cs index b9efe969..3e7eb4da 100644 --- a/src/Bandwidth.Standard.Test/Unit/Model/BlockedWebhookTests.cs +++ b/src/Bandwidth.Standard.Test/Unit/Model/BlockedWebhookTests.cs @@ -32,7 +32,6 @@ namespace Bandwidth.Standard.Test.Unit.Model public class BlockedWebhookTests : IDisposable { private BlockedWebhook instance; - private Guid guid = Guid.NewGuid(); public BlockedWebhookTests() { @@ -40,7 +39,7 @@ public BlockedWebhookTests() accountId: "accountId", phoneNumber: "phoneNumber", status: TfvCallbackStatusEnum.VERIFIED, - internalTicketNumber: guid, + internalTicketNumber: "internalTicketNumber", blocked: true, blockedReason: "blockedReason" ); @@ -96,8 +95,8 @@ public void StatusTest() [Fact] public void InternalTicketNumberTest() { - Assert.IsType(instance.InternalTicketNumber); - Assert.Equal(guid, instance.InternalTicketNumber); + Assert.IsType(instance.InternalTicketNumber); + Assert.Equal("internalTicketNumber", instance.InternalTicketNumber); } /// diff --git a/src/Bandwidth.Standard.Test/Unit/Model/FailureWebhookTests.cs b/src/Bandwidth.Standard.Test/Unit/Model/FailureWebhookTests.cs index 460116a6..eebc63fb 100644 --- a/src/Bandwidth.Standard.Test/Unit/Model/FailureWebhookTests.cs +++ b/src/Bandwidth.Standard.Test/Unit/Model/FailureWebhookTests.cs @@ -28,7 +28,6 @@ namespace Bandwidth.Standard.Test.Unit.Model public class FailureWebhookTests : IDisposable { private FailureWebhook instance; - private Guid guid = Guid.NewGuid(); public FailureWebhookTests() { @@ -38,7 +37,7 @@ public FailureWebhookTests() errorCode: "errorCode", errorMessage: "errorMessage", errors: new List { "error" }, - internalTicketNumber: guid + internalTicketNumber: "internalTicketNumber" ); } @@ -112,8 +111,8 @@ public void ErrorsTest() [Fact] public void InternalTicketNumberTest() { - Assert.IsType(instance.InternalTicketNumber); - Assert.Equal(guid, instance.InternalTicketNumber); + Assert.IsType(instance.InternalTicketNumber); + Assert.Equal("internalTicketNumber", instance.InternalTicketNumber); } } } diff --git a/src/Bandwidth.Standard.Test/Unit/Model/MultiChannelChannelListRBMObjectAllOfContentTests.cs b/src/Bandwidth.Standard.Test/Unit/Model/MultiChannelChannelListRBMObjectAllOfContentTests.cs index f7de1ee8..c6ccee34 100644 --- a/src/Bandwidth.Standard.Test/Unit/Model/MultiChannelChannelListRBMObjectAllOfContentTests.cs +++ b/src/Bandwidth.Standard.Test/Unit/Model/MultiChannelChannelListRBMObjectAllOfContentTests.cs @@ -34,7 +34,7 @@ public class MultiChannelChannelListRBMObjectAllOfContentTests : IDisposable private MultiChannelChannelListRBMObjectAllOfContent instanceText; private MultiChannelChannelListRBMObjectAllOfContent instanceMedia; private MultiChannelChannelListRBMObjectAllOfContent instanceRich; - private RbmCardContent cardContent; + private RbmCardContent cardContent; private List suggestions; public MultiChannelChannelListRBMObjectAllOfContentTests() @@ -58,10 +58,12 @@ public MultiChannelChannelListRBMObjectAllOfContentTests() )); instanceMedia = new MultiChannelChannelListRBMObjectAllOfContent(new RbmMessageMedia( - media: new RbmMessageContentFile( - fileUrl: "https://test.url/", - thumbnailUrl: "https://test.url/" - ), + media: new List { + new RbmMessageContentFile( + fileUrl: "https://test.url/", + thumbnailUrl: "https://test.url/" + ) + }, suggestions: suggestions )); diff --git a/src/Bandwidth.Standard.Test/Unit/Model/RbmMessageMediaTests.cs b/src/Bandwidth.Standard.Test/Unit/Model/RbmMessageMediaTests.cs index b38bc9b2..c19f614f 100644 --- a/src/Bandwidth.Standard.Test/Unit/Model/RbmMessageMediaTests.cs +++ b/src/Bandwidth.Standard.Test/Unit/Model/RbmMessageMediaTests.cs @@ -36,10 +36,13 @@ public class RbmMessageMediaTests : IDisposable public RbmMessageMediaTests() { instance = new RbmMessageMedia( - media: new RbmMessageContentFile( - fileUrl: "https://test.url/", - thumbnailUrl: "https://test.url/" - ), + media: new List + { + new RbmMessageContentFile( + fileUrl: "https://test.url/", + thumbnailUrl: "https://test.url/" + ) + }, suggestions: new List { new MultiChannelAction(new RbmActionBase( @@ -71,7 +74,7 @@ public void RbmMessageMediaInstanceTest() [Fact] public void MediaTest() { - Assert.IsType(instance.Media); + Assert.IsType>(instance.Media); } /// diff --git a/src/Bandwidth.Standard.Test/Unit/Model/TfvStatusTests.cs b/src/Bandwidth.Standard.Test/Unit/Model/TfvStatusTests.cs index fd669d89..b4196623 100644 --- a/src/Bandwidth.Standard.Test/Unit/Model/TfvStatusTests.cs +++ b/src/Bandwidth.Standard.Test/Unit/Model/TfvStatusTests.cs @@ -28,7 +28,6 @@ namespace Bandwidth.Standard.Test.Unit.Model public class TfvStatusTests : IDisposable { private TfvStatus instance; - private Guid internalTicketNumber = Guid.NewGuid(); private TfvSubmissionInfo submission = new TfvSubmissionInfo(); public TfvStatusTests() @@ -36,7 +35,7 @@ public TfvStatusTests() instance = new TfvStatus( phoneNumber: "phoneNumber", status: TfvStatusEnum.PENDING, - internalTicketNumber: internalTicketNumber, + internalTicketNumber: "internalTicketNumber", declineReasonDescription: "declineReasonDescription", resubmitAllowed: true, createdDateTime: DateTime.Parse("2023-10-01T00:00:00Z"), @@ -88,8 +87,8 @@ public void StatusTest() [Fact] public void InternalTicketNumberTest() { - Assert.IsType(instance.InternalTicketNumber); - Assert.Equal(internalTicketNumber, instance.InternalTicketNumber); + Assert.IsType(instance.InternalTicketNumber); + Assert.Equal("internalTicketNumber", instance.InternalTicketNumber); } /// diff --git a/src/Bandwidth.Standard.Test/Unit/Model/VerificationDenialWebhookTests.cs b/src/Bandwidth.Standard.Test/Unit/Model/VerificationDenialWebhookTests.cs index afe33167..7d1fbfcf 100644 --- a/src/Bandwidth.Standard.Test/Unit/Model/VerificationDenialWebhookTests.cs +++ b/src/Bandwidth.Standard.Test/Unit/Model/VerificationDenialWebhookTests.cs @@ -29,7 +29,6 @@ public class VerificationDenialWebhookTests : IDisposable { private VerificationDenialWebhook instance; private AdditionalDenialReason additionalDenialReason; - private Guid internalTicketNumber = Guid.NewGuid(); public VerificationDenialWebhookTests() { @@ -44,7 +43,7 @@ public VerificationDenialWebhookTests() additionalDenialReasons: new List { additionalDenialReason }, declineReasonDescription: "declineReasonDescription", denialStatusCode: 511, - internalTicketNumber: internalTicketNumber, + internalTicketNumber: "internalTicketNumber", phoneNumber: "+18005551234", resubmitAllowed: true, status: "status", @@ -113,8 +112,8 @@ public void DenialStatusCodeTest() [Fact] public void InternalTicketNumberTest() { - Assert.IsType(instance.InternalTicketNumber); - Assert.Equal(internalTicketNumber, instance.InternalTicketNumber); + Assert.IsType(instance.InternalTicketNumber); + Assert.Equal("internalTicketNumber", instance.InternalTicketNumber); } /// diff --git a/src/Bandwidth.Standard.Test/Unit/Model/VerificationWebhookTests.cs b/src/Bandwidth.Standard.Test/Unit/Model/VerificationWebhookTests.cs index ae3cecf8..586997d4 100644 --- a/src/Bandwidth.Standard.Test/Unit/Model/VerificationWebhookTests.cs +++ b/src/Bandwidth.Standard.Test/Unit/Model/VerificationWebhookTests.cs @@ -28,7 +28,6 @@ namespace Bandwidth.Standard.Test.Unit.Model public class VerificationWebhookTests : IDisposable { private VerificationWebhook instance; - private Guid internalTicketNumber = Guid.NewGuid(); public VerificationWebhookTests() { @@ -36,7 +35,7 @@ public VerificationWebhookTests() accountId: "accountId", phoneNumber: "+1919551234", status: TfvCallbackStatusEnum.VERIFIED, - internalTicketNumber: internalTicketNumber + internalTicketNumber: "internalTicketNumber" ); } @@ -90,8 +89,8 @@ public void StatusTest() [Fact] public void InternalTicketNumberTest() { - Assert.IsType(instance.InternalTicketNumber); - Assert.Equal(internalTicketNumber, instance.InternalTicketNumber); + Assert.IsType(instance.InternalTicketNumber); + Assert.Equal("internalTicketNumber", instance.InternalTicketNumber); } } } diff --git a/src/Bandwidth.Standard/Api/MessagesApi.cs b/src/Bandwidth.Standard/Api/MessagesApi.cs index 7b11fb04..4d3a8e17 100644 --- a/src/Bandwidth.Standard/Api/MessagesApi.cs +++ b/src/Bandwidth.Standard/Api/MessagesApi.cs @@ -57,7 +57,7 @@ public interface IMessagesApiSync : IApiAccessor /// List Messages /// /// - /// Returns a list of messages based on query parameters. + /// Returns a list of messages based on query parameters. **Rate Limit:** This endpoint is rate limited to 3500 requests per 5 minutes per Source IP address. Exceeding the limit returns HTTP 429 with a `Retry-After` header. /// /// Thrown when fails to make API call /// Your Bandwidth Account ID. @@ -96,7 +96,7 @@ public interface IMessagesApiSync : IApiAccessor /// List Messages /// /// - /// Returns a list of messages based on query parameters. + /// Returns a list of messages based on query parameters. **Rate Limit:** This endpoint is rate limited to 3500 requests per 5 minutes per Source IP address. Exceeding the limit returns HTTP 429 with a `Retry-After` header. /// /// Thrown when fails to make API call /// Your Bandwidth Account ID. @@ -170,7 +170,7 @@ public interface IMessagesApiAsync : IApiAccessor /// List Messages /// /// - /// Returns a list of messages based on query parameters. + /// Returns a list of messages based on query parameters. **Rate Limit:** This endpoint is rate limited to 3500 requests per 5 minutes per Source IP address. Exceeding the limit returns HTTP 429 with a `Retry-After` header. /// /// Thrown when fails to make API call /// Your Bandwidth Account ID. @@ -210,7 +210,7 @@ public interface IMessagesApiAsync : IApiAccessor /// List Messages /// /// - /// Returns a list of messages based on query parameters. + /// Returns a list of messages based on query parameters. **Rate Limit:** This endpoint is rate limited to 3500 requests per 5 minutes per Source IP address. Exceeding the limit returns HTTP 429 with a `Retry-After` header. /// /// Thrown when fails to make API call /// Your Bandwidth Account ID. @@ -574,7 +574,7 @@ public Bandwidth.Standard.Client.ApiResponse CreateMessageWithHttpInfo( } /// - /// List Messages Returns a list of messages based on query parameters. + /// List Messages Returns a list of messages based on query parameters. **Rate Limit:** This endpoint is rate limited to 3500 requests per 5 minutes per Source IP address. Exceeding the limit returns HTTP 429 with a `Retry-After` header. /// /// Thrown when fails to make API call /// Your Bandwidth Account ID. @@ -614,7 +614,7 @@ public Bandwidth.Standard.Client.ApiResponse CreateMessageWithHttpInfo( } /// - /// List Messages Returns a list of messages based on query parameters. + /// List Messages Returns a list of messages based on query parameters. **Rate Limit:** This endpoint is rate limited to 3500 requests per 5 minutes per Source IP address. Exceeding the limit returns HTTP 429 with a `Retry-After` header. /// /// Thrown when fails to make API call /// Your Bandwidth Account ID. @@ -828,7 +828,7 @@ public Bandwidth.Standard.Client.ApiResponse CreateMessageWithHttpInfo( } /// - /// List Messages Returns a list of messages based on query parameters. + /// List Messages Returns a list of messages based on query parameters. **Rate Limit:** This endpoint is rate limited to 3500 requests per 5 minutes per Source IP address. Exceeding the limit returns HTTP 429 with a `Retry-After` header. /// /// Thrown when fails to make API call /// Your Bandwidth Account ID. @@ -869,7 +869,7 @@ public Bandwidth.Standard.Client.ApiResponse CreateMessageWithHttpInfo( } /// - /// List Messages Returns a list of messages based on query parameters. + /// List Messages Returns a list of messages based on query parameters. **Rate Limit:** This endpoint is rate limited to 3500 requests per 5 minutes per Source IP address. Exceeding the limit returns HTTP 429 with a `Retry-After` header. /// /// Thrown when fails to make API call /// Your Bandwidth Account ID. diff --git a/src/Bandwidth.Standard/Model/BlockedWebhook.cs b/src/Bandwidth.Standard/Model/BlockedWebhook.cs index 7e6b7d5a..e5eb0bcd 100644 --- a/src/Bandwidth.Standard/Model/BlockedWebhook.cs +++ b/src/Bandwidth.Standard/Model/BlockedWebhook.cs @@ -47,7 +47,7 @@ public partial class BlockedWebhook : IValidatableObject /// Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number.. /// Whether a Toll-Free Verification is blocked. This attribute will only be defined when the number is blocked.. /// The reason why the Toll-Free Verification is blocked. This attribute will only be defined when the number is blocked.. - public BlockedWebhook(string accountId = default(string), string phoneNumber = default(string), TfvCallbackStatusEnum? status = default(TfvCallbackStatusEnum?), Guid internalTicketNumber = default(Guid), bool blocked = default(bool), string blockedReason = default(string)) + public BlockedWebhook(string accountId = default(string), string phoneNumber = default(string), TfvCallbackStatusEnum? status = default(TfvCallbackStatusEnum?), string internalTicketNumber = default(string), bool blocked = default(bool), string blockedReason = default(string)) { this.AccountId = accountId; this.PhoneNumber = phoneNumber; @@ -79,7 +79,7 @@ public partial class BlockedWebhook : IValidatableObject /// Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number. /// acde070d-8c4c-4f0d-9d8a-162843c10333 [DataMember(Name = "internalTicketNumber", EmitDefaultValue = false)] - public Guid InternalTicketNumber { get; set; } + public string InternalTicketNumber { get; set; } /// /// Whether a Toll-Free Verification is blocked. This attribute will only be defined when the number is blocked. diff --git a/src/Bandwidth.Standard/Model/FailureWebhook.cs b/src/Bandwidth.Standard/Model/FailureWebhook.cs index 68ec307e..feb427df 100644 --- a/src/Bandwidth.Standard/Model/FailureWebhook.cs +++ b/src/Bandwidth.Standard/Model/FailureWebhook.cs @@ -41,7 +41,7 @@ public partial class FailureWebhook : IValidatableObject /// A description of the error that was encountered.. /// Details of the errors that were encountered when processing the request.. /// Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number.. - public FailureWebhook(string accountId = default(string), string phoneNumber = default(string), string errorCode = default(string), string errorMessage = default(string), List errors = default(List), Guid internalTicketNumber = default(Guid)) + public FailureWebhook(string accountId = default(string), string phoneNumber = default(string), string errorCode = default(string), string errorMessage = default(string), List errors = default(List), string internalTicketNumber = default(string)) { this.AccountId = accountId; this.PhoneNumber = phoneNumber; @@ -96,7 +96,7 @@ public partial class FailureWebhook : IValidatableObject /// Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number. /// acde070d-8c4c-4f0d-9d8a-162843c10333 [DataMember(Name = "internalTicketNumber", EmitDefaultValue = false)] - public Guid InternalTicketNumber { get; set; } + public string InternalTicketNumber { get; set; } /// /// Returns the string presentation of the object diff --git a/src/Bandwidth.Standard/Model/LookupResult.cs b/src/Bandwidth.Standard/Model/LookupResult.cs index 549bafe1..e566406b 100644 --- a/src/Bandwidth.Standard/Model/LookupResult.cs +++ b/src/Bandwidth.Standard/Model/LookupResult.cs @@ -130,7 +130,7 @@ public partial class LookupResult : IValidatableObject /// [DNI-Only](#section/DNI-Only). The date the phone number entered the status described in `latestMessageDeliveryStatus`. Think of this as the \"start time\" for that status. Value resets every time the `latestMessageDeliveryStatus` changes. /// /// [DNI-Only](#section/DNI-Only). The date the phone number entered the status described in `latestMessageDeliveryStatus`. Think of this as the \"start time\" for that status. Value resets every time the `latestMessageDeliveryStatus` changes. - /// Fri Jun 20 00:00:00 UTC 2025 + /// Thu Jun 19 20:00:00 EDT 2025 [DataMember(Name = "initialMessageDeliveryStatusDate", EmitDefaultValue = false)] [JsonConverter(typeof(OpenAPIDateConverter))] public DateTime InitialMessageDeliveryStatusDate { get; set; } @@ -139,7 +139,7 @@ public partial class LookupResult : IValidatableObject /// [DNI-Only](#section/DNI-Only). The date bandwidth last received delivery status information for this phone number. Use this field to understand how up-to-date the `latestMessageDeliveryStatus` is. Value resets every time the `latestMessageDeliveryStatus` changes. /// /// [DNI-Only](#section/DNI-Only). The date bandwidth last received delivery status information for this phone number. Use this field to understand how up-to-date the `latestMessageDeliveryStatus` is. Value resets every time the `latestMessageDeliveryStatus` changes. - /// Sat Jun 21 00:00:00 UTC 2025 + /// Fri Jun 20 20:00:00 EDT 2025 [DataMember(Name = "latestMessageDeliveryStatusDate", EmitDefaultValue = false)] [JsonConverter(typeof(OpenAPIDateConverter))] public DateTime LatestMessageDeliveryStatusDate { get; set; } diff --git a/src/Bandwidth.Standard/Model/RbmActionBase.cs b/src/Bandwidth.Standard/Model/RbmActionBase.cs index 33ebaecb..fb2d1d16 100644 --- a/src/Bandwidth.Standard/Model/RbmActionBase.cs +++ b/src/Bandwidth.Standard/Model/RbmActionBase.cs @@ -78,7 +78,7 @@ protected RbmActionBase() { } /// Base64 payload the customer receives when the reply is clicked. /// /// Base64 payload the customer receives when the reply is clicked. - /// [B@43f7f48d + /// [B@126d0868 [DataMember(Name = "postbackData", IsRequired = true, EmitDefaultValue = true)] public byte[] PostbackData { get; set; } diff --git a/src/Bandwidth.Standard/Model/RbmMessageMedia.cs b/src/Bandwidth.Standard/Model/RbmMessageMedia.cs index 96a89251..0967a508 100644 --- a/src/Bandwidth.Standard/Model/RbmMessageMedia.cs +++ b/src/Bandwidth.Standard/Model/RbmMessageMedia.cs @@ -42,7 +42,7 @@ protected RbmMessageMedia() { } /// /// media (required). /// An array of suggested actions for the recipient.. - public RbmMessageMedia(RbmMessageContentFile media = default(RbmMessageContentFile), List suggestions = default(List)) + public RbmMessageMedia(List media = default(List), List suggestions = default(List)) { // to ensure "media" is required (not null) if (media == null) @@ -57,7 +57,7 @@ protected RbmMessageMedia() { } /// Gets or Sets Media /// [DataMember(Name = "media", IsRequired = true, EmitDefaultValue = true)] - public RbmMessageContentFile Media { get; set; } + public List Media { get; set; } /// /// An array of suggested actions for the recipient. diff --git a/src/Bandwidth.Standard/Model/RbmSuggestionResponse.cs b/src/Bandwidth.Standard/Model/RbmSuggestionResponse.cs index a0976c1c..2ef0e516 100644 --- a/src/Bandwidth.Standard/Model/RbmSuggestionResponse.cs +++ b/src/Bandwidth.Standard/Model/RbmSuggestionResponse.cs @@ -55,7 +55,7 @@ public partial class RbmSuggestionResponse : IValidatableObject /// Base64 payload the customer receives when the reply is clicked. /// /// Base64 payload the customer receives when the reply is clicked. - /// [B@43f7f48d + /// [B@126d0868 [DataMember(Name = "postbackData", EmitDefaultValue = false)] public byte[] PostbackData { get; set; } diff --git a/src/Bandwidth.Standard/Model/TfvStatus.cs b/src/Bandwidth.Standard/Model/TfvStatus.cs index 45d9e62f..76e29c98 100644 --- a/src/Bandwidth.Standard/Model/TfvStatus.cs +++ b/src/Bandwidth.Standard/Model/TfvStatus.cs @@ -52,7 +52,7 @@ public partial class TfvStatus : IValidatableObject /// Whether a Toll-Free Verification is blocked. This attribute will only be defined when the number is blocked.. /// The reason why the Toll-Free Verification is blocked. This attribute will only be defined when the number is blocked.. /// The token provided by Campaign Verify to validate your political use case. Only required for 527 political organizations. If you are not a 527 political organization, this field should be omitted. If you pass an empty string, it will be passed along and potentially rejected.. - public TfvStatus(string phoneNumber = default(string), TfvStatusEnum? status = default(TfvStatusEnum?), Guid internalTicketNumber = default(Guid), string declineReasonDescription = default(string), bool resubmitAllowed = default(bool), DateTime createdDateTime = default(DateTime), DateTime modifiedDateTime = default(DateTime), TfvSubmissionInfo submission = default(TfvSubmissionInfo), bool blocked = default(bool), string blockedReason = default(string), string cvToken = default(string)) + public TfvStatus(string phoneNumber = default(string), TfvStatusEnum? status = default(TfvStatusEnum?), string internalTicketNumber = default(string), string declineReasonDescription = default(string), bool resubmitAllowed = default(bool), DateTime createdDateTime = default(DateTime), DateTime modifiedDateTime = default(DateTime), TfvSubmissionInfo submission = default(TfvSubmissionInfo), bool blocked = default(bool), string blockedReason = default(string), string cvToken = default(string)) { this.PhoneNumber = phoneNumber; this.Status = status; @@ -81,7 +81,7 @@ public partial class TfvStatus : IValidatableObject /// Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number - included in all webhook payloads. /// acde070d-8c4c-4f0d-9d8a-162843c10333 [DataMember(Name = "internalTicketNumber", EmitDefaultValue = false)] - public Guid InternalTicketNumber { get; set; } + public string InternalTicketNumber { get; set; } /// /// Explanation for why a verification request was declined. diff --git a/src/Bandwidth.Standard/Model/VerificationDenialWebhook.cs b/src/Bandwidth.Standard/Model/VerificationDenialWebhook.cs index 8ae7ba17..46b7066a 100644 --- a/src/Bandwidth.Standard/Model/VerificationDenialWebhook.cs +++ b/src/Bandwidth.Standard/Model/VerificationDenialWebhook.cs @@ -45,7 +45,7 @@ public partial class VerificationDenialWebhook : IValidatableObject /// status (default to "UNVERIFIED"). /// Whether a Toll-Free Verification is blocked. This attribute will only be defined when the number is blocked.. /// The reason why the Toll-Free Verification is blocked. This attribute will only be defined when the number is blocked.. - public VerificationDenialWebhook(string accountId = default(string), List additionalDenialReasons = default(List), string declineReasonDescription = default(string), int denialStatusCode = default(int), Guid internalTicketNumber = default(Guid), string phoneNumber = default(string), bool resubmitAllowed = default(bool), string status = @"UNVERIFIED", bool blocked = default(bool), string blockedReason = default(string)) + public VerificationDenialWebhook(string accountId = default(string), List additionalDenialReasons = default(List), string declineReasonDescription = default(string), int denialStatusCode = default(int), string internalTicketNumber = default(string), string phoneNumber = default(string), bool resubmitAllowed = default(bool), string status = @"UNVERIFIED", bool blocked = default(bool), string blockedReason = default(string)) { this.AccountId = accountId; this.AdditionalDenialReasons = additionalDenialReasons; @@ -98,7 +98,7 @@ public partial class VerificationDenialWebhook : IValidatableObject /// Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number. /// acde070d-8c4c-4f0d-9d8a-162843c10333 [DataMember(Name = "internalTicketNumber", EmitDefaultValue = false)] - public Guid InternalTicketNumber { get; set; } + public string InternalTicketNumber { get; set; } /// /// Toll-free telephone number in E.164 format. diff --git a/src/Bandwidth.Standard/Model/VerificationWebhook.cs b/src/Bandwidth.Standard/Model/VerificationWebhook.cs index 6318cfab..11d76cb1 100644 --- a/src/Bandwidth.Standard/Model/VerificationWebhook.cs +++ b/src/Bandwidth.Standard/Model/VerificationWebhook.cs @@ -45,7 +45,7 @@ public partial class VerificationWebhook : IValidatableObject /// Toll-free telephone number in E.164 format.. /// status. /// Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number.. - public VerificationWebhook(string accountId = default(string), string phoneNumber = default(string), TfvCallbackStatusEnum? status = default(TfvCallbackStatusEnum?), Guid internalTicketNumber = default(Guid)) + public VerificationWebhook(string accountId = default(string), string phoneNumber = default(string), TfvCallbackStatusEnum? status = default(TfvCallbackStatusEnum?), string internalTicketNumber = default(string)) { this.AccountId = accountId; this.PhoneNumber = phoneNumber; @@ -75,7 +75,7 @@ public partial class VerificationWebhook : IValidatableObject /// Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number. /// acde070d-8c4c-4f0d-9d8a-162843c10333 [DataMember(Name = "internalTicketNumber", EmitDefaultValue = false)] - public Guid InternalTicketNumber { get; set; } + public string InternalTicketNumber { get; set; } /// /// Returns the string presentation of the object