diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,367 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,44 @@
+# Amazon Pinpoint SMS Voice V2 SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2022-03-31@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-pinpoint-sms-voice-v2)
+and the [AWS API Reference](https://aws.amazon.com/documentation/).
+
+The types from this library are intended to be used with [amazonka](http://hackage.haskell.org/package/amazonka),
+which provides mechanisms for specifying AuthN/AuthZ information, sending requests,
+and receiving responses.
+
+Lenses are used for constructing and manipulating types,
+due to the depth of nesting of AWS types and transparency regarding
+de/serialisation into more palatable Haskell values.
+The provided lenses should be compatible with any of the major lens libraries
+[lens](http://hackage.haskell.org/package/lens) or [lens-family-core](http://hackage.haskell.org/package/lens-family-core).
+
+See [Amazonka.PinpointSmsVoiceV2](http://hackage.haskell.org/package/amazonka-pinpoint-sms-voice-v2/docs/Amazonka-PinpointSmsVoiceV2.html)
+or [the AWS documentation](https://aws.amazon.com/documentation/) to get started.
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/amazonka/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `amazonka-gen` for more information.
+
+
+## Licence
+
+`amazonka-pinpoint-sms-voice-v2` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
+
+Parts of the code are derived from AWS service descriptions, licensed under Apache 2.0.
+Source files subject to this contain an additional licensing clause in their header.
diff --git a/amazonka-pinpoint-sms-voice-v2.cabal b/amazonka-pinpoint-sms-voice-v2.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-pinpoint-sms-voice-v2.cabal
@@ -0,0 +1,171 @@
+cabal-version:      2.2
+name:               amazonka-pinpoint-sms-voice-v2
+version:            2.0
+synopsis:           Amazon Pinpoint SMS Voice V2 SDK.
+homepage:           https://github.com/brendanhay/amazonka
+bug-reports:        https://github.com/brendanhay/amazonka/issues
+license:            MPL-2.0
+license-file:       LICENSE
+author:             Brendan Hay
+maintainer:
+  Brendan Hay <brendan.g.hay+amazonka@gmail.com>, Jack Kelly <jack@jackkelly.name>
+
+copyright:          Copyright (c) 2013-2023 Brendan Hay
+category:           AWS
+build-type:         Simple
+extra-source-files:
+  fixture/*.proto
+  fixture/*.yaml
+  README.md
+  src/.gitkeep
+
+description:
+  Derived from API version @2022-03-31@ of the AWS service descriptions, licensed under Apache 2.0.
+  .
+  The types from this library are intended to be used with <http://hackage.haskell.org/package/amazonka amazonka>,
+  which provides mechanisms for specifying AuthN/AuthZ information, sending requests, and receiving responses.
+  .
+  It is recommended to use generic lenses or optics from packages such as <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify optional fields and deconstruct responses.
+  .
+  Generated lenses can be found in "Amazonka.PinpointSmsVoiceV2.Lens" and are
+  suitable for use with a lens package such as <http://hackage.haskell.org/package/lens lens> or <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
+  .
+  See "Amazonka.PinpointSmsVoiceV2" and the <https://aws.amazon.com/documentation/ AWS documentation> to get started.
+
+source-repository head
+  type:     git
+  location: git://github.com/brendanhay/amazonka.git
+  subdir:   amazonka-pinpoint-sms-voice-v2
+
+library
+  default-language: Haskell2010
+  hs-source-dirs:   src gen
+  ghc-options:
+    -Wall -fwarn-incomplete-uni-patterns
+    -fwarn-incomplete-record-updates -funbox-strict-fields
+
+  exposed-modules:
+    Amazonka.PinpointSmsVoiceV2
+    Amazonka.PinpointSmsVoiceV2.AssociateOriginationIdentity
+    Amazonka.PinpointSmsVoiceV2.CreateConfigurationSet
+    Amazonka.PinpointSmsVoiceV2.CreateEventDestination
+    Amazonka.PinpointSmsVoiceV2.CreateOptOutList
+    Amazonka.PinpointSmsVoiceV2.CreatePool
+    Amazonka.PinpointSmsVoiceV2.DeleteConfigurationSet
+    Amazonka.PinpointSmsVoiceV2.DeleteDefaultMessageType
+    Amazonka.PinpointSmsVoiceV2.DeleteDefaultSenderId
+    Amazonka.PinpointSmsVoiceV2.DeleteEventDestination
+    Amazonka.PinpointSmsVoiceV2.DeleteKeyword
+    Amazonka.PinpointSmsVoiceV2.DeleteOptedOutNumber
+    Amazonka.PinpointSmsVoiceV2.DeleteOptOutList
+    Amazonka.PinpointSmsVoiceV2.DeletePool
+    Amazonka.PinpointSmsVoiceV2.DeleteTextMessageSpendLimitOverride
+    Amazonka.PinpointSmsVoiceV2.DeleteVoiceMessageSpendLimitOverride
+    Amazonka.PinpointSmsVoiceV2.DescribeAccountAttributes
+    Amazonka.PinpointSmsVoiceV2.DescribeAccountLimits
+    Amazonka.PinpointSmsVoiceV2.DescribeConfigurationSets
+    Amazonka.PinpointSmsVoiceV2.DescribeKeywords
+    Amazonka.PinpointSmsVoiceV2.DescribeOptedOutNumbers
+    Amazonka.PinpointSmsVoiceV2.DescribeOptOutLists
+    Amazonka.PinpointSmsVoiceV2.DescribePhoneNumbers
+    Amazonka.PinpointSmsVoiceV2.DescribePools
+    Amazonka.PinpointSmsVoiceV2.DescribeSenderIds
+    Amazonka.PinpointSmsVoiceV2.DescribeSpendLimits
+    Amazonka.PinpointSmsVoiceV2.DisassociateOriginationIdentity
+    Amazonka.PinpointSmsVoiceV2.Lens
+    Amazonka.PinpointSmsVoiceV2.ListPoolOriginationIdentities
+    Amazonka.PinpointSmsVoiceV2.ListTagsForResource
+    Amazonka.PinpointSmsVoiceV2.PutKeyword
+    Amazonka.PinpointSmsVoiceV2.PutOptedOutNumber
+    Amazonka.PinpointSmsVoiceV2.ReleasePhoneNumber
+    Amazonka.PinpointSmsVoiceV2.RequestPhoneNumber
+    Amazonka.PinpointSmsVoiceV2.SendTextMessage
+    Amazonka.PinpointSmsVoiceV2.SendVoiceMessage
+    Amazonka.PinpointSmsVoiceV2.SetDefaultMessageType
+    Amazonka.PinpointSmsVoiceV2.SetDefaultSenderId
+    Amazonka.PinpointSmsVoiceV2.SetTextMessageSpendLimitOverride
+    Amazonka.PinpointSmsVoiceV2.SetVoiceMessageSpendLimitOverride
+    Amazonka.PinpointSmsVoiceV2.TagResource
+    Amazonka.PinpointSmsVoiceV2.Types
+    Amazonka.PinpointSmsVoiceV2.Types.AccountAttribute
+    Amazonka.PinpointSmsVoiceV2.Types.AccountAttributeName
+    Amazonka.PinpointSmsVoiceV2.Types.AccountLimit
+    Amazonka.PinpointSmsVoiceV2.Types.AccountLimitName
+    Amazonka.PinpointSmsVoiceV2.Types.CloudWatchLogsDestination
+    Amazonka.PinpointSmsVoiceV2.Types.ConfigurationSetFilter
+    Amazonka.PinpointSmsVoiceV2.Types.ConfigurationSetFilterName
+    Amazonka.PinpointSmsVoiceV2.Types.ConfigurationSetInformation
+    Amazonka.PinpointSmsVoiceV2.Types.DestinationCountryParameterKey
+    Amazonka.PinpointSmsVoiceV2.Types.EventDestination
+    Amazonka.PinpointSmsVoiceV2.Types.EventType
+    Amazonka.PinpointSmsVoiceV2.Types.KeywordAction
+    Amazonka.PinpointSmsVoiceV2.Types.KeywordFilter
+    Amazonka.PinpointSmsVoiceV2.Types.KeywordFilterName
+    Amazonka.PinpointSmsVoiceV2.Types.KeywordInformation
+    Amazonka.PinpointSmsVoiceV2.Types.KinesisFirehoseDestination
+    Amazonka.PinpointSmsVoiceV2.Types.MessageType
+    Amazonka.PinpointSmsVoiceV2.Types.NumberCapability
+    Amazonka.PinpointSmsVoiceV2.Types.NumberStatus
+    Amazonka.PinpointSmsVoiceV2.Types.NumberType
+    Amazonka.PinpointSmsVoiceV2.Types.OptedOutFilter
+    Amazonka.PinpointSmsVoiceV2.Types.OptedOutFilterName
+    Amazonka.PinpointSmsVoiceV2.Types.OptedOutNumberInformation
+    Amazonka.PinpointSmsVoiceV2.Types.OptOutListInformation
+    Amazonka.PinpointSmsVoiceV2.Types.OriginationIdentityMetadata
+    Amazonka.PinpointSmsVoiceV2.Types.PhoneNumberFilter
+    Amazonka.PinpointSmsVoiceV2.Types.PhoneNumberFilterName
+    Amazonka.PinpointSmsVoiceV2.Types.PhoneNumberInformation
+    Amazonka.PinpointSmsVoiceV2.Types.PoolFilter
+    Amazonka.PinpointSmsVoiceV2.Types.PoolFilterName
+    Amazonka.PinpointSmsVoiceV2.Types.PoolInformation
+    Amazonka.PinpointSmsVoiceV2.Types.PoolOriginationIdentitiesFilter
+    Amazonka.PinpointSmsVoiceV2.Types.PoolOriginationIdentitiesFilterName
+    Amazonka.PinpointSmsVoiceV2.Types.PoolStatus
+    Amazonka.PinpointSmsVoiceV2.Types.RequestableNumberType
+    Amazonka.PinpointSmsVoiceV2.Types.SenderIdAndCountry
+    Amazonka.PinpointSmsVoiceV2.Types.SenderIdFilter
+    Amazonka.PinpointSmsVoiceV2.Types.SenderIdFilterName
+    Amazonka.PinpointSmsVoiceV2.Types.SenderIdInformation
+    Amazonka.PinpointSmsVoiceV2.Types.SnsDestination
+    Amazonka.PinpointSmsVoiceV2.Types.SpendLimit
+    Amazonka.PinpointSmsVoiceV2.Types.SpendLimitName
+    Amazonka.PinpointSmsVoiceV2.Types.Tag
+    Amazonka.PinpointSmsVoiceV2.Types.VoiceId
+    Amazonka.PinpointSmsVoiceV2.Types.VoiceMessageBodyTextType
+    Amazonka.PinpointSmsVoiceV2.UntagResource
+    Amazonka.PinpointSmsVoiceV2.UpdateEventDestination
+    Amazonka.PinpointSmsVoiceV2.UpdatePhoneNumber
+    Amazonka.PinpointSmsVoiceV2.UpdatePool
+    Amazonka.PinpointSmsVoiceV2.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-pinpoint-sms-voice-v2-test
+  type:             exitcode-stdio-1.0
+  default-language: Haskell2010
+  hs-source-dirs:   test
+  main-is:          Main.hs
+  ghc-options:      -Wall -threaded
+
+  -- This section is encoded by the template and any modules added by
+  -- hand outside these namespaces will not correctly be added to the
+  -- distribution package.
+  other-modules:
+    Test.Amazonka.Gen.PinpointSmsVoiceV2
+    Test.Amazonka.PinpointSmsVoiceV2
+    Test.Amazonka.PinpointSmsVoiceV2.Internal
+
+  build-depends:
+    , amazonka-core                   >=2.0 && <2.1
+    , amazonka-pinpoint-sms-voice-v2
+    , amazonka-test                   >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/AssociateOriginationIdentity.yaml b/fixture/AssociateOriginationIdentity.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AssociateOriginationIdentity.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/AssociateOriginationIdentityResponse.proto b/fixture/AssociateOriginationIdentityResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AssociateOriginationIdentityResponse.proto
diff --git a/fixture/CreateConfigurationSet.yaml b/fixture/CreateConfigurationSet.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateConfigurationSet.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateConfigurationSetResponse.proto b/fixture/CreateConfigurationSetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateConfigurationSetResponse.proto
diff --git a/fixture/CreateEventDestination.yaml b/fixture/CreateEventDestination.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateEventDestination.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateEventDestinationResponse.proto b/fixture/CreateEventDestinationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateEventDestinationResponse.proto
diff --git a/fixture/CreateOptOutList.yaml b/fixture/CreateOptOutList.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateOptOutList.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateOptOutListResponse.proto b/fixture/CreateOptOutListResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateOptOutListResponse.proto
diff --git a/fixture/CreatePool.yaml b/fixture/CreatePool.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreatePool.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreatePoolResponse.proto b/fixture/CreatePoolResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreatePoolResponse.proto
diff --git a/fixture/DeleteConfigurationSet.yaml b/fixture/DeleteConfigurationSet.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteConfigurationSet.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteConfigurationSetResponse.proto b/fixture/DeleteConfigurationSetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteConfigurationSetResponse.proto
diff --git a/fixture/DeleteDefaultMessageType.yaml b/fixture/DeleteDefaultMessageType.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDefaultMessageType.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteDefaultMessageTypeResponse.proto b/fixture/DeleteDefaultMessageTypeResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDefaultMessageTypeResponse.proto
diff --git a/fixture/DeleteDefaultSenderId.yaml b/fixture/DeleteDefaultSenderId.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDefaultSenderId.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteDefaultSenderIdResponse.proto b/fixture/DeleteDefaultSenderIdResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDefaultSenderIdResponse.proto
diff --git a/fixture/DeleteEventDestination.yaml b/fixture/DeleteEventDestination.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteEventDestination.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteEventDestinationResponse.proto b/fixture/DeleteEventDestinationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteEventDestinationResponse.proto
diff --git a/fixture/DeleteKeyword.yaml b/fixture/DeleteKeyword.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteKeyword.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteKeywordResponse.proto b/fixture/DeleteKeywordResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteKeywordResponse.proto
diff --git a/fixture/DeleteOptOutList.yaml b/fixture/DeleteOptOutList.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteOptOutList.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteOptOutListResponse.proto b/fixture/DeleteOptOutListResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteOptOutListResponse.proto
diff --git a/fixture/DeleteOptedOutNumber.yaml b/fixture/DeleteOptedOutNumber.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteOptedOutNumber.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteOptedOutNumberResponse.proto b/fixture/DeleteOptedOutNumberResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteOptedOutNumberResponse.proto
diff --git a/fixture/DeletePool.yaml b/fixture/DeletePool.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeletePool.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeletePoolResponse.proto b/fixture/DeletePoolResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeletePoolResponse.proto
diff --git a/fixture/DeleteTextMessageSpendLimitOverride.yaml b/fixture/DeleteTextMessageSpendLimitOverride.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteTextMessageSpendLimitOverride.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteTextMessageSpendLimitOverrideResponse.proto b/fixture/DeleteTextMessageSpendLimitOverrideResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteTextMessageSpendLimitOverrideResponse.proto
diff --git a/fixture/DeleteVoiceMessageSpendLimitOverride.yaml b/fixture/DeleteVoiceMessageSpendLimitOverride.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteVoiceMessageSpendLimitOverride.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteVoiceMessageSpendLimitOverrideResponse.proto b/fixture/DeleteVoiceMessageSpendLimitOverrideResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteVoiceMessageSpendLimitOverrideResponse.proto
diff --git a/fixture/DescribeAccountAttributes.yaml b/fixture/DescribeAccountAttributes.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeAccountAttributes.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeAccountAttributesResponse.proto b/fixture/DescribeAccountAttributesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeAccountAttributesResponse.proto
diff --git a/fixture/DescribeAccountLimits.yaml b/fixture/DescribeAccountLimits.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeAccountLimits.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeAccountLimitsResponse.proto b/fixture/DescribeAccountLimitsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeAccountLimitsResponse.proto
diff --git a/fixture/DescribeConfigurationSets.yaml b/fixture/DescribeConfigurationSets.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeConfigurationSets.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeConfigurationSetsResponse.proto b/fixture/DescribeConfigurationSetsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeConfigurationSetsResponse.proto
diff --git a/fixture/DescribeKeywords.yaml b/fixture/DescribeKeywords.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeKeywords.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeKeywordsResponse.proto b/fixture/DescribeKeywordsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeKeywordsResponse.proto
diff --git a/fixture/DescribeOptOutLists.yaml b/fixture/DescribeOptOutLists.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeOptOutLists.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeOptOutListsResponse.proto b/fixture/DescribeOptOutListsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeOptOutListsResponse.proto
diff --git a/fixture/DescribeOptedOutNumbers.yaml b/fixture/DescribeOptedOutNumbers.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeOptedOutNumbers.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeOptedOutNumbersResponse.proto b/fixture/DescribeOptedOutNumbersResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeOptedOutNumbersResponse.proto
diff --git a/fixture/DescribePhoneNumbers.yaml b/fixture/DescribePhoneNumbers.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribePhoneNumbers.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribePhoneNumbersResponse.proto b/fixture/DescribePhoneNumbersResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribePhoneNumbersResponse.proto
diff --git a/fixture/DescribePools.yaml b/fixture/DescribePools.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribePools.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribePoolsResponse.proto b/fixture/DescribePoolsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribePoolsResponse.proto
diff --git a/fixture/DescribeSenderIds.yaml b/fixture/DescribeSenderIds.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSenderIds.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeSenderIdsResponse.proto b/fixture/DescribeSenderIdsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSenderIdsResponse.proto
diff --git a/fixture/DescribeSpendLimits.yaml b/fixture/DescribeSpendLimits.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSpendLimits.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeSpendLimitsResponse.proto b/fixture/DescribeSpendLimitsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSpendLimitsResponse.proto
diff --git a/fixture/DisassociateOriginationIdentity.yaml b/fixture/DisassociateOriginationIdentity.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DisassociateOriginationIdentity.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DisassociateOriginationIdentityResponse.proto b/fixture/DisassociateOriginationIdentityResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DisassociateOriginationIdentityResponse.proto
diff --git a/fixture/ListPoolOriginationIdentities.yaml b/fixture/ListPoolOriginationIdentities.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListPoolOriginationIdentities.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListPoolOriginationIdentitiesResponse.proto b/fixture/ListPoolOriginationIdentitiesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListPoolOriginationIdentitiesResponse.proto
diff --git a/fixture/ListTagsForResource.yaml b/fixture/ListTagsForResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListTagsForResourceResponse.proto b/fixture/ListTagsForResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResourceResponse.proto
diff --git a/fixture/PutKeyword.yaml b/fixture/PutKeyword.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutKeyword.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/PutKeywordResponse.proto b/fixture/PutKeywordResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutKeywordResponse.proto
diff --git a/fixture/PutOptedOutNumber.yaml b/fixture/PutOptedOutNumber.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutOptedOutNumber.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/PutOptedOutNumberResponse.proto b/fixture/PutOptedOutNumberResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutOptedOutNumberResponse.proto
diff --git a/fixture/ReleasePhoneNumber.yaml b/fixture/ReleasePhoneNumber.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ReleasePhoneNumber.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ReleasePhoneNumberResponse.proto b/fixture/ReleasePhoneNumberResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ReleasePhoneNumberResponse.proto
diff --git a/fixture/RequestPhoneNumber.yaml b/fixture/RequestPhoneNumber.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/RequestPhoneNumber.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/RequestPhoneNumberResponse.proto b/fixture/RequestPhoneNumberResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/RequestPhoneNumberResponse.proto
diff --git a/fixture/SendTextMessage.yaml b/fixture/SendTextMessage.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SendTextMessage.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/SendTextMessageResponse.proto b/fixture/SendTextMessageResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SendTextMessageResponse.proto
diff --git a/fixture/SendVoiceMessage.yaml b/fixture/SendVoiceMessage.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SendVoiceMessage.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/SendVoiceMessageResponse.proto b/fixture/SendVoiceMessageResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SendVoiceMessageResponse.proto
diff --git a/fixture/SetDefaultMessageType.yaml b/fixture/SetDefaultMessageType.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SetDefaultMessageType.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/SetDefaultMessageTypeResponse.proto b/fixture/SetDefaultMessageTypeResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SetDefaultMessageTypeResponse.proto
diff --git a/fixture/SetDefaultSenderId.yaml b/fixture/SetDefaultSenderId.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SetDefaultSenderId.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/SetDefaultSenderIdResponse.proto b/fixture/SetDefaultSenderIdResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SetDefaultSenderIdResponse.proto
diff --git a/fixture/SetTextMessageSpendLimitOverride.yaml b/fixture/SetTextMessageSpendLimitOverride.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SetTextMessageSpendLimitOverride.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/SetTextMessageSpendLimitOverrideResponse.proto b/fixture/SetTextMessageSpendLimitOverrideResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SetTextMessageSpendLimitOverrideResponse.proto
diff --git a/fixture/SetVoiceMessageSpendLimitOverride.yaml b/fixture/SetVoiceMessageSpendLimitOverride.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SetVoiceMessageSpendLimitOverride.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/SetVoiceMessageSpendLimitOverrideResponse.proto b/fixture/SetVoiceMessageSpendLimitOverrideResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SetVoiceMessageSpendLimitOverrideResponse.proto
diff --git a/fixture/TagResource.yaml b/fixture/TagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/TagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/TagResourceResponse.proto b/fixture/TagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/TagResourceResponse.proto
diff --git a/fixture/UntagResource.yaml b/fixture/UntagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UntagResourceResponse.proto b/fixture/UntagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResourceResponse.proto
diff --git a/fixture/UpdateEventDestination.yaml b/fixture/UpdateEventDestination.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateEventDestination.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateEventDestinationResponse.proto b/fixture/UpdateEventDestinationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateEventDestinationResponse.proto
diff --git a/fixture/UpdatePhoneNumber.yaml b/fixture/UpdatePhoneNumber.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdatePhoneNumber.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdatePhoneNumberResponse.proto b/fixture/UpdatePhoneNumberResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdatePhoneNumberResponse.proto
diff --git a/fixture/UpdatePool.yaml b/fixture/UpdatePool.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdatePool.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/sms-voice/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  sms-voice.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdatePoolResponse.proto b/fixture/UpdatePoolResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdatePoolResponse.proto
diff --git a/gen/Amazonka/PinpointSmsVoiceV2.hs b/gen/Amazonka/PinpointSmsVoiceV2.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2.hs
@@ -0,0 +1,560 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from API version @2022-03-31@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Welcome to the /Amazon Pinpoint SMS and Voice, version 2 API Reference/.
+-- This guide provides information about Amazon Pinpoint SMS and Voice,
+-- version 2 API resources, including supported HTTP methods, parameters,
+-- and schemas.
+--
+-- Amazon Pinpoint is an Amazon Web Services service that you can use to
+-- engage with your recipients across multiple messaging channels. The
+-- Amazon Pinpoint SMS and Voice, version 2 API provides programmatic
+-- access to options that are unique to the SMS and voice channels and
+-- supplements the resources provided by the Amazon Pinpoint API.
+--
+-- If you\'re new to Amazon Pinpoint, it\'s also helpful to review the
+-- <https://docs.aws.amazon.com/pinpoint/latest/developerguide/welcome.html Amazon Pinpoint Developer Guide>.
+-- The /Amazon Pinpoint Developer Guide/ provides tutorials, code samples,
+-- and procedures that demonstrate how to use Amazon Pinpoint features
+-- programmatically and how to integrate Amazon Pinpoint functionality into
+-- mobile apps and other types of applications. The guide also provides key
+-- information, such as Amazon Pinpoint integration with other Amazon Web
+-- Services services, and the quotas that apply to use of the service.
+module Amazonka.PinpointSmsVoiceV2
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** AccessDeniedException
+    _AccessDeniedException,
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** InternalServerException
+    _InternalServerException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ServiceQuotaExceededException
+    _ServiceQuotaExceededException,
+
+    -- ** ThrottlingException
+    _ThrottlingException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** AssociateOriginationIdentity
+    AssociateOriginationIdentity (AssociateOriginationIdentity'),
+    newAssociateOriginationIdentity,
+    AssociateOriginationIdentityResponse (AssociateOriginationIdentityResponse'),
+    newAssociateOriginationIdentityResponse,
+
+    -- ** CreateConfigurationSet
+    CreateConfigurationSet (CreateConfigurationSet'),
+    newCreateConfigurationSet,
+    CreateConfigurationSetResponse (CreateConfigurationSetResponse'),
+    newCreateConfigurationSetResponse,
+
+    -- ** CreateEventDestination
+    CreateEventDestination (CreateEventDestination'),
+    newCreateEventDestination,
+    CreateEventDestinationResponse (CreateEventDestinationResponse'),
+    newCreateEventDestinationResponse,
+
+    -- ** CreateOptOutList
+    CreateOptOutList (CreateOptOutList'),
+    newCreateOptOutList,
+    CreateOptOutListResponse (CreateOptOutListResponse'),
+    newCreateOptOutListResponse,
+
+    -- ** CreatePool
+    CreatePool (CreatePool'),
+    newCreatePool,
+    CreatePoolResponse (CreatePoolResponse'),
+    newCreatePoolResponse,
+
+    -- ** DeleteConfigurationSet
+    DeleteConfigurationSet (DeleteConfigurationSet'),
+    newDeleteConfigurationSet,
+    DeleteConfigurationSetResponse (DeleteConfigurationSetResponse'),
+    newDeleteConfigurationSetResponse,
+
+    -- ** DeleteDefaultMessageType
+    DeleteDefaultMessageType (DeleteDefaultMessageType'),
+    newDeleteDefaultMessageType,
+    DeleteDefaultMessageTypeResponse (DeleteDefaultMessageTypeResponse'),
+    newDeleteDefaultMessageTypeResponse,
+
+    -- ** DeleteDefaultSenderId
+    DeleteDefaultSenderId (DeleteDefaultSenderId'),
+    newDeleteDefaultSenderId,
+    DeleteDefaultSenderIdResponse (DeleteDefaultSenderIdResponse'),
+    newDeleteDefaultSenderIdResponse,
+
+    -- ** DeleteEventDestination
+    DeleteEventDestination (DeleteEventDestination'),
+    newDeleteEventDestination,
+    DeleteEventDestinationResponse (DeleteEventDestinationResponse'),
+    newDeleteEventDestinationResponse,
+
+    -- ** DeleteKeyword
+    DeleteKeyword (DeleteKeyword'),
+    newDeleteKeyword,
+    DeleteKeywordResponse (DeleteKeywordResponse'),
+    newDeleteKeywordResponse,
+
+    -- ** DeleteOptOutList
+    DeleteOptOutList (DeleteOptOutList'),
+    newDeleteOptOutList,
+    DeleteOptOutListResponse (DeleteOptOutListResponse'),
+    newDeleteOptOutListResponse,
+
+    -- ** DeleteOptedOutNumber
+    DeleteOptedOutNumber (DeleteOptedOutNumber'),
+    newDeleteOptedOutNumber,
+    DeleteOptedOutNumberResponse (DeleteOptedOutNumberResponse'),
+    newDeleteOptedOutNumberResponse,
+
+    -- ** DeletePool
+    DeletePool (DeletePool'),
+    newDeletePool,
+    DeletePoolResponse (DeletePoolResponse'),
+    newDeletePoolResponse,
+
+    -- ** DeleteTextMessageSpendLimitOverride
+    DeleteTextMessageSpendLimitOverride (DeleteTextMessageSpendLimitOverride'),
+    newDeleteTextMessageSpendLimitOverride,
+    DeleteTextMessageSpendLimitOverrideResponse (DeleteTextMessageSpendLimitOverrideResponse'),
+    newDeleteTextMessageSpendLimitOverrideResponse,
+
+    -- ** DeleteVoiceMessageSpendLimitOverride
+    DeleteVoiceMessageSpendLimitOverride (DeleteVoiceMessageSpendLimitOverride'),
+    newDeleteVoiceMessageSpendLimitOverride,
+    DeleteVoiceMessageSpendLimitOverrideResponse (DeleteVoiceMessageSpendLimitOverrideResponse'),
+    newDeleteVoiceMessageSpendLimitOverrideResponse,
+
+    -- ** DescribeAccountAttributes (Paginated)
+    DescribeAccountAttributes (DescribeAccountAttributes'),
+    newDescribeAccountAttributes,
+    DescribeAccountAttributesResponse (DescribeAccountAttributesResponse'),
+    newDescribeAccountAttributesResponse,
+
+    -- ** DescribeAccountLimits (Paginated)
+    DescribeAccountLimits (DescribeAccountLimits'),
+    newDescribeAccountLimits,
+    DescribeAccountLimitsResponse (DescribeAccountLimitsResponse'),
+    newDescribeAccountLimitsResponse,
+
+    -- ** DescribeConfigurationSets (Paginated)
+    DescribeConfigurationSets (DescribeConfigurationSets'),
+    newDescribeConfigurationSets,
+    DescribeConfigurationSetsResponse (DescribeConfigurationSetsResponse'),
+    newDescribeConfigurationSetsResponse,
+
+    -- ** DescribeKeywords (Paginated)
+    DescribeKeywords (DescribeKeywords'),
+    newDescribeKeywords,
+    DescribeKeywordsResponse (DescribeKeywordsResponse'),
+    newDescribeKeywordsResponse,
+
+    -- ** DescribeOptOutLists (Paginated)
+    DescribeOptOutLists (DescribeOptOutLists'),
+    newDescribeOptOutLists,
+    DescribeOptOutListsResponse (DescribeOptOutListsResponse'),
+    newDescribeOptOutListsResponse,
+
+    -- ** DescribeOptedOutNumbers (Paginated)
+    DescribeOptedOutNumbers (DescribeOptedOutNumbers'),
+    newDescribeOptedOutNumbers,
+    DescribeOptedOutNumbersResponse (DescribeOptedOutNumbersResponse'),
+    newDescribeOptedOutNumbersResponse,
+
+    -- ** DescribePhoneNumbers (Paginated)
+    DescribePhoneNumbers (DescribePhoneNumbers'),
+    newDescribePhoneNumbers,
+    DescribePhoneNumbersResponse (DescribePhoneNumbersResponse'),
+    newDescribePhoneNumbersResponse,
+
+    -- ** DescribePools (Paginated)
+    DescribePools (DescribePools'),
+    newDescribePools,
+    DescribePoolsResponse (DescribePoolsResponse'),
+    newDescribePoolsResponse,
+
+    -- ** DescribeSenderIds (Paginated)
+    DescribeSenderIds (DescribeSenderIds'),
+    newDescribeSenderIds,
+    DescribeSenderIdsResponse (DescribeSenderIdsResponse'),
+    newDescribeSenderIdsResponse,
+
+    -- ** DescribeSpendLimits (Paginated)
+    DescribeSpendLimits (DescribeSpendLimits'),
+    newDescribeSpendLimits,
+    DescribeSpendLimitsResponse (DescribeSpendLimitsResponse'),
+    newDescribeSpendLimitsResponse,
+
+    -- ** DisassociateOriginationIdentity
+    DisassociateOriginationIdentity (DisassociateOriginationIdentity'),
+    newDisassociateOriginationIdentity,
+    DisassociateOriginationIdentityResponse (DisassociateOriginationIdentityResponse'),
+    newDisassociateOriginationIdentityResponse,
+
+    -- ** ListPoolOriginationIdentities (Paginated)
+    ListPoolOriginationIdentities (ListPoolOriginationIdentities'),
+    newListPoolOriginationIdentities,
+    ListPoolOriginationIdentitiesResponse (ListPoolOriginationIdentitiesResponse'),
+    newListPoolOriginationIdentitiesResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** PutKeyword
+    PutKeyword (PutKeyword'),
+    newPutKeyword,
+    PutKeywordResponse (PutKeywordResponse'),
+    newPutKeywordResponse,
+
+    -- ** PutOptedOutNumber
+    PutOptedOutNumber (PutOptedOutNumber'),
+    newPutOptedOutNumber,
+    PutOptedOutNumberResponse (PutOptedOutNumberResponse'),
+    newPutOptedOutNumberResponse,
+
+    -- ** ReleasePhoneNumber
+    ReleasePhoneNumber (ReleasePhoneNumber'),
+    newReleasePhoneNumber,
+    ReleasePhoneNumberResponse (ReleasePhoneNumberResponse'),
+    newReleasePhoneNumberResponse,
+
+    -- ** RequestPhoneNumber
+    RequestPhoneNumber (RequestPhoneNumber'),
+    newRequestPhoneNumber,
+    RequestPhoneNumberResponse (RequestPhoneNumberResponse'),
+    newRequestPhoneNumberResponse,
+
+    -- ** SendTextMessage
+    SendTextMessage (SendTextMessage'),
+    newSendTextMessage,
+    SendTextMessageResponse (SendTextMessageResponse'),
+    newSendTextMessageResponse,
+
+    -- ** SendVoiceMessage
+    SendVoiceMessage (SendVoiceMessage'),
+    newSendVoiceMessage,
+    SendVoiceMessageResponse (SendVoiceMessageResponse'),
+    newSendVoiceMessageResponse,
+
+    -- ** SetDefaultMessageType
+    SetDefaultMessageType (SetDefaultMessageType'),
+    newSetDefaultMessageType,
+    SetDefaultMessageTypeResponse (SetDefaultMessageTypeResponse'),
+    newSetDefaultMessageTypeResponse,
+
+    -- ** SetDefaultSenderId
+    SetDefaultSenderId (SetDefaultSenderId'),
+    newSetDefaultSenderId,
+    SetDefaultSenderIdResponse (SetDefaultSenderIdResponse'),
+    newSetDefaultSenderIdResponse,
+
+    -- ** SetTextMessageSpendLimitOverride
+    SetTextMessageSpendLimitOverride (SetTextMessageSpendLimitOverride'),
+    newSetTextMessageSpendLimitOverride,
+    SetTextMessageSpendLimitOverrideResponse (SetTextMessageSpendLimitOverrideResponse'),
+    newSetTextMessageSpendLimitOverrideResponse,
+
+    -- ** SetVoiceMessageSpendLimitOverride
+    SetVoiceMessageSpendLimitOverride (SetVoiceMessageSpendLimitOverride'),
+    newSetVoiceMessageSpendLimitOverride,
+    SetVoiceMessageSpendLimitOverrideResponse (SetVoiceMessageSpendLimitOverrideResponse'),
+    newSetVoiceMessageSpendLimitOverrideResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateEventDestination
+    UpdateEventDestination (UpdateEventDestination'),
+    newUpdateEventDestination,
+    UpdateEventDestinationResponse (UpdateEventDestinationResponse'),
+    newUpdateEventDestinationResponse,
+
+    -- ** UpdatePhoneNumber
+    UpdatePhoneNumber (UpdatePhoneNumber'),
+    newUpdatePhoneNumber,
+    UpdatePhoneNumberResponse (UpdatePhoneNumberResponse'),
+    newUpdatePhoneNumberResponse,
+
+    -- ** UpdatePool
+    UpdatePool (UpdatePool'),
+    newUpdatePool,
+    UpdatePoolResponse (UpdatePoolResponse'),
+    newUpdatePoolResponse,
+
+    -- * Types
+
+    -- ** AccountAttributeName
+    AccountAttributeName (..),
+
+    -- ** AccountLimitName
+    AccountLimitName (..),
+
+    -- ** ConfigurationSetFilterName
+    ConfigurationSetFilterName (..),
+
+    -- ** DestinationCountryParameterKey
+    DestinationCountryParameterKey (..),
+
+    -- ** EventType
+    EventType (..),
+
+    -- ** KeywordAction
+    KeywordAction (..),
+
+    -- ** KeywordFilterName
+    KeywordFilterName (..),
+
+    -- ** MessageType
+    MessageType (..),
+
+    -- ** NumberCapability
+    NumberCapability (..),
+
+    -- ** NumberStatus
+    NumberStatus (..),
+
+    -- ** NumberType
+    NumberType (..),
+
+    -- ** OptedOutFilterName
+    OptedOutFilterName (..),
+
+    -- ** PhoneNumberFilterName
+    PhoneNumberFilterName (..),
+
+    -- ** PoolFilterName
+    PoolFilterName (..),
+
+    -- ** PoolOriginationIdentitiesFilterName
+    PoolOriginationIdentitiesFilterName (..),
+
+    -- ** PoolStatus
+    PoolStatus (..),
+
+    -- ** RequestableNumberType
+    RequestableNumberType (..),
+
+    -- ** SenderIdFilterName
+    SenderIdFilterName (..),
+
+    -- ** SpendLimitName
+    SpendLimitName (..),
+
+    -- ** VoiceId
+    VoiceId (..),
+
+    -- ** VoiceMessageBodyTextType
+    VoiceMessageBodyTextType (..),
+
+    -- ** AccountAttribute
+    AccountAttribute (AccountAttribute'),
+    newAccountAttribute,
+
+    -- ** AccountLimit
+    AccountLimit (AccountLimit'),
+    newAccountLimit,
+
+    -- ** CloudWatchLogsDestination
+    CloudWatchLogsDestination (CloudWatchLogsDestination'),
+    newCloudWatchLogsDestination,
+
+    -- ** ConfigurationSetFilter
+    ConfigurationSetFilter (ConfigurationSetFilter'),
+    newConfigurationSetFilter,
+
+    -- ** ConfigurationSetInformation
+    ConfigurationSetInformation (ConfigurationSetInformation'),
+    newConfigurationSetInformation,
+
+    -- ** EventDestination
+    EventDestination (EventDestination'),
+    newEventDestination,
+
+    -- ** KeywordFilter
+    KeywordFilter (KeywordFilter'),
+    newKeywordFilter,
+
+    -- ** KeywordInformation
+    KeywordInformation (KeywordInformation'),
+    newKeywordInformation,
+
+    -- ** KinesisFirehoseDestination
+    KinesisFirehoseDestination (KinesisFirehoseDestination'),
+    newKinesisFirehoseDestination,
+
+    -- ** OptOutListInformation
+    OptOutListInformation (OptOutListInformation'),
+    newOptOutListInformation,
+
+    -- ** OptedOutFilter
+    OptedOutFilter (OptedOutFilter'),
+    newOptedOutFilter,
+
+    -- ** OptedOutNumberInformation
+    OptedOutNumberInformation (OptedOutNumberInformation'),
+    newOptedOutNumberInformation,
+
+    -- ** OriginationIdentityMetadata
+    OriginationIdentityMetadata (OriginationIdentityMetadata'),
+    newOriginationIdentityMetadata,
+
+    -- ** PhoneNumberFilter
+    PhoneNumberFilter (PhoneNumberFilter'),
+    newPhoneNumberFilter,
+
+    -- ** PhoneNumberInformation
+    PhoneNumberInformation (PhoneNumberInformation'),
+    newPhoneNumberInformation,
+
+    -- ** PoolFilter
+    PoolFilter (PoolFilter'),
+    newPoolFilter,
+
+    -- ** PoolInformation
+    PoolInformation (PoolInformation'),
+    newPoolInformation,
+
+    -- ** PoolOriginationIdentitiesFilter
+    PoolOriginationIdentitiesFilter (PoolOriginationIdentitiesFilter'),
+    newPoolOriginationIdentitiesFilter,
+
+    -- ** SenderIdAndCountry
+    SenderIdAndCountry (SenderIdAndCountry'),
+    newSenderIdAndCountry,
+
+    -- ** SenderIdFilter
+    SenderIdFilter (SenderIdFilter'),
+    newSenderIdFilter,
+
+    -- ** SenderIdInformation
+    SenderIdInformation (SenderIdInformation'),
+    newSenderIdInformation,
+
+    -- ** SnsDestination
+    SnsDestination (SnsDestination'),
+    newSnsDestination,
+
+    -- ** SpendLimit
+    SpendLimit (SpendLimit'),
+    newSpendLimit,
+
+    -- ** Tag
+    Tag (Tag'),
+    newTag,
+  )
+where
+
+import Amazonka.PinpointSmsVoiceV2.AssociateOriginationIdentity
+import Amazonka.PinpointSmsVoiceV2.CreateConfigurationSet
+import Amazonka.PinpointSmsVoiceV2.CreateEventDestination
+import Amazonka.PinpointSmsVoiceV2.CreateOptOutList
+import Amazonka.PinpointSmsVoiceV2.CreatePool
+import Amazonka.PinpointSmsVoiceV2.DeleteConfigurationSet
+import Amazonka.PinpointSmsVoiceV2.DeleteDefaultMessageType
+import Amazonka.PinpointSmsVoiceV2.DeleteDefaultSenderId
+import Amazonka.PinpointSmsVoiceV2.DeleteEventDestination
+import Amazonka.PinpointSmsVoiceV2.DeleteKeyword
+import Amazonka.PinpointSmsVoiceV2.DeleteOptOutList
+import Amazonka.PinpointSmsVoiceV2.DeleteOptedOutNumber
+import Amazonka.PinpointSmsVoiceV2.DeletePool
+import Amazonka.PinpointSmsVoiceV2.DeleteTextMessageSpendLimitOverride
+import Amazonka.PinpointSmsVoiceV2.DeleteVoiceMessageSpendLimitOverride
+import Amazonka.PinpointSmsVoiceV2.DescribeAccountAttributes
+import Amazonka.PinpointSmsVoiceV2.DescribeAccountLimits
+import Amazonka.PinpointSmsVoiceV2.DescribeConfigurationSets
+import Amazonka.PinpointSmsVoiceV2.DescribeKeywords
+import Amazonka.PinpointSmsVoiceV2.DescribeOptOutLists
+import Amazonka.PinpointSmsVoiceV2.DescribeOptedOutNumbers
+import Amazonka.PinpointSmsVoiceV2.DescribePhoneNumbers
+import Amazonka.PinpointSmsVoiceV2.DescribePools
+import Amazonka.PinpointSmsVoiceV2.DescribeSenderIds
+import Amazonka.PinpointSmsVoiceV2.DescribeSpendLimits
+import Amazonka.PinpointSmsVoiceV2.DisassociateOriginationIdentity
+import Amazonka.PinpointSmsVoiceV2.Lens
+import Amazonka.PinpointSmsVoiceV2.ListPoolOriginationIdentities
+import Amazonka.PinpointSmsVoiceV2.ListTagsForResource
+import Amazonka.PinpointSmsVoiceV2.PutKeyword
+import Amazonka.PinpointSmsVoiceV2.PutOptedOutNumber
+import Amazonka.PinpointSmsVoiceV2.ReleasePhoneNumber
+import Amazonka.PinpointSmsVoiceV2.RequestPhoneNumber
+import Amazonka.PinpointSmsVoiceV2.SendTextMessage
+import Amazonka.PinpointSmsVoiceV2.SendVoiceMessage
+import Amazonka.PinpointSmsVoiceV2.SetDefaultMessageType
+import Amazonka.PinpointSmsVoiceV2.SetDefaultSenderId
+import Amazonka.PinpointSmsVoiceV2.SetTextMessageSpendLimitOverride
+import Amazonka.PinpointSmsVoiceV2.SetVoiceMessageSpendLimitOverride
+import Amazonka.PinpointSmsVoiceV2.TagResource
+import Amazonka.PinpointSmsVoiceV2.Types
+import Amazonka.PinpointSmsVoiceV2.UntagResource
+import Amazonka.PinpointSmsVoiceV2.UpdateEventDestination
+import Amazonka.PinpointSmsVoiceV2.UpdatePhoneNumber
+import Amazonka.PinpointSmsVoiceV2.UpdatePool
+import Amazonka.PinpointSmsVoiceV2.Waiters
+
+-- $errors
+-- Error matchers are designed for use with the functions provided by
+-- <http://hackage.haskell.org/package/lens/docs/Control-Exception-Lens.html Control.Exception.Lens>.
+-- This allows catching (and rethrowing) service specific errors returned
+-- by 'PinpointSmsVoiceV2'.
+
+-- $operations
+-- Some AWS operations return results that are incomplete and require subsequent
+-- requests in order to obtain the entire result set. The process of sending
+-- subsequent requests to continue where a previous request left off is called
+-- pagination. For example, the 'ListObjects' operation of Amazon S3 returns up to
+-- 1000 objects at a time, and you must send subsequent requests with the
+-- appropriate Marker in order to retrieve the next page of results.
+--
+-- Operations that have an 'AWSPager' instance can transparently perform subsequent
+-- requests, correctly setting Markers and other request facets to iterate through
+-- the entire result set of a truncated API operation. Operations which support
+-- this have an additional note in the documentation.
+--
+-- Many operations have the ability to filter results on the server side. See the
+-- individual operation parameters for details.
+
+-- $waiters
+-- Waiters poll by repeatedly sending a request until some remote success condition
+-- configured by the 'Wait' specification is fulfilled. The 'Wait' specification
+-- determines how many attempts should be made, in addition to delay and retry strategies.
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/AssociateOriginationIdentity.hs b/gen/Amazonka/PinpointSmsVoiceV2/AssociateOriginationIdentity.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/AssociateOriginationIdentity.hs
@@ -0,0 +1,314 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.AssociateOriginationIdentity
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Associates the specified origination identity with a pool.
+--
+-- If the origination identity is a phone number and is already associated
+-- with another pool, an Error is returned. A sender ID can be associated
+-- with multiple pools.
+--
+-- If the origination identity configuration doesn\'t match the pool\'s
+-- configuration, an Error is returned.
+module Amazonka.PinpointSmsVoiceV2.AssociateOriginationIdentity
+  ( -- * Creating a Request
+    AssociateOriginationIdentity (..),
+    newAssociateOriginationIdentity,
+
+    -- * Request Lenses
+    associateOriginationIdentity_clientToken,
+    associateOriginationIdentity_poolId,
+    associateOriginationIdentity_originationIdentity,
+    associateOriginationIdentity_isoCountryCode,
+
+    -- * Destructuring the Response
+    AssociateOriginationIdentityResponse (..),
+    newAssociateOriginationIdentityResponse,
+
+    -- * Response Lenses
+    associateOriginationIdentityResponse_isoCountryCode,
+    associateOriginationIdentityResponse_originationIdentity,
+    associateOriginationIdentityResponse_originationIdentityArn,
+    associateOriginationIdentityResponse_poolArn,
+    associateOriginationIdentityResponse_poolId,
+    associateOriginationIdentityResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newAssociateOriginationIdentity' smart constructor.
+data AssociateOriginationIdentity = AssociateOriginationIdentity'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. If you don\'t specify a client token, a
+    -- randomly generated token is used for the request to ensure idempotency.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The pool to update with the new Identity. This value can be either the
+    -- PoolId or PoolArn, and you can find these values using DescribePools.
+    poolId :: Prelude.Text,
+    -- | The origination identity to use, such as PhoneNumberId, PhoneNumberArn,
+    -- SenderId, or SenderIdArn. You can use DescribePhoneNumbers to find the
+    -- values for PhoneNumberId and PhoneNumberArn, while DescribeSenderIds can
+    -- be used to get the values for SenderId and SenderIdArn.
+    originationIdentity :: Prelude.Text,
+    -- | The new two-character code, in ISO 3166-1 alpha-2 format, for the
+    -- country or region of the origination identity.
+    isoCountryCode :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssociateOriginationIdentity' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'associateOriginationIdentity_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. If you don\'t specify a client token, a
+-- randomly generated token is used for the request to ensure idempotency.
+--
+-- 'poolId', 'associateOriginationIdentity_poolId' - The pool to update with the new Identity. This value can be either the
+-- PoolId or PoolArn, and you can find these values using DescribePools.
+--
+-- 'originationIdentity', 'associateOriginationIdentity_originationIdentity' - The origination identity to use, such as PhoneNumberId, PhoneNumberArn,
+-- SenderId, or SenderIdArn. You can use DescribePhoneNumbers to find the
+-- values for PhoneNumberId and PhoneNumberArn, while DescribeSenderIds can
+-- be used to get the values for SenderId and SenderIdArn.
+--
+-- 'isoCountryCode', 'associateOriginationIdentity_isoCountryCode' - The new two-character code, in ISO 3166-1 alpha-2 format, for the
+-- country or region of the origination identity.
+newAssociateOriginationIdentity ::
+  -- | 'poolId'
+  Prelude.Text ->
+  -- | 'originationIdentity'
+  Prelude.Text ->
+  -- | 'isoCountryCode'
+  Prelude.Text ->
+  AssociateOriginationIdentity
+newAssociateOriginationIdentity
+  pPoolId_
+  pOriginationIdentity_
+  pIsoCountryCode_ =
+    AssociateOriginationIdentity'
+      { clientToken =
+          Prelude.Nothing,
+        poolId = pPoolId_,
+        originationIdentity = pOriginationIdentity_,
+        isoCountryCode = pIsoCountryCode_
+      }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. If you don\'t specify a client token, a
+-- randomly generated token is used for the request to ensure idempotency.
+associateOriginationIdentity_clientToken :: Lens.Lens' AssociateOriginationIdentity (Prelude.Maybe Prelude.Text)
+associateOriginationIdentity_clientToken = Lens.lens (\AssociateOriginationIdentity' {clientToken} -> clientToken) (\s@AssociateOriginationIdentity' {} a -> s {clientToken = a} :: AssociateOriginationIdentity)
+
+-- | The pool to update with the new Identity. This value can be either the
+-- PoolId or PoolArn, and you can find these values using DescribePools.
+associateOriginationIdentity_poolId :: Lens.Lens' AssociateOriginationIdentity Prelude.Text
+associateOriginationIdentity_poolId = Lens.lens (\AssociateOriginationIdentity' {poolId} -> poolId) (\s@AssociateOriginationIdentity' {} a -> s {poolId = a} :: AssociateOriginationIdentity)
+
+-- | The origination identity to use, such as PhoneNumberId, PhoneNumberArn,
+-- SenderId, or SenderIdArn. You can use DescribePhoneNumbers to find the
+-- values for PhoneNumberId and PhoneNumberArn, while DescribeSenderIds can
+-- be used to get the values for SenderId and SenderIdArn.
+associateOriginationIdentity_originationIdentity :: Lens.Lens' AssociateOriginationIdentity Prelude.Text
+associateOriginationIdentity_originationIdentity = Lens.lens (\AssociateOriginationIdentity' {originationIdentity} -> originationIdentity) (\s@AssociateOriginationIdentity' {} a -> s {originationIdentity = a} :: AssociateOriginationIdentity)
+
+-- | The new two-character code, in ISO 3166-1 alpha-2 format, for the
+-- country or region of the origination identity.
+associateOriginationIdentity_isoCountryCode :: Lens.Lens' AssociateOriginationIdentity Prelude.Text
+associateOriginationIdentity_isoCountryCode = Lens.lens (\AssociateOriginationIdentity' {isoCountryCode} -> isoCountryCode) (\s@AssociateOriginationIdentity' {} a -> s {isoCountryCode = a} :: AssociateOriginationIdentity)
+
+instance Core.AWSRequest AssociateOriginationIdentity where
+  type
+    AWSResponse AssociateOriginationIdentity =
+      AssociateOriginationIdentityResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          AssociateOriginationIdentityResponse'
+            Prelude.<$> (x Data..?> "IsoCountryCode")
+            Prelude.<*> (x Data..?> "OriginationIdentity")
+            Prelude.<*> (x Data..?> "OriginationIdentityArn")
+            Prelude.<*> (x Data..?> "PoolArn")
+            Prelude.<*> (x Data..?> "PoolId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    AssociateOriginationIdentity
+  where
+  hashWithSalt _salt AssociateOriginationIdentity' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` poolId
+      `Prelude.hashWithSalt` originationIdentity
+      `Prelude.hashWithSalt` isoCountryCode
+
+instance Prelude.NFData AssociateOriginationIdentity where
+  rnf AssociateOriginationIdentity' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf poolId
+      `Prelude.seq` Prelude.rnf originationIdentity
+      `Prelude.seq` Prelude.rnf isoCountryCode
+
+instance Data.ToHeaders AssociateOriginationIdentity where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.AssociateOriginationIdentity" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON AssociateOriginationIdentity where
+  toJSON AssociateOriginationIdentity' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClientToken" Data..=) Prelude.<$> clientToken,
+            Prelude.Just ("PoolId" Data..= poolId),
+            Prelude.Just
+              ("OriginationIdentity" Data..= originationIdentity),
+            Prelude.Just
+              ("IsoCountryCode" Data..= isoCountryCode)
+          ]
+      )
+
+instance Data.ToPath AssociateOriginationIdentity where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery AssociateOriginationIdentity where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newAssociateOriginationIdentityResponse' smart constructor.
+data AssociateOriginationIdentityResponse = AssociateOriginationIdentityResponse'
+  { -- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+    -- region.
+    isoCountryCode :: Prelude.Maybe Prelude.Text,
+    -- | The PhoneNumberId or SenderId of the origination identity.
+    originationIdentity :: Prelude.Maybe Prelude.Text,
+    -- | The PhoneNumberArn or SenderIdArn of the origination identity.
+    originationIdentityArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the pool that is now associated with
+    -- the origination identity.
+    poolArn :: Prelude.Maybe Prelude.Text,
+    -- | The PoolId of the pool that is now associated with the origination
+    -- identity.
+    poolId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssociateOriginationIdentityResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'isoCountryCode', 'associateOriginationIdentityResponse_isoCountryCode' - The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+--
+-- 'originationIdentity', 'associateOriginationIdentityResponse_originationIdentity' - The PhoneNumberId or SenderId of the origination identity.
+--
+-- 'originationIdentityArn', 'associateOriginationIdentityResponse_originationIdentityArn' - The PhoneNumberArn or SenderIdArn of the origination identity.
+--
+-- 'poolArn', 'associateOriginationIdentityResponse_poolArn' - The Amazon Resource Name (ARN) of the pool that is now associated with
+-- the origination identity.
+--
+-- 'poolId', 'associateOriginationIdentityResponse_poolId' - The PoolId of the pool that is now associated with the origination
+-- identity.
+--
+-- 'httpStatus', 'associateOriginationIdentityResponse_httpStatus' - The response's http status code.
+newAssociateOriginationIdentityResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  AssociateOriginationIdentityResponse
+newAssociateOriginationIdentityResponse pHttpStatus_ =
+  AssociateOriginationIdentityResponse'
+    { isoCountryCode =
+        Prelude.Nothing,
+      originationIdentity = Prelude.Nothing,
+      originationIdentityArn =
+        Prelude.Nothing,
+      poolArn = Prelude.Nothing,
+      poolId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+associateOriginationIdentityResponse_isoCountryCode :: Lens.Lens' AssociateOriginationIdentityResponse (Prelude.Maybe Prelude.Text)
+associateOriginationIdentityResponse_isoCountryCode = Lens.lens (\AssociateOriginationIdentityResponse' {isoCountryCode} -> isoCountryCode) (\s@AssociateOriginationIdentityResponse' {} a -> s {isoCountryCode = a} :: AssociateOriginationIdentityResponse)
+
+-- | The PhoneNumberId or SenderId of the origination identity.
+associateOriginationIdentityResponse_originationIdentity :: Lens.Lens' AssociateOriginationIdentityResponse (Prelude.Maybe Prelude.Text)
+associateOriginationIdentityResponse_originationIdentity = Lens.lens (\AssociateOriginationIdentityResponse' {originationIdentity} -> originationIdentity) (\s@AssociateOriginationIdentityResponse' {} a -> s {originationIdentity = a} :: AssociateOriginationIdentityResponse)
+
+-- | The PhoneNumberArn or SenderIdArn of the origination identity.
+associateOriginationIdentityResponse_originationIdentityArn :: Lens.Lens' AssociateOriginationIdentityResponse (Prelude.Maybe Prelude.Text)
+associateOriginationIdentityResponse_originationIdentityArn = Lens.lens (\AssociateOriginationIdentityResponse' {originationIdentityArn} -> originationIdentityArn) (\s@AssociateOriginationIdentityResponse' {} a -> s {originationIdentityArn = a} :: AssociateOriginationIdentityResponse)
+
+-- | The Amazon Resource Name (ARN) of the pool that is now associated with
+-- the origination identity.
+associateOriginationIdentityResponse_poolArn :: Lens.Lens' AssociateOriginationIdentityResponse (Prelude.Maybe Prelude.Text)
+associateOriginationIdentityResponse_poolArn = Lens.lens (\AssociateOriginationIdentityResponse' {poolArn} -> poolArn) (\s@AssociateOriginationIdentityResponse' {} a -> s {poolArn = a} :: AssociateOriginationIdentityResponse)
+
+-- | The PoolId of the pool that is now associated with the origination
+-- identity.
+associateOriginationIdentityResponse_poolId :: Lens.Lens' AssociateOriginationIdentityResponse (Prelude.Maybe Prelude.Text)
+associateOriginationIdentityResponse_poolId = Lens.lens (\AssociateOriginationIdentityResponse' {poolId} -> poolId) (\s@AssociateOriginationIdentityResponse' {} a -> s {poolId = a} :: AssociateOriginationIdentityResponse)
+
+-- | The response's http status code.
+associateOriginationIdentityResponse_httpStatus :: Lens.Lens' AssociateOriginationIdentityResponse Prelude.Int
+associateOriginationIdentityResponse_httpStatus = Lens.lens (\AssociateOriginationIdentityResponse' {httpStatus} -> httpStatus) (\s@AssociateOriginationIdentityResponse' {} a -> s {httpStatus = a} :: AssociateOriginationIdentityResponse)
+
+instance
+  Prelude.NFData
+    AssociateOriginationIdentityResponse
+  where
+  rnf AssociateOriginationIdentityResponse' {..} =
+    Prelude.rnf isoCountryCode
+      `Prelude.seq` Prelude.rnf originationIdentity
+      `Prelude.seq` Prelude.rnf originationIdentityArn
+      `Prelude.seq` Prelude.rnf poolArn
+      `Prelude.seq` Prelude.rnf poolId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/CreateConfigurationSet.hs b/gen/Amazonka/PinpointSmsVoiceV2/CreateConfigurationSet.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/CreateConfigurationSet.hs
@@ -0,0 +1,264 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.CreateConfigurationSet
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a new configuration set. After you create the configuration set,
+-- you can add one or more event destinations to it.
+--
+-- A configuration set is a set of rules that you apply to the SMS and
+-- voice messages that you send.
+--
+-- When you send a message, you can optionally specify a single
+-- configuration set.
+module Amazonka.PinpointSmsVoiceV2.CreateConfigurationSet
+  ( -- * Creating a Request
+    CreateConfigurationSet (..),
+    newCreateConfigurationSet,
+
+    -- * Request Lenses
+    createConfigurationSet_clientToken,
+    createConfigurationSet_tags,
+    createConfigurationSet_configurationSetName,
+
+    -- * Destructuring the Response
+    CreateConfigurationSetResponse (..),
+    newCreateConfigurationSetResponse,
+
+    -- * Response Lenses
+    createConfigurationSetResponse_configurationSetArn,
+    createConfigurationSetResponse_configurationSetName,
+    createConfigurationSetResponse_createdTimestamp,
+    createConfigurationSetResponse_tags,
+    createConfigurationSetResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateConfigurationSet' smart constructor.
+data CreateConfigurationSet = CreateConfigurationSet'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. If you don\'t specify a client token, a
+    -- randomly generated token is used for the request to ensure idempotency.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | An array of key and value pair tags that\'s associated with the new
+    -- configuration set.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name to use for the new configuration set.
+    configurationSetName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateConfigurationSet' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createConfigurationSet_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. If you don\'t specify a client token, a
+-- randomly generated token is used for the request to ensure idempotency.
+--
+-- 'tags', 'createConfigurationSet_tags' - An array of key and value pair tags that\'s associated with the new
+-- configuration set.
+--
+-- 'configurationSetName', 'createConfigurationSet_configurationSetName' - The name to use for the new configuration set.
+newCreateConfigurationSet ::
+  -- | 'configurationSetName'
+  Prelude.Text ->
+  CreateConfigurationSet
+newCreateConfigurationSet pConfigurationSetName_ =
+  CreateConfigurationSet'
+    { clientToken =
+        Prelude.Nothing,
+      tags = Prelude.Nothing,
+      configurationSetName = pConfigurationSetName_
+    }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. If you don\'t specify a client token, a
+-- randomly generated token is used for the request to ensure idempotency.
+createConfigurationSet_clientToken :: Lens.Lens' CreateConfigurationSet (Prelude.Maybe Prelude.Text)
+createConfigurationSet_clientToken = Lens.lens (\CreateConfigurationSet' {clientToken} -> clientToken) (\s@CreateConfigurationSet' {} a -> s {clientToken = a} :: CreateConfigurationSet)
+
+-- | An array of key and value pair tags that\'s associated with the new
+-- configuration set.
+createConfigurationSet_tags :: Lens.Lens' CreateConfigurationSet (Prelude.Maybe [Tag])
+createConfigurationSet_tags = Lens.lens (\CreateConfigurationSet' {tags} -> tags) (\s@CreateConfigurationSet' {} a -> s {tags = a} :: CreateConfigurationSet) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name to use for the new configuration set.
+createConfigurationSet_configurationSetName :: Lens.Lens' CreateConfigurationSet Prelude.Text
+createConfigurationSet_configurationSetName = Lens.lens (\CreateConfigurationSet' {configurationSetName} -> configurationSetName) (\s@CreateConfigurationSet' {} a -> s {configurationSetName = a} :: CreateConfigurationSet)
+
+instance Core.AWSRequest CreateConfigurationSet where
+  type
+    AWSResponse CreateConfigurationSet =
+      CreateConfigurationSetResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateConfigurationSetResponse'
+            Prelude.<$> (x Data..?> "ConfigurationSetArn")
+            Prelude.<*> (x Data..?> "ConfigurationSetName")
+            Prelude.<*> (x Data..?> "CreatedTimestamp")
+            Prelude.<*> (x Data..?> "Tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateConfigurationSet where
+  hashWithSalt _salt CreateConfigurationSet' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` configurationSetName
+
+instance Prelude.NFData CreateConfigurationSet where
+  rnf CreateConfigurationSet' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf configurationSetName
+
+instance Data.ToHeaders CreateConfigurationSet where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.CreateConfigurationSet" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateConfigurationSet where
+  toJSON CreateConfigurationSet' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClientToken" Data..=) Prelude.<$> clientToken,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ( "ConfigurationSetName"
+                  Data..= configurationSetName
+              )
+          ]
+      )
+
+instance Data.ToPath CreateConfigurationSet where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateConfigurationSet where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateConfigurationSetResponse' smart constructor.
+data CreateConfigurationSetResponse = CreateConfigurationSetResponse'
+  { -- | The Amazon Resource Name (ARN) of the newly created configuration set.
+    configurationSetArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the new configuration set.
+    configurationSetName :: Prelude.Maybe Prelude.Text,
+    -- | The time when the configuration set was created, in
+    -- <https://www.epochconverter.com/ UNIX epoch time> format.
+    createdTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | An array of key and value pair tags that\'s associated with the
+    -- configuration set.
+    tags :: Prelude.Maybe [Tag],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateConfigurationSetResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationSetArn', 'createConfigurationSetResponse_configurationSetArn' - The Amazon Resource Name (ARN) of the newly created configuration set.
+--
+-- 'configurationSetName', 'createConfigurationSetResponse_configurationSetName' - The name of the new configuration set.
+--
+-- 'createdTimestamp', 'createConfigurationSetResponse_createdTimestamp' - The time when the configuration set was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+--
+-- 'tags', 'createConfigurationSetResponse_tags' - An array of key and value pair tags that\'s associated with the
+-- configuration set.
+--
+-- 'httpStatus', 'createConfigurationSetResponse_httpStatus' - The response's http status code.
+newCreateConfigurationSetResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateConfigurationSetResponse
+newCreateConfigurationSetResponse pHttpStatus_ =
+  CreateConfigurationSetResponse'
+    { configurationSetArn =
+        Prelude.Nothing,
+      configurationSetName = Prelude.Nothing,
+      createdTimestamp = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the newly created configuration set.
+createConfigurationSetResponse_configurationSetArn :: Lens.Lens' CreateConfigurationSetResponse (Prelude.Maybe Prelude.Text)
+createConfigurationSetResponse_configurationSetArn = Lens.lens (\CreateConfigurationSetResponse' {configurationSetArn} -> configurationSetArn) (\s@CreateConfigurationSetResponse' {} a -> s {configurationSetArn = a} :: CreateConfigurationSetResponse)
+
+-- | The name of the new configuration set.
+createConfigurationSetResponse_configurationSetName :: Lens.Lens' CreateConfigurationSetResponse (Prelude.Maybe Prelude.Text)
+createConfigurationSetResponse_configurationSetName = Lens.lens (\CreateConfigurationSetResponse' {configurationSetName} -> configurationSetName) (\s@CreateConfigurationSetResponse' {} a -> s {configurationSetName = a} :: CreateConfigurationSetResponse)
+
+-- | The time when the configuration set was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+createConfigurationSetResponse_createdTimestamp :: Lens.Lens' CreateConfigurationSetResponse (Prelude.Maybe Prelude.UTCTime)
+createConfigurationSetResponse_createdTimestamp = Lens.lens (\CreateConfigurationSetResponse' {createdTimestamp} -> createdTimestamp) (\s@CreateConfigurationSetResponse' {} a -> s {createdTimestamp = a} :: CreateConfigurationSetResponse) Prelude.. Lens.mapping Data._Time
+
+-- | An array of key and value pair tags that\'s associated with the
+-- configuration set.
+createConfigurationSetResponse_tags :: Lens.Lens' CreateConfigurationSetResponse (Prelude.Maybe [Tag])
+createConfigurationSetResponse_tags = Lens.lens (\CreateConfigurationSetResponse' {tags} -> tags) (\s@CreateConfigurationSetResponse' {} a -> s {tags = a} :: CreateConfigurationSetResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+createConfigurationSetResponse_httpStatus :: Lens.Lens' CreateConfigurationSetResponse Prelude.Int
+createConfigurationSetResponse_httpStatus = Lens.lens (\CreateConfigurationSetResponse' {httpStatus} -> httpStatus) (\s@CreateConfigurationSetResponse' {} a -> s {httpStatus = a} :: CreateConfigurationSetResponse)
+
+instance
+  Prelude.NFData
+    CreateConfigurationSetResponse
+  where
+  rnf CreateConfigurationSetResponse' {..} =
+    Prelude.rnf configurationSetArn
+      `Prelude.seq` Prelude.rnf configurationSetName
+      `Prelude.seq` Prelude.rnf createdTimestamp
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/CreateEventDestination.hs b/gen/Amazonka/PinpointSmsVoiceV2/CreateEventDestination.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/CreateEventDestination.hs
@@ -0,0 +1,331 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.CreateEventDestination
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a new event destination in a configuration set.
+--
+-- An event destination is a location where you send message events. The
+-- event options are Amazon CloudWatch, Amazon Kinesis Data Firehose, or
+-- Amazon SNS. For example, when a message is delivered successfully, you
+-- can send information about that event to an event destination, or send
+-- notifications to endpoints that are subscribed to an Amazon SNS topic.
+--
+-- Each configuration set can contain between 0 and 5 event destinations.
+-- Each event destination can contain a reference to a single destination,
+-- such as a CloudWatch or Kinesis Data Firehose destination.
+module Amazonka.PinpointSmsVoiceV2.CreateEventDestination
+  ( -- * Creating a Request
+    CreateEventDestination (..),
+    newCreateEventDestination,
+
+    -- * Request Lenses
+    createEventDestination_clientToken,
+    createEventDestination_cloudWatchLogsDestination,
+    createEventDestination_kinesisFirehoseDestination,
+    createEventDestination_snsDestination,
+    createEventDestination_configurationSetName,
+    createEventDestination_eventDestinationName,
+    createEventDestination_matchingEventTypes,
+
+    -- * Destructuring the Response
+    CreateEventDestinationResponse (..),
+    newCreateEventDestinationResponse,
+
+    -- * Response Lenses
+    createEventDestinationResponse_configurationSetArn,
+    createEventDestinationResponse_configurationSetName,
+    createEventDestinationResponse_eventDestination,
+    createEventDestinationResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateEventDestination' smart constructor.
+data CreateEventDestination = CreateEventDestination'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. If you don\'t specify a client token, a
+    -- randomly generated token is used for the request to ensure idempotency.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | An object that contains information about an event destination for
+    -- logging to Amazon CloudWatch logs.
+    cloudWatchLogsDestination :: Prelude.Maybe CloudWatchLogsDestination,
+    -- | An object that contains information about an event destination for
+    -- logging to Amazon Kinesis Data Firehose.
+    kinesisFirehoseDestination :: Prelude.Maybe KinesisFirehoseDestination,
+    -- | An object that contains information about an event destination for
+    -- logging to Amazon SNS.
+    snsDestination :: Prelude.Maybe SnsDestination,
+    -- | Either the name of the configuration set or the configuration set ARN to
+    -- apply event logging to. The ConfigurateSetName and ConfigurationSetArn
+    -- can be found using the DescribeConfigurationSets action.
+    configurationSetName :: Prelude.Text,
+    -- | The name that identifies the event destination.
+    eventDestinationName :: Prelude.Text,
+    -- | An array of event types that determine which events to log. If \"ALL\"
+    -- is used, then Amazon Pinpoint logs every event type.
+    matchingEventTypes :: Prelude.NonEmpty EventType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateEventDestination' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createEventDestination_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. If you don\'t specify a client token, a
+-- randomly generated token is used for the request to ensure idempotency.
+--
+-- 'cloudWatchLogsDestination', 'createEventDestination_cloudWatchLogsDestination' - An object that contains information about an event destination for
+-- logging to Amazon CloudWatch logs.
+--
+-- 'kinesisFirehoseDestination', 'createEventDestination_kinesisFirehoseDestination' - An object that contains information about an event destination for
+-- logging to Amazon Kinesis Data Firehose.
+--
+-- 'snsDestination', 'createEventDestination_snsDestination' - An object that contains information about an event destination for
+-- logging to Amazon SNS.
+--
+-- 'configurationSetName', 'createEventDestination_configurationSetName' - Either the name of the configuration set or the configuration set ARN to
+-- apply event logging to. The ConfigurateSetName and ConfigurationSetArn
+-- can be found using the DescribeConfigurationSets action.
+--
+-- 'eventDestinationName', 'createEventDestination_eventDestinationName' - The name that identifies the event destination.
+--
+-- 'matchingEventTypes', 'createEventDestination_matchingEventTypes' - An array of event types that determine which events to log. If \"ALL\"
+-- is used, then Amazon Pinpoint logs every event type.
+newCreateEventDestination ::
+  -- | 'configurationSetName'
+  Prelude.Text ->
+  -- | 'eventDestinationName'
+  Prelude.Text ->
+  -- | 'matchingEventTypes'
+  Prelude.NonEmpty EventType ->
+  CreateEventDestination
+newCreateEventDestination
+  pConfigurationSetName_
+  pEventDestinationName_
+  pMatchingEventTypes_ =
+    CreateEventDestination'
+      { clientToken =
+          Prelude.Nothing,
+        cloudWatchLogsDestination = Prelude.Nothing,
+        kinesisFirehoseDestination = Prelude.Nothing,
+        snsDestination = Prelude.Nothing,
+        configurationSetName = pConfigurationSetName_,
+        eventDestinationName = pEventDestinationName_,
+        matchingEventTypes =
+          Lens.coerced Lens.# pMatchingEventTypes_
+      }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. If you don\'t specify a client token, a
+-- randomly generated token is used for the request to ensure idempotency.
+createEventDestination_clientToken :: Lens.Lens' CreateEventDestination (Prelude.Maybe Prelude.Text)
+createEventDestination_clientToken = Lens.lens (\CreateEventDestination' {clientToken} -> clientToken) (\s@CreateEventDestination' {} a -> s {clientToken = a} :: CreateEventDestination)
+
+-- | An object that contains information about an event destination for
+-- logging to Amazon CloudWatch logs.
+createEventDestination_cloudWatchLogsDestination :: Lens.Lens' CreateEventDestination (Prelude.Maybe CloudWatchLogsDestination)
+createEventDestination_cloudWatchLogsDestination = Lens.lens (\CreateEventDestination' {cloudWatchLogsDestination} -> cloudWatchLogsDestination) (\s@CreateEventDestination' {} a -> s {cloudWatchLogsDestination = a} :: CreateEventDestination)
+
+-- | An object that contains information about an event destination for
+-- logging to Amazon Kinesis Data Firehose.
+createEventDestination_kinesisFirehoseDestination :: Lens.Lens' CreateEventDestination (Prelude.Maybe KinesisFirehoseDestination)
+createEventDestination_kinesisFirehoseDestination = Lens.lens (\CreateEventDestination' {kinesisFirehoseDestination} -> kinesisFirehoseDestination) (\s@CreateEventDestination' {} a -> s {kinesisFirehoseDestination = a} :: CreateEventDestination)
+
+-- | An object that contains information about an event destination for
+-- logging to Amazon SNS.
+createEventDestination_snsDestination :: Lens.Lens' CreateEventDestination (Prelude.Maybe SnsDestination)
+createEventDestination_snsDestination = Lens.lens (\CreateEventDestination' {snsDestination} -> snsDestination) (\s@CreateEventDestination' {} a -> s {snsDestination = a} :: CreateEventDestination)
+
+-- | Either the name of the configuration set or the configuration set ARN to
+-- apply event logging to. The ConfigurateSetName and ConfigurationSetArn
+-- can be found using the DescribeConfigurationSets action.
+createEventDestination_configurationSetName :: Lens.Lens' CreateEventDestination Prelude.Text
+createEventDestination_configurationSetName = Lens.lens (\CreateEventDestination' {configurationSetName} -> configurationSetName) (\s@CreateEventDestination' {} a -> s {configurationSetName = a} :: CreateEventDestination)
+
+-- | The name that identifies the event destination.
+createEventDestination_eventDestinationName :: Lens.Lens' CreateEventDestination Prelude.Text
+createEventDestination_eventDestinationName = Lens.lens (\CreateEventDestination' {eventDestinationName} -> eventDestinationName) (\s@CreateEventDestination' {} a -> s {eventDestinationName = a} :: CreateEventDestination)
+
+-- | An array of event types that determine which events to log. If \"ALL\"
+-- is used, then Amazon Pinpoint logs every event type.
+createEventDestination_matchingEventTypes :: Lens.Lens' CreateEventDestination (Prelude.NonEmpty EventType)
+createEventDestination_matchingEventTypes = Lens.lens (\CreateEventDestination' {matchingEventTypes} -> matchingEventTypes) (\s@CreateEventDestination' {} a -> s {matchingEventTypes = a} :: CreateEventDestination) Prelude.. Lens.coerced
+
+instance Core.AWSRequest CreateEventDestination where
+  type
+    AWSResponse CreateEventDestination =
+      CreateEventDestinationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateEventDestinationResponse'
+            Prelude.<$> (x Data..?> "ConfigurationSetArn")
+            Prelude.<*> (x Data..?> "ConfigurationSetName")
+            Prelude.<*> (x Data..?> "EventDestination")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateEventDestination where
+  hashWithSalt _salt CreateEventDestination' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` cloudWatchLogsDestination
+      `Prelude.hashWithSalt` kinesisFirehoseDestination
+      `Prelude.hashWithSalt` snsDestination
+      `Prelude.hashWithSalt` configurationSetName
+      `Prelude.hashWithSalt` eventDestinationName
+      `Prelude.hashWithSalt` matchingEventTypes
+
+instance Prelude.NFData CreateEventDestination where
+  rnf CreateEventDestination' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf cloudWatchLogsDestination
+      `Prelude.seq` Prelude.rnf kinesisFirehoseDestination
+      `Prelude.seq` Prelude.rnf snsDestination
+      `Prelude.seq` Prelude.rnf configurationSetName
+      `Prelude.seq` Prelude.rnf eventDestinationName
+      `Prelude.seq` Prelude.rnf matchingEventTypes
+
+instance Data.ToHeaders CreateEventDestination where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.CreateEventDestination" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateEventDestination where
+  toJSON CreateEventDestination' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClientToken" Data..=) Prelude.<$> clientToken,
+            ("CloudWatchLogsDestination" Data..=)
+              Prelude.<$> cloudWatchLogsDestination,
+            ("KinesisFirehoseDestination" Data..=)
+              Prelude.<$> kinesisFirehoseDestination,
+            ("SnsDestination" Data..=)
+              Prelude.<$> snsDestination,
+            Prelude.Just
+              ( "ConfigurationSetName"
+                  Data..= configurationSetName
+              ),
+            Prelude.Just
+              ( "EventDestinationName"
+                  Data..= eventDestinationName
+              ),
+            Prelude.Just
+              ("MatchingEventTypes" Data..= matchingEventTypes)
+          ]
+      )
+
+instance Data.ToPath CreateEventDestination where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateEventDestination where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateEventDestinationResponse' smart constructor.
+data CreateEventDestinationResponse = CreateEventDestinationResponse'
+  { -- | The ARN of the configuration set.
+    configurationSetArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the configuration set.
+    configurationSetName :: Prelude.Maybe Prelude.Text,
+    -- | The details of the destination where events are logged.
+    eventDestination :: Prelude.Maybe EventDestination,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateEventDestinationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationSetArn', 'createEventDestinationResponse_configurationSetArn' - The ARN of the configuration set.
+--
+-- 'configurationSetName', 'createEventDestinationResponse_configurationSetName' - The name of the configuration set.
+--
+-- 'eventDestination', 'createEventDestinationResponse_eventDestination' - The details of the destination where events are logged.
+--
+-- 'httpStatus', 'createEventDestinationResponse_httpStatus' - The response's http status code.
+newCreateEventDestinationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateEventDestinationResponse
+newCreateEventDestinationResponse pHttpStatus_ =
+  CreateEventDestinationResponse'
+    { configurationSetArn =
+        Prelude.Nothing,
+      configurationSetName = Prelude.Nothing,
+      eventDestination = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The ARN of the configuration set.
+createEventDestinationResponse_configurationSetArn :: Lens.Lens' CreateEventDestinationResponse (Prelude.Maybe Prelude.Text)
+createEventDestinationResponse_configurationSetArn = Lens.lens (\CreateEventDestinationResponse' {configurationSetArn} -> configurationSetArn) (\s@CreateEventDestinationResponse' {} a -> s {configurationSetArn = a} :: CreateEventDestinationResponse)
+
+-- | The name of the configuration set.
+createEventDestinationResponse_configurationSetName :: Lens.Lens' CreateEventDestinationResponse (Prelude.Maybe Prelude.Text)
+createEventDestinationResponse_configurationSetName = Lens.lens (\CreateEventDestinationResponse' {configurationSetName} -> configurationSetName) (\s@CreateEventDestinationResponse' {} a -> s {configurationSetName = a} :: CreateEventDestinationResponse)
+
+-- | The details of the destination where events are logged.
+createEventDestinationResponse_eventDestination :: Lens.Lens' CreateEventDestinationResponse (Prelude.Maybe EventDestination)
+createEventDestinationResponse_eventDestination = Lens.lens (\CreateEventDestinationResponse' {eventDestination} -> eventDestination) (\s@CreateEventDestinationResponse' {} a -> s {eventDestination = a} :: CreateEventDestinationResponse)
+
+-- | The response's http status code.
+createEventDestinationResponse_httpStatus :: Lens.Lens' CreateEventDestinationResponse Prelude.Int
+createEventDestinationResponse_httpStatus = Lens.lens (\CreateEventDestinationResponse' {httpStatus} -> httpStatus) (\s@CreateEventDestinationResponse' {} a -> s {httpStatus = a} :: CreateEventDestinationResponse)
+
+instance
+  Prelude.NFData
+    CreateEventDestinationResponse
+  where
+  rnf CreateEventDestinationResponse' {..} =
+    Prelude.rnf configurationSetArn
+      `Prelude.seq` Prelude.rnf configurationSetName
+      `Prelude.seq` Prelude.rnf eventDestination
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/CreateOptOutList.hs b/gen/Amazonka/PinpointSmsVoiceV2/CreateOptOutList.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/CreateOptOutList.hs
@@ -0,0 +1,262 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.CreateOptOutList
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a new opt-out list.
+--
+-- If the opt-out list name already exists, an Error is returned.
+--
+-- An opt-out list is a list of phone numbers that are opted out, meaning
+-- you can\'t send SMS or voice messages to them. If end user replies with
+-- the keyword \"STOP,\" an entry for the phone number is added to the
+-- opt-out list. In addition to STOP, your recipients can use any supported
+-- opt-out keyword, such as CANCEL or OPTOUT. For a list of supported
+-- opt-out keywords, see
+-- <https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-manage.html#channels-sms-manage-optout SMS opt out>
+-- in the /Amazon Pinpoint User Guide/.
+module Amazonka.PinpointSmsVoiceV2.CreateOptOutList
+  ( -- * Creating a Request
+    CreateOptOutList (..),
+    newCreateOptOutList,
+
+    -- * Request Lenses
+    createOptOutList_clientToken,
+    createOptOutList_tags,
+    createOptOutList_optOutListName,
+
+    -- * Destructuring the Response
+    CreateOptOutListResponse (..),
+    newCreateOptOutListResponse,
+
+    -- * Response Lenses
+    createOptOutListResponse_createdTimestamp,
+    createOptOutListResponse_optOutListArn,
+    createOptOutListResponse_optOutListName,
+    createOptOutListResponse_tags,
+    createOptOutListResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateOptOutList' smart constructor.
+data CreateOptOutList = CreateOptOutList'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. If you don\'t specify a client token, a
+    -- randomly generated token is used for the request to ensure idempotency.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | An array of tags (key and value pairs) to associate with the new
+    -- OptOutList.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name of the new OptOutList.
+    optOutListName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateOptOutList' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createOptOutList_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. If you don\'t specify a client token, a
+-- randomly generated token is used for the request to ensure idempotency.
+--
+-- 'tags', 'createOptOutList_tags' - An array of tags (key and value pairs) to associate with the new
+-- OptOutList.
+--
+-- 'optOutListName', 'createOptOutList_optOutListName' - The name of the new OptOutList.
+newCreateOptOutList ::
+  -- | 'optOutListName'
+  Prelude.Text ->
+  CreateOptOutList
+newCreateOptOutList pOptOutListName_ =
+  CreateOptOutList'
+    { clientToken = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      optOutListName = pOptOutListName_
+    }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. If you don\'t specify a client token, a
+-- randomly generated token is used for the request to ensure idempotency.
+createOptOutList_clientToken :: Lens.Lens' CreateOptOutList (Prelude.Maybe Prelude.Text)
+createOptOutList_clientToken = Lens.lens (\CreateOptOutList' {clientToken} -> clientToken) (\s@CreateOptOutList' {} a -> s {clientToken = a} :: CreateOptOutList)
+
+-- | An array of tags (key and value pairs) to associate with the new
+-- OptOutList.
+createOptOutList_tags :: Lens.Lens' CreateOptOutList (Prelude.Maybe [Tag])
+createOptOutList_tags = Lens.lens (\CreateOptOutList' {tags} -> tags) (\s@CreateOptOutList' {} a -> s {tags = a} :: CreateOptOutList) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the new OptOutList.
+createOptOutList_optOutListName :: Lens.Lens' CreateOptOutList Prelude.Text
+createOptOutList_optOutListName = Lens.lens (\CreateOptOutList' {optOutListName} -> optOutListName) (\s@CreateOptOutList' {} a -> s {optOutListName = a} :: CreateOptOutList)
+
+instance Core.AWSRequest CreateOptOutList where
+  type
+    AWSResponse CreateOptOutList =
+      CreateOptOutListResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateOptOutListResponse'
+            Prelude.<$> (x Data..?> "CreatedTimestamp")
+            Prelude.<*> (x Data..?> "OptOutListArn")
+            Prelude.<*> (x Data..?> "OptOutListName")
+            Prelude.<*> (x Data..?> "Tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateOptOutList where
+  hashWithSalt _salt CreateOptOutList' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` optOutListName
+
+instance Prelude.NFData CreateOptOutList where
+  rnf CreateOptOutList' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf optOutListName
+
+instance Data.ToHeaders CreateOptOutList where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.CreateOptOutList" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateOptOutList where
+  toJSON CreateOptOutList' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClientToken" Data..=) Prelude.<$> clientToken,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ("OptOutListName" Data..= optOutListName)
+          ]
+      )
+
+instance Data.ToPath CreateOptOutList where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateOptOutList where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateOptOutListResponse' smart constructor.
+data CreateOptOutListResponse = CreateOptOutListResponse'
+  { -- | The time when the pool was created, in
+    -- <https://www.epochconverter.com/ UNIX epoch time> format.
+    createdTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) for the OptOutList.
+    optOutListArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the new OptOutList.
+    optOutListName :: Prelude.Maybe Prelude.Text,
+    -- | An array of tags (key and value pairs) associated with the new
+    -- OptOutList.
+    tags :: Prelude.Maybe [Tag],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateOptOutListResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdTimestamp', 'createOptOutListResponse_createdTimestamp' - The time when the pool was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+--
+-- 'optOutListArn', 'createOptOutListResponse_optOutListArn' - The Amazon Resource Name (ARN) for the OptOutList.
+--
+-- 'optOutListName', 'createOptOutListResponse_optOutListName' - The name of the new OptOutList.
+--
+-- 'tags', 'createOptOutListResponse_tags' - An array of tags (key and value pairs) associated with the new
+-- OptOutList.
+--
+-- 'httpStatus', 'createOptOutListResponse_httpStatus' - The response's http status code.
+newCreateOptOutListResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateOptOutListResponse
+newCreateOptOutListResponse pHttpStatus_ =
+  CreateOptOutListResponse'
+    { createdTimestamp =
+        Prelude.Nothing,
+      optOutListArn = Prelude.Nothing,
+      optOutListName = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The time when the pool was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+createOptOutListResponse_createdTimestamp :: Lens.Lens' CreateOptOutListResponse (Prelude.Maybe Prelude.UTCTime)
+createOptOutListResponse_createdTimestamp = Lens.lens (\CreateOptOutListResponse' {createdTimestamp} -> createdTimestamp) (\s@CreateOptOutListResponse' {} a -> s {createdTimestamp = a} :: CreateOptOutListResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) for the OptOutList.
+createOptOutListResponse_optOutListArn :: Lens.Lens' CreateOptOutListResponse (Prelude.Maybe Prelude.Text)
+createOptOutListResponse_optOutListArn = Lens.lens (\CreateOptOutListResponse' {optOutListArn} -> optOutListArn) (\s@CreateOptOutListResponse' {} a -> s {optOutListArn = a} :: CreateOptOutListResponse)
+
+-- | The name of the new OptOutList.
+createOptOutListResponse_optOutListName :: Lens.Lens' CreateOptOutListResponse (Prelude.Maybe Prelude.Text)
+createOptOutListResponse_optOutListName = Lens.lens (\CreateOptOutListResponse' {optOutListName} -> optOutListName) (\s@CreateOptOutListResponse' {} a -> s {optOutListName = a} :: CreateOptOutListResponse)
+
+-- | An array of tags (key and value pairs) associated with the new
+-- OptOutList.
+createOptOutListResponse_tags :: Lens.Lens' CreateOptOutListResponse (Prelude.Maybe [Tag])
+createOptOutListResponse_tags = Lens.lens (\CreateOptOutListResponse' {tags} -> tags) (\s@CreateOptOutListResponse' {} a -> s {tags = a} :: CreateOptOutListResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+createOptOutListResponse_httpStatus :: Lens.Lens' CreateOptOutListResponse Prelude.Int
+createOptOutListResponse_httpStatus = Lens.lens (\CreateOptOutListResponse' {httpStatus} -> httpStatus) (\s@CreateOptOutListResponse' {} a -> s {httpStatus = a} :: CreateOptOutListResponse)
+
+instance Prelude.NFData CreateOptOutListResponse where
+  rnf CreateOptOutListResponse' {..} =
+    Prelude.rnf createdTimestamp
+      `Prelude.seq` Prelude.rnf optOutListArn
+      `Prelude.seq` Prelude.rnf optOutListName
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/CreatePool.hs b/gen/Amazonka/PinpointSmsVoiceV2/CreatePool.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/CreatePool.hs
@@ -0,0 +1,462 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.CreatePool
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a new pool and associates the specified origination identity to
+-- the pool. A pool can include one or more phone numbers and SenderIds
+-- that are associated with your Amazon Web Services account.
+--
+-- The new pool inherits its configuration from the specified origination
+-- identity. This includes keywords, message type, opt-out list, two-way
+-- configuration, and self-managed opt-out configuration. Deletion
+-- protection isn\'t inherited from the origination identity and defaults
+-- to false.
+--
+-- If the origination identity is a phone number and is already associated
+-- with another pool, an Error is returned. A sender ID can be associated
+-- with multiple pools.
+module Amazonka.PinpointSmsVoiceV2.CreatePool
+  ( -- * Creating a Request
+    CreatePool (..),
+    newCreatePool,
+
+    -- * Request Lenses
+    createPool_clientToken,
+    createPool_deletionProtectionEnabled,
+    createPool_tags,
+    createPool_originationIdentity,
+    createPool_isoCountryCode,
+    createPool_messageType,
+
+    -- * Destructuring the Response
+    CreatePoolResponse (..),
+    newCreatePoolResponse,
+
+    -- * Response Lenses
+    createPoolResponse_createdTimestamp,
+    createPoolResponse_deletionProtectionEnabled,
+    createPoolResponse_messageType,
+    createPoolResponse_optOutListName,
+    createPoolResponse_poolArn,
+    createPoolResponse_poolId,
+    createPoolResponse_selfManagedOptOutsEnabled,
+    createPoolResponse_sharedRoutesEnabled,
+    createPoolResponse_status,
+    createPoolResponse_tags,
+    createPoolResponse_twoWayChannelArn,
+    createPoolResponse_twoWayEnabled,
+    createPoolResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreatePool' smart constructor.
+data CreatePool = CreatePool'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. If you don\'t specify a client token, a
+    -- randomly generated token is used for the request to ensure idempotency.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | By default this is set to false. When set to true the pool can\'t be
+    -- deleted. You can change this value using the UpdatePool action.
+    deletionProtectionEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | An array of tags (key and value pairs) associated with the pool.
+    tags :: Prelude.Maybe [Tag],
+    -- | The origination identity to use such as a PhoneNumberId, PhoneNumberArn,
+    -- SenderId or SenderIdArn. You can use DescribePhoneNumbers to find the
+    -- values for PhoneNumberId and PhoneNumberArn while DescribeSenderIds can
+    -- be used to get the values for SenderId and SenderIdArn.
+    originationIdentity :: Prelude.Text,
+    -- | The new two-character code, in ISO 3166-1 alpha-2 format, for the
+    -- country or region of the new pool.
+    isoCountryCode :: Prelude.Text,
+    -- | The type of message. Valid values are TRANSACTIONAL for messages that
+    -- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+    -- critical or time-sensitive.
+    messageType :: MessageType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreatePool' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createPool_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. If you don\'t specify a client token, a
+-- randomly generated token is used for the request to ensure idempotency.
+--
+-- 'deletionProtectionEnabled', 'createPool_deletionProtectionEnabled' - By default this is set to false. When set to true the pool can\'t be
+-- deleted. You can change this value using the UpdatePool action.
+--
+-- 'tags', 'createPool_tags' - An array of tags (key and value pairs) associated with the pool.
+--
+-- 'originationIdentity', 'createPool_originationIdentity' - The origination identity to use such as a PhoneNumberId, PhoneNumberArn,
+-- SenderId or SenderIdArn. You can use DescribePhoneNumbers to find the
+-- values for PhoneNumberId and PhoneNumberArn while DescribeSenderIds can
+-- be used to get the values for SenderId and SenderIdArn.
+--
+-- 'isoCountryCode', 'createPool_isoCountryCode' - The new two-character code, in ISO 3166-1 alpha-2 format, for the
+-- country or region of the new pool.
+--
+-- 'messageType', 'createPool_messageType' - The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+newCreatePool ::
+  -- | 'originationIdentity'
+  Prelude.Text ->
+  -- | 'isoCountryCode'
+  Prelude.Text ->
+  -- | 'messageType'
+  MessageType ->
+  CreatePool
+newCreatePool
+  pOriginationIdentity_
+  pIsoCountryCode_
+  pMessageType_ =
+    CreatePool'
+      { clientToken = Prelude.Nothing,
+        deletionProtectionEnabled = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        originationIdentity = pOriginationIdentity_,
+        isoCountryCode = pIsoCountryCode_,
+        messageType = pMessageType_
+      }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. If you don\'t specify a client token, a
+-- randomly generated token is used for the request to ensure idempotency.
+createPool_clientToken :: Lens.Lens' CreatePool (Prelude.Maybe Prelude.Text)
+createPool_clientToken = Lens.lens (\CreatePool' {clientToken} -> clientToken) (\s@CreatePool' {} a -> s {clientToken = a} :: CreatePool)
+
+-- | By default this is set to false. When set to true the pool can\'t be
+-- deleted. You can change this value using the UpdatePool action.
+createPool_deletionProtectionEnabled :: Lens.Lens' CreatePool (Prelude.Maybe Prelude.Bool)
+createPool_deletionProtectionEnabled = Lens.lens (\CreatePool' {deletionProtectionEnabled} -> deletionProtectionEnabled) (\s@CreatePool' {} a -> s {deletionProtectionEnabled = a} :: CreatePool)
+
+-- | An array of tags (key and value pairs) associated with the pool.
+createPool_tags :: Lens.Lens' CreatePool (Prelude.Maybe [Tag])
+createPool_tags = Lens.lens (\CreatePool' {tags} -> tags) (\s@CreatePool' {} a -> s {tags = a} :: CreatePool) Prelude.. Lens.mapping Lens.coerced
+
+-- | The origination identity to use such as a PhoneNumberId, PhoneNumberArn,
+-- SenderId or SenderIdArn. You can use DescribePhoneNumbers to find the
+-- values for PhoneNumberId and PhoneNumberArn while DescribeSenderIds can
+-- be used to get the values for SenderId and SenderIdArn.
+createPool_originationIdentity :: Lens.Lens' CreatePool Prelude.Text
+createPool_originationIdentity = Lens.lens (\CreatePool' {originationIdentity} -> originationIdentity) (\s@CreatePool' {} a -> s {originationIdentity = a} :: CreatePool)
+
+-- | The new two-character code, in ISO 3166-1 alpha-2 format, for the
+-- country or region of the new pool.
+createPool_isoCountryCode :: Lens.Lens' CreatePool Prelude.Text
+createPool_isoCountryCode = Lens.lens (\CreatePool' {isoCountryCode} -> isoCountryCode) (\s@CreatePool' {} a -> s {isoCountryCode = a} :: CreatePool)
+
+-- | The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+createPool_messageType :: Lens.Lens' CreatePool MessageType
+createPool_messageType = Lens.lens (\CreatePool' {messageType} -> messageType) (\s@CreatePool' {} a -> s {messageType = a} :: CreatePool)
+
+instance Core.AWSRequest CreatePool where
+  type AWSResponse CreatePool = CreatePoolResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreatePoolResponse'
+            Prelude.<$> (x Data..?> "CreatedTimestamp")
+            Prelude.<*> (x Data..?> "DeletionProtectionEnabled")
+            Prelude.<*> (x Data..?> "MessageType")
+            Prelude.<*> (x Data..?> "OptOutListName")
+            Prelude.<*> (x Data..?> "PoolArn")
+            Prelude.<*> (x Data..?> "PoolId")
+            Prelude.<*> (x Data..?> "SelfManagedOptOutsEnabled")
+            Prelude.<*> (x Data..?> "SharedRoutesEnabled")
+            Prelude.<*> (x Data..?> "Status")
+            Prelude.<*> (x Data..?> "Tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "TwoWayChannelArn")
+            Prelude.<*> (x Data..?> "TwoWayEnabled")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreatePool where
+  hashWithSalt _salt CreatePool' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` deletionProtectionEnabled
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` originationIdentity
+      `Prelude.hashWithSalt` isoCountryCode
+      `Prelude.hashWithSalt` messageType
+
+instance Prelude.NFData CreatePool where
+  rnf CreatePool' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf deletionProtectionEnabled
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf originationIdentity
+      `Prelude.seq` Prelude.rnf isoCountryCode
+      `Prelude.seq` Prelude.rnf messageType
+
+instance Data.ToHeaders CreatePool where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.CreatePool" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreatePool where
+  toJSON CreatePool' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClientToken" Data..=) Prelude.<$> clientToken,
+            ("DeletionProtectionEnabled" Data..=)
+              Prelude.<$> deletionProtectionEnabled,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ("OriginationIdentity" Data..= originationIdentity),
+            Prelude.Just
+              ("IsoCountryCode" Data..= isoCountryCode),
+            Prelude.Just ("MessageType" Data..= messageType)
+          ]
+      )
+
+instance Data.ToPath CreatePool where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreatePool where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreatePoolResponse' smart constructor.
+data CreatePoolResponse = CreatePoolResponse'
+  { -- | The time when the pool was created, in
+    -- <https://www.epochconverter.com/ UNIX epoch time> format.
+    createdTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | When set to true deletion protection is enabled. By default this is set
+    -- to false.
+    deletionProtectionEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The type of message for the pool to use.
+    messageType :: Prelude.Maybe MessageType,
+    -- | The name of the OptOutList associated with the pool.
+    optOutListName :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) for the pool.
+    poolArn :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the pool.
+    poolId :: Prelude.Maybe Prelude.Text,
+    -- | By default this is set to false. When an end recipient sends a message
+    -- that begins with HELP or STOP to one of your dedicated numbers, Amazon
+    -- Pinpoint automatically replies with a customizable message and adds the
+    -- end recipient to the OptOutList. When set to true you\'re responsible
+    -- for responding to HELP and STOP requests. You\'re also responsible for
+    -- tracking and honoring opt-out requests.
+    selfManagedOptOutsEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | Indicates whether shared routes are enabled for the pool.
+    sharedRoutesEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The current status of the pool.
+    --
+    -- -   CREATING: The pool is currently being created and isn\'t yet
+    --     available for use.
+    --
+    -- -   ACTIVE: The pool is active and available for use.
+    --
+    -- -   DELETING: The pool is being deleted.
+    status :: Prelude.Maybe PoolStatus,
+    -- | An array of tags (key and value pairs) associated with the pool.
+    tags :: Prelude.Maybe [Tag],
+    -- | The Amazon Resource Name (ARN) of the two way channel.
+    twoWayChannelArn :: Prelude.Maybe Prelude.Text,
+    -- | By default this is set to false. When set to true you can receive
+    -- incoming text messages from your end recipients.
+    twoWayEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreatePoolResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdTimestamp', 'createPoolResponse_createdTimestamp' - The time when the pool was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+--
+-- 'deletionProtectionEnabled', 'createPoolResponse_deletionProtectionEnabled' - When set to true deletion protection is enabled. By default this is set
+-- to false.
+--
+-- 'messageType', 'createPoolResponse_messageType' - The type of message for the pool to use.
+--
+-- 'optOutListName', 'createPoolResponse_optOutListName' - The name of the OptOutList associated with the pool.
+--
+-- 'poolArn', 'createPoolResponse_poolArn' - The Amazon Resource Name (ARN) for the pool.
+--
+-- 'poolId', 'createPoolResponse_poolId' - The unique identifier for the pool.
+--
+-- 'selfManagedOptOutsEnabled', 'createPoolResponse_selfManagedOptOutsEnabled' - By default this is set to false. When an end recipient sends a message
+-- that begins with HELP or STOP to one of your dedicated numbers, Amazon
+-- Pinpoint automatically replies with a customizable message and adds the
+-- end recipient to the OptOutList. When set to true you\'re responsible
+-- for responding to HELP and STOP requests. You\'re also responsible for
+-- tracking and honoring opt-out requests.
+--
+-- 'sharedRoutesEnabled', 'createPoolResponse_sharedRoutesEnabled' - Indicates whether shared routes are enabled for the pool.
+--
+-- 'status', 'createPoolResponse_status' - The current status of the pool.
+--
+-- -   CREATING: The pool is currently being created and isn\'t yet
+--     available for use.
+--
+-- -   ACTIVE: The pool is active and available for use.
+--
+-- -   DELETING: The pool is being deleted.
+--
+-- 'tags', 'createPoolResponse_tags' - An array of tags (key and value pairs) associated with the pool.
+--
+-- 'twoWayChannelArn', 'createPoolResponse_twoWayChannelArn' - The Amazon Resource Name (ARN) of the two way channel.
+--
+-- 'twoWayEnabled', 'createPoolResponse_twoWayEnabled' - By default this is set to false. When set to true you can receive
+-- incoming text messages from your end recipients.
+--
+-- 'httpStatus', 'createPoolResponse_httpStatus' - The response's http status code.
+newCreatePoolResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreatePoolResponse
+newCreatePoolResponse pHttpStatus_ =
+  CreatePoolResponse'
+    { createdTimestamp =
+        Prelude.Nothing,
+      deletionProtectionEnabled = Prelude.Nothing,
+      messageType = Prelude.Nothing,
+      optOutListName = Prelude.Nothing,
+      poolArn = Prelude.Nothing,
+      poolId = Prelude.Nothing,
+      selfManagedOptOutsEnabled = Prelude.Nothing,
+      sharedRoutesEnabled = Prelude.Nothing,
+      status = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      twoWayChannelArn = Prelude.Nothing,
+      twoWayEnabled = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The time when the pool was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+createPoolResponse_createdTimestamp :: Lens.Lens' CreatePoolResponse (Prelude.Maybe Prelude.UTCTime)
+createPoolResponse_createdTimestamp = Lens.lens (\CreatePoolResponse' {createdTimestamp} -> createdTimestamp) (\s@CreatePoolResponse' {} a -> s {createdTimestamp = a} :: CreatePoolResponse) Prelude.. Lens.mapping Data._Time
+
+-- | When set to true deletion protection is enabled. By default this is set
+-- to false.
+createPoolResponse_deletionProtectionEnabled :: Lens.Lens' CreatePoolResponse (Prelude.Maybe Prelude.Bool)
+createPoolResponse_deletionProtectionEnabled = Lens.lens (\CreatePoolResponse' {deletionProtectionEnabled} -> deletionProtectionEnabled) (\s@CreatePoolResponse' {} a -> s {deletionProtectionEnabled = a} :: CreatePoolResponse)
+
+-- | The type of message for the pool to use.
+createPoolResponse_messageType :: Lens.Lens' CreatePoolResponse (Prelude.Maybe MessageType)
+createPoolResponse_messageType = Lens.lens (\CreatePoolResponse' {messageType} -> messageType) (\s@CreatePoolResponse' {} a -> s {messageType = a} :: CreatePoolResponse)
+
+-- | The name of the OptOutList associated with the pool.
+createPoolResponse_optOutListName :: Lens.Lens' CreatePoolResponse (Prelude.Maybe Prelude.Text)
+createPoolResponse_optOutListName = Lens.lens (\CreatePoolResponse' {optOutListName} -> optOutListName) (\s@CreatePoolResponse' {} a -> s {optOutListName = a} :: CreatePoolResponse)
+
+-- | The Amazon Resource Name (ARN) for the pool.
+createPoolResponse_poolArn :: Lens.Lens' CreatePoolResponse (Prelude.Maybe Prelude.Text)
+createPoolResponse_poolArn = Lens.lens (\CreatePoolResponse' {poolArn} -> poolArn) (\s@CreatePoolResponse' {} a -> s {poolArn = a} :: CreatePoolResponse)
+
+-- | The unique identifier for the pool.
+createPoolResponse_poolId :: Lens.Lens' CreatePoolResponse (Prelude.Maybe Prelude.Text)
+createPoolResponse_poolId = Lens.lens (\CreatePoolResponse' {poolId} -> poolId) (\s@CreatePoolResponse' {} a -> s {poolId = a} :: CreatePoolResponse)
+
+-- | By default this is set to false. When an end recipient sends a message
+-- that begins with HELP or STOP to one of your dedicated numbers, Amazon
+-- Pinpoint automatically replies with a customizable message and adds the
+-- end recipient to the OptOutList. When set to true you\'re responsible
+-- for responding to HELP and STOP requests. You\'re also responsible for
+-- tracking and honoring opt-out requests.
+createPoolResponse_selfManagedOptOutsEnabled :: Lens.Lens' CreatePoolResponse (Prelude.Maybe Prelude.Bool)
+createPoolResponse_selfManagedOptOutsEnabled = Lens.lens (\CreatePoolResponse' {selfManagedOptOutsEnabled} -> selfManagedOptOutsEnabled) (\s@CreatePoolResponse' {} a -> s {selfManagedOptOutsEnabled = a} :: CreatePoolResponse)
+
+-- | Indicates whether shared routes are enabled for the pool.
+createPoolResponse_sharedRoutesEnabled :: Lens.Lens' CreatePoolResponse (Prelude.Maybe Prelude.Bool)
+createPoolResponse_sharedRoutesEnabled = Lens.lens (\CreatePoolResponse' {sharedRoutesEnabled} -> sharedRoutesEnabled) (\s@CreatePoolResponse' {} a -> s {sharedRoutesEnabled = a} :: CreatePoolResponse)
+
+-- | The current status of the pool.
+--
+-- -   CREATING: The pool is currently being created and isn\'t yet
+--     available for use.
+--
+-- -   ACTIVE: The pool is active and available for use.
+--
+-- -   DELETING: The pool is being deleted.
+createPoolResponse_status :: Lens.Lens' CreatePoolResponse (Prelude.Maybe PoolStatus)
+createPoolResponse_status = Lens.lens (\CreatePoolResponse' {status} -> status) (\s@CreatePoolResponse' {} a -> s {status = a} :: CreatePoolResponse)
+
+-- | An array of tags (key and value pairs) associated with the pool.
+createPoolResponse_tags :: Lens.Lens' CreatePoolResponse (Prelude.Maybe [Tag])
+createPoolResponse_tags = Lens.lens (\CreatePoolResponse' {tags} -> tags) (\s@CreatePoolResponse' {} a -> s {tags = a} :: CreatePoolResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon Resource Name (ARN) of the two way channel.
+createPoolResponse_twoWayChannelArn :: Lens.Lens' CreatePoolResponse (Prelude.Maybe Prelude.Text)
+createPoolResponse_twoWayChannelArn = Lens.lens (\CreatePoolResponse' {twoWayChannelArn} -> twoWayChannelArn) (\s@CreatePoolResponse' {} a -> s {twoWayChannelArn = a} :: CreatePoolResponse)
+
+-- | By default this is set to false. When set to true you can receive
+-- incoming text messages from your end recipients.
+createPoolResponse_twoWayEnabled :: Lens.Lens' CreatePoolResponse (Prelude.Maybe Prelude.Bool)
+createPoolResponse_twoWayEnabled = Lens.lens (\CreatePoolResponse' {twoWayEnabled} -> twoWayEnabled) (\s@CreatePoolResponse' {} a -> s {twoWayEnabled = a} :: CreatePoolResponse)
+
+-- | The response's http status code.
+createPoolResponse_httpStatus :: Lens.Lens' CreatePoolResponse Prelude.Int
+createPoolResponse_httpStatus = Lens.lens (\CreatePoolResponse' {httpStatus} -> httpStatus) (\s@CreatePoolResponse' {} a -> s {httpStatus = a} :: CreatePoolResponse)
+
+instance Prelude.NFData CreatePoolResponse where
+  rnf CreatePoolResponse' {..} =
+    Prelude.rnf createdTimestamp
+      `Prelude.seq` Prelude.rnf deletionProtectionEnabled
+      `Prelude.seq` Prelude.rnf messageType
+      `Prelude.seq` Prelude.rnf optOutListName
+      `Prelude.seq` Prelude.rnf poolArn
+      `Prelude.seq` Prelude.rnf poolId
+      `Prelude.seq` Prelude.rnf selfManagedOptOutsEnabled
+      `Prelude.seq` Prelude.rnf sharedRoutesEnabled
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf twoWayChannelArn
+      `Prelude.seq` Prelude.rnf twoWayEnabled
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DeleteConfigurationSet.hs b/gen/Amazonka/PinpointSmsVoiceV2/DeleteConfigurationSet.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DeleteConfigurationSet.hs
@@ -0,0 +1,259 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DeleteConfigurationSet
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an existing configuration set.
+--
+-- A configuration set is a set of rules that you apply to voice and SMS
+-- messages that you send. In a configuration set, you can specify a
+-- destination for specific types of events related to voice and SMS
+-- messages.
+module Amazonka.PinpointSmsVoiceV2.DeleteConfigurationSet
+  ( -- * Creating a Request
+    DeleteConfigurationSet (..),
+    newDeleteConfigurationSet,
+
+    -- * Request Lenses
+    deleteConfigurationSet_configurationSetName,
+
+    -- * Destructuring the Response
+    DeleteConfigurationSetResponse (..),
+    newDeleteConfigurationSetResponse,
+
+    -- * Response Lenses
+    deleteConfigurationSetResponse_configurationSetArn,
+    deleteConfigurationSetResponse_configurationSetName,
+    deleteConfigurationSetResponse_createdTimestamp,
+    deleteConfigurationSetResponse_defaultMessageType,
+    deleteConfigurationSetResponse_defaultSenderId,
+    deleteConfigurationSetResponse_eventDestinations,
+    deleteConfigurationSetResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteConfigurationSet' smart constructor.
+data DeleteConfigurationSet = DeleteConfigurationSet'
+  { -- | The name of the configuration set or the configuration set ARN that you
+    -- want to delete. The ConfigurationSetName and ConfigurationSetArn can be
+    -- found using the DescribeConfigurationSets action.
+    configurationSetName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteConfigurationSet' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationSetName', 'deleteConfigurationSet_configurationSetName' - The name of the configuration set or the configuration set ARN that you
+-- want to delete. The ConfigurationSetName and ConfigurationSetArn can be
+-- found using the DescribeConfigurationSets action.
+newDeleteConfigurationSet ::
+  -- | 'configurationSetName'
+  Prelude.Text ->
+  DeleteConfigurationSet
+newDeleteConfigurationSet pConfigurationSetName_ =
+  DeleteConfigurationSet'
+    { configurationSetName =
+        pConfigurationSetName_
+    }
+
+-- | The name of the configuration set or the configuration set ARN that you
+-- want to delete. The ConfigurationSetName and ConfigurationSetArn can be
+-- found using the DescribeConfigurationSets action.
+deleteConfigurationSet_configurationSetName :: Lens.Lens' DeleteConfigurationSet Prelude.Text
+deleteConfigurationSet_configurationSetName = Lens.lens (\DeleteConfigurationSet' {configurationSetName} -> configurationSetName) (\s@DeleteConfigurationSet' {} a -> s {configurationSetName = a} :: DeleteConfigurationSet)
+
+instance Core.AWSRequest DeleteConfigurationSet where
+  type
+    AWSResponse DeleteConfigurationSet =
+      DeleteConfigurationSetResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteConfigurationSetResponse'
+            Prelude.<$> (x Data..?> "ConfigurationSetArn")
+            Prelude.<*> (x Data..?> "ConfigurationSetName")
+            Prelude.<*> (x Data..?> "CreatedTimestamp")
+            Prelude.<*> (x Data..?> "DefaultMessageType")
+            Prelude.<*> (x Data..?> "DefaultSenderId")
+            Prelude.<*> ( x
+                            Data..?> "EventDestinations"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteConfigurationSet where
+  hashWithSalt _salt DeleteConfigurationSet' {..} =
+    _salt `Prelude.hashWithSalt` configurationSetName
+
+instance Prelude.NFData DeleteConfigurationSet where
+  rnf DeleteConfigurationSet' {..} =
+    Prelude.rnf configurationSetName
+
+instance Data.ToHeaders DeleteConfigurationSet where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DeleteConfigurationSet" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteConfigurationSet where
+  toJSON DeleteConfigurationSet' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "ConfigurationSetName"
+                  Data..= configurationSetName
+              )
+          ]
+      )
+
+instance Data.ToPath DeleteConfigurationSet where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteConfigurationSet where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteConfigurationSetResponse' smart constructor.
+data DeleteConfigurationSetResponse = DeleteConfigurationSetResponse'
+  { -- | The Amazon Resource Name (ARN) of the deleted configuration set.
+    configurationSetArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the deleted configuration set.
+    configurationSetName :: Prelude.Maybe Prelude.Text,
+    -- | The time that the deleted configuration set was created in
+    -- <https://www.epochconverter.com/ UNIX epoch time> format.
+    createdTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The default message type of the configuration set that was deleted.
+    defaultMessageType :: Prelude.Maybe MessageType,
+    -- | The default Sender ID of the configuration set that was deleted.
+    defaultSenderId :: Prelude.Maybe Prelude.Text,
+    -- | An array of any EventDestination objects that were associated with the
+    -- deleted configuration set.
+    eventDestinations :: Prelude.Maybe [EventDestination],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteConfigurationSetResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationSetArn', 'deleteConfigurationSetResponse_configurationSetArn' - The Amazon Resource Name (ARN) of the deleted configuration set.
+--
+-- 'configurationSetName', 'deleteConfigurationSetResponse_configurationSetName' - The name of the deleted configuration set.
+--
+-- 'createdTimestamp', 'deleteConfigurationSetResponse_createdTimestamp' - The time that the deleted configuration set was created in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+--
+-- 'defaultMessageType', 'deleteConfigurationSetResponse_defaultMessageType' - The default message type of the configuration set that was deleted.
+--
+-- 'defaultSenderId', 'deleteConfigurationSetResponse_defaultSenderId' - The default Sender ID of the configuration set that was deleted.
+--
+-- 'eventDestinations', 'deleteConfigurationSetResponse_eventDestinations' - An array of any EventDestination objects that were associated with the
+-- deleted configuration set.
+--
+-- 'httpStatus', 'deleteConfigurationSetResponse_httpStatus' - The response's http status code.
+newDeleteConfigurationSetResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteConfigurationSetResponse
+newDeleteConfigurationSetResponse pHttpStatus_ =
+  DeleteConfigurationSetResponse'
+    { configurationSetArn =
+        Prelude.Nothing,
+      configurationSetName = Prelude.Nothing,
+      createdTimestamp = Prelude.Nothing,
+      defaultMessageType = Prelude.Nothing,
+      defaultSenderId = Prelude.Nothing,
+      eventDestinations = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the deleted configuration set.
+deleteConfigurationSetResponse_configurationSetArn :: Lens.Lens' DeleteConfigurationSetResponse (Prelude.Maybe Prelude.Text)
+deleteConfigurationSetResponse_configurationSetArn = Lens.lens (\DeleteConfigurationSetResponse' {configurationSetArn} -> configurationSetArn) (\s@DeleteConfigurationSetResponse' {} a -> s {configurationSetArn = a} :: DeleteConfigurationSetResponse)
+
+-- | The name of the deleted configuration set.
+deleteConfigurationSetResponse_configurationSetName :: Lens.Lens' DeleteConfigurationSetResponse (Prelude.Maybe Prelude.Text)
+deleteConfigurationSetResponse_configurationSetName = Lens.lens (\DeleteConfigurationSetResponse' {configurationSetName} -> configurationSetName) (\s@DeleteConfigurationSetResponse' {} a -> s {configurationSetName = a} :: DeleteConfigurationSetResponse)
+
+-- | The time that the deleted configuration set was created in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+deleteConfigurationSetResponse_createdTimestamp :: Lens.Lens' DeleteConfigurationSetResponse (Prelude.Maybe Prelude.UTCTime)
+deleteConfigurationSetResponse_createdTimestamp = Lens.lens (\DeleteConfigurationSetResponse' {createdTimestamp} -> createdTimestamp) (\s@DeleteConfigurationSetResponse' {} a -> s {createdTimestamp = a} :: DeleteConfigurationSetResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The default message type of the configuration set that was deleted.
+deleteConfigurationSetResponse_defaultMessageType :: Lens.Lens' DeleteConfigurationSetResponse (Prelude.Maybe MessageType)
+deleteConfigurationSetResponse_defaultMessageType = Lens.lens (\DeleteConfigurationSetResponse' {defaultMessageType} -> defaultMessageType) (\s@DeleteConfigurationSetResponse' {} a -> s {defaultMessageType = a} :: DeleteConfigurationSetResponse)
+
+-- | The default Sender ID of the configuration set that was deleted.
+deleteConfigurationSetResponse_defaultSenderId :: Lens.Lens' DeleteConfigurationSetResponse (Prelude.Maybe Prelude.Text)
+deleteConfigurationSetResponse_defaultSenderId = Lens.lens (\DeleteConfigurationSetResponse' {defaultSenderId} -> defaultSenderId) (\s@DeleteConfigurationSetResponse' {} a -> s {defaultSenderId = a} :: DeleteConfigurationSetResponse)
+
+-- | An array of any EventDestination objects that were associated with the
+-- deleted configuration set.
+deleteConfigurationSetResponse_eventDestinations :: Lens.Lens' DeleteConfigurationSetResponse (Prelude.Maybe [EventDestination])
+deleteConfigurationSetResponse_eventDestinations = Lens.lens (\DeleteConfigurationSetResponse' {eventDestinations} -> eventDestinations) (\s@DeleteConfigurationSetResponse' {} a -> s {eventDestinations = a} :: DeleteConfigurationSetResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+deleteConfigurationSetResponse_httpStatus :: Lens.Lens' DeleteConfigurationSetResponse Prelude.Int
+deleteConfigurationSetResponse_httpStatus = Lens.lens (\DeleteConfigurationSetResponse' {httpStatus} -> httpStatus) (\s@DeleteConfigurationSetResponse' {} a -> s {httpStatus = a} :: DeleteConfigurationSetResponse)
+
+instance
+  Prelude.NFData
+    DeleteConfigurationSetResponse
+  where
+  rnf DeleteConfigurationSetResponse' {..} =
+    Prelude.rnf configurationSetArn
+      `Prelude.seq` Prelude.rnf configurationSetName
+      `Prelude.seq` Prelude.rnf createdTimestamp
+      `Prelude.seq` Prelude.rnf defaultMessageType
+      `Prelude.seq` Prelude.rnf defaultSenderId
+      `Prelude.seq` Prelude.rnf eventDestinations
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DeleteDefaultMessageType.hs b/gen/Amazonka/PinpointSmsVoiceV2/DeleteDefaultMessageType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DeleteDefaultMessageType.hs
@@ -0,0 +1,219 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DeleteDefaultMessageType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an existing default message type on a configuration set.
+--
+-- A message type is a type of messages that you plan to send. If you send
+-- account-related messages or time-sensitive messages such as one-time
+-- passcodes, choose __Transactional__. If you plan to send messages that
+-- contain marketing material or other promotional content, choose
+-- __Promotional__. This setting applies to your entire Amazon Web Services
+-- account.
+module Amazonka.PinpointSmsVoiceV2.DeleteDefaultMessageType
+  ( -- * Creating a Request
+    DeleteDefaultMessageType (..),
+    newDeleteDefaultMessageType,
+
+    -- * Request Lenses
+    deleteDefaultMessageType_configurationSetName,
+
+    -- * Destructuring the Response
+    DeleteDefaultMessageTypeResponse (..),
+    newDeleteDefaultMessageTypeResponse,
+
+    -- * Response Lenses
+    deleteDefaultMessageTypeResponse_configurationSetArn,
+    deleteDefaultMessageTypeResponse_configurationSetName,
+    deleteDefaultMessageTypeResponse_messageType,
+    deleteDefaultMessageTypeResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteDefaultMessageType' smart constructor.
+data DeleteDefaultMessageType = DeleteDefaultMessageType'
+  { -- | The name of the configuration set or the configuration set Amazon
+    -- Resource Name (ARN) to delete the default message type from. The
+    -- ConfigurationSetName and ConfigurationSetArn can be found using the
+    -- DescribeConfigurationSets action.
+    configurationSetName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDefaultMessageType' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationSetName', 'deleteDefaultMessageType_configurationSetName' - The name of the configuration set or the configuration set Amazon
+-- Resource Name (ARN) to delete the default message type from. The
+-- ConfigurationSetName and ConfigurationSetArn can be found using the
+-- DescribeConfigurationSets action.
+newDeleteDefaultMessageType ::
+  -- | 'configurationSetName'
+  Prelude.Text ->
+  DeleteDefaultMessageType
+newDeleteDefaultMessageType pConfigurationSetName_ =
+  DeleteDefaultMessageType'
+    { configurationSetName =
+        pConfigurationSetName_
+    }
+
+-- | The name of the configuration set or the configuration set Amazon
+-- Resource Name (ARN) to delete the default message type from. The
+-- ConfigurationSetName and ConfigurationSetArn can be found using the
+-- DescribeConfigurationSets action.
+deleteDefaultMessageType_configurationSetName :: Lens.Lens' DeleteDefaultMessageType Prelude.Text
+deleteDefaultMessageType_configurationSetName = Lens.lens (\DeleteDefaultMessageType' {configurationSetName} -> configurationSetName) (\s@DeleteDefaultMessageType' {} a -> s {configurationSetName = a} :: DeleteDefaultMessageType)
+
+instance Core.AWSRequest DeleteDefaultMessageType where
+  type
+    AWSResponse DeleteDefaultMessageType =
+      DeleteDefaultMessageTypeResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteDefaultMessageTypeResponse'
+            Prelude.<$> (x Data..?> "ConfigurationSetArn")
+            Prelude.<*> (x Data..?> "ConfigurationSetName")
+            Prelude.<*> (x Data..?> "MessageType")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteDefaultMessageType where
+  hashWithSalt _salt DeleteDefaultMessageType' {..} =
+    _salt `Prelude.hashWithSalt` configurationSetName
+
+instance Prelude.NFData DeleteDefaultMessageType where
+  rnf DeleteDefaultMessageType' {..} =
+    Prelude.rnf configurationSetName
+
+instance Data.ToHeaders DeleteDefaultMessageType where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DeleteDefaultMessageType" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteDefaultMessageType where
+  toJSON DeleteDefaultMessageType' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "ConfigurationSetName"
+                  Data..= configurationSetName
+              )
+          ]
+      )
+
+instance Data.ToPath DeleteDefaultMessageType where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteDefaultMessageType where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteDefaultMessageTypeResponse' smart constructor.
+data DeleteDefaultMessageTypeResponse = DeleteDefaultMessageTypeResponse'
+  { -- | The Amazon Resource Name (ARN) of the configuration set.
+    configurationSetArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the configuration set.
+    configurationSetName :: Prelude.Maybe Prelude.Text,
+    -- | The current message type for the configuration set.
+    messageType :: Prelude.Maybe MessageType,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDefaultMessageTypeResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationSetArn', 'deleteDefaultMessageTypeResponse_configurationSetArn' - The Amazon Resource Name (ARN) of the configuration set.
+--
+-- 'configurationSetName', 'deleteDefaultMessageTypeResponse_configurationSetName' - The name of the configuration set.
+--
+-- 'messageType', 'deleteDefaultMessageTypeResponse_messageType' - The current message type for the configuration set.
+--
+-- 'httpStatus', 'deleteDefaultMessageTypeResponse_httpStatus' - The response's http status code.
+newDeleteDefaultMessageTypeResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteDefaultMessageTypeResponse
+newDeleteDefaultMessageTypeResponse pHttpStatus_ =
+  DeleteDefaultMessageTypeResponse'
+    { configurationSetArn =
+        Prelude.Nothing,
+      configurationSetName = Prelude.Nothing,
+      messageType = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the configuration set.
+deleteDefaultMessageTypeResponse_configurationSetArn :: Lens.Lens' DeleteDefaultMessageTypeResponse (Prelude.Maybe Prelude.Text)
+deleteDefaultMessageTypeResponse_configurationSetArn = Lens.lens (\DeleteDefaultMessageTypeResponse' {configurationSetArn} -> configurationSetArn) (\s@DeleteDefaultMessageTypeResponse' {} a -> s {configurationSetArn = a} :: DeleteDefaultMessageTypeResponse)
+
+-- | The name of the configuration set.
+deleteDefaultMessageTypeResponse_configurationSetName :: Lens.Lens' DeleteDefaultMessageTypeResponse (Prelude.Maybe Prelude.Text)
+deleteDefaultMessageTypeResponse_configurationSetName = Lens.lens (\DeleteDefaultMessageTypeResponse' {configurationSetName} -> configurationSetName) (\s@DeleteDefaultMessageTypeResponse' {} a -> s {configurationSetName = a} :: DeleteDefaultMessageTypeResponse)
+
+-- | The current message type for the configuration set.
+deleteDefaultMessageTypeResponse_messageType :: Lens.Lens' DeleteDefaultMessageTypeResponse (Prelude.Maybe MessageType)
+deleteDefaultMessageTypeResponse_messageType = Lens.lens (\DeleteDefaultMessageTypeResponse' {messageType} -> messageType) (\s@DeleteDefaultMessageTypeResponse' {} a -> s {messageType = a} :: DeleteDefaultMessageTypeResponse)
+
+-- | The response's http status code.
+deleteDefaultMessageTypeResponse_httpStatus :: Lens.Lens' DeleteDefaultMessageTypeResponse Prelude.Int
+deleteDefaultMessageTypeResponse_httpStatus = Lens.lens (\DeleteDefaultMessageTypeResponse' {httpStatus} -> httpStatus) (\s@DeleteDefaultMessageTypeResponse' {} a -> s {httpStatus = a} :: DeleteDefaultMessageTypeResponse)
+
+instance
+  Prelude.NFData
+    DeleteDefaultMessageTypeResponse
+  where
+  rnf DeleteDefaultMessageTypeResponse' {..} =
+    Prelude.rnf configurationSetArn
+      `Prelude.seq` Prelude.rnf configurationSetName
+      `Prelude.seq` Prelude.rnf messageType
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DeleteDefaultSenderId.hs b/gen/Amazonka/PinpointSmsVoiceV2/DeleteDefaultSenderId.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DeleteDefaultSenderId.hs
@@ -0,0 +1,213 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DeleteDefaultSenderId
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an existing default sender ID on a configuration set.
+--
+-- A default sender ID is the identity that appears on recipients\' devices
+-- when they receive SMS messages. Support for sender ID capabilities
+-- varies by country or region.
+module Amazonka.PinpointSmsVoiceV2.DeleteDefaultSenderId
+  ( -- * Creating a Request
+    DeleteDefaultSenderId (..),
+    newDeleteDefaultSenderId,
+
+    -- * Request Lenses
+    deleteDefaultSenderId_configurationSetName,
+
+    -- * Destructuring the Response
+    DeleteDefaultSenderIdResponse (..),
+    newDeleteDefaultSenderIdResponse,
+
+    -- * Response Lenses
+    deleteDefaultSenderIdResponse_configurationSetArn,
+    deleteDefaultSenderIdResponse_configurationSetName,
+    deleteDefaultSenderIdResponse_senderId,
+    deleteDefaultSenderIdResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteDefaultSenderId' smart constructor.
+data DeleteDefaultSenderId = DeleteDefaultSenderId'
+  { -- | The name of the configuration set or the configuration set Amazon
+    -- Resource Name (ARN) to delete the default sender ID from. The
+    -- ConfigurationSetName and ConfigurationSetArn can be found using the
+    -- DescribeConfigurationSets action.
+    configurationSetName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDefaultSenderId' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationSetName', 'deleteDefaultSenderId_configurationSetName' - The name of the configuration set or the configuration set Amazon
+-- Resource Name (ARN) to delete the default sender ID from. The
+-- ConfigurationSetName and ConfigurationSetArn can be found using the
+-- DescribeConfigurationSets action.
+newDeleteDefaultSenderId ::
+  -- | 'configurationSetName'
+  Prelude.Text ->
+  DeleteDefaultSenderId
+newDeleteDefaultSenderId pConfigurationSetName_ =
+  DeleteDefaultSenderId'
+    { configurationSetName =
+        pConfigurationSetName_
+    }
+
+-- | The name of the configuration set or the configuration set Amazon
+-- Resource Name (ARN) to delete the default sender ID from. The
+-- ConfigurationSetName and ConfigurationSetArn can be found using the
+-- DescribeConfigurationSets action.
+deleteDefaultSenderId_configurationSetName :: Lens.Lens' DeleteDefaultSenderId Prelude.Text
+deleteDefaultSenderId_configurationSetName = Lens.lens (\DeleteDefaultSenderId' {configurationSetName} -> configurationSetName) (\s@DeleteDefaultSenderId' {} a -> s {configurationSetName = a} :: DeleteDefaultSenderId)
+
+instance Core.AWSRequest DeleteDefaultSenderId where
+  type
+    AWSResponse DeleteDefaultSenderId =
+      DeleteDefaultSenderIdResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteDefaultSenderIdResponse'
+            Prelude.<$> (x Data..?> "ConfigurationSetArn")
+            Prelude.<*> (x Data..?> "ConfigurationSetName")
+            Prelude.<*> (x Data..?> "SenderId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteDefaultSenderId where
+  hashWithSalt _salt DeleteDefaultSenderId' {..} =
+    _salt `Prelude.hashWithSalt` configurationSetName
+
+instance Prelude.NFData DeleteDefaultSenderId where
+  rnf DeleteDefaultSenderId' {..} =
+    Prelude.rnf configurationSetName
+
+instance Data.ToHeaders DeleteDefaultSenderId where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DeleteDefaultSenderId" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteDefaultSenderId where
+  toJSON DeleteDefaultSenderId' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "ConfigurationSetName"
+                  Data..= configurationSetName
+              )
+          ]
+      )
+
+instance Data.ToPath DeleteDefaultSenderId where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteDefaultSenderId where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteDefaultSenderIdResponse' smart constructor.
+data DeleteDefaultSenderIdResponse = DeleteDefaultSenderIdResponse'
+  { -- | The Amazon Resource Name (ARN) of the configuration set.
+    configurationSetArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the configuration set.
+    configurationSetName :: Prelude.Maybe Prelude.Text,
+    -- | The current sender ID for the configuration set.
+    senderId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDefaultSenderIdResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationSetArn', 'deleteDefaultSenderIdResponse_configurationSetArn' - The Amazon Resource Name (ARN) of the configuration set.
+--
+-- 'configurationSetName', 'deleteDefaultSenderIdResponse_configurationSetName' - The name of the configuration set.
+--
+-- 'senderId', 'deleteDefaultSenderIdResponse_senderId' - The current sender ID for the configuration set.
+--
+-- 'httpStatus', 'deleteDefaultSenderIdResponse_httpStatus' - The response's http status code.
+newDeleteDefaultSenderIdResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteDefaultSenderIdResponse
+newDeleteDefaultSenderIdResponse pHttpStatus_ =
+  DeleteDefaultSenderIdResponse'
+    { configurationSetArn =
+        Prelude.Nothing,
+      configurationSetName = Prelude.Nothing,
+      senderId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the configuration set.
+deleteDefaultSenderIdResponse_configurationSetArn :: Lens.Lens' DeleteDefaultSenderIdResponse (Prelude.Maybe Prelude.Text)
+deleteDefaultSenderIdResponse_configurationSetArn = Lens.lens (\DeleteDefaultSenderIdResponse' {configurationSetArn} -> configurationSetArn) (\s@DeleteDefaultSenderIdResponse' {} a -> s {configurationSetArn = a} :: DeleteDefaultSenderIdResponse)
+
+-- | The name of the configuration set.
+deleteDefaultSenderIdResponse_configurationSetName :: Lens.Lens' DeleteDefaultSenderIdResponse (Prelude.Maybe Prelude.Text)
+deleteDefaultSenderIdResponse_configurationSetName = Lens.lens (\DeleteDefaultSenderIdResponse' {configurationSetName} -> configurationSetName) (\s@DeleteDefaultSenderIdResponse' {} a -> s {configurationSetName = a} :: DeleteDefaultSenderIdResponse)
+
+-- | The current sender ID for the configuration set.
+deleteDefaultSenderIdResponse_senderId :: Lens.Lens' DeleteDefaultSenderIdResponse (Prelude.Maybe Prelude.Text)
+deleteDefaultSenderIdResponse_senderId = Lens.lens (\DeleteDefaultSenderIdResponse' {senderId} -> senderId) (\s@DeleteDefaultSenderIdResponse' {} a -> s {senderId = a} :: DeleteDefaultSenderIdResponse)
+
+-- | The response's http status code.
+deleteDefaultSenderIdResponse_httpStatus :: Lens.Lens' DeleteDefaultSenderIdResponse Prelude.Int
+deleteDefaultSenderIdResponse_httpStatus = Lens.lens (\DeleteDefaultSenderIdResponse' {httpStatus} -> httpStatus) (\s@DeleteDefaultSenderIdResponse' {} a -> s {httpStatus = a} :: DeleteDefaultSenderIdResponse)
+
+instance Prelude.NFData DeleteDefaultSenderIdResponse where
+  rnf DeleteDefaultSenderIdResponse' {..} =
+    Prelude.rnf configurationSetArn
+      `Prelude.seq` Prelude.rnf configurationSetName
+      `Prelude.seq` Prelude.rnf senderId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DeleteEventDestination.hs b/gen/Amazonka/PinpointSmsVoiceV2/DeleteEventDestination.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DeleteEventDestination.hs
@@ -0,0 +1,242 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DeleteEventDestination
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an existing event destination.
+--
+-- An event destination is a location where you send response information
+-- about the messages that you send. For example, when a message is
+-- delivered successfully, you can send information about that event to an
+-- Amazon CloudWatch destination, or send notifications to endpoints that
+-- are subscribed to an Amazon SNS topic.
+module Amazonka.PinpointSmsVoiceV2.DeleteEventDestination
+  ( -- * Creating a Request
+    DeleteEventDestination (..),
+    newDeleteEventDestination,
+
+    -- * Request Lenses
+    deleteEventDestination_configurationSetName,
+    deleteEventDestination_eventDestinationName,
+
+    -- * Destructuring the Response
+    DeleteEventDestinationResponse (..),
+    newDeleteEventDestinationResponse,
+
+    -- * Response Lenses
+    deleteEventDestinationResponse_configurationSetArn,
+    deleteEventDestinationResponse_configurationSetName,
+    deleteEventDestinationResponse_eventDestination,
+    deleteEventDestinationResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteEventDestination' smart constructor.
+data DeleteEventDestination = DeleteEventDestination'
+  { -- | The name of the configuration set or the configuration set\'s Amazon
+    -- Resource Name (ARN) to remove the event destination from. The
+    -- ConfigurateSetName and ConfigurationSetArn can be found using the
+    -- DescribeConfigurationSets action.
+    configurationSetName :: Prelude.Text,
+    -- | The name of the event destination to delete.
+    eventDestinationName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteEventDestination' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationSetName', 'deleteEventDestination_configurationSetName' - The name of the configuration set or the configuration set\'s Amazon
+-- Resource Name (ARN) to remove the event destination from. The
+-- ConfigurateSetName and ConfigurationSetArn can be found using the
+-- DescribeConfigurationSets action.
+--
+-- 'eventDestinationName', 'deleteEventDestination_eventDestinationName' - The name of the event destination to delete.
+newDeleteEventDestination ::
+  -- | 'configurationSetName'
+  Prelude.Text ->
+  -- | 'eventDestinationName'
+  Prelude.Text ->
+  DeleteEventDestination
+newDeleteEventDestination
+  pConfigurationSetName_
+  pEventDestinationName_ =
+    DeleteEventDestination'
+      { configurationSetName =
+          pConfigurationSetName_,
+        eventDestinationName = pEventDestinationName_
+      }
+
+-- | The name of the configuration set or the configuration set\'s Amazon
+-- Resource Name (ARN) to remove the event destination from. The
+-- ConfigurateSetName and ConfigurationSetArn can be found using the
+-- DescribeConfigurationSets action.
+deleteEventDestination_configurationSetName :: Lens.Lens' DeleteEventDestination Prelude.Text
+deleteEventDestination_configurationSetName = Lens.lens (\DeleteEventDestination' {configurationSetName} -> configurationSetName) (\s@DeleteEventDestination' {} a -> s {configurationSetName = a} :: DeleteEventDestination)
+
+-- | The name of the event destination to delete.
+deleteEventDestination_eventDestinationName :: Lens.Lens' DeleteEventDestination Prelude.Text
+deleteEventDestination_eventDestinationName = Lens.lens (\DeleteEventDestination' {eventDestinationName} -> eventDestinationName) (\s@DeleteEventDestination' {} a -> s {eventDestinationName = a} :: DeleteEventDestination)
+
+instance Core.AWSRequest DeleteEventDestination where
+  type
+    AWSResponse DeleteEventDestination =
+      DeleteEventDestinationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteEventDestinationResponse'
+            Prelude.<$> (x Data..?> "ConfigurationSetArn")
+            Prelude.<*> (x Data..?> "ConfigurationSetName")
+            Prelude.<*> (x Data..?> "EventDestination")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteEventDestination where
+  hashWithSalt _salt DeleteEventDestination' {..} =
+    _salt
+      `Prelude.hashWithSalt` configurationSetName
+      `Prelude.hashWithSalt` eventDestinationName
+
+instance Prelude.NFData DeleteEventDestination where
+  rnf DeleteEventDestination' {..} =
+    Prelude.rnf configurationSetName
+      `Prelude.seq` Prelude.rnf eventDestinationName
+
+instance Data.ToHeaders DeleteEventDestination where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DeleteEventDestination" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteEventDestination where
+  toJSON DeleteEventDestination' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "ConfigurationSetName"
+                  Data..= configurationSetName
+              ),
+            Prelude.Just
+              ( "EventDestinationName"
+                  Data..= eventDestinationName
+              )
+          ]
+      )
+
+instance Data.ToPath DeleteEventDestination where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteEventDestination where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteEventDestinationResponse' smart constructor.
+data DeleteEventDestinationResponse = DeleteEventDestinationResponse'
+  { -- | The Amazon Resource Name (ARN) of the configuration set.
+    configurationSetArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the configuration set the event destination was deleted
+    -- from.
+    configurationSetName :: Prelude.Maybe Prelude.Text,
+    -- | The event destination object that was deleted.
+    eventDestination :: Prelude.Maybe EventDestination,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteEventDestinationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationSetArn', 'deleteEventDestinationResponse_configurationSetArn' - The Amazon Resource Name (ARN) of the configuration set.
+--
+-- 'configurationSetName', 'deleteEventDestinationResponse_configurationSetName' - The name of the configuration set the event destination was deleted
+-- from.
+--
+-- 'eventDestination', 'deleteEventDestinationResponse_eventDestination' - The event destination object that was deleted.
+--
+-- 'httpStatus', 'deleteEventDestinationResponse_httpStatus' - The response's http status code.
+newDeleteEventDestinationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteEventDestinationResponse
+newDeleteEventDestinationResponse pHttpStatus_ =
+  DeleteEventDestinationResponse'
+    { configurationSetArn =
+        Prelude.Nothing,
+      configurationSetName = Prelude.Nothing,
+      eventDestination = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the configuration set.
+deleteEventDestinationResponse_configurationSetArn :: Lens.Lens' DeleteEventDestinationResponse (Prelude.Maybe Prelude.Text)
+deleteEventDestinationResponse_configurationSetArn = Lens.lens (\DeleteEventDestinationResponse' {configurationSetArn} -> configurationSetArn) (\s@DeleteEventDestinationResponse' {} a -> s {configurationSetArn = a} :: DeleteEventDestinationResponse)
+
+-- | The name of the configuration set the event destination was deleted
+-- from.
+deleteEventDestinationResponse_configurationSetName :: Lens.Lens' DeleteEventDestinationResponse (Prelude.Maybe Prelude.Text)
+deleteEventDestinationResponse_configurationSetName = Lens.lens (\DeleteEventDestinationResponse' {configurationSetName} -> configurationSetName) (\s@DeleteEventDestinationResponse' {} a -> s {configurationSetName = a} :: DeleteEventDestinationResponse)
+
+-- | The event destination object that was deleted.
+deleteEventDestinationResponse_eventDestination :: Lens.Lens' DeleteEventDestinationResponse (Prelude.Maybe EventDestination)
+deleteEventDestinationResponse_eventDestination = Lens.lens (\DeleteEventDestinationResponse' {eventDestination} -> eventDestination) (\s@DeleteEventDestinationResponse' {} a -> s {eventDestination = a} :: DeleteEventDestinationResponse)
+
+-- | The response's http status code.
+deleteEventDestinationResponse_httpStatus :: Lens.Lens' DeleteEventDestinationResponse Prelude.Int
+deleteEventDestinationResponse_httpStatus = Lens.lens (\DeleteEventDestinationResponse' {httpStatus} -> httpStatus) (\s@DeleteEventDestinationResponse' {} a -> s {httpStatus = a} :: DeleteEventDestinationResponse)
+
+instance
+  Prelude.NFData
+    DeleteEventDestinationResponse
+  where
+  rnf DeleteEventDestinationResponse' {..} =
+    Prelude.rnf configurationSetArn
+      `Prelude.seq` Prelude.rnf configurationSetName
+      `Prelude.seq` Prelude.rnf eventDestination
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DeleteKeyword.hs b/gen/Amazonka/PinpointSmsVoiceV2/DeleteKeyword.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DeleteKeyword.hs
@@ -0,0 +1,254 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DeleteKeyword
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an existing keyword from an origination phone number or pool.
+--
+-- A keyword is a word that you can search for on a particular phone number
+-- or pool. It is also a specific word or phrase that an end user can send
+-- to your number to elicit a response, such as an informational message or
+-- a special offer. When your number receives a message that begins with a
+-- keyword, Amazon Pinpoint responds with a customizable message.
+--
+-- Keywords \"HELP\" and \"STOP\" can\'t be deleted or modified.
+module Amazonka.PinpointSmsVoiceV2.DeleteKeyword
+  ( -- * Creating a Request
+    DeleteKeyword (..),
+    newDeleteKeyword,
+
+    -- * Request Lenses
+    deleteKeyword_originationIdentity,
+    deleteKeyword_keyword,
+
+    -- * Destructuring the Response
+    DeleteKeywordResponse (..),
+    newDeleteKeywordResponse,
+
+    -- * Response Lenses
+    deleteKeywordResponse_keyword,
+    deleteKeywordResponse_keywordAction,
+    deleteKeywordResponse_keywordMessage,
+    deleteKeywordResponse_originationIdentity,
+    deleteKeywordResponse_originationIdentityArn,
+    deleteKeywordResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteKeyword' smart constructor.
+data DeleteKeyword = DeleteKeyword'
+  { -- | The origination identity to use such as a PhoneNumberId, PhoneNumberArn,
+    -- PoolId or PoolArn. You can use DescribePhoneNumbers to find the values
+    -- for PhoneNumberId and PhoneNumberArn and DescribePools to find the
+    -- values of PoolId and PoolArn.
+    originationIdentity :: Prelude.Text,
+    -- | The keyword to delete.
+    keyword :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteKeyword' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'originationIdentity', 'deleteKeyword_originationIdentity' - The origination identity to use such as a PhoneNumberId, PhoneNumberArn,
+-- PoolId or PoolArn. You can use DescribePhoneNumbers to find the values
+-- for PhoneNumberId and PhoneNumberArn and DescribePools to find the
+-- values of PoolId and PoolArn.
+--
+-- 'keyword', 'deleteKeyword_keyword' - The keyword to delete.
+newDeleteKeyword ::
+  -- | 'originationIdentity'
+  Prelude.Text ->
+  -- | 'keyword'
+  Prelude.Text ->
+  DeleteKeyword
+newDeleteKeyword pOriginationIdentity_ pKeyword_ =
+  DeleteKeyword'
+    { originationIdentity =
+        pOriginationIdentity_,
+      keyword = pKeyword_
+    }
+
+-- | The origination identity to use such as a PhoneNumberId, PhoneNumberArn,
+-- PoolId or PoolArn. You can use DescribePhoneNumbers to find the values
+-- for PhoneNumberId and PhoneNumberArn and DescribePools to find the
+-- values of PoolId and PoolArn.
+deleteKeyword_originationIdentity :: Lens.Lens' DeleteKeyword Prelude.Text
+deleteKeyword_originationIdentity = Lens.lens (\DeleteKeyword' {originationIdentity} -> originationIdentity) (\s@DeleteKeyword' {} a -> s {originationIdentity = a} :: DeleteKeyword)
+
+-- | The keyword to delete.
+deleteKeyword_keyword :: Lens.Lens' DeleteKeyword Prelude.Text
+deleteKeyword_keyword = Lens.lens (\DeleteKeyword' {keyword} -> keyword) (\s@DeleteKeyword' {} a -> s {keyword = a} :: DeleteKeyword)
+
+instance Core.AWSRequest DeleteKeyword where
+  type
+    AWSResponse DeleteKeyword =
+      DeleteKeywordResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteKeywordResponse'
+            Prelude.<$> (x Data..?> "Keyword")
+            Prelude.<*> (x Data..?> "KeywordAction")
+            Prelude.<*> (x Data..?> "KeywordMessage")
+            Prelude.<*> (x Data..?> "OriginationIdentity")
+            Prelude.<*> (x Data..?> "OriginationIdentityArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteKeyword where
+  hashWithSalt _salt DeleteKeyword' {..} =
+    _salt
+      `Prelude.hashWithSalt` originationIdentity
+      `Prelude.hashWithSalt` keyword
+
+instance Prelude.NFData DeleteKeyword where
+  rnf DeleteKeyword' {..} =
+    Prelude.rnf originationIdentity
+      `Prelude.seq` Prelude.rnf keyword
+
+instance Data.ToHeaders DeleteKeyword where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DeleteKeyword" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteKeyword where
+  toJSON DeleteKeyword' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("OriginationIdentity" Data..= originationIdentity),
+            Prelude.Just ("Keyword" Data..= keyword)
+          ]
+      )
+
+instance Data.ToPath DeleteKeyword where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteKeyword where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteKeywordResponse' smart constructor.
+data DeleteKeywordResponse = DeleteKeywordResponse'
+  { -- | The keyword that was deleted.
+    keyword :: Prelude.Maybe Prelude.Text,
+    -- | The action that was associated with the deleted keyword.
+    keywordAction :: Prelude.Maybe KeywordAction,
+    -- | The message that was associated with the deleted keyword.
+    keywordMessage :: Prelude.Maybe Prelude.Text,
+    -- | The PhoneNumberId or PoolId that the keyword was associated with.
+    originationIdentity :: Prelude.Maybe Prelude.Text,
+    -- | The PhoneNumberArn or PoolArn that the keyword was associated with.
+    originationIdentityArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteKeywordResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'keyword', 'deleteKeywordResponse_keyword' - The keyword that was deleted.
+--
+-- 'keywordAction', 'deleteKeywordResponse_keywordAction' - The action that was associated with the deleted keyword.
+--
+-- 'keywordMessage', 'deleteKeywordResponse_keywordMessage' - The message that was associated with the deleted keyword.
+--
+-- 'originationIdentity', 'deleteKeywordResponse_originationIdentity' - The PhoneNumberId or PoolId that the keyword was associated with.
+--
+-- 'originationIdentityArn', 'deleteKeywordResponse_originationIdentityArn' - The PhoneNumberArn or PoolArn that the keyword was associated with.
+--
+-- 'httpStatus', 'deleteKeywordResponse_httpStatus' - The response's http status code.
+newDeleteKeywordResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteKeywordResponse
+newDeleteKeywordResponse pHttpStatus_ =
+  DeleteKeywordResponse'
+    { keyword = Prelude.Nothing,
+      keywordAction = Prelude.Nothing,
+      keywordMessage = Prelude.Nothing,
+      originationIdentity = Prelude.Nothing,
+      originationIdentityArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The keyword that was deleted.
+deleteKeywordResponse_keyword :: Lens.Lens' DeleteKeywordResponse (Prelude.Maybe Prelude.Text)
+deleteKeywordResponse_keyword = Lens.lens (\DeleteKeywordResponse' {keyword} -> keyword) (\s@DeleteKeywordResponse' {} a -> s {keyword = a} :: DeleteKeywordResponse)
+
+-- | The action that was associated with the deleted keyword.
+deleteKeywordResponse_keywordAction :: Lens.Lens' DeleteKeywordResponse (Prelude.Maybe KeywordAction)
+deleteKeywordResponse_keywordAction = Lens.lens (\DeleteKeywordResponse' {keywordAction} -> keywordAction) (\s@DeleteKeywordResponse' {} a -> s {keywordAction = a} :: DeleteKeywordResponse)
+
+-- | The message that was associated with the deleted keyword.
+deleteKeywordResponse_keywordMessage :: Lens.Lens' DeleteKeywordResponse (Prelude.Maybe Prelude.Text)
+deleteKeywordResponse_keywordMessage = Lens.lens (\DeleteKeywordResponse' {keywordMessage} -> keywordMessage) (\s@DeleteKeywordResponse' {} a -> s {keywordMessage = a} :: DeleteKeywordResponse)
+
+-- | The PhoneNumberId or PoolId that the keyword was associated with.
+deleteKeywordResponse_originationIdentity :: Lens.Lens' DeleteKeywordResponse (Prelude.Maybe Prelude.Text)
+deleteKeywordResponse_originationIdentity = Lens.lens (\DeleteKeywordResponse' {originationIdentity} -> originationIdentity) (\s@DeleteKeywordResponse' {} a -> s {originationIdentity = a} :: DeleteKeywordResponse)
+
+-- | The PhoneNumberArn or PoolArn that the keyword was associated with.
+deleteKeywordResponse_originationIdentityArn :: Lens.Lens' DeleteKeywordResponse (Prelude.Maybe Prelude.Text)
+deleteKeywordResponse_originationIdentityArn = Lens.lens (\DeleteKeywordResponse' {originationIdentityArn} -> originationIdentityArn) (\s@DeleteKeywordResponse' {} a -> s {originationIdentityArn = a} :: DeleteKeywordResponse)
+
+-- | The response's http status code.
+deleteKeywordResponse_httpStatus :: Lens.Lens' DeleteKeywordResponse Prelude.Int
+deleteKeywordResponse_httpStatus = Lens.lens (\DeleteKeywordResponse' {httpStatus} -> httpStatus) (\s@DeleteKeywordResponse' {} a -> s {httpStatus = a} :: DeleteKeywordResponse)
+
+instance Prelude.NFData DeleteKeywordResponse where
+  rnf DeleteKeywordResponse' {..} =
+    Prelude.rnf keyword
+      `Prelude.seq` Prelude.rnf keywordAction
+      `Prelude.seq` Prelude.rnf keywordMessage
+      `Prelude.seq` Prelude.rnf originationIdentity
+      `Prelude.seq` Prelude.rnf originationIdentityArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DeleteOptOutList.hs b/gen/Amazonka/PinpointSmsVoiceV2/DeleteOptOutList.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DeleteOptOutList.hs
@@ -0,0 +1,211 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DeleteOptOutList
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an existing opt-out list. All opted out phone numbers in the
+-- opt-out list are deleted.
+--
+-- If the specified opt-out list name doesn\'t exist or is in-use by an
+-- origination phone number or pool, an Error is returned.
+module Amazonka.PinpointSmsVoiceV2.DeleteOptOutList
+  ( -- * Creating a Request
+    DeleteOptOutList (..),
+    newDeleteOptOutList,
+
+    -- * Request Lenses
+    deleteOptOutList_optOutListName,
+
+    -- * Destructuring the Response
+    DeleteOptOutListResponse (..),
+    newDeleteOptOutListResponse,
+
+    -- * Response Lenses
+    deleteOptOutListResponse_createdTimestamp,
+    deleteOptOutListResponse_optOutListArn,
+    deleteOptOutListResponse_optOutListName,
+    deleteOptOutListResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteOptOutList' smart constructor.
+data DeleteOptOutList = DeleteOptOutList'
+  { -- | The OptOutListName or OptOutListArn of the OptOutList to delete. You can
+    -- use DescribeOptOutLists to find the values for OptOutListName and
+    -- OptOutListArn.
+    optOutListName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteOptOutList' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'optOutListName', 'deleteOptOutList_optOutListName' - The OptOutListName or OptOutListArn of the OptOutList to delete. You can
+-- use DescribeOptOutLists to find the values for OptOutListName and
+-- OptOutListArn.
+newDeleteOptOutList ::
+  -- | 'optOutListName'
+  Prelude.Text ->
+  DeleteOptOutList
+newDeleteOptOutList pOptOutListName_ =
+  DeleteOptOutList'
+    { optOutListName =
+        pOptOutListName_
+    }
+
+-- | The OptOutListName or OptOutListArn of the OptOutList to delete. You can
+-- use DescribeOptOutLists to find the values for OptOutListName and
+-- OptOutListArn.
+deleteOptOutList_optOutListName :: Lens.Lens' DeleteOptOutList Prelude.Text
+deleteOptOutList_optOutListName = Lens.lens (\DeleteOptOutList' {optOutListName} -> optOutListName) (\s@DeleteOptOutList' {} a -> s {optOutListName = a} :: DeleteOptOutList)
+
+instance Core.AWSRequest DeleteOptOutList where
+  type
+    AWSResponse DeleteOptOutList =
+      DeleteOptOutListResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteOptOutListResponse'
+            Prelude.<$> (x Data..?> "CreatedTimestamp")
+            Prelude.<*> (x Data..?> "OptOutListArn")
+            Prelude.<*> (x Data..?> "OptOutListName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteOptOutList where
+  hashWithSalt _salt DeleteOptOutList' {..} =
+    _salt `Prelude.hashWithSalt` optOutListName
+
+instance Prelude.NFData DeleteOptOutList where
+  rnf DeleteOptOutList' {..} =
+    Prelude.rnf optOutListName
+
+instance Data.ToHeaders DeleteOptOutList where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DeleteOptOutList" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteOptOutList where
+  toJSON DeleteOptOutList' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("OptOutListName" Data..= optOutListName)
+          ]
+      )
+
+instance Data.ToPath DeleteOptOutList where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteOptOutList where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteOptOutListResponse' smart constructor.
+data DeleteOptOutListResponse = DeleteOptOutListResponse'
+  { -- | The time when the OptOutList was created, in
+    -- <https://www.epochconverter.com/ UNIX epoch time> format.
+    createdTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the OptOutList that was removed.
+    optOutListArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the OptOutList that was removed.
+    optOutListName :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteOptOutListResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdTimestamp', 'deleteOptOutListResponse_createdTimestamp' - The time when the OptOutList was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+--
+-- 'optOutListArn', 'deleteOptOutListResponse_optOutListArn' - The Amazon Resource Name (ARN) of the OptOutList that was removed.
+--
+-- 'optOutListName', 'deleteOptOutListResponse_optOutListName' - The name of the OptOutList that was removed.
+--
+-- 'httpStatus', 'deleteOptOutListResponse_httpStatus' - The response's http status code.
+newDeleteOptOutListResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteOptOutListResponse
+newDeleteOptOutListResponse pHttpStatus_ =
+  DeleteOptOutListResponse'
+    { createdTimestamp =
+        Prelude.Nothing,
+      optOutListArn = Prelude.Nothing,
+      optOutListName = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The time when the OptOutList was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+deleteOptOutListResponse_createdTimestamp :: Lens.Lens' DeleteOptOutListResponse (Prelude.Maybe Prelude.UTCTime)
+deleteOptOutListResponse_createdTimestamp = Lens.lens (\DeleteOptOutListResponse' {createdTimestamp} -> createdTimestamp) (\s@DeleteOptOutListResponse' {} a -> s {createdTimestamp = a} :: DeleteOptOutListResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the OptOutList that was removed.
+deleteOptOutListResponse_optOutListArn :: Lens.Lens' DeleteOptOutListResponse (Prelude.Maybe Prelude.Text)
+deleteOptOutListResponse_optOutListArn = Lens.lens (\DeleteOptOutListResponse' {optOutListArn} -> optOutListArn) (\s@DeleteOptOutListResponse' {} a -> s {optOutListArn = a} :: DeleteOptOutListResponse)
+
+-- | The name of the OptOutList that was removed.
+deleteOptOutListResponse_optOutListName :: Lens.Lens' DeleteOptOutListResponse (Prelude.Maybe Prelude.Text)
+deleteOptOutListResponse_optOutListName = Lens.lens (\DeleteOptOutListResponse' {optOutListName} -> optOutListName) (\s@DeleteOptOutListResponse' {} a -> s {optOutListName = a} :: DeleteOptOutListResponse)
+
+-- | The response's http status code.
+deleteOptOutListResponse_httpStatus :: Lens.Lens' DeleteOptOutListResponse Prelude.Int
+deleteOptOutListResponse_httpStatus = Lens.lens (\DeleteOptOutListResponse' {httpStatus} -> httpStatus) (\s@DeleteOptOutListResponse' {} a -> s {httpStatus = a} :: DeleteOptOutListResponse)
+
+instance Prelude.NFData DeleteOptOutListResponse where
+  rnf DeleteOptOutListResponse' {..} =
+    Prelude.rnf createdTimestamp
+      `Prelude.seq` Prelude.rnf optOutListArn
+      `Prelude.seq` Prelude.rnf optOutListName
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DeleteOptedOutNumber.hs b/gen/Amazonka/PinpointSmsVoiceV2/DeleteOptedOutNumber.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DeleteOptedOutNumber.hs
@@ -0,0 +1,253 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DeleteOptedOutNumber
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an existing opted out destination phone number from the
+-- specified opt-out list.
+--
+-- Each destination phone number can only be deleted once every 30 days.
+--
+-- If the specified destination phone number doesn\'t exist or if the
+-- opt-out list doesn\'t exist, an Error is returned.
+module Amazonka.PinpointSmsVoiceV2.DeleteOptedOutNumber
+  ( -- * Creating a Request
+    DeleteOptedOutNumber (..),
+    newDeleteOptedOutNumber,
+
+    -- * Request Lenses
+    deleteOptedOutNumber_optOutListName,
+    deleteOptedOutNumber_optedOutNumber,
+
+    -- * Destructuring the Response
+    DeleteOptedOutNumberResponse (..),
+    newDeleteOptedOutNumberResponse,
+
+    -- * Response Lenses
+    deleteOptedOutNumberResponse_endUserOptedOut,
+    deleteOptedOutNumberResponse_optOutListArn,
+    deleteOptedOutNumberResponse_optOutListName,
+    deleteOptedOutNumberResponse_optedOutNumber,
+    deleteOptedOutNumberResponse_optedOutTimestamp,
+    deleteOptedOutNumberResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteOptedOutNumber' smart constructor.
+data DeleteOptedOutNumber = DeleteOptedOutNumber'
+  { -- | The OptOutListName or OptOutListArn to remove the phone number from.
+    optOutListName :: Prelude.Text,
+    -- | The phone number, in E.164 format, to remove from the OptOutList.
+    optedOutNumber :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteOptedOutNumber' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'optOutListName', 'deleteOptedOutNumber_optOutListName' - The OptOutListName or OptOutListArn to remove the phone number from.
+--
+-- 'optedOutNumber', 'deleteOptedOutNumber_optedOutNumber' - The phone number, in E.164 format, to remove from the OptOutList.
+newDeleteOptedOutNumber ::
+  -- | 'optOutListName'
+  Prelude.Text ->
+  -- | 'optedOutNumber'
+  Prelude.Text ->
+  DeleteOptedOutNumber
+newDeleteOptedOutNumber
+  pOptOutListName_
+  pOptedOutNumber_ =
+    DeleteOptedOutNumber'
+      { optOutListName =
+          pOptOutListName_,
+        optedOutNumber = pOptedOutNumber_
+      }
+
+-- | The OptOutListName or OptOutListArn to remove the phone number from.
+deleteOptedOutNumber_optOutListName :: Lens.Lens' DeleteOptedOutNumber Prelude.Text
+deleteOptedOutNumber_optOutListName = Lens.lens (\DeleteOptedOutNumber' {optOutListName} -> optOutListName) (\s@DeleteOptedOutNumber' {} a -> s {optOutListName = a} :: DeleteOptedOutNumber)
+
+-- | The phone number, in E.164 format, to remove from the OptOutList.
+deleteOptedOutNumber_optedOutNumber :: Lens.Lens' DeleteOptedOutNumber Prelude.Text
+deleteOptedOutNumber_optedOutNumber = Lens.lens (\DeleteOptedOutNumber' {optedOutNumber} -> optedOutNumber) (\s@DeleteOptedOutNumber' {} a -> s {optedOutNumber = a} :: DeleteOptedOutNumber)
+
+instance Core.AWSRequest DeleteOptedOutNumber where
+  type
+    AWSResponse DeleteOptedOutNumber =
+      DeleteOptedOutNumberResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteOptedOutNumberResponse'
+            Prelude.<$> (x Data..?> "EndUserOptedOut")
+            Prelude.<*> (x Data..?> "OptOutListArn")
+            Prelude.<*> (x Data..?> "OptOutListName")
+            Prelude.<*> (x Data..?> "OptedOutNumber")
+            Prelude.<*> (x Data..?> "OptedOutTimestamp")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteOptedOutNumber where
+  hashWithSalt _salt DeleteOptedOutNumber' {..} =
+    _salt
+      `Prelude.hashWithSalt` optOutListName
+      `Prelude.hashWithSalt` optedOutNumber
+
+instance Prelude.NFData DeleteOptedOutNumber where
+  rnf DeleteOptedOutNumber' {..} =
+    Prelude.rnf optOutListName
+      `Prelude.seq` Prelude.rnf optedOutNumber
+
+instance Data.ToHeaders DeleteOptedOutNumber where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DeleteOptedOutNumber" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteOptedOutNumber where
+  toJSON DeleteOptedOutNumber' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("OptOutListName" Data..= optOutListName),
+            Prelude.Just
+              ("OptedOutNumber" Data..= optedOutNumber)
+          ]
+      )
+
+instance Data.ToPath DeleteOptedOutNumber where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteOptedOutNumber where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteOptedOutNumberResponse' smart constructor.
+data DeleteOptedOutNumberResponse = DeleteOptedOutNumberResponse'
+  { -- | This is true if it was the end user who requested their phone number be
+    -- removed.
+    endUserOptedOut :: Prelude.Maybe Prelude.Bool,
+    -- | The OptOutListArn that the phone number was removed from.
+    optOutListArn :: Prelude.Maybe Prelude.Text,
+    -- | The OptOutListName that the phone number was removed from.
+    optOutListName :: Prelude.Maybe Prelude.Text,
+    -- | The phone number that was removed from the OptOutList.
+    optedOutNumber :: Prelude.Maybe Prelude.Text,
+    -- | The time that the number was removed at, in
+    -- <https://www.epochconverter.com/ UNIX epoch time> format.
+    optedOutTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteOptedOutNumberResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'endUserOptedOut', 'deleteOptedOutNumberResponse_endUserOptedOut' - This is true if it was the end user who requested their phone number be
+-- removed.
+--
+-- 'optOutListArn', 'deleteOptedOutNumberResponse_optOutListArn' - The OptOutListArn that the phone number was removed from.
+--
+-- 'optOutListName', 'deleteOptedOutNumberResponse_optOutListName' - The OptOutListName that the phone number was removed from.
+--
+-- 'optedOutNumber', 'deleteOptedOutNumberResponse_optedOutNumber' - The phone number that was removed from the OptOutList.
+--
+-- 'optedOutTimestamp', 'deleteOptedOutNumberResponse_optedOutTimestamp' - The time that the number was removed at, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+--
+-- 'httpStatus', 'deleteOptedOutNumberResponse_httpStatus' - The response's http status code.
+newDeleteOptedOutNumberResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteOptedOutNumberResponse
+newDeleteOptedOutNumberResponse pHttpStatus_ =
+  DeleteOptedOutNumberResponse'
+    { endUserOptedOut =
+        Prelude.Nothing,
+      optOutListArn = Prelude.Nothing,
+      optOutListName = Prelude.Nothing,
+      optedOutNumber = Prelude.Nothing,
+      optedOutTimestamp = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | This is true if it was the end user who requested their phone number be
+-- removed.
+deleteOptedOutNumberResponse_endUserOptedOut :: Lens.Lens' DeleteOptedOutNumberResponse (Prelude.Maybe Prelude.Bool)
+deleteOptedOutNumberResponse_endUserOptedOut = Lens.lens (\DeleteOptedOutNumberResponse' {endUserOptedOut} -> endUserOptedOut) (\s@DeleteOptedOutNumberResponse' {} a -> s {endUserOptedOut = a} :: DeleteOptedOutNumberResponse)
+
+-- | The OptOutListArn that the phone number was removed from.
+deleteOptedOutNumberResponse_optOutListArn :: Lens.Lens' DeleteOptedOutNumberResponse (Prelude.Maybe Prelude.Text)
+deleteOptedOutNumberResponse_optOutListArn = Lens.lens (\DeleteOptedOutNumberResponse' {optOutListArn} -> optOutListArn) (\s@DeleteOptedOutNumberResponse' {} a -> s {optOutListArn = a} :: DeleteOptedOutNumberResponse)
+
+-- | The OptOutListName that the phone number was removed from.
+deleteOptedOutNumberResponse_optOutListName :: Lens.Lens' DeleteOptedOutNumberResponse (Prelude.Maybe Prelude.Text)
+deleteOptedOutNumberResponse_optOutListName = Lens.lens (\DeleteOptedOutNumberResponse' {optOutListName} -> optOutListName) (\s@DeleteOptedOutNumberResponse' {} a -> s {optOutListName = a} :: DeleteOptedOutNumberResponse)
+
+-- | The phone number that was removed from the OptOutList.
+deleteOptedOutNumberResponse_optedOutNumber :: Lens.Lens' DeleteOptedOutNumberResponse (Prelude.Maybe Prelude.Text)
+deleteOptedOutNumberResponse_optedOutNumber = Lens.lens (\DeleteOptedOutNumberResponse' {optedOutNumber} -> optedOutNumber) (\s@DeleteOptedOutNumberResponse' {} a -> s {optedOutNumber = a} :: DeleteOptedOutNumberResponse)
+
+-- | The time that the number was removed at, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+deleteOptedOutNumberResponse_optedOutTimestamp :: Lens.Lens' DeleteOptedOutNumberResponse (Prelude.Maybe Prelude.UTCTime)
+deleteOptedOutNumberResponse_optedOutTimestamp = Lens.lens (\DeleteOptedOutNumberResponse' {optedOutTimestamp} -> optedOutTimestamp) (\s@DeleteOptedOutNumberResponse' {} a -> s {optedOutTimestamp = a} :: DeleteOptedOutNumberResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The response's http status code.
+deleteOptedOutNumberResponse_httpStatus :: Lens.Lens' DeleteOptedOutNumberResponse Prelude.Int
+deleteOptedOutNumberResponse_httpStatus = Lens.lens (\DeleteOptedOutNumberResponse' {httpStatus} -> httpStatus) (\s@DeleteOptedOutNumberResponse' {} a -> s {httpStatus = a} :: DeleteOptedOutNumberResponse)
+
+instance Prelude.NFData DeleteOptedOutNumberResponse where
+  rnf DeleteOptedOutNumberResponse' {..} =
+    Prelude.rnf endUserOptedOut
+      `Prelude.seq` Prelude.rnf optOutListArn
+      `Prelude.seq` Prelude.rnf optOutListName
+      `Prelude.seq` Prelude.rnf optedOutNumber
+      `Prelude.seq` Prelude.rnf optedOutTimestamp
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DeletePool.hs b/gen/Amazonka/PinpointSmsVoiceV2/DeletePool.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DeletePool.hs
@@ -0,0 +1,327 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DeletePool
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an existing pool. Deleting a pool disassociates all origination
+-- identities from that pool.
+--
+-- If the pool status isn\'t active or if deletion protection is enabled,
+-- an Error is returned.
+--
+-- A pool is a collection of phone numbers and SenderIds. A pool can
+-- include one or more phone numbers and SenderIds that are associated with
+-- your Amazon Web Services account.
+module Amazonka.PinpointSmsVoiceV2.DeletePool
+  ( -- * Creating a Request
+    DeletePool (..),
+    newDeletePool,
+
+    -- * Request Lenses
+    deletePool_poolId,
+
+    -- * Destructuring the Response
+    DeletePoolResponse (..),
+    newDeletePoolResponse,
+
+    -- * Response Lenses
+    deletePoolResponse_createdTimestamp,
+    deletePoolResponse_messageType,
+    deletePoolResponse_optOutListName,
+    deletePoolResponse_poolArn,
+    deletePoolResponse_poolId,
+    deletePoolResponse_selfManagedOptOutsEnabled,
+    deletePoolResponse_sharedRoutesEnabled,
+    deletePoolResponse_status,
+    deletePoolResponse_twoWayChannelArn,
+    deletePoolResponse_twoWayEnabled,
+    deletePoolResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeletePool' smart constructor.
+data DeletePool = DeletePool'
+  { -- | The PoolId or PoolArn of the pool to delete. You can use DescribePools
+    -- to find the values for PoolId and PoolArn .
+    poolId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeletePool' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'poolId', 'deletePool_poolId' - The PoolId or PoolArn of the pool to delete. You can use DescribePools
+-- to find the values for PoolId and PoolArn .
+newDeletePool ::
+  -- | 'poolId'
+  Prelude.Text ->
+  DeletePool
+newDeletePool pPoolId_ =
+  DeletePool' {poolId = pPoolId_}
+
+-- | The PoolId or PoolArn of the pool to delete. You can use DescribePools
+-- to find the values for PoolId and PoolArn .
+deletePool_poolId :: Lens.Lens' DeletePool Prelude.Text
+deletePool_poolId = Lens.lens (\DeletePool' {poolId} -> poolId) (\s@DeletePool' {} a -> s {poolId = a} :: DeletePool)
+
+instance Core.AWSRequest DeletePool where
+  type AWSResponse DeletePool = DeletePoolResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeletePoolResponse'
+            Prelude.<$> (x Data..?> "CreatedTimestamp")
+            Prelude.<*> (x Data..?> "MessageType")
+            Prelude.<*> (x Data..?> "OptOutListName")
+            Prelude.<*> (x Data..?> "PoolArn")
+            Prelude.<*> (x Data..?> "PoolId")
+            Prelude.<*> (x Data..?> "SelfManagedOptOutsEnabled")
+            Prelude.<*> (x Data..?> "SharedRoutesEnabled")
+            Prelude.<*> (x Data..?> "Status")
+            Prelude.<*> (x Data..?> "TwoWayChannelArn")
+            Prelude.<*> (x Data..?> "TwoWayEnabled")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeletePool where
+  hashWithSalt _salt DeletePool' {..} =
+    _salt `Prelude.hashWithSalt` poolId
+
+instance Prelude.NFData DeletePool where
+  rnf DeletePool' {..} = Prelude.rnf poolId
+
+instance Data.ToHeaders DeletePool where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DeletePool" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeletePool where
+  toJSON DeletePool' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("PoolId" Data..= poolId)]
+      )
+
+instance Data.ToPath DeletePool where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeletePool where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeletePoolResponse' smart constructor.
+data DeletePoolResponse = DeletePoolResponse'
+  { -- | The time when the pool was created, in
+    -- <https://www.epochconverter.com/ UNIX epoch time> format.
+    createdTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The message type that was associated with the deleted pool.
+    messageType :: Prelude.Maybe MessageType,
+    -- | The name of the OptOutList that was associated with the deleted pool.
+    optOutListName :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the pool that was deleted.
+    poolArn :: Prelude.Maybe Prelude.Text,
+    -- | The PoolId of the pool that was deleted.
+    poolId :: Prelude.Maybe Prelude.Text,
+    -- | By default this is set to false. When an end recipient sends a message
+    -- that begins with HELP or STOP to one of your dedicated numbers, Amazon
+    -- Pinpoint automatically replies with a customizable message and adds the
+    -- end recipient to the OptOutList. When set to true you\'re responsible
+    -- for responding to HELP and STOP requests. You\'re also responsible for
+    -- tracking and honoring opt-out requests.
+    selfManagedOptOutsEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | Indicates whether shared routes are enabled for the pool.
+    sharedRoutesEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The current status of the pool.
+    --
+    -- -   CREATING: The pool is currently being created and isn\'t yet
+    --     available for use.
+    --
+    -- -   ACTIVE: The pool is active and available for use.
+    --
+    -- -   DELETING: The pool is being deleted.
+    status :: Prelude.Maybe PoolStatus,
+    -- | The Amazon Resource Name (ARN) of the TwoWayChannel.
+    twoWayChannelArn :: Prelude.Maybe Prelude.Text,
+    -- | By default this is set to false. When set to true you can receive
+    -- incoming text messages from your end recipients.
+    twoWayEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeletePoolResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdTimestamp', 'deletePoolResponse_createdTimestamp' - The time when the pool was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+--
+-- 'messageType', 'deletePoolResponse_messageType' - The message type that was associated with the deleted pool.
+--
+-- 'optOutListName', 'deletePoolResponse_optOutListName' - The name of the OptOutList that was associated with the deleted pool.
+--
+-- 'poolArn', 'deletePoolResponse_poolArn' - The Amazon Resource Name (ARN) of the pool that was deleted.
+--
+-- 'poolId', 'deletePoolResponse_poolId' - The PoolId of the pool that was deleted.
+--
+-- 'selfManagedOptOutsEnabled', 'deletePoolResponse_selfManagedOptOutsEnabled' - By default this is set to false. When an end recipient sends a message
+-- that begins with HELP or STOP to one of your dedicated numbers, Amazon
+-- Pinpoint automatically replies with a customizable message and adds the
+-- end recipient to the OptOutList. When set to true you\'re responsible
+-- for responding to HELP and STOP requests. You\'re also responsible for
+-- tracking and honoring opt-out requests.
+--
+-- 'sharedRoutesEnabled', 'deletePoolResponse_sharedRoutesEnabled' - Indicates whether shared routes are enabled for the pool.
+--
+-- 'status', 'deletePoolResponse_status' - The current status of the pool.
+--
+-- -   CREATING: The pool is currently being created and isn\'t yet
+--     available for use.
+--
+-- -   ACTIVE: The pool is active and available for use.
+--
+-- -   DELETING: The pool is being deleted.
+--
+-- 'twoWayChannelArn', 'deletePoolResponse_twoWayChannelArn' - The Amazon Resource Name (ARN) of the TwoWayChannel.
+--
+-- 'twoWayEnabled', 'deletePoolResponse_twoWayEnabled' - By default this is set to false. When set to true you can receive
+-- incoming text messages from your end recipients.
+--
+-- 'httpStatus', 'deletePoolResponse_httpStatus' - The response's http status code.
+newDeletePoolResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeletePoolResponse
+newDeletePoolResponse pHttpStatus_ =
+  DeletePoolResponse'
+    { createdTimestamp =
+        Prelude.Nothing,
+      messageType = Prelude.Nothing,
+      optOutListName = Prelude.Nothing,
+      poolArn = Prelude.Nothing,
+      poolId = Prelude.Nothing,
+      selfManagedOptOutsEnabled = Prelude.Nothing,
+      sharedRoutesEnabled = Prelude.Nothing,
+      status = Prelude.Nothing,
+      twoWayChannelArn = Prelude.Nothing,
+      twoWayEnabled = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The time when the pool was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+deletePoolResponse_createdTimestamp :: Lens.Lens' DeletePoolResponse (Prelude.Maybe Prelude.UTCTime)
+deletePoolResponse_createdTimestamp = Lens.lens (\DeletePoolResponse' {createdTimestamp} -> createdTimestamp) (\s@DeletePoolResponse' {} a -> s {createdTimestamp = a} :: DeletePoolResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The message type that was associated with the deleted pool.
+deletePoolResponse_messageType :: Lens.Lens' DeletePoolResponse (Prelude.Maybe MessageType)
+deletePoolResponse_messageType = Lens.lens (\DeletePoolResponse' {messageType} -> messageType) (\s@DeletePoolResponse' {} a -> s {messageType = a} :: DeletePoolResponse)
+
+-- | The name of the OptOutList that was associated with the deleted pool.
+deletePoolResponse_optOutListName :: Lens.Lens' DeletePoolResponse (Prelude.Maybe Prelude.Text)
+deletePoolResponse_optOutListName = Lens.lens (\DeletePoolResponse' {optOutListName} -> optOutListName) (\s@DeletePoolResponse' {} a -> s {optOutListName = a} :: DeletePoolResponse)
+
+-- | The Amazon Resource Name (ARN) of the pool that was deleted.
+deletePoolResponse_poolArn :: Lens.Lens' DeletePoolResponse (Prelude.Maybe Prelude.Text)
+deletePoolResponse_poolArn = Lens.lens (\DeletePoolResponse' {poolArn} -> poolArn) (\s@DeletePoolResponse' {} a -> s {poolArn = a} :: DeletePoolResponse)
+
+-- | The PoolId of the pool that was deleted.
+deletePoolResponse_poolId :: Lens.Lens' DeletePoolResponse (Prelude.Maybe Prelude.Text)
+deletePoolResponse_poolId = Lens.lens (\DeletePoolResponse' {poolId} -> poolId) (\s@DeletePoolResponse' {} a -> s {poolId = a} :: DeletePoolResponse)
+
+-- | By default this is set to false. When an end recipient sends a message
+-- that begins with HELP or STOP to one of your dedicated numbers, Amazon
+-- Pinpoint automatically replies with a customizable message and adds the
+-- end recipient to the OptOutList. When set to true you\'re responsible
+-- for responding to HELP and STOP requests. You\'re also responsible for
+-- tracking and honoring opt-out requests.
+deletePoolResponse_selfManagedOptOutsEnabled :: Lens.Lens' DeletePoolResponse (Prelude.Maybe Prelude.Bool)
+deletePoolResponse_selfManagedOptOutsEnabled = Lens.lens (\DeletePoolResponse' {selfManagedOptOutsEnabled} -> selfManagedOptOutsEnabled) (\s@DeletePoolResponse' {} a -> s {selfManagedOptOutsEnabled = a} :: DeletePoolResponse)
+
+-- | Indicates whether shared routes are enabled for the pool.
+deletePoolResponse_sharedRoutesEnabled :: Lens.Lens' DeletePoolResponse (Prelude.Maybe Prelude.Bool)
+deletePoolResponse_sharedRoutesEnabled = Lens.lens (\DeletePoolResponse' {sharedRoutesEnabled} -> sharedRoutesEnabled) (\s@DeletePoolResponse' {} a -> s {sharedRoutesEnabled = a} :: DeletePoolResponse)
+
+-- | The current status of the pool.
+--
+-- -   CREATING: The pool is currently being created and isn\'t yet
+--     available for use.
+--
+-- -   ACTIVE: The pool is active and available for use.
+--
+-- -   DELETING: The pool is being deleted.
+deletePoolResponse_status :: Lens.Lens' DeletePoolResponse (Prelude.Maybe PoolStatus)
+deletePoolResponse_status = Lens.lens (\DeletePoolResponse' {status} -> status) (\s@DeletePoolResponse' {} a -> s {status = a} :: DeletePoolResponse)
+
+-- | The Amazon Resource Name (ARN) of the TwoWayChannel.
+deletePoolResponse_twoWayChannelArn :: Lens.Lens' DeletePoolResponse (Prelude.Maybe Prelude.Text)
+deletePoolResponse_twoWayChannelArn = Lens.lens (\DeletePoolResponse' {twoWayChannelArn} -> twoWayChannelArn) (\s@DeletePoolResponse' {} a -> s {twoWayChannelArn = a} :: DeletePoolResponse)
+
+-- | By default this is set to false. When set to true you can receive
+-- incoming text messages from your end recipients.
+deletePoolResponse_twoWayEnabled :: Lens.Lens' DeletePoolResponse (Prelude.Maybe Prelude.Bool)
+deletePoolResponse_twoWayEnabled = Lens.lens (\DeletePoolResponse' {twoWayEnabled} -> twoWayEnabled) (\s@DeletePoolResponse' {} a -> s {twoWayEnabled = a} :: DeletePoolResponse)
+
+-- | The response's http status code.
+deletePoolResponse_httpStatus :: Lens.Lens' DeletePoolResponse Prelude.Int
+deletePoolResponse_httpStatus = Lens.lens (\DeletePoolResponse' {httpStatus} -> httpStatus) (\s@DeletePoolResponse' {} a -> s {httpStatus = a} :: DeletePoolResponse)
+
+instance Prelude.NFData DeletePoolResponse where
+  rnf DeletePoolResponse' {..} =
+    Prelude.rnf createdTimestamp
+      `Prelude.seq` Prelude.rnf messageType
+      `Prelude.seq` Prelude.rnf optOutListName
+      `Prelude.seq` Prelude.rnf poolArn
+      `Prelude.seq` Prelude.rnf poolId
+      `Prelude.seq` Prelude.rnf selfManagedOptOutsEnabled
+      `Prelude.seq` Prelude.rnf sharedRoutesEnabled
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf twoWayChannelArn
+      `Prelude.seq` Prelude.rnf twoWayEnabled
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DeleteTextMessageSpendLimitOverride.hs b/gen/Amazonka/PinpointSmsVoiceV2/DeleteTextMessageSpendLimitOverride.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DeleteTextMessageSpendLimitOverride.hs
@@ -0,0 +1,179 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DeleteTextMessageSpendLimitOverride
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an account-level monthly spending limit override for sending
+-- text messages. Deleting a spend limit override will set the
+-- @EnforcedLimit@ to equal the @MaxLimit@, which is controlled by Amazon
+-- Web Services. For more information on spend limits (quotas) see
+-- <https://docs.aws.amazon.com/pinpoint/latest/developerguide/quotas.html Amazon Pinpoint quotas>
+-- in the /Amazon Pinpoint Developer Guide/.
+module Amazonka.PinpointSmsVoiceV2.DeleteTextMessageSpendLimitOverride
+  ( -- * Creating a Request
+    DeleteTextMessageSpendLimitOverride (..),
+    newDeleteTextMessageSpendLimitOverride,
+
+    -- * Destructuring the Response
+    DeleteTextMessageSpendLimitOverrideResponse (..),
+    newDeleteTextMessageSpendLimitOverrideResponse,
+
+    -- * Response Lenses
+    deleteTextMessageSpendLimitOverrideResponse_monthlyLimit,
+    deleteTextMessageSpendLimitOverrideResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteTextMessageSpendLimitOverride' smart constructor.
+data DeleteTextMessageSpendLimitOverride = DeleteTextMessageSpendLimitOverride'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteTextMessageSpendLimitOverride' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteTextMessageSpendLimitOverride ::
+  DeleteTextMessageSpendLimitOverride
+newDeleteTextMessageSpendLimitOverride =
+  DeleteTextMessageSpendLimitOverride'
+
+instance
+  Core.AWSRequest
+    DeleteTextMessageSpendLimitOverride
+  where
+  type
+    AWSResponse DeleteTextMessageSpendLimitOverride =
+      DeleteTextMessageSpendLimitOverrideResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteTextMessageSpendLimitOverrideResponse'
+            Prelude.<$> (x Data..?> "MonthlyLimit")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    DeleteTextMessageSpendLimitOverride
+  where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance
+  Prelude.NFData
+    DeleteTextMessageSpendLimitOverride
+  where
+  rnf _ = ()
+
+instance
+  Data.ToHeaders
+    DeleteTextMessageSpendLimitOverride
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DeleteTextMessageSpendLimitOverride" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance
+  Data.ToJSON
+    DeleteTextMessageSpendLimitOverride
+  where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
+
+instance
+  Data.ToPath
+    DeleteTextMessageSpendLimitOverride
+  where
+  toPath = Prelude.const "/"
+
+instance
+  Data.ToQuery
+    DeleteTextMessageSpendLimitOverride
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteTextMessageSpendLimitOverrideResponse' smart constructor.
+data DeleteTextMessageSpendLimitOverrideResponse = DeleteTextMessageSpendLimitOverrideResponse'
+  { -- | The current monthly limit, in US dollars.
+    monthlyLimit :: Prelude.Maybe Prelude.Natural,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteTextMessageSpendLimitOverrideResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'monthlyLimit', 'deleteTextMessageSpendLimitOverrideResponse_monthlyLimit' - The current monthly limit, in US dollars.
+--
+-- 'httpStatus', 'deleteTextMessageSpendLimitOverrideResponse_httpStatus' - The response's http status code.
+newDeleteTextMessageSpendLimitOverrideResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteTextMessageSpendLimitOverrideResponse
+newDeleteTextMessageSpendLimitOverrideResponse
+  pHttpStatus_ =
+    DeleteTextMessageSpendLimitOverrideResponse'
+      { monthlyLimit =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | The current monthly limit, in US dollars.
+deleteTextMessageSpendLimitOverrideResponse_monthlyLimit :: Lens.Lens' DeleteTextMessageSpendLimitOverrideResponse (Prelude.Maybe Prelude.Natural)
+deleteTextMessageSpendLimitOverrideResponse_monthlyLimit = Lens.lens (\DeleteTextMessageSpendLimitOverrideResponse' {monthlyLimit} -> monthlyLimit) (\s@DeleteTextMessageSpendLimitOverrideResponse' {} a -> s {monthlyLimit = a} :: DeleteTextMessageSpendLimitOverrideResponse)
+
+-- | The response's http status code.
+deleteTextMessageSpendLimitOverrideResponse_httpStatus :: Lens.Lens' DeleteTextMessageSpendLimitOverrideResponse Prelude.Int
+deleteTextMessageSpendLimitOverrideResponse_httpStatus = Lens.lens (\DeleteTextMessageSpendLimitOverrideResponse' {httpStatus} -> httpStatus) (\s@DeleteTextMessageSpendLimitOverrideResponse' {} a -> s {httpStatus = a} :: DeleteTextMessageSpendLimitOverrideResponse)
+
+instance
+  Prelude.NFData
+    DeleteTextMessageSpendLimitOverrideResponse
+  where
+  rnf DeleteTextMessageSpendLimitOverrideResponse' {..} =
+    Prelude.rnf monthlyLimit
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DeleteVoiceMessageSpendLimitOverride.hs b/gen/Amazonka/PinpointSmsVoiceV2/DeleteVoiceMessageSpendLimitOverride.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DeleteVoiceMessageSpendLimitOverride.hs
@@ -0,0 +1,179 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DeleteVoiceMessageSpendLimitOverride
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an account level monthly spend limit override for sending voice
+-- messages. Deleting a spend limit override sets the @EnforcedLimit@ equal
+-- to the @MaxLimit@, which is controlled by Amazon Web Services. For more
+-- information on spending limits (quotas) see
+-- <https://docs.aws.amazon.com/pinpoint/latest/developerguide/quotas.html Amazon Pinpoint quotas>
+-- in the /Amazon Pinpoint Developer Guide/.
+module Amazonka.PinpointSmsVoiceV2.DeleteVoiceMessageSpendLimitOverride
+  ( -- * Creating a Request
+    DeleteVoiceMessageSpendLimitOverride (..),
+    newDeleteVoiceMessageSpendLimitOverride,
+
+    -- * Destructuring the Response
+    DeleteVoiceMessageSpendLimitOverrideResponse (..),
+    newDeleteVoiceMessageSpendLimitOverrideResponse,
+
+    -- * Response Lenses
+    deleteVoiceMessageSpendLimitOverrideResponse_monthlyLimit,
+    deleteVoiceMessageSpendLimitOverrideResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteVoiceMessageSpendLimitOverride' smart constructor.
+data DeleteVoiceMessageSpendLimitOverride = DeleteVoiceMessageSpendLimitOverride'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteVoiceMessageSpendLimitOverride' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteVoiceMessageSpendLimitOverride ::
+  DeleteVoiceMessageSpendLimitOverride
+newDeleteVoiceMessageSpendLimitOverride =
+  DeleteVoiceMessageSpendLimitOverride'
+
+instance
+  Core.AWSRequest
+    DeleteVoiceMessageSpendLimitOverride
+  where
+  type
+    AWSResponse DeleteVoiceMessageSpendLimitOverride =
+      DeleteVoiceMessageSpendLimitOverrideResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteVoiceMessageSpendLimitOverrideResponse'
+            Prelude.<$> (x Data..?> "MonthlyLimit")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    DeleteVoiceMessageSpendLimitOverride
+  where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance
+  Prelude.NFData
+    DeleteVoiceMessageSpendLimitOverride
+  where
+  rnf _ = ()
+
+instance
+  Data.ToHeaders
+    DeleteVoiceMessageSpendLimitOverride
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DeleteVoiceMessageSpendLimitOverride" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance
+  Data.ToJSON
+    DeleteVoiceMessageSpendLimitOverride
+  where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
+
+instance
+  Data.ToPath
+    DeleteVoiceMessageSpendLimitOverride
+  where
+  toPath = Prelude.const "/"
+
+instance
+  Data.ToQuery
+    DeleteVoiceMessageSpendLimitOverride
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteVoiceMessageSpendLimitOverrideResponse' smart constructor.
+data DeleteVoiceMessageSpendLimitOverrideResponse = DeleteVoiceMessageSpendLimitOverrideResponse'
+  { -- | The current monthly limit, in US dollars.
+    monthlyLimit :: Prelude.Maybe Prelude.Natural,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteVoiceMessageSpendLimitOverrideResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'monthlyLimit', 'deleteVoiceMessageSpendLimitOverrideResponse_monthlyLimit' - The current monthly limit, in US dollars.
+--
+-- 'httpStatus', 'deleteVoiceMessageSpendLimitOverrideResponse_httpStatus' - The response's http status code.
+newDeleteVoiceMessageSpendLimitOverrideResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteVoiceMessageSpendLimitOverrideResponse
+newDeleteVoiceMessageSpendLimitOverrideResponse
+  pHttpStatus_ =
+    DeleteVoiceMessageSpendLimitOverrideResponse'
+      { monthlyLimit =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | The current monthly limit, in US dollars.
+deleteVoiceMessageSpendLimitOverrideResponse_monthlyLimit :: Lens.Lens' DeleteVoiceMessageSpendLimitOverrideResponse (Prelude.Maybe Prelude.Natural)
+deleteVoiceMessageSpendLimitOverrideResponse_monthlyLimit = Lens.lens (\DeleteVoiceMessageSpendLimitOverrideResponse' {monthlyLimit} -> monthlyLimit) (\s@DeleteVoiceMessageSpendLimitOverrideResponse' {} a -> s {monthlyLimit = a} :: DeleteVoiceMessageSpendLimitOverrideResponse)
+
+-- | The response's http status code.
+deleteVoiceMessageSpendLimitOverrideResponse_httpStatus :: Lens.Lens' DeleteVoiceMessageSpendLimitOverrideResponse Prelude.Int
+deleteVoiceMessageSpendLimitOverrideResponse_httpStatus = Lens.lens (\DeleteVoiceMessageSpendLimitOverrideResponse' {httpStatus} -> httpStatus) (\s@DeleteVoiceMessageSpendLimitOverrideResponse' {} a -> s {httpStatus = a} :: DeleteVoiceMessageSpendLimitOverrideResponse)
+
+instance
+  Prelude.NFData
+    DeleteVoiceMessageSpendLimitOverrideResponse
+  where
+  rnf DeleteVoiceMessageSpendLimitOverrideResponse' {..} =
+    Prelude.rnf monthlyLimit
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DescribeAccountAttributes.hs b/gen/Amazonka/PinpointSmsVoiceV2/DescribeAccountAttributes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DescribeAccountAttributes.hs
@@ -0,0 +1,241 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DescribeAccountAttributes
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes attributes of your Amazon Web Services account. The supported
+-- account attributes include account tier, which indicates whether your
+-- account is in the sandbox or production environment. When you\'re ready
+-- to move your account out of the sandbox, create an Amazon Web Services
+-- Support case for a service limit increase request.
+--
+-- New Amazon Pinpoint accounts are placed into an SMS or voice sandbox.
+-- The sandbox protects both Amazon Web Services end recipients and SMS or
+-- voice recipients from fraud and abuse.
+--
+-- This operation returns paginated results.
+module Amazonka.PinpointSmsVoiceV2.DescribeAccountAttributes
+  ( -- * Creating a Request
+    DescribeAccountAttributes (..),
+    newDescribeAccountAttributes,
+
+    -- * Request Lenses
+    describeAccountAttributes_maxResults,
+    describeAccountAttributes_nextToken,
+
+    -- * Destructuring the Response
+    DescribeAccountAttributesResponse (..),
+    newDescribeAccountAttributesResponse,
+
+    -- * Response Lenses
+    describeAccountAttributesResponse_accountAttributes,
+    describeAccountAttributesResponse_nextToken,
+    describeAccountAttributesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeAccountAttributes' smart constructor.
+data DescribeAccountAttributes = DescribeAccountAttributes'
+  { -- | The maximum number of results to return per each request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results. You don\'t
+    -- need to supply a value for this field in the initial request.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeAccountAttributes' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'describeAccountAttributes_maxResults' - The maximum number of results to return per each request.
+--
+-- 'nextToken', 'describeAccountAttributes_nextToken' - The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+newDescribeAccountAttributes ::
+  DescribeAccountAttributes
+newDescribeAccountAttributes =
+  DescribeAccountAttributes'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of results to return per each request.
+describeAccountAttributes_maxResults :: Lens.Lens' DescribeAccountAttributes (Prelude.Maybe Prelude.Natural)
+describeAccountAttributes_maxResults = Lens.lens (\DescribeAccountAttributes' {maxResults} -> maxResults) (\s@DescribeAccountAttributes' {} a -> s {maxResults = a} :: DescribeAccountAttributes)
+
+-- | The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+describeAccountAttributes_nextToken :: Lens.Lens' DescribeAccountAttributes (Prelude.Maybe Prelude.Text)
+describeAccountAttributes_nextToken = Lens.lens (\DescribeAccountAttributes' {nextToken} -> nextToken) (\s@DescribeAccountAttributes' {} a -> s {nextToken = a} :: DescribeAccountAttributes)
+
+instance Core.AWSPager DescribeAccountAttributes where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeAccountAttributesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeAccountAttributesResponse_accountAttributes
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeAccountAttributes_nextToken
+          Lens..~ rs
+          Lens.^? describeAccountAttributesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeAccountAttributes where
+  type
+    AWSResponse DescribeAccountAttributes =
+      DescribeAccountAttributesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeAccountAttributesResponse'
+            Prelude.<$> ( x
+                            Data..?> "AccountAttributes"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeAccountAttributes where
+  hashWithSalt _salt DescribeAccountAttributes' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData DescribeAccountAttributes where
+  rnf DescribeAccountAttributes' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders DescribeAccountAttributes where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DescribeAccountAttributes" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeAccountAttributes where
+  toJSON DescribeAccountAttributes' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath DescribeAccountAttributes where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeAccountAttributes where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeAccountAttributesResponse' smart constructor.
+data DescribeAccountAttributesResponse = DescribeAccountAttributesResponse'
+  { -- | An array of AccountAttributes objects.
+    accountAttributes :: Prelude.Maybe [AccountAttribute],
+    -- | The token to be used for the next set of paginated results. If this
+    -- field is empty then there are no more results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeAccountAttributesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'accountAttributes', 'describeAccountAttributesResponse_accountAttributes' - An array of AccountAttributes objects.
+--
+-- 'nextToken', 'describeAccountAttributesResponse_nextToken' - The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+--
+-- 'httpStatus', 'describeAccountAttributesResponse_httpStatus' - The response's http status code.
+newDescribeAccountAttributesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeAccountAttributesResponse
+newDescribeAccountAttributesResponse pHttpStatus_ =
+  DescribeAccountAttributesResponse'
+    { accountAttributes =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An array of AccountAttributes objects.
+describeAccountAttributesResponse_accountAttributes :: Lens.Lens' DescribeAccountAttributesResponse (Prelude.Maybe [AccountAttribute])
+describeAccountAttributesResponse_accountAttributes = Lens.lens (\DescribeAccountAttributesResponse' {accountAttributes} -> accountAttributes) (\s@DescribeAccountAttributesResponse' {} a -> s {accountAttributes = a} :: DescribeAccountAttributesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+describeAccountAttributesResponse_nextToken :: Lens.Lens' DescribeAccountAttributesResponse (Prelude.Maybe Prelude.Text)
+describeAccountAttributesResponse_nextToken = Lens.lens (\DescribeAccountAttributesResponse' {nextToken} -> nextToken) (\s@DescribeAccountAttributesResponse' {} a -> s {nextToken = a} :: DescribeAccountAttributesResponse)
+
+-- | The response's http status code.
+describeAccountAttributesResponse_httpStatus :: Lens.Lens' DescribeAccountAttributesResponse Prelude.Int
+describeAccountAttributesResponse_httpStatus = Lens.lens (\DescribeAccountAttributesResponse' {httpStatus} -> httpStatus) (\s@DescribeAccountAttributesResponse' {} a -> s {httpStatus = a} :: DescribeAccountAttributesResponse)
+
+instance
+  Prelude.NFData
+    DescribeAccountAttributesResponse
+  where
+  rnf DescribeAccountAttributesResponse' {..} =
+    Prelude.rnf accountAttributes
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DescribeAccountLimits.hs b/gen/Amazonka/PinpointSmsVoiceV2/DescribeAccountLimits.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DescribeAccountLimits.hs
@@ -0,0 +1,236 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DescribeAccountLimits
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the current Amazon Pinpoint SMS Voice V2 resource quotas for
+-- your account. The description for a quota includes the quota name,
+-- current usage toward that quota, and the quota\'s maximum value.
+--
+-- When you establish an Amazon Web Services account, the account has
+-- initial quotas on the maximum number of configuration sets, opt-out
+-- lists, phone numbers, and pools that you can create in a given Region.
+-- For more information see
+-- <https://docs.aws.amazon.com/pinpoint/latest/developerguide/quotas.html Amazon Pinpoint quotas>
+-- in the /Amazon Pinpoint Developer Guide/.
+--
+-- This operation returns paginated results.
+module Amazonka.PinpointSmsVoiceV2.DescribeAccountLimits
+  ( -- * Creating a Request
+    DescribeAccountLimits (..),
+    newDescribeAccountLimits,
+
+    -- * Request Lenses
+    describeAccountLimits_maxResults,
+    describeAccountLimits_nextToken,
+
+    -- * Destructuring the Response
+    DescribeAccountLimitsResponse (..),
+    newDescribeAccountLimitsResponse,
+
+    -- * Response Lenses
+    describeAccountLimitsResponse_accountLimits,
+    describeAccountLimitsResponse_nextToken,
+    describeAccountLimitsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeAccountLimits' smart constructor.
+data DescribeAccountLimits = DescribeAccountLimits'
+  { -- | The maximum number of results to return per each request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results. You don\'t
+    -- need to supply a value for this field in the initial request.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeAccountLimits' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'describeAccountLimits_maxResults' - The maximum number of results to return per each request.
+--
+-- 'nextToken', 'describeAccountLimits_nextToken' - The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+newDescribeAccountLimits ::
+  DescribeAccountLimits
+newDescribeAccountLimits =
+  DescribeAccountLimits'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of results to return per each request.
+describeAccountLimits_maxResults :: Lens.Lens' DescribeAccountLimits (Prelude.Maybe Prelude.Natural)
+describeAccountLimits_maxResults = Lens.lens (\DescribeAccountLimits' {maxResults} -> maxResults) (\s@DescribeAccountLimits' {} a -> s {maxResults = a} :: DescribeAccountLimits)
+
+-- | The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+describeAccountLimits_nextToken :: Lens.Lens' DescribeAccountLimits (Prelude.Maybe Prelude.Text)
+describeAccountLimits_nextToken = Lens.lens (\DescribeAccountLimits' {nextToken} -> nextToken) (\s@DescribeAccountLimits' {} a -> s {nextToken = a} :: DescribeAccountLimits)
+
+instance Core.AWSPager DescribeAccountLimits where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeAccountLimitsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeAccountLimitsResponse_accountLimits
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeAccountLimits_nextToken
+          Lens..~ rs
+          Lens.^? describeAccountLimitsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeAccountLimits where
+  type
+    AWSResponse DescribeAccountLimits =
+      DescribeAccountLimitsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeAccountLimitsResponse'
+            Prelude.<$> (x Data..?> "AccountLimits" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeAccountLimits where
+  hashWithSalt _salt DescribeAccountLimits' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData DescribeAccountLimits where
+  rnf DescribeAccountLimits' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders DescribeAccountLimits where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DescribeAccountLimits" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeAccountLimits where
+  toJSON DescribeAccountLimits' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath DescribeAccountLimits where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeAccountLimits where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeAccountLimitsResponse' smart constructor.
+data DescribeAccountLimitsResponse = DescribeAccountLimitsResponse'
+  { -- | An array of AccountLimit objects that show the current spend limits.
+    accountLimits :: Prelude.Maybe [AccountLimit],
+    -- | The token to be used for the next set of paginated results. If this
+    -- field is empty then there are no more results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeAccountLimitsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'accountLimits', 'describeAccountLimitsResponse_accountLimits' - An array of AccountLimit objects that show the current spend limits.
+--
+-- 'nextToken', 'describeAccountLimitsResponse_nextToken' - The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+--
+-- 'httpStatus', 'describeAccountLimitsResponse_httpStatus' - The response's http status code.
+newDescribeAccountLimitsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeAccountLimitsResponse
+newDescribeAccountLimitsResponse pHttpStatus_ =
+  DescribeAccountLimitsResponse'
+    { accountLimits =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An array of AccountLimit objects that show the current spend limits.
+describeAccountLimitsResponse_accountLimits :: Lens.Lens' DescribeAccountLimitsResponse (Prelude.Maybe [AccountLimit])
+describeAccountLimitsResponse_accountLimits = Lens.lens (\DescribeAccountLimitsResponse' {accountLimits} -> accountLimits) (\s@DescribeAccountLimitsResponse' {} a -> s {accountLimits = a} :: DescribeAccountLimitsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+describeAccountLimitsResponse_nextToken :: Lens.Lens' DescribeAccountLimitsResponse (Prelude.Maybe Prelude.Text)
+describeAccountLimitsResponse_nextToken = Lens.lens (\DescribeAccountLimitsResponse' {nextToken} -> nextToken) (\s@DescribeAccountLimitsResponse' {} a -> s {nextToken = a} :: DescribeAccountLimitsResponse)
+
+-- | The response's http status code.
+describeAccountLimitsResponse_httpStatus :: Lens.Lens' DescribeAccountLimitsResponse Prelude.Int
+describeAccountLimitsResponse_httpStatus = Lens.lens (\DescribeAccountLimitsResponse' {httpStatus} -> httpStatus) (\s@DescribeAccountLimitsResponse' {} a -> s {httpStatus = a} :: DescribeAccountLimitsResponse)
+
+instance Prelude.NFData DescribeAccountLimitsResponse where
+  rnf DescribeAccountLimitsResponse' {..} =
+    Prelude.rnf accountLimits
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DescribeConfigurationSets.hs b/gen/Amazonka/PinpointSmsVoiceV2/DescribeConfigurationSets.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DescribeConfigurationSets.hs
@@ -0,0 +1,272 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DescribeConfigurationSets
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the specified configuration sets or all in your account.
+--
+-- If you specify configuration set names, the output includes information
+-- for only the specified configuration sets. If you specify filters, the
+-- output includes information for only those configuration sets that meet
+-- the filter criteria. If you don\'t specify configuration set names or
+-- filters, the output includes information for all configuration sets.
+--
+-- If you specify a configuration set name that isn\'t valid, an error is
+-- returned.
+--
+-- This operation returns paginated results.
+module Amazonka.PinpointSmsVoiceV2.DescribeConfigurationSets
+  ( -- * Creating a Request
+    DescribeConfigurationSets (..),
+    newDescribeConfigurationSets,
+
+    -- * Request Lenses
+    describeConfigurationSets_configurationSetNames,
+    describeConfigurationSets_filters,
+    describeConfigurationSets_maxResults,
+    describeConfigurationSets_nextToken,
+
+    -- * Destructuring the Response
+    DescribeConfigurationSetsResponse (..),
+    newDescribeConfigurationSetsResponse,
+
+    -- * Response Lenses
+    describeConfigurationSetsResponse_configurationSets,
+    describeConfigurationSetsResponse_nextToken,
+    describeConfigurationSetsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeConfigurationSets' smart constructor.
+data DescribeConfigurationSets = DescribeConfigurationSets'
+  { -- | An array of strings. Each element can be either a ConfigurationSetName
+    -- or ConfigurationSetArn.
+    configurationSetNames :: Prelude.Maybe [Prelude.Text],
+    -- | An array of filters to apply to the results that are returned.
+    filters :: Prelude.Maybe [ConfigurationSetFilter],
+    -- | The maximum number of results to return per each request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results. You don\'t
+    -- need to supply a value for this field in the initial request.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeConfigurationSets' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationSetNames', 'describeConfigurationSets_configurationSetNames' - An array of strings. Each element can be either a ConfigurationSetName
+-- or ConfigurationSetArn.
+--
+-- 'filters', 'describeConfigurationSets_filters' - An array of filters to apply to the results that are returned.
+--
+-- 'maxResults', 'describeConfigurationSets_maxResults' - The maximum number of results to return per each request.
+--
+-- 'nextToken', 'describeConfigurationSets_nextToken' - The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+newDescribeConfigurationSets ::
+  DescribeConfigurationSets
+newDescribeConfigurationSets =
+  DescribeConfigurationSets'
+    { configurationSetNames =
+        Prelude.Nothing,
+      filters = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | An array of strings. Each element can be either a ConfigurationSetName
+-- or ConfigurationSetArn.
+describeConfigurationSets_configurationSetNames :: Lens.Lens' DescribeConfigurationSets (Prelude.Maybe [Prelude.Text])
+describeConfigurationSets_configurationSetNames = Lens.lens (\DescribeConfigurationSets' {configurationSetNames} -> configurationSetNames) (\s@DescribeConfigurationSets' {} a -> s {configurationSetNames = a} :: DescribeConfigurationSets) Prelude.. Lens.mapping Lens.coerced
+
+-- | An array of filters to apply to the results that are returned.
+describeConfigurationSets_filters :: Lens.Lens' DescribeConfigurationSets (Prelude.Maybe [ConfigurationSetFilter])
+describeConfigurationSets_filters = Lens.lens (\DescribeConfigurationSets' {filters} -> filters) (\s@DescribeConfigurationSets' {} a -> s {filters = a} :: DescribeConfigurationSets) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of results to return per each request.
+describeConfigurationSets_maxResults :: Lens.Lens' DescribeConfigurationSets (Prelude.Maybe Prelude.Natural)
+describeConfigurationSets_maxResults = Lens.lens (\DescribeConfigurationSets' {maxResults} -> maxResults) (\s@DescribeConfigurationSets' {} a -> s {maxResults = a} :: DescribeConfigurationSets)
+
+-- | The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+describeConfigurationSets_nextToken :: Lens.Lens' DescribeConfigurationSets (Prelude.Maybe Prelude.Text)
+describeConfigurationSets_nextToken = Lens.lens (\DescribeConfigurationSets' {nextToken} -> nextToken) (\s@DescribeConfigurationSets' {} a -> s {nextToken = a} :: DescribeConfigurationSets)
+
+instance Core.AWSPager DescribeConfigurationSets where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeConfigurationSetsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeConfigurationSetsResponse_configurationSets
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeConfigurationSets_nextToken
+          Lens..~ rs
+          Lens.^? describeConfigurationSetsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeConfigurationSets where
+  type
+    AWSResponse DescribeConfigurationSets =
+      DescribeConfigurationSetsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeConfigurationSetsResponse'
+            Prelude.<$> ( x
+                            Data..?> "ConfigurationSets"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeConfigurationSets where
+  hashWithSalt _salt DescribeConfigurationSets' {..} =
+    _salt
+      `Prelude.hashWithSalt` configurationSetNames
+      `Prelude.hashWithSalt` filters
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData DescribeConfigurationSets where
+  rnf DescribeConfigurationSets' {..} =
+    Prelude.rnf configurationSetNames
+      `Prelude.seq` Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders DescribeConfigurationSets where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DescribeConfigurationSets" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeConfigurationSets where
+  toJSON DescribeConfigurationSets' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ConfigurationSetNames" Data..=)
+              Prelude.<$> configurationSetNames,
+            ("Filters" Data..=) Prelude.<$> filters,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath DescribeConfigurationSets where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeConfigurationSets where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeConfigurationSetsResponse' smart constructor.
+data DescribeConfigurationSetsResponse = DescribeConfigurationSetsResponse'
+  { -- | An array of ConfigurationSets objects.
+    configurationSets :: Prelude.Maybe [ConfigurationSetInformation],
+    -- | The token to be used for the next set of paginated results. If this
+    -- field is empty then there are no more results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeConfigurationSetsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationSets', 'describeConfigurationSetsResponse_configurationSets' - An array of ConfigurationSets objects.
+--
+-- 'nextToken', 'describeConfigurationSetsResponse_nextToken' - The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+--
+-- 'httpStatus', 'describeConfigurationSetsResponse_httpStatus' - The response's http status code.
+newDescribeConfigurationSetsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeConfigurationSetsResponse
+newDescribeConfigurationSetsResponse pHttpStatus_ =
+  DescribeConfigurationSetsResponse'
+    { configurationSets =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An array of ConfigurationSets objects.
+describeConfigurationSetsResponse_configurationSets :: Lens.Lens' DescribeConfigurationSetsResponse (Prelude.Maybe [ConfigurationSetInformation])
+describeConfigurationSetsResponse_configurationSets = Lens.lens (\DescribeConfigurationSetsResponse' {configurationSets} -> configurationSets) (\s@DescribeConfigurationSetsResponse' {} a -> s {configurationSets = a} :: DescribeConfigurationSetsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+describeConfigurationSetsResponse_nextToken :: Lens.Lens' DescribeConfigurationSetsResponse (Prelude.Maybe Prelude.Text)
+describeConfigurationSetsResponse_nextToken = Lens.lens (\DescribeConfigurationSetsResponse' {nextToken} -> nextToken) (\s@DescribeConfigurationSetsResponse' {} a -> s {nextToken = a} :: DescribeConfigurationSetsResponse)
+
+-- | The response's http status code.
+describeConfigurationSetsResponse_httpStatus :: Lens.Lens' DescribeConfigurationSetsResponse Prelude.Int
+describeConfigurationSetsResponse_httpStatus = Lens.lens (\DescribeConfigurationSetsResponse' {httpStatus} -> httpStatus) (\s@DescribeConfigurationSetsResponse' {} a -> s {httpStatus = a} :: DescribeConfigurationSetsResponse)
+
+instance
+  Prelude.NFData
+    DescribeConfigurationSetsResponse
+  where
+  rnf DescribeConfigurationSetsResponse' {..} =
+    Prelude.rnf configurationSets
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DescribeKeywords.hs b/gen/Amazonka/PinpointSmsVoiceV2/DescribeKeywords.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DescribeKeywords.hs
@@ -0,0 +1,316 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DescribeKeywords
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the specified keywords or all keywords on your origination
+-- phone number or pool.
+--
+-- A keyword is a word that you can search for on a particular phone number
+-- or pool. It is also a specific word or phrase that an end user can send
+-- to your number to elicit a response, such as an informational message or
+-- a special offer. When your number receives a message that begins with a
+-- keyword, Amazon Pinpoint responds with a customizable message.
+--
+-- If you specify a keyword that isn\'t valid, an Error is returned.
+--
+-- This operation returns paginated results.
+module Amazonka.PinpointSmsVoiceV2.DescribeKeywords
+  ( -- * Creating a Request
+    DescribeKeywords (..),
+    newDescribeKeywords,
+
+    -- * Request Lenses
+    describeKeywords_filters,
+    describeKeywords_keywords,
+    describeKeywords_maxResults,
+    describeKeywords_nextToken,
+    describeKeywords_originationIdentity,
+
+    -- * Destructuring the Response
+    DescribeKeywordsResponse (..),
+    newDescribeKeywordsResponse,
+
+    -- * Response Lenses
+    describeKeywordsResponse_keywords,
+    describeKeywordsResponse_nextToken,
+    describeKeywordsResponse_originationIdentity,
+    describeKeywordsResponse_originationIdentityArn,
+    describeKeywordsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeKeywords' smart constructor.
+data DescribeKeywords = DescribeKeywords'
+  { -- | An array of keyword filters to filter the results.
+    filters :: Prelude.Maybe [KeywordFilter],
+    -- | An array of keywords to search for.
+    keywords :: Prelude.Maybe [Prelude.Text],
+    -- | The maximum number of results to return per each request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results. You don\'t
+    -- need to supply a value for this field in the initial request.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The origination identity to use such as a PhoneNumberId, PhoneNumberArn,
+    -- SenderId or SenderIdArn. You can use DescribePhoneNumbers to find the
+    -- values for PhoneNumberId and PhoneNumberArn while DescribeSenderIds can
+    -- be used to get the values for SenderId and SenderIdArn.
+    originationIdentity :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeKeywords' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filters', 'describeKeywords_filters' - An array of keyword filters to filter the results.
+--
+-- 'keywords', 'describeKeywords_keywords' - An array of keywords to search for.
+--
+-- 'maxResults', 'describeKeywords_maxResults' - The maximum number of results to return per each request.
+--
+-- 'nextToken', 'describeKeywords_nextToken' - The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+--
+-- 'originationIdentity', 'describeKeywords_originationIdentity' - The origination identity to use such as a PhoneNumberId, PhoneNumberArn,
+-- SenderId or SenderIdArn. You can use DescribePhoneNumbers to find the
+-- values for PhoneNumberId and PhoneNumberArn while DescribeSenderIds can
+-- be used to get the values for SenderId and SenderIdArn.
+newDescribeKeywords ::
+  -- | 'originationIdentity'
+  Prelude.Text ->
+  DescribeKeywords
+newDescribeKeywords pOriginationIdentity_ =
+  DescribeKeywords'
+    { filters = Prelude.Nothing,
+      keywords = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      originationIdentity = pOriginationIdentity_
+    }
+
+-- | An array of keyword filters to filter the results.
+describeKeywords_filters :: Lens.Lens' DescribeKeywords (Prelude.Maybe [KeywordFilter])
+describeKeywords_filters = Lens.lens (\DescribeKeywords' {filters} -> filters) (\s@DescribeKeywords' {} a -> s {filters = a} :: DescribeKeywords) Prelude.. Lens.mapping Lens.coerced
+
+-- | An array of keywords to search for.
+describeKeywords_keywords :: Lens.Lens' DescribeKeywords (Prelude.Maybe [Prelude.Text])
+describeKeywords_keywords = Lens.lens (\DescribeKeywords' {keywords} -> keywords) (\s@DescribeKeywords' {} a -> s {keywords = a} :: DescribeKeywords) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of results to return per each request.
+describeKeywords_maxResults :: Lens.Lens' DescribeKeywords (Prelude.Maybe Prelude.Natural)
+describeKeywords_maxResults = Lens.lens (\DescribeKeywords' {maxResults} -> maxResults) (\s@DescribeKeywords' {} a -> s {maxResults = a} :: DescribeKeywords)
+
+-- | The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+describeKeywords_nextToken :: Lens.Lens' DescribeKeywords (Prelude.Maybe Prelude.Text)
+describeKeywords_nextToken = Lens.lens (\DescribeKeywords' {nextToken} -> nextToken) (\s@DescribeKeywords' {} a -> s {nextToken = a} :: DescribeKeywords)
+
+-- | The origination identity to use such as a PhoneNumberId, PhoneNumberArn,
+-- SenderId or SenderIdArn. You can use DescribePhoneNumbers to find the
+-- values for PhoneNumberId and PhoneNumberArn while DescribeSenderIds can
+-- be used to get the values for SenderId and SenderIdArn.
+describeKeywords_originationIdentity :: Lens.Lens' DescribeKeywords Prelude.Text
+describeKeywords_originationIdentity = Lens.lens (\DescribeKeywords' {originationIdentity} -> originationIdentity) (\s@DescribeKeywords' {} a -> s {originationIdentity = a} :: DescribeKeywords)
+
+instance Core.AWSPager DescribeKeywords where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeKeywordsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeKeywordsResponse_keywords
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeKeywords_nextToken
+          Lens..~ rs
+          Lens.^? describeKeywordsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeKeywords where
+  type
+    AWSResponse DescribeKeywords =
+      DescribeKeywordsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeKeywordsResponse'
+            Prelude.<$> (x Data..?> "Keywords" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "OriginationIdentity")
+            Prelude.<*> (x Data..?> "OriginationIdentityArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeKeywords where
+  hashWithSalt _salt DescribeKeywords' {..} =
+    _salt
+      `Prelude.hashWithSalt` filters
+      `Prelude.hashWithSalt` keywords
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` originationIdentity
+
+instance Prelude.NFData DescribeKeywords where
+  rnf DescribeKeywords' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf keywords
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf originationIdentity
+
+instance Data.ToHeaders DescribeKeywords where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DescribeKeywords" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeKeywords where
+  toJSON DescribeKeywords' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Filters" Data..=) Prelude.<$> filters,
+            ("Keywords" Data..=) Prelude.<$> keywords,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just
+              ("OriginationIdentity" Data..= originationIdentity)
+          ]
+      )
+
+instance Data.ToPath DescribeKeywords where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeKeywords where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeKeywordsResponse' smart constructor.
+data DescribeKeywordsResponse = DescribeKeywordsResponse'
+  { -- | An array of KeywordInformation objects that contain the results.
+    keywords :: Prelude.Maybe [KeywordInformation],
+    -- | The token to be used for the next set of paginated results. If this
+    -- field is empty then there are no more results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The PhoneNumberId or PoolId that is associated with the
+    -- OriginationIdentity.
+    originationIdentity :: Prelude.Maybe Prelude.Text,
+    -- | The PhoneNumberArn or PoolArn that is associated with the
+    -- OriginationIdentity.
+    originationIdentityArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeKeywordsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'keywords', 'describeKeywordsResponse_keywords' - An array of KeywordInformation objects that contain the results.
+--
+-- 'nextToken', 'describeKeywordsResponse_nextToken' - The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+--
+-- 'originationIdentity', 'describeKeywordsResponse_originationIdentity' - The PhoneNumberId or PoolId that is associated with the
+-- OriginationIdentity.
+--
+-- 'originationIdentityArn', 'describeKeywordsResponse_originationIdentityArn' - The PhoneNumberArn or PoolArn that is associated with the
+-- OriginationIdentity.
+--
+-- 'httpStatus', 'describeKeywordsResponse_httpStatus' - The response's http status code.
+newDescribeKeywordsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeKeywordsResponse
+newDescribeKeywordsResponse pHttpStatus_ =
+  DescribeKeywordsResponse'
+    { keywords =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      originationIdentity = Prelude.Nothing,
+      originationIdentityArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An array of KeywordInformation objects that contain the results.
+describeKeywordsResponse_keywords :: Lens.Lens' DescribeKeywordsResponse (Prelude.Maybe [KeywordInformation])
+describeKeywordsResponse_keywords = Lens.lens (\DescribeKeywordsResponse' {keywords} -> keywords) (\s@DescribeKeywordsResponse' {} a -> s {keywords = a} :: DescribeKeywordsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+describeKeywordsResponse_nextToken :: Lens.Lens' DescribeKeywordsResponse (Prelude.Maybe Prelude.Text)
+describeKeywordsResponse_nextToken = Lens.lens (\DescribeKeywordsResponse' {nextToken} -> nextToken) (\s@DescribeKeywordsResponse' {} a -> s {nextToken = a} :: DescribeKeywordsResponse)
+
+-- | The PhoneNumberId or PoolId that is associated with the
+-- OriginationIdentity.
+describeKeywordsResponse_originationIdentity :: Lens.Lens' DescribeKeywordsResponse (Prelude.Maybe Prelude.Text)
+describeKeywordsResponse_originationIdentity = Lens.lens (\DescribeKeywordsResponse' {originationIdentity} -> originationIdentity) (\s@DescribeKeywordsResponse' {} a -> s {originationIdentity = a} :: DescribeKeywordsResponse)
+
+-- | The PhoneNumberArn or PoolArn that is associated with the
+-- OriginationIdentity.
+describeKeywordsResponse_originationIdentityArn :: Lens.Lens' DescribeKeywordsResponse (Prelude.Maybe Prelude.Text)
+describeKeywordsResponse_originationIdentityArn = Lens.lens (\DescribeKeywordsResponse' {originationIdentityArn} -> originationIdentityArn) (\s@DescribeKeywordsResponse' {} a -> s {originationIdentityArn = a} :: DescribeKeywordsResponse)
+
+-- | The response's http status code.
+describeKeywordsResponse_httpStatus :: Lens.Lens' DescribeKeywordsResponse Prelude.Int
+describeKeywordsResponse_httpStatus = Lens.lens (\DescribeKeywordsResponse' {httpStatus} -> httpStatus) (\s@DescribeKeywordsResponse' {} a -> s {httpStatus = a} :: DescribeKeywordsResponse)
+
+instance Prelude.NFData DescribeKeywordsResponse where
+  rnf DescribeKeywordsResponse' {..} =
+    Prelude.rnf keywords
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf originationIdentity
+      `Prelude.seq` Prelude.rnf originationIdentityArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DescribeOptOutLists.hs b/gen/Amazonka/PinpointSmsVoiceV2/DescribeOptOutLists.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DescribeOptOutLists.hs
@@ -0,0 +1,255 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DescribeOptOutLists
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the specified opt-out list or all opt-out lists in your
+-- account.
+--
+-- If you specify opt-out list names, the output includes information for
+-- only the specified opt-out lists. Opt-out lists include only those that
+-- meet the filter criteria. If you don\'t specify opt-out list names or
+-- filters, the output includes information for all opt-out lists.
+--
+-- If you specify an opt-out list name that isn\'t valid, an Error is
+-- returned.
+--
+-- This operation returns paginated results.
+module Amazonka.PinpointSmsVoiceV2.DescribeOptOutLists
+  ( -- * Creating a Request
+    DescribeOptOutLists (..),
+    newDescribeOptOutLists,
+
+    -- * Request Lenses
+    describeOptOutLists_maxResults,
+    describeOptOutLists_nextToken,
+    describeOptOutLists_optOutListNames,
+
+    -- * Destructuring the Response
+    DescribeOptOutListsResponse (..),
+    newDescribeOptOutListsResponse,
+
+    -- * Response Lenses
+    describeOptOutListsResponse_nextToken,
+    describeOptOutListsResponse_optOutLists,
+    describeOptOutListsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeOptOutLists' smart constructor.
+data DescribeOptOutLists = DescribeOptOutLists'
+  { -- | The maximum number of results to return per each request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results. You don\'t
+    -- need to supply a value for this field in the initial request.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The OptOutLists to show the details of. This is an array of strings that
+    -- can be either the OptOutListName or OptOutListArn.
+    optOutListNames :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeOptOutLists' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'describeOptOutLists_maxResults' - The maximum number of results to return per each request.
+--
+-- 'nextToken', 'describeOptOutLists_nextToken' - The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+--
+-- 'optOutListNames', 'describeOptOutLists_optOutListNames' - The OptOutLists to show the details of. This is an array of strings that
+-- can be either the OptOutListName or OptOutListArn.
+newDescribeOptOutLists ::
+  DescribeOptOutLists
+newDescribeOptOutLists =
+  DescribeOptOutLists'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      optOutListNames = Prelude.Nothing
+    }
+
+-- | The maximum number of results to return per each request.
+describeOptOutLists_maxResults :: Lens.Lens' DescribeOptOutLists (Prelude.Maybe Prelude.Natural)
+describeOptOutLists_maxResults = Lens.lens (\DescribeOptOutLists' {maxResults} -> maxResults) (\s@DescribeOptOutLists' {} a -> s {maxResults = a} :: DescribeOptOutLists)
+
+-- | The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+describeOptOutLists_nextToken :: Lens.Lens' DescribeOptOutLists (Prelude.Maybe Prelude.Text)
+describeOptOutLists_nextToken = Lens.lens (\DescribeOptOutLists' {nextToken} -> nextToken) (\s@DescribeOptOutLists' {} a -> s {nextToken = a} :: DescribeOptOutLists)
+
+-- | The OptOutLists to show the details of. This is an array of strings that
+-- can be either the OptOutListName or OptOutListArn.
+describeOptOutLists_optOutListNames :: Lens.Lens' DescribeOptOutLists (Prelude.Maybe [Prelude.Text])
+describeOptOutLists_optOutListNames = Lens.lens (\DescribeOptOutLists' {optOutListNames} -> optOutListNames) (\s@DescribeOptOutLists' {} a -> s {optOutListNames = a} :: DescribeOptOutLists) Prelude.. Lens.mapping Lens.coerced
+
+instance Core.AWSPager DescribeOptOutLists where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeOptOutListsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeOptOutListsResponse_optOutLists
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeOptOutLists_nextToken
+          Lens..~ rs
+          Lens.^? describeOptOutListsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeOptOutLists where
+  type
+    AWSResponse DescribeOptOutLists =
+      DescribeOptOutListsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeOptOutListsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "OptOutLists" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeOptOutLists where
+  hashWithSalt _salt DescribeOptOutLists' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` optOutListNames
+
+instance Prelude.NFData DescribeOptOutLists where
+  rnf DescribeOptOutLists' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf optOutListNames
+
+instance Data.ToHeaders DescribeOptOutLists where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DescribeOptOutLists" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeOptOutLists where
+  toJSON DescribeOptOutLists' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("OptOutListNames" Data..=)
+              Prelude.<$> optOutListNames
+          ]
+      )
+
+instance Data.ToPath DescribeOptOutLists where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeOptOutLists where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeOptOutListsResponse' smart constructor.
+data DescribeOptOutListsResponse = DescribeOptOutListsResponse'
+  { -- | The token to be used for the next set of paginated results. If this
+    -- field is empty then there are no more results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | An array of OptOutListInformation objects that contain the details for
+    -- the requested OptOutLists.
+    optOutLists :: Prelude.Maybe [OptOutListInformation],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeOptOutListsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'describeOptOutListsResponse_nextToken' - The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+--
+-- 'optOutLists', 'describeOptOutListsResponse_optOutLists' - An array of OptOutListInformation objects that contain the details for
+-- the requested OptOutLists.
+--
+-- 'httpStatus', 'describeOptOutListsResponse_httpStatus' - The response's http status code.
+newDescribeOptOutListsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeOptOutListsResponse
+newDescribeOptOutListsResponse pHttpStatus_ =
+  DescribeOptOutListsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      optOutLists = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+describeOptOutListsResponse_nextToken :: Lens.Lens' DescribeOptOutListsResponse (Prelude.Maybe Prelude.Text)
+describeOptOutListsResponse_nextToken = Lens.lens (\DescribeOptOutListsResponse' {nextToken} -> nextToken) (\s@DescribeOptOutListsResponse' {} a -> s {nextToken = a} :: DescribeOptOutListsResponse)
+
+-- | An array of OptOutListInformation objects that contain the details for
+-- the requested OptOutLists.
+describeOptOutListsResponse_optOutLists :: Lens.Lens' DescribeOptOutListsResponse (Prelude.Maybe [OptOutListInformation])
+describeOptOutListsResponse_optOutLists = Lens.lens (\DescribeOptOutListsResponse' {optOutLists} -> optOutLists) (\s@DescribeOptOutListsResponse' {} a -> s {optOutLists = a} :: DescribeOptOutListsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeOptOutListsResponse_httpStatus :: Lens.Lens' DescribeOptOutListsResponse Prelude.Int
+describeOptOutListsResponse_httpStatus = Lens.lens (\DescribeOptOutListsResponse' {httpStatus} -> httpStatus) (\s@DescribeOptOutListsResponse' {} a -> s {httpStatus = a} :: DescribeOptOutListsResponse)
+
+instance Prelude.NFData DescribeOptOutListsResponse where
+  rnf DescribeOptOutListsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf optOutLists
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DescribeOptedOutNumbers.hs b/gen/Amazonka/PinpointSmsVoiceV2/DescribeOptedOutNumbers.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DescribeOptedOutNumbers.hs
@@ -0,0 +1,319 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DescribeOptedOutNumbers
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the specified opted out destination numbers or all opted out
+-- destination numbers in an opt-out list.
+--
+-- If you specify opted out numbers, the output includes information for
+-- only the specified opted out numbers. If you specify filters, the output
+-- includes information for only those opted out numbers that meet the
+-- filter criteria. If you don\'t specify opted out numbers or filters, the
+-- output includes information for all opted out destination numbers in
+-- your opt-out list.
+--
+-- If you specify an opted out number that isn\'t valid, an Error is
+-- returned.
+--
+-- This operation returns paginated results.
+module Amazonka.PinpointSmsVoiceV2.DescribeOptedOutNumbers
+  ( -- * Creating a Request
+    DescribeOptedOutNumbers (..),
+    newDescribeOptedOutNumbers,
+
+    -- * Request Lenses
+    describeOptedOutNumbers_filters,
+    describeOptedOutNumbers_maxResults,
+    describeOptedOutNumbers_nextToken,
+    describeOptedOutNumbers_optedOutNumbers,
+    describeOptedOutNumbers_optOutListName,
+
+    -- * Destructuring the Response
+    DescribeOptedOutNumbersResponse (..),
+    newDescribeOptedOutNumbersResponse,
+
+    -- * Response Lenses
+    describeOptedOutNumbersResponse_nextToken,
+    describeOptedOutNumbersResponse_optOutListArn,
+    describeOptedOutNumbersResponse_optOutListName,
+    describeOptedOutNumbersResponse_optedOutNumbers,
+    describeOptedOutNumbersResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeOptedOutNumbers' smart constructor.
+data DescribeOptedOutNumbers = DescribeOptedOutNumbers'
+  { -- | An array of OptedOutFilter objects to filter the results on.
+    filters :: Prelude.Maybe [OptedOutFilter],
+    -- | The maximum number of results to return per each request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results. You don\'t
+    -- need to supply a value for this field in the initial request.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | An array of phone numbers to search for in the OptOutList.
+    optedOutNumbers :: Prelude.Maybe [Prelude.Text],
+    -- | The OptOutListName or OptOutListArn of the OptOutList. You can use
+    -- DescribeOptOutLists to find the values for OptOutListName and
+    -- OptOutListArn.
+    optOutListName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeOptedOutNumbers' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filters', 'describeOptedOutNumbers_filters' - An array of OptedOutFilter objects to filter the results on.
+--
+-- 'maxResults', 'describeOptedOutNumbers_maxResults' - The maximum number of results to return per each request.
+--
+-- 'nextToken', 'describeOptedOutNumbers_nextToken' - The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+--
+-- 'optedOutNumbers', 'describeOptedOutNumbers_optedOutNumbers' - An array of phone numbers to search for in the OptOutList.
+--
+-- 'optOutListName', 'describeOptedOutNumbers_optOutListName' - The OptOutListName or OptOutListArn of the OptOutList. You can use
+-- DescribeOptOutLists to find the values for OptOutListName and
+-- OptOutListArn.
+newDescribeOptedOutNumbers ::
+  -- | 'optOutListName'
+  Prelude.Text ->
+  DescribeOptedOutNumbers
+newDescribeOptedOutNumbers pOptOutListName_ =
+  DescribeOptedOutNumbers'
+    { filters = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      optedOutNumbers = Prelude.Nothing,
+      optOutListName = pOptOutListName_
+    }
+
+-- | An array of OptedOutFilter objects to filter the results on.
+describeOptedOutNumbers_filters :: Lens.Lens' DescribeOptedOutNumbers (Prelude.Maybe [OptedOutFilter])
+describeOptedOutNumbers_filters = Lens.lens (\DescribeOptedOutNumbers' {filters} -> filters) (\s@DescribeOptedOutNumbers' {} a -> s {filters = a} :: DescribeOptedOutNumbers) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of results to return per each request.
+describeOptedOutNumbers_maxResults :: Lens.Lens' DescribeOptedOutNumbers (Prelude.Maybe Prelude.Natural)
+describeOptedOutNumbers_maxResults = Lens.lens (\DescribeOptedOutNumbers' {maxResults} -> maxResults) (\s@DescribeOptedOutNumbers' {} a -> s {maxResults = a} :: DescribeOptedOutNumbers)
+
+-- | The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+describeOptedOutNumbers_nextToken :: Lens.Lens' DescribeOptedOutNumbers (Prelude.Maybe Prelude.Text)
+describeOptedOutNumbers_nextToken = Lens.lens (\DescribeOptedOutNumbers' {nextToken} -> nextToken) (\s@DescribeOptedOutNumbers' {} a -> s {nextToken = a} :: DescribeOptedOutNumbers)
+
+-- | An array of phone numbers to search for in the OptOutList.
+describeOptedOutNumbers_optedOutNumbers :: Lens.Lens' DescribeOptedOutNumbers (Prelude.Maybe [Prelude.Text])
+describeOptedOutNumbers_optedOutNumbers = Lens.lens (\DescribeOptedOutNumbers' {optedOutNumbers} -> optedOutNumbers) (\s@DescribeOptedOutNumbers' {} a -> s {optedOutNumbers = a} :: DescribeOptedOutNumbers) Prelude.. Lens.mapping Lens.coerced
+
+-- | The OptOutListName or OptOutListArn of the OptOutList. You can use
+-- DescribeOptOutLists to find the values for OptOutListName and
+-- OptOutListArn.
+describeOptedOutNumbers_optOutListName :: Lens.Lens' DescribeOptedOutNumbers Prelude.Text
+describeOptedOutNumbers_optOutListName = Lens.lens (\DescribeOptedOutNumbers' {optOutListName} -> optOutListName) (\s@DescribeOptedOutNumbers' {} a -> s {optOutListName = a} :: DescribeOptedOutNumbers)
+
+instance Core.AWSPager DescribeOptedOutNumbers where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeOptedOutNumbersResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeOptedOutNumbersResponse_optedOutNumbers
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeOptedOutNumbers_nextToken
+          Lens..~ rs
+          Lens.^? describeOptedOutNumbersResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeOptedOutNumbers where
+  type
+    AWSResponse DescribeOptedOutNumbers =
+      DescribeOptedOutNumbersResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeOptedOutNumbersResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "OptOutListArn")
+            Prelude.<*> (x Data..?> "OptOutListName")
+            Prelude.<*> ( x
+                            Data..?> "OptedOutNumbers"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeOptedOutNumbers where
+  hashWithSalt _salt DescribeOptedOutNumbers' {..} =
+    _salt
+      `Prelude.hashWithSalt` filters
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` optedOutNumbers
+      `Prelude.hashWithSalt` optOutListName
+
+instance Prelude.NFData DescribeOptedOutNumbers where
+  rnf DescribeOptedOutNumbers' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf optedOutNumbers
+      `Prelude.seq` Prelude.rnf optOutListName
+
+instance Data.ToHeaders DescribeOptedOutNumbers where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DescribeOptedOutNumbers" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeOptedOutNumbers where
+  toJSON DescribeOptedOutNumbers' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Filters" Data..=) Prelude.<$> filters,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("OptedOutNumbers" Data..=)
+              Prelude.<$> optedOutNumbers,
+            Prelude.Just
+              ("OptOutListName" Data..= optOutListName)
+          ]
+      )
+
+instance Data.ToPath DescribeOptedOutNumbers where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeOptedOutNumbers where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeOptedOutNumbersResponse' smart constructor.
+data DescribeOptedOutNumbersResponse = DescribeOptedOutNumbersResponse'
+  { -- | The token to be used for the next set of paginated results. If this
+    -- field is empty then there are no more results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the OptOutList.
+    optOutListArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the OptOutList.
+    optOutListName :: Prelude.Maybe Prelude.Text,
+    -- | An array of OptedOutNumbersInformation objects that provide information
+    -- about the requested OptedOutNumbers.
+    optedOutNumbers :: Prelude.Maybe [OptedOutNumberInformation],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeOptedOutNumbersResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'describeOptedOutNumbersResponse_nextToken' - The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+--
+-- 'optOutListArn', 'describeOptedOutNumbersResponse_optOutListArn' - The Amazon Resource Name (ARN) of the OptOutList.
+--
+-- 'optOutListName', 'describeOptedOutNumbersResponse_optOutListName' - The name of the OptOutList.
+--
+-- 'optedOutNumbers', 'describeOptedOutNumbersResponse_optedOutNumbers' - An array of OptedOutNumbersInformation objects that provide information
+-- about the requested OptedOutNumbers.
+--
+-- 'httpStatus', 'describeOptedOutNumbersResponse_httpStatus' - The response's http status code.
+newDescribeOptedOutNumbersResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeOptedOutNumbersResponse
+newDescribeOptedOutNumbersResponse pHttpStatus_ =
+  DescribeOptedOutNumbersResponse'
+    { nextToken =
+        Prelude.Nothing,
+      optOutListArn = Prelude.Nothing,
+      optOutListName = Prelude.Nothing,
+      optedOutNumbers = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+describeOptedOutNumbersResponse_nextToken :: Lens.Lens' DescribeOptedOutNumbersResponse (Prelude.Maybe Prelude.Text)
+describeOptedOutNumbersResponse_nextToken = Lens.lens (\DescribeOptedOutNumbersResponse' {nextToken} -> nextToken) (\s@DescribeOptedOutNumbersResponse' {} a -> s {nextToken = a} :: DescribeOptedOutNumbersResponse)
+
+-- | The Amazon Resource Name (ARN) of the OptOutList.
+describeOptedOutNumbersResponse_optOutListArn :: Lens.Lens' DescribeOptedOutNumbersResponse (Prelude.Maybe Prelude.Text)
+describeOptedOutNumbersResponse_optOutListArn = Lens.lens (\DescribeOptedOutNumbersResponse' {optOutListArn} -> optOutListArn) (\s@DescribeOptedOutNumbersResponse' {} a -> s {optOutListArn = a} :: DescribeOptedOutNumbersResponse)
+
+-- | The name of the OptOutList.
+describeOptedOutNumbersResponse_optOutListName :: Lens.Lens' DescribeOptedOutNumbersResponse (Prelude.Maybe Prelude.Text)
+describeOptedOutNumbersResponse_optOutListName = Lens.lens (\DescribeOptedOutNumbersResponse' {optOutListName} -> optOutListName) (\s@DescribeOptedOutNumbersResponse' {} a -> s {optOutListName = a} :: DescribeOptedOutNumbersResponse)
+
+-- | An array of OptedOutNumbersInformation objects that provide information
+-- about the requested OptedOutNumbers.
+describeOptedOutNumbersResponse_optedOutNumbers :: Lens.Lens' DescribeOptedOutNumbersResponse (Prelude.Maybe [OptedOutNumberInformation])
+describeOptedOutNumbersResponse_optedOutNumbers = Lens.lens (\DescribeOptedOutNumbersResponse' {optedOutNumbers} -> optedOutNumbers) (\s@DescribeOptedOutNumbersResponse' {} a -> s {optedOutNumbers = a} :: DescribeOptedOutNumbersResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeOptedOutNumbersResponse_httpStatus :: Lens.Lens' DescribeOptedOutNumbersResponse Prelude.Int
+describeOptedOutNumbersResponse_httpStatus = Lens.lens (\DescribeOptedOutNumbersResponse' {httpStatus} -> httpStatus) (\s@DescribeOptedOutNumbersResponse' {} a -> s {httpStatus = a} :: DescribeOptedOutNumbersResponse)
+
+instance
+  Prelude.NFData
+    DescribeOptedOutNumbersResponse
+  where
+  rnf DescribeOptedOutNumbersResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf optOutListArn
+      `Prelude.seq` Prelude.rnf optOutListName
+      `Prelude.seq` Prelude.rnf optedOutNumbers
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DescribePhoneNumbers.hs b/gen/Amazonka/PinpointSmsVoiceV2/DescribePhoneNumbers.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DescribePhoneNumbers.hs
@@ -0,0 +1,272 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DescribePhoneNumbers
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the specified origination phone number, or all the phone
+-- numbers in your account.
+--
+-- If you specify phone number IDs, the output includes information for
+-- only the specified phone numbers. If you specify filters, the output
+-- includes information for only those phone numbers that meet the filter
+-- criteria. If you don\'t specify phone number IDs or filters, the output
+-- includes information for all phone numbers.
+--
+-- If you specify a phone number ID that isn\'t valid, an Error is
+-- returned.
+--
+-- This operation returns paginated results.
+module Amazonka.PinpointSmsVoiceV2.DescribePhoneNumbers
+  ( -- * Creating a Request
+    DescribePhoneNumbers (..),
+    newDescribePhoneNumbers,
+
+    -- * Request Lenses
+    describePhoneNumbers_filters,
+    describePhoneNumbers_maxResults,
+    describePhoneNumbers_nextToken,
+    describePhoneNumbers_phoneNumberIds,
+
+    -- * Destructuring the Response
+    DescribePhoneNumbersResponse (..),
+    newDescribePhoneNumbersResponse,
+
+    -- * Response Lenses
+    describePhoneNumbersResponse_nextToken,
+    describePhoneNumbersResponse_phoneNumbers,
+    describePhoneNumbersResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribePhoneNumbers' smart constructor.
+data DescribePhoneNumbers = DescribePhoneNumbers'
+  { -- | An array of PhoneNumberFilter objects to filter the results.
+    filters :: Prelude.Maybe [PhoneNumberFilter],
+    -- | The maximum number of results to return per each request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results. You don\'t
+    -- need to supply a value for this field in the initial request.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of phone numbers to find information about. This
+    -- is an array of strings that can be either the PhoneNumberId or
+    -- PhoneNumberArn.
+    phoneNumberIds :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribePhoneNumbers' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filters', 'describePhoneNumbers_filters' - An array of PhoneNumberFilter objects to filter the results.
+--
+-- 'maxResults', 'describePhoneNumbers_maxResults' - The maximum number of results to return per each request.
+--
+-- 'nextToken', 'describePhoneNumbers_nextToken' - The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+--
+-- 'phoneNumberIds', 'describePhoneNumbers_phoneNumberIds' - The unique identifier of phone numbers to find information about. This
+-- is an array of strings that can be either the PhoneNumberId or
+-- PhoneNumberArn.
+newDescribePhoneNumbers ::
+  DescribePhoneNumbers
+newDescribePhoneNumbers =
+  DescribePhoneNumbers'
+    { filters = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      phoneNumberIds = Prelude.Nothing
+    }
+
+-- | An array of PhoneNumberFilter objects to filter the results.
+describePhoneNumbers_filters :: Lens.Lens' DescribePhoneNumbers (Prelude.Maybe [PhoneNumberFilter])
+describePhoneNumbers_filters = Lens.lens (\DescribePhoneNumbers' {filters} -> filters) (\s@DescribePhoneNumbers' {} a -> s {filters = a} :: DescribePhoneNumbers) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of results to return per each request.
+describePhoneNumbers_maxResults :: Lens.Lens' DescribePhoneNumbers (Prelude.Maybe Prelude.Natural)
+describePhoneNumbers_maxResults = Lens.lens (\DescribePhoneNumbers' {maxResults} -> maxResults) (\s@DescribePhoneNumbers' {} a -> s {maxResults = a} :: DescribePhoneNumbers)
+
+-- | The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+describePhoneNumbers_nextToken :: Lens.Lens' DescribePhoneNumbers (Prelude.Maybe Prelude.Text)
+describePhoneNumbers_nextToken = Lens.lens (\DescribePhoneNumbers' {nextToken} -> nextToken) (\s@DescribePhoneNumbers' {} a -> s {nextToken = a} :: DescribePhoneNumbers)
+
+-- | The unique identifier of phone numbers to find information about. This
+-- is an array of strings that can be either the PhoneNumberId or
+-- PhoneNumberArn.
+describePhoneNumbers_phoneNumberIds :: Lens.Lens' DescribePhoneNumbers (Prelude.Maybe [Prelude.Text])
+describePhoneNumbers_phoneNumberIds = Lens.lens (\DescribePhoneNumbers' {phoneNumberIds} -> phoneNumberIds) (\s@DescribePhoneNumbers' {} a -> s {phoneNumberIds = a} :: DescribePhoneNumbers) Prelude.. Lens.mapping Lens.coerced
+
+instance Core.AWSPager DescribePhoneNumbers where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describePhoneNumbersResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describePhoneNumbersResponse_phoneNumbers
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describePhoneNumbers_nextToken
+          Lens..~ rs
+          Lens.^? describePhoneNumbersResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribePhoneNumbers where
+  type
+    AWSResponse DescribePhoneNumbers =
+      DescribePhoneNumbersResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribePhoneNumbersResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "PhoneNumbers" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribePhoneNumbers where
+  hashWithSalt _salt DescribePhoneNumbers' {..} =
+    _salt
+      `Prelude.hashWithSalt` filters
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` phoneNumberIds
+
+instance Prelude.NFData DescribePhoneNumbers where
+  rnf DescribePhoneNumbers' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf phoneNumberIds
+
+instance Data.ToHeaders DescribePhoneNumbers where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DescribePhoneNumbers" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribePhoneNumbers where
+  toJSON DescribePhoneNumbers' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Filters" Data..=) Prelude.<$> filters,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("PhoneNumberIds" Data..=)
+              Prelude.<$> phoneNumberIds
+          ]
+      )
+
+instance Data.ToPath DescribePhoneNumbers where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribePhoneNumbers where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribePhoneNumbersResponse' smart constructor.
+data DescribePhoneNumbersResponse = DescribePhoneNumbersResponse'
+  { -- | The token to be used for the next set of paginated results. If this
+    -- field is empty then there are no more results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | An array of PhoneNumberInformation objects that contain the details for
+    -- the requested phone numbers.
+    phoneNumbers :: Prelude.Maybe [PhoneNumberInformation],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribePhoneNumbersResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'describePhoneNumbersResponse_nextToken' - The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+--
+-- 'phoneNumbers', 'describePhoneNumbersResponse_phoneNumbers' - An array of PhoneNumberInformation objects that contain the details for
+-- the requested phone numbers.
+--
+-- 'httpStatus', 'describePhoneNumbersResponse_httpStatus' - The response's http status code.
+newDescribePhoneNumbersResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribePhoneNumbersResponse
+newDescribePhoneNumbersResponse pHttpStatus_ =
+  DescribePhoneNumbersResponse'
+    { nextToken =
+        Prelude.Nothing,
+      phoneNumbers = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+describePhoneNumbersResponse_nextToken :: Lens.Lens' DescribePhoneNumbersResponse (Prelude.Maybe Prelude.Text)
+describePhoneNumbersResponse_nextToken = Lens.lens (\DescribePhoneNumbersResponse' {nextToken} -> nextToken) (\s@DescribePhoneNumbersResponse' {} a -> s {nextToken = a} :: DescribePhoneNumbersResponse)
+
+-- | An array of PhoneNumberInformation objects that contain the details for
+-- the requested phone numbers.
+describePhoneNumbersResponse_phoneNumbers :: Lens.Lens' DescribePhoneNumbersResponse (Prelude.Maybe [PhoneNumberInformation])
+describePhoneNumbersResponse_phoneNumbers = Lens.lens (\DescribePhoneNumbersResponse' {phoneNumbers} -> phoneNumbers) (\s@DescribePhoneNumbersResponse' {} a -> s {phoneNumbers = a} :: DescribePhoneNumbersResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describePhoneNumbersResponse_httpStatus :: Lens.Lens' DescribePhoneNumbersResponse Prelude.Int
+describePhoneNumbersResponse_httpStatus = Lens.lens (\DescribePhoneNumbersResponse' {httpStatus} -> httpStatus) (\s@DescribePhoneNumbersResponse' {} a -> s {httpStatus = a} :: DescribePhoneNumbersResponse)
+
+instance Prelude.NFData DescribePhoneNumbersResponse where
+  rnf DescribePhoneNumbersResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf phoneNumbers
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DescribePools.hs b/gen/Amazonka/PinpointSmsVoiceV2/DescribePools.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DescribePools.hs
@@ -0,0 +1,270 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DescribePools
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves the specified pools or all pools associated with your Amazon
+-- Web Services account.
+--
+-- If you specify pool IDs, the output includes information for only the
+-- specified pools. If you specify filters, the output includes information
+-- for only those pools that meet the filter criteria. If you don\'t
+-- specify pool IDs or filters, the output includes information for all
+-- pools.
+--
+-- If you specify a pool ID that isn\'t valid, an Error is returned.
+--
+-- A pool is a collection of phone numbers and SenderIds. A pool can
+-- include one or more phone numbers and SenderIds that are associated with
+-- your Amazon Web Services account.
+--
+-- This operation returns paginated results.
+module Amazonka.PinpointSmsVoiceV2.DescribePools
+  ( -- * Creating a Request
+    DescribePools (..),
+    newDescribePools,
+
+    -- * Request Lenses
+    describePools_filters,
+    describePools_maxResults,
+    describePools_nextToken,
+    describePools_poolIds,
+
+    -- * Destructuring the Response
+    DescribePoolsResponse (..),
+    newDescribePoolsResponse,
+
+    -- * Response Lenses
+    describePoolsResponse_nextToken,
+    describePoolsResponse_pools,
+    describePoolsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribePools' smart constructor.
+data DescribePools = DescribePools'
+  { -- | An array of PoolFilter objects to filter the results.
+    filters :: Prelude.Maybe [PoolFilter],
+    -- | The maximum number of results to return per each request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results. You don\'t
+    -- need to supply a value for this field in the initial request.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of pools to find. This is an array of strings that
+    -- can be either the PoolId or PoolArn.
+    poolIds :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribePools' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filters', 'describePools_filters' - An array of PoolFilter objects to filter the results.
+--
+-- 'maxResults', 'describePools_maxResults' - The maximum number of results to return per each request.
+--
+-- 'nextToken', 'describePools_nextToken' - The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+--
+-- 'poolIds', 'describePools_poolIds' - The unique identifier of pools to find. This is an array of strings that
+-- can be either the PoolId or PoolArn.
+newDescribePools ::
+  DescribePools
+newDescribePools =
+  DescribePools'
+    { filters = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      poolIds = Prelude.Nothing
+    }
+
+-- | An array of PoolFilter objects to filter the results.
+describePools_filters :: Lens.Lens' DescribePools (Prelude.Maybe [PoolFilter])
+describePools_filters = Lens.lens (\DescribePools' {filters} -> filters) (\s@DescribePools' {} a -> s {filters = a} :: DescribePools) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of results to return per each request.
+describePools_maxResults :: Lens.Lens' DescribePools (Prelude.Maybe Prelude.Natural)
+describePools_maxResults = Lens.lens (\DescribePools' {maxResults} -> maxResults) (\s@DescribePools' {} a -> s {maxResults = a} :: DescribePools)
+
+-- | The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+describePools_nextToken :: Lens.Lens' DescribePools (Prelude.Maybe Prelude.Text)
+describePools_nextToken = Lens.lens (\DescribePools' {nextToken} -> nextToken) (\s@DescribePools' {} a -> s {nextToken = a} :: DescribePools)
+
+-- | The unique identifier of pools to find. This is an array of strings that
+-- can be either the PoolId or PoolArn.
+describePools_poolIds :: Lens.Lens' DescribePools (Prelude.Maybe [Prelude.Text])
+describePools_poolIds = Lens.lens (\DescribePools' {poolIds} -> poolIds) (\s@DescribePools' {} a -> s {poolIds = a} :: DescribePools) Prelude.. Lens.mapping Lens.coerced
+
+instance Core.AWSPager DescribePools where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describePoolsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describePoolsResponse_pools
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describePools_nextToken
+          Lens..~ rs
+          Lens.^? describePoolsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribePools where
+  type
+    AWSResponse DescribePools =
+      DescribePoolsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribePoolsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "Pools" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribePools where
+  hashWithSalt _salt DescribePools' {..} =
+    _salt
+      `Prelude.hashWithSalt` filters
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` poolIds
+
+instance Prelude.NFData DescribePools where
+  rnf DescribePools' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf poolIds
+
+instance Data.ToHeaders DescribePools where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DescribePools" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribePools where
+  toJSON DescribePools' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Filters" Data..=) Prelude.<$> filters,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("PoolIds" Data..=) Prelude.<$> poolIds
+          ]
+      )
+
+instance Data.ToPath DescribePools where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribePools where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribePoolsResponse' smart constructor.
+data DescribePoolsResponse = DescribePoolsResponse'
+  { -- | The token to be used for the next set of paginated results. If this
+    -- field is empty then there are no more results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | An array of PoolInformation objects that contain the details for the
+    -- requested pools.
+    pools :: Prelude.Maybe [PoolInformation],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribePoolsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'describePoolsResponse_nextToken' - The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+--
+-- 'pools', 'describePoolsResponse_pools' - An array of PoolInformation objects that contain the details for the
+-- requested pools.
+--
+-- 'httpStatus', 'describePoolsResponse_httpStatus' - The response's http status code.
+newDescribePoolsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribePoolsResponse
+newDescribePoolsResponse pHttpStatus_ =
+  DescribePoolsResponse'
+    { nextToken = Prelude.Nothing,
+      pools = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+describePoolsResponse_nextToken :: Lens.Lens' DescribePoolsResponse (Prelude.Maybe Prelude.Text)
+describePoolsResponse_nextToken = Lens.lens (\DescribePoolsResponse' {nextToken} -> nextToken) (\s@DescribePoolsResponse' {} a -> s {nextToken = a} :: DescribePoolsResponse)
+
+-- | An array of PoolInformation objects that contain the details for the
+-- requested pools.
+describePoolsResponse_pools :: Lens.Lens' DescribePoolsResponse (Prelude.Maybe [PoolInformation])
+describePoolsResponse_pools = Lens.lens (\DescribePoolsResponse' {pools} -> pools) (\s@DescribePoolsResponse' {} a -> s {pools = a} :: DescribePoolsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describePoolsResponse_httpStatus :: Lens.Lens' DescribePoolsResponse Prelude.Int
+describePoolsResponse_httpStatus = Lens.lens (\DescribePoolsResponse' {httpStatus} -> httpStatus) (\s@DescribePoolsResponse' {} a -> s {httpStatus = a} :: DescribePoolsResponse)
+
+instance Prelude.NFData DescribePoolsResponse where
+  rnf DescribePoolsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf pools
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DescribeSenderIds.hs b/gen/Amazonka/PinpointSmsVoiceV2/DescribeSenderIds.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DescribeSenderIds.hs
@@ -0,0 +1,264 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DescribeSenderIds
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the specified SenderIds or all SenderIds associated with your
+-- Amazon Web Services account.
+--
+-- If you specify SenderIds, the output includes information for only the
+-- specified SenderIds. If you specify filters, the output includes
+-- information for only those SenderIds that meet the filter criteria. If
+-- you don\'t specify SenderIds or filters, the output includes information
+-- for all SenderIds.
+--
+-- f you specify a sender ID that isn\'t valid, an Error is returned.
+--
+-- This operation returns paginated results.
+module Amazonka.PinpointSmsVoiceV2.DescribeSenderIds
+  ( -- * Creating a Request
+    DescribeSenderIds (..),
+    newDescribeSenderIds,
+
+    -- * Request Lenses
+    describeSenderIds_filters,
+    describeSenderIds_maxResults,
+    describeSenderIds_nextToken,
+    describeSenderIds_senderIds,
+
+    -- * Destructuring the Response
+    DescribeSenderIdsResponse (..),
+    newDescribeSenderIdsResponse,
+
+    -- * Response Lenses
+    describeSenderIdsResponse_nextToken,
+    describeSenderIdsResponse_senderIds,
+    describeSenderIdsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeSenderIds' smart constructor.
+data DescribeSenderIds = DescribeSenderIds'
+  { -- | An array of SenderIdFilter objects to filter the results.
+    filters :: Prelude.Maybe [SenderIdFilter],
+    -- | The maximum number of results to return per each request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results. You don\'t
+    -- need to supply a value for this field in the initial request.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | An array of SenderIdAndCountry objects to search for.
+    senderIds :: Prelude.Maybe [SenderIdAndCountry]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSenderIds' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filters', 'describeSenderIds_filters' - An array of SenderIdFilter objects to filter the results.
+--
+-- 'maxResults', 'describeSenderIds_maxResults' - The maximum number of results to return per each request.
+--
+-- 'nextToken', 'describeSenderIds_nextToken' - The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+--
+-- 'senderIds', 'describeSenderIds_senderIds' - An array of SenderIdAndCountry objects to search for.
+newDescribeSenderIds ::
+  DescribeSenderIds
+newDescribeSenderIds =
+  DescribeSenderIds'
+    { filters = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      senderIds = Prelude.Nothing
+    }
+
+-- | An array of SenderIdFilter objects to filter the results.
+describeSenderIds_filters :: Lens.Lens' DescribeSenderIds (Prelude.Maybe [SenderIdFilter])
+describeSenderIds_filters = Lens.lens (\DescribeSenderIds' {filters} -> filters) (\s@DescribeSenderIds' {} a -> s {filters = a} :: DescribeSenderIds) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of results to return per each request.
+describeSenderIds_maxResults :: Lens.Lens' DescribeSenderIds (Prelude.Maybe Prelude.Natural)
+describeSenderIds_maxResults = Lens.lens (\DescribeSenderIds' {maxResults} -> maxResults) (\s@DescribeSenderIds' {} a -> s {maxResults = a} :: DescribeSenderIds)
+
+-- | The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+describeSenderIds_nextToken :: Lens.Lens' DescribeSenderIds (Prelude.Maybe Prelude.Text)
+describeSenderIds_nextToken = Lens.lens (\DescribeSenderIds' {nextToken} -> nextToken) (\s@DescribeSenderIds' {} a -> s {nextToken = a} :: DescribeSenderIds)
+
+-- | An array of SenderIdAndCountry objects to search for.
+describeSenderIds_senderIds :: Lens.Lens' DescribeSenderIds (Prelude.Maybe [SenderIdAndCountry])
+describeSenderIds_senderIds = Lens.lens (\DescribeSenderIds' {senderIds} -> senderIds) (\s@DescribeSenderIds' {} a -> s {senderIds = a} :: DescribeSenderIds) Prelude.. Lens.mapping Lens.coerced
+
+instance Core.AWSPager DescribeSenderIds where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeSenderIdsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeSenderIdsResponse_senderIds
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeSenderIds_nextToken
+          Lens..~ rs
+          Lens.^? describeSenderIdsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeSenderIds where
+  type
+    AWSResponse DescribeSenderIds =
+      DescribeSenderIdsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeSenderIdsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "SenderIds" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeSenderIds where
+  hashWithSalt _salt DescribeSenderIds' {..} =
+    _salt
+      `Prelude.hashWithSalt` filters
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` senderIds
+
+instance Prelude.NFData DescribeSenderIds where
+  rnf DescribeSenderIds' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf senderIds
+
+instance Data.ToHeaders DescribeSenderIds where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DescribeSenderIds" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeSenderIds where
+  toJSON DescribeSenderIds' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Filters" Data..=) Prelude.<$> filters,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("SenderIds" Data..=) Prelude.<$> senderIds
+          ]
+      )
+
+instance Data.ToPath DescribeSenderIds where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeSenderIds where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeSenderIdsResponse' smart constructor.
+data DescribeSenderIdsResponse = DescribeSenderIdsResponse'
+  { -- | The token to be used for the next set of paginated results. If this
+    -- field is empty then there are no more results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | An array of SernderIdInformation objects that contain the details for
+    -- the requested SenderIds.
+    senderIds :: Prelude.Maybe [SenderIdInformation],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSenderIdsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'describeSenderIdsResponse_nextToken' - The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+--
+-- 'senderIds', 'describeSenderIdsResponse_senderIds' - An array of SernderIdInformation objects that contain the details for
+-- the requested SenderIds.
+--
+-- 'httpStatus', 'describeSenderIdsResponse_httpStatus' - The response's http status code.
+newDescribeSenderIdsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeSenderIdsResponse
+newDescribeSenderIdsResponse pHttpStatus_ =
+  DescribeSenderIdsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      senderIds = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+describeSenderIdsResponse_nextToken :: Lens.Lens' DescribeSenderIdsResponse (Prelude.Maybe Prelude.Text)
+describeSenderIdsResponse_nextToken = Lens.lens (\DescribeSenderIdsResponse' {nextToken} -> nextToken) (\s@DescribeSenderIdsResponse' {} a -> s {nextToken = a} :: DescribeSenderIdsResponse)
+
+-- | An array of SernderIdInformation objects that contain the details for
+-- the requested SenderIds.
+describeSenderIdsResponse_senderIds :: Lens.Lens' DescribeSenderIdsResponse (Prelude.Maybe [SenderIdInformation])
+describeSenderIdsResponse_senderIds = Lens.lens (\DescribeSenderIdsResponse' {senderIds} -> senderIds) (\s@DescribeSenderIdsResponse' {} a -> s {senderIds = a} :: DescribeSenderIdsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeSenderIdsResponse_httpStatus :: Lens.Lens' DescribeSenderIdsResponse Prelude.Int
+describeSenderIdsResponse_httpStatus = Lens.lens (\DescribeSenderIdsResponse' {httpStatus} -> httpStatus) (\s@DescribeSenderIdsResponse' {} a -> s {httpStatus = a} :: DescribeSenderIdsResponse)
+
+instance Prelude.NFData DescribeSenderIdsResponse where
+  rnf DescribeSenderIdsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf senderIds
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DescribeSpendLimits.hs b/gen/Amazonka/PinpointSmsVoiceV2/DescribeSpendLimits.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DescribeSpendLimits.hs
@@ -0,0 +1,236 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DescribeSpendLimits
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the current Amazon Pinpoint monthly spend limits for sending
+-- voice and text messages.
+--
+-- When you establish an Amazon Web Services account, the account has
+-- initial monthly spend limit in a given Region. For more information on
+-- increasing your monthly spend limit, see
+-- <https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-awssupport-spend-threshold.html Requesting increases to your monthly SMS spending quota for Amazon Pinpoint>
+-- in the /Amazon Pinpoint User Guide/.
+--
+-- This operation returns paginated results.
+module Amazonka.PinpointSmsVoiceV2.DescribeSpendLimits
+  ( -- * Creating a Request
+    DescribeSpendLimits (..),
+    newDescribeSpendLimits,
+
+    -- * Request Lenses
+    describeSpendLimits_maxResults,
+    describeSpendLimits_nextToken,
+
+    -- * Destructuring the Response
+    DescribeSpendLimitsResponse (..),
+    newDescribeSpendLimitsResponse,
+
+    -- * Response Lenses
+    describeSpendLimitsResponse_nextToken,
+    describeSpendLimitsResponse_spendLimits,
+    describeSpendLimitsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeSpendLimits' smart constructor.
+data DescribeSpendLimits = DescribeSpendLimits'
+  { -- | The maximum number of results to return per each request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results. You don\'t
+    -- need to supply a value for this field in the initial request.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSpendLimits' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'describeSpendLimits_maxResults' - The maximum number of results to return per each request.
+--
+-- 'nextToken', 'describeSpendLimits_nextToken' - The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+newDescribeSpendLimits ::
+  DescribeSpendLimits
+newDescribeSpendLimits =
+  DescribeSpendLimits'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of results to return per each request.
+describeSpendLimits_maxResults :: Lens.Lens' DescribeSpendLimits (Prelude.Maybe Prelude.Natural)
+describeSpendLimits_maxResults = Lens.lens (\DescribeSpendLimits' {maxResults} -> maxResults) (\s@DescribeSpendLimits' {} a -> s {maxResults = a} :: DescribeSpendLimits)
+
+-- | The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+describeSpendLimits_nextToken :: Lens.Lens' DescribeSpendLimits (Prelude.Maybe Prelude.Text)
+describeSpendLimits_nextToken = Lens.lens (\DescribeSpendLimits' {nextToken} -> nextToken) (\s@DescribeSpendLimits' {} a -> s {nextToken = a} :: DescribeSpendLimits)
+
+instance Core.AWSPager DescribeSpendLimits where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeSpendLimitsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeSpendLimitsResponse_spendLimits
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeSpendLimits_nextToken
+          Lens..~ rs
+          Lens.^? describeSpendLimitsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeSpendLimits where
+  type
+    AWSResponse DescribeSpendLimits =
+      DescribeSpendLimitsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeSpendLimitsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "SpendLimits" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeSpendLimits where
+  hashWithSalt _salt DescribeSpendLimits' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData DescribeSpendLimits where
+  rnf DescribeSpendLimits' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders DescribeSpendLimits where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DescribeSpendLimits" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeSpendLimits where
+  toJSON DescribeSpendLimits' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath DescribeSpendLimits where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeSpendLimits where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeSpendLimitsResponse' smart constructor.
+data DescribeSpendLimitsResponse = DescribeSpendLimitsResponse'
+  { -- | The token to be used for the next set of paginated results. If this
+    -- field is empty then there are no more results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | An array of SpendLimit objects that contain the details for the
+    -- requested spend limits.
+    spendLimits :: Prelude.Maybe [SpendLimit],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSpendLimitsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'describeSpendLimitsResponse_nextToken' - The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+--
+-- 'spendLimits', 'describeSpendLimitsResponse_spendLimits' - An array of SpendLimit objects that contain the details for the
+-- requested spend limits.
+--
+-- 'httpStatus', 'describeSpendLimitsResponse_httpStatus' - The response's http status code.
+newDescribeSpendLimitsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeSpendLimitsResponse
+newDescribeSpendLimitsResponse pHttpStatus_ =
+  DescribeSpendLimitsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      spendLimits = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+describeSpendLimitsResponse_nextToken :: Lens.Lens' DescribeSpendLimitsResponse (Prelude.Maybe Prelude.Text)
+describeSpendLimitsResponse_nextToken = Lens.lens (\DescribeSpendLimitsResponse' {nextToken} -> nextToken) (\s@DescribeSpendLimitsResponse' {} a -> s {nextToken = a} :: DescribeSpendLimitsResponse)
+
+-- | An array of SpendLimit objects that contain the details for the
+-- requested spend limits.
+describeSpendLimitsResponse_spendLimits :: Lens.Lens' DescribeSpendLimitsResponse (Prelude.Maybe [SpendLimit])
+describeSpendLimitsResponse_spendLimits = Lens.lens (\DescribeSpendLimitsResponse' {spendLimits} -> spendLimits) (\s@DescribeSpendLimitsResponse' {} a -> s {spendLimits = a} :: DescribeSpendLimitsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeSpendLimitsResponse_httpStatus :: Lens.Lens' DescribeSpendLimitsResponse Prelude.Int
+describeSpendLimitsResponse_httpStatus = Lens.lens (\DescribeSpendLimitsResponse' {httpStatus} -> httpStatus) (\s@DescribeSpendLimitsResponse' {} a -> s {httpStatus = a} :: DescribeSpendLimitsResponse)
+
+instance Prelude.NFData DescribeSpendLimitsResponse where
+  rnf DescribeSpendLimitsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf spendLimits
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/DisassociateOriginationIdentity.hs b/gen/Amazonka/PinpointSmsVoiceV2/DisassociateOriginationIdentity.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/DisassociateOriginationIdentity.hs
@@ -0,0 +1,321 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.DisassociateOriginationIdentity
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Removes the specified origination identity from an existing pool.
+--
+-- If the origination identity isn\'t associated with the specified pool,
+-- an Error is returned.
+module Amazonka.PinpointSmsVoiceV2.DisassociateOriginationIdentity
+  ( -- * Creating a Request
+    DisassociateOriginationIdentity (..),
+    newDisassociateOriginationIdentity,
+
+    -- * Request Lenses
+    disassociateOriginationIdentity_clientToken,
+    disassociateOriginationIdentity_poolId,
+    disassociateOriginationIdentity_originationIdentity,
+    disassociateOriginationIdentity_isoCountryCode,
+
+    -- * Destructuring the Response
+    DisassociateOriginationIdentityResponse (..),
+    newDisassociateOriginationIdentityResponse,
+
+    -- * Response Lenses
+    disassociateOriginationIdentityResponse_isoCountryCode,
+    disassociateOriginationIdentityResponse_originationIdentity,
+    disassociateOriginationIdentityResponse_originationIdentityArn,
+    disassociateOriginationIdentityResponse_poolArn,
+    disassociateOriginationIdentityResponse_poolId,
+    disassociateOriginationIdentityResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDisassociateOriginationIdentity' smart constructor.
+data DisassociateOriginationIdentity = DisassociateOriginationIdentity'
+  { -- | Unique, case-sensitive identifier you provide to ensure the idempotency
+    -- of the request. If you don\'t specify a client token, a randomly
+    -- generated token is used for the request to ensure idempotency.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the pool to disassociate with the origination
+    -- identity. This value can be either the PoolId or PoolArn.
+    poolId :: Prelude.Text,
+    -- | The origination identity to use such as a PhoneNumberId, PhoneNumberArn,
+    -- SenderId or SenderIdArn. You can use DescribePhoneNumbers find the
+    -- values for PhoneNumberId and PhoneNumberArn, or use DescribeSenderIds to
+    -- get the values for SenderId and SenderIdArn.
+    originationIdentity :: Prelude.Text,
+    -- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+    -- region.
+    isoCountryCode :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DisassociateOriginationIdentity' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'disassociateOriginationIdentity_clientToken' - Unique, case-sensitive identifier you provide to ensure the idempotency
+-- of the request. If you don\'t specify a client token, a randomly
+-- generated token is used for the request to ensure idempotency.
+--
+-- 'poolId', 'disassociateOriginationIdentity_poolId' - The unique identifier for the pool to disassociate with the origination
+-- identity. This value can be either the PoolId or PoolArn.
+--
+-- 'originationIdentity', 'disassociateOriginationIdentity_originationIdentity' - The origination identity to use such as a PhoneNumberId, PhoneNumberArn,
+-- SenderId or SenderIdArn. You can use DescribePhoneNumbers find the
+-- values for PhoneNumberId and PhoneNumberArn, or use DescribeSenderIds to
+-- get the values for SenderId and SenderIdArn.
+--
+-- 'isoCountryCode', 'disassociateOriginationIdentity_isoCountryCode' - The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+newDisassociateOriginationIdentity ::
+  -- | 'poolId'
+  Prelude.Text ->
+  -- | 'originationIdentity'
+  Prelude.Text ->
+  -- | 'isoCountryCode'
+  Prelude.Text ->
+  DisassociateOriginationIdentity
+newDisassociateOriginationIdentity
+  pPoolId_
+  pOriginationIdentity_
+  pIsoCountryCode_ =
+    DisassociateOriginationIdentity'
+      { clientToken =
+          Prelude.Nothing,
+        poolId = pPoolId_,
+        originationIdentity =
+          pOriginationIdentity_,
+        isoCountryCode = pIsoCountryCode_
+      }
+
+-- | Unique, case-sensitive identifier you provide to ensure the idempotency
+-- of the request. If you don\'t specify a client token, a randomly
+-- generated token is used for the request to ensure idempotency.
+disassociateOriginationIdentity_clientToken :: Lens.Lens' DisassociateOriginationIdentity (Prelude.Maybe Prelude.Text)
+disassociateOriginationIdentity_clientToken = Lens.lens (\DisassociateOriginationIdentity' {clientToken} -> clientToken) (\s@DisassociateOriginationIdentity' {} a -> s {clientToken = a} :: DisassociateOriginationIdentity)
+
+-- | The unique identifier for the pool to disassociate with the origination
+-- identity. This value can be either the PoolId or PoolArn.
+disassociateOriginationIdentity_poolId :: Lens.Lens' DisassociateOriginationIdentity Prelude.Text
+disassociateOriginationIdentity_poolId = Lens.lens (\DisassociateOriginationIdentity' {poolId} -> poolId) (\s@DisassociateOriginationIdentity' {} a -> s {poolId = a} :: DisassociateOriginationIdentity)
+
+-- | The origination identity to use such as a PhoneNumberId, PhoneNumberArn,
+-- SenderId or SenderIdArn. You can use DescribePhoneNumbers find the
+-- values for PhoneNumberId and PhoneNumberArn, or use DescribeSenderIds to
+-- get the values for SenderId and SenderIdArn.
+disassociateOriginationIdentity_originationIdentity :: Lens.Lens' DisassociateOriginationIdentity Prelude.Text
+disassociateOriginationIdentity_originationIdentity = Lens.lens (\DisassociateOriginationIdentity' {originationIdentity} -> originationIdentity) (\s@DisassociateOriginationIdentity' {} a -> s {originationIdentity = a} :: DisassociateOriginationIdentity)
+
+-- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+disassociateOriginationIdentity_isoCountryCode :: Lens.Lens' DisassociateOriginationIdentity Prelude.Text
+disassociateOriginationIdentity_isoCountryCode = Lens.lens (\DisassociateOriginationIdentity' {isoCountryCode} -> isoCountryCode) (\s@DisassociateOriginationIdentity' {} a -> s {isoCountryCode = a} :: DisassociateOriginationIdentity)
+
+instance
+  Core.AWSRequest
+    DisassociateOriginationIdentity
+  where
+  type
+    AWSResponse DisassociateOriginationIdentity =
+      DisassociateOriginationIdentityResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DisassociateOriginationIdentityResponse'
+            Prelude.<$> (x Data..?> "IsoCountryCode")
+            Prelude.<*> (x Data..?> "OriginationIdentity")
+            Prelude.<*> (x Data..?> "OriginationIdentityArn")
+            Prelude.<*> (x Data..?> "PoolArn")
+            Prelude.<*> (x Data..?> "PoolId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    DisassociateOriginationIdentity
+  where
+  hashWithSalt
+    _salt
+    DisassociateOriginationIdentity' {..} =
+      _salt
+        `Prelude.hashWithSalt` clientToken
+        `Prelude.hashWithSalt` poolId
+        `Prelude.hashWithSalt` originationIdentity
+        `Prelude.hashWithSalt` isoCountryCode
+
+instance
+  Prelude.NFData
+    DisassociateOriginationIdentity
+  where
+  rnf DisassociateOriginationIdentity' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf poolId
+      `Prelude.seq` Prelude.rnf originationIdentity
+      `Prelude.seq` Prelude.rnf isoCountryCode
+
+instance
+  Data.ToHeaders
+    DisassociateOriginationIdentity
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.DisassociateOriginationIdentity" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DisassociateOriginationIdentity where
+  toJSON DisassociateOriginationIdentity' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClientToken" Data..=) Prelude.<$> clientToken,
+            Prelude.Just ("PoolId" Data..= poolId),
+            Prelude.Just
+              ("OriginationIdentity" Data..= originationIdentity),
+            Prelude.Just
+              ("IsoCountryCode" Data..= isoCountryCode)
+          ]
+      )
+
+instance Data.ToPath DisassociateOriginationIdentity where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DisassociateOriginationIdentity where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDisassociateOriginationIdentityResponse' smart constructor.
+data DisassociateOriginationIdentityResponse = DisassociateOriginationIdentityResponse'
+  { -- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+    -- region.
+    isoCountryCode :: Prelude.Maybe Prelude.Text,
+    -- | The PhoneNumberId or SenderId of the origination identity.
+    originationIdentity :: Prelude.Maybe Prelude.Text,
+    -- | The PhoneNumberArn or SenderIdArn of the origination identity.
+    originationIdentityArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the pool.
+    poolArn :: Prelude.Maybe Prelude.Text,
+    -- | The PoolId of the pool no longer associated with the origination
+    -- identity.
+    poolId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DisassociateOriginationIdentityResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'isoCountryCode', 'disassociateOriginationIdentityResponse_isoCountryCode' - The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+--
+-- 'originationIdentity', 'disassociateOriginationIdentityResponse_originationIdentity' - The PhoneNumberId or SenderId of the origination identity.
+--
+-- 'originationIdentityArn', 'disassociateOriginationIdentityResponse_originationIdentityArn' - The PhoneNumberArn or SenderIdArn of the origination identity.
+--
+-- 'poolArn', 'disassociateOriginationIdentityResponse_poolArn' - The Amazon Resource Name (ARN) of the pool.
+--
+-- 'poolId', 'disassociateOriginationIdentityResponse_poolId' - The PoolId of the pool no longer associated with the origination
+-- identity.
+--
+-- 'httpStatus', 'disassociateOriginationIdentityResponse_httpStatus' - The response's http status code.
+newDisassociateOriginationIdentityResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DisassociateOriginationIdentityResponse
+newDisassociateOriginationIdentityResponse
+  pHttpStatus_ =
+    DisassociateOriginationIdentityResponse'
+      { isoCountryCode =
+          Prelude.Nothing,
+        originationIdentity =
+          Prelude.Nothing,
+        originationIdentityArn =
+          Prelude.Nothing,
+        poolArn = Prelude.Nothing,
+        poolId = Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+disassociateOriginationIdentityResponse_isoCountryCode :: Lens.Lens' DisassociateOriginationIdentityResponse (Prelude.Maybe Prelude.Text)
+disassociateOriginationIdentityResponse_isoCountryCode = Lens.lens (\DisassociateOriginationIdentityResponse' {isoCountryCode} -> isoCountryCode) (\s@DisassociateOriginationIdentityResponse' {} a -> s {isoCountryCode = a} :: DisassociateOriginationIdentityResponse)
+
+-- | The PhoneNumberId or SenderId of the origination identity.
+disassociateOriginationIdentityResponse_originationIdentity :: Lens.Lens' DisassociateOriginationIdentityResponse (Prelude.Maybe Prelude.Text)
+disassociateOriginationIdentityResponse_originationIdentity = Lens.lens (\DisassociateOriginationIdentityResponse' {originationIdentity} -> originationIdentity) (\s@DisassociateOriginationIdentityResponse' {} a -> s {originationIdentity = a} :: DisassociateOriginationIdentityResponse)
+
+-- | The PhoneNumberArn or SenderIdArn of the origination identity.
+disassociateOriginationIdentityResponse_originationIdentityArn :: Lens.Lens' DisassociateOriginationIdentityResponse (Prelude.Maybe Prelude.Text)
+disassociateOriginationIdentityResponse_originationIdentityArn = Lens.lens (\DisassociateOriginationIdentityResponse' {originationIdentityArn} -> originationIdentityArn) (\s@DisassociateOriginationIdentityResponse' {} a -> s {originationIdentityArn = a} :: DisassociateOriginationIdentityResponse)
+
+-- | The Amazon Resource Name (ARN) of the pool.
+disassociateOriginationIdentityResponse_poolArn :: Lens.Lens' DisassociateOriginationIdentityResponse (Prelude.Maybe Prelude.Text)
+disassociateOriginationIdentityResponse_poolArn = Lens.lens (\DisassociateOriginationIdentityResponse' {poolArn} -> poolArn) (\s@DisassociateOriginationIdentityResponse' {} a -> s {poolArn = a} :: DisassociateOriginationIdentityResponse)
+
+-- | The PoolId of the pool no longer associated with the origination
+-- identity.
+disassociateOriginationIdentityResponse_poolId :: Lens.Lens' DisassociateOriginationIdentityResponse (Prelude.Maybe Prelude.Text)
+disassociateOriginationIdentityResponse_poolId = Lens.lens (\DisassociateOriginationIdentityResponse' {poolId} -> poolId) (\s@DisassociateOriginationIdentityResponse' {} a -> s {poolId = a} :: DisassociateOriginationIdentityResponse)
+
+-- | The response's http status code.
+disassociateOriginationIdentityResponse_httpStatus :: Lens.Lens' DisassociateOriginationIdentityResponse Prelude.Int
+disassociateOriginationIdentityResponse_httpStatus = Lens.lens (\DisassociateOriginationIdentityResponse' {httpStatus} -> httpStatus) (\s@DisassociateOriginationIdentityResponse' {} a -> s {httpStatus = a} :: DisassociateOriginationIdentityResponse)
+
+instance
+  Prelude.NFData
+    DisassociateOriginationIdentityResponse
+  where
+  rnf DisassociateOriginationIdentityResponse' {..} =
+    Prelude.rnf isoCountryCode
+      `Prelude.seq` Prelude.rnf originationIdentity
+      `Prelude.seq` Prelude.rnf originationIdentityArn
+      `Prelude.seq` Prelude.rnf poolArn
+      `Prelude.seq` Prelude.rnf poolId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Lens.hs b/gen/Amazonka/PinpointSmsVoiceV2/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Lens.hs
@@ -0,0 +1,682 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Lens
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Lens
+  ( -- * Operations
+
+    -- ** AssociateOriginationIdentity
+    associateOriginationIdentity_clientToken,
+    associateOriginationIdentity_poolId,
+    associateOriginationIdentity_originationIdentity,
+    associateOriginationIdentity_isoCountryCode,
+    associateOriginationIdentityResponse_isoCountryCode,
+    associateOriginationIdentityResponse_originationIdentity,
+    associateOriginationIdentityResponse_originationIdentityArn,
+    associateOriginationIdentityResponse_poolArn,
+    associateOriginationIdentityResponse_poolId,
+    associateOriginationIdentityResponse_httpStatus,
+
+    -- ** CreateConfigurationSet
+    createConfigurationSet_clientToken,
+    createConfigurationSet_tags,
+    createConfigurationSet_configurationSetName,
+    createConfigurationSetResponse_configurationSetArn,
+    createConfigurationSetResponse_configurationSetName,
+    createConfigurationSetResponse_createdTimestamp,
+    createConfigurationSetResponse_tags,
+    createConfigurationSetResponse_httpStatus,
+
+    -- ** CreateEventDestination
+    createEventDestination_clientToken,
+    createEventDestination_cloudWatchLogsDestination,
+    createEventDestination_kinesisFirehoseDestination,
+    createEventDestination_snsDestination,
+    createEventDestination_configurationSetName,
+    createEventDestination_eventDestinationName,
+    createEventDestination_matchingEventTypes,
+    createEventDestinationResponse_configurationSetArn,
+    createEventDestinationResponse_configurationSetName,
+    createEventDestinationResponse_eventDestination,
+    createEventDestinationResponse_httpStatus,
+
+    -- ** CreateOptOutList
+    createOptOutList_clientToken,
+    createOptOutList_tags,
+    createOptOutList_optOutListName,
+    createOptOutListResponse_createdTimestamp,
+    createOptOutListResponse_optOutListArn,
+    createOptOutListResponse_optOutListName,
+    createOptOutListResponse_tags,
+    createOptOutListResponse_httpStatus,
+
+    -- ** CreatePool
+    createPool_clientToken,
+    createPool_deletionProtectionEnabled,
+    createPool_tags,
+    createPool_originationIdentity,
+    createPool_isoCountryCode,
+    createPool_messageType,
+    createPoolResponse_createdTimestamp,
+    createPoolResponse_deletionProtectionEnabled,
+    createPoolResponse_messageType,
+    createPoolResponse_optOutListName,
+    createPoolResponse_poolArn,
+    createPoolResponse_poolId,
+    createPoolResponse_selfManagedOptOutsEnabled,
+    createPoolResponse_sharedRoutesEnabled,
+    createPoolResponse_status,
+    createPoolResponse_tags,
+    createPoolResponse_twoWayChannelArn,
+    createPoolResponse_twoWayEnabled,
+    createPoolResponse_httpStatus,
+
+    -- ** DeleteConfigurationSet
+    deleteConfigurationSet_configurationSetName,
+    deleteConfigurationSetResponse_configurationSetArn,
+    deleteConfigurationSetResponse_configurationSetName,
+    deleteConfigurationSetResponse_createdTimestamp,
+    deleteConfigurationSetResponse_defaultMessageType,
+    deleteConfigurationSetResponse_defaultSenderId,
+    deleteConfigurationSetResponse_eventDestinations,
+    deleteConfigurationSetResponse_httpStatus,
+
+    -- ** DeleteDefaultMessageType
+    deleteDefaultMessageType_configurationSetName,
+    deleteDefaultMessageTypeResponse_configurationSetArn,
+    deleteDefaultMessageTypeResponse_configurationSetName,
+    deleteDefaultMessageTypeResponse_messageType,
+    deleteDefaultMessageTypeResponse_httpStatus,
+
+    -- ** DeleteDefaultSenderId
+    deleteDefaultSenderId_configurationSetName,
+    deleteDefaultSenderIdResponse_configurationSetArn,
+    deleteDefaultSenderIdResponse_configurationSetName,
+    deleteDefaultSenderIdResponse_senderId,
+    deleteDefaultSenderIdResponse_httpStatus,
+
+    -- ** DeleteEventDestination
+    deleteEventDestination_configurationSetName,
+    deleteEventDestination_eventDestinationName,
+    deleteEventDestinationResponse_configurationSetArn,
+    deleteEventDestinationResponse_configurationSetName,
+    deleteEventDestinationResponse_eventDestination,
+    deleteEventDestinationResponse_httpStatus,
+
+    -- ** DeleteKeyword
+    deleteKeyword_originationIdentity,
+    deleteKeyword_keyword,
+    deleteKeywordResponse_keyword,
+    deleteKeywordResponse_keywordAction,
+    deleteKeywordResponse_keywordMessage,
+    deleteKeywordResponse_originationIdentity,
+    deleteKeywordResponse_originationIdentityArn,
+    deleteKeywordResponse_httpStatus,
+
+    -- ** DeleteOptOutList
+    deleteOptOutList_optOutListName,
+    deleteOptOutListResponse_createdTimestamp,
+    deleteOptOutListResponse_optOutListArn,
+    deleteOptOutListResponse_optOutListName,
+    deleteOptOutListResponse_httpStatus,
+
+    -- ** DeleteOptedOutNumber
+    deleteOptedOutNumber_optOutListName,
+    deleteOptedOutNumber_optedOutNumber,
+    deleteOptedOutNumberResponse_endUserOptedOut,
+    deleteOptedOutNumberResponse_optOutListArn,
+    deleteOptedOutNumberResponse_optOutListName,
+    deleteOptedOutNumberResponse_optedOutNumber,
+    deleteOptedOutNumberResponse_optedOutTimestamp,
+    deleteOptedOutNumberResponse_httpStatus,
+
+    -- ** DeletePool
+    deletePool_poolId,
+    deletePoolResponse_createdTimestamp,
+    deletePoolResponse_messageType,
+    deletePoolResponse_optOutListName,
+    deletePoolResponse_poolArn,
+    deletePoolResponse_poolId,
+    deletePoolResponse_selfManagedOptOutsEnabled,
+    deletePoolResponse_sharedRoutesEnabled,
+    deletePoolResponse_status,
+    deletePoolResponse_twoWayChannelArn,
+    deletePoolResponse_twoWayEnabled,
+    deletePoolResponse_httpStatus,
+
+    -- ** DeleteTextMessageSpendLimitOverride
+    deleteTextMessageSpendLimitOverrideResponse_monthlyLimit,
+    deleteTextMessageSpendLimitOverrideResponse_httpStatus,
+
+    -- ** DeleteVoiceMessageSpendLimitOverride
+    deleteVoiceMessageSpendLimitOverrideResponse_monthlyLimit,
+    deleteVoiceMessageSpendLimitOverrideResponse_httpStatus,
+
+    -- ** DescribeAccountAttributes
+    describeAccountAttributes_maxResults,
+    describeAccountAttributes_nextToken,
+    describeAccountAttributesResponse_accountAttributes,
+    describeAccountAttributesResponse_nextToken,
+    describeAccountAttributesResponse_httpStatus,
+
+    -- ** DescribeAccountLimits
+    describeAccountLimits_maxResults,
+    describeAccountLimits_nextToken,
+    describeAccountLimitsResponse_accountLimits,
+    describeAccountLimitsResponse_nextToken,
+    describeAccountLimitsResponse_httpStatus,
+
+    -- ** DescribeConfigurationSets
+    describeConfigurationSets_configurationSetNames,
+    describeConfigurationSets_filters,
+    describeConfigurationSets_maxResults,
+    describeConfigurationSets_nextToken,
+    describeConfigurationSetsResponse_configurationSets,
+    describeConfigurationSetsResponse_nextToken,
+    describeConfigurationSetsResponse_httpStatus,
+
+    -- ** DescribeKeywords
+    describeKeywords_filters,
+    describeKeywords_keywords,
+    describeKeywords_maxResults,
+    describeKeywords_nextToken,
+    describeKeywords_originationIdentity,
+    describeKeywordsResponse_keywords,
+    describeKeywordsResponse_nextToken,
+    describeKeywordsResponse_originationIdentity,
+    describeKeywordsResponse_originationIdentityArn,
+    describeKeywordsResponse_httpStatus,
+
+    -- ** DescribeOptOutLists
+    describeOptOutLists_maxResults,
+    describeOptOutLists_nextToken,
+    describeOptOutLists_optOutListNames,
+    describeOptOutListsResponse_nextToken,
+    describeOptOutListsResponse_optOutLists,
+    describeOptOutListsResponse_httpStatus,
+
+    -- ** DescribeOptedOutNumbers
+    describeOptedOutNumbers_filters,
+    describeOptedOutNumbers_maxResults,
+    describeOptedOutNumbers_nextToken,
+    describeOptedOutNumbers_optedOutNumbers,
+    describeOptedOutNumbers_optOutListName,
+    describeOptedOutNumbersResponse_nextToken,
+    describeOptedOutNumbersResponse_optOutListArn,
+    describeOptedOutNumbersResponse_optOutListName,
+    describeOptedOutNumbersResponse_optedOutNumbers,
+    describeOptedOutNumbersResponse_httpStatus,
+
+    -- ** DescribePhoneNumbers
+    describePhoneNumbers_filters,
+    describePhoneNumbers_maxResults,
+    describePhoneNumbers_nextToken,
+    describePhoneNumbers_phoneNumberIds,
+    describePhoneNumbersResponse_nextToken,
+    describePhoneNumbersResponse_phoneNumbers,
+    describePhoneNumbersResponse_httpStatus,
+
+    -- ** DescribePools
+    describePools_filters,
+    describePools_maxResults,
+    describePools_nextToken,
+    describePools_poolIds,
+    describePoolsResponse_nextToken,
+    describePoolsResponse_pools,
+    describePoolsResponse_httpStatus,
+
+    -- ** DescribeSenderIds
+    describeSenderIds_filters,
+    describeSenderIds_maxResults,
+    describeSenderIds_nextToken,
+    describeSenderIds_senderIds,
+    describeSenderIdsResponse_nextToken,
+    describeSenderIdsResponse_senderIds,
+    describeSenderIdsResponse_httpStatus,
+
+    -- ** DescribeSpendLimits
+    describeSpendLimits_maxResults,
+    describeSpendLimits_nextToken,
+    describeSpendLimitsResponse_nextToken,
+    describeSpendLimitsResponse_spendLimits,
+    describeSpendLimitsResponse_httpStatus,
+
+    -- ** DisassociateOriginationIdentity
+    disassociateOriginationIdentity_clientToken,
+    disassociateOriginationIdentity_poolId,
+    disassociateOriginationIdentity_originationIdentity,
+    disassociateOriginationIdentity_isoCountryCode,
+    disassociateOriginationIdentityResponse_isoCountryCode,
+    disassociateOriginationIdentityResponse_originationIdentity,
+    disassociateOriginationIdentityResponse_originationIdentityArn,
+    disassociateOriginationIdentityResponse_poolArn,
+    disassociateOriginationIdentityResponse_poolId,
+    disassociateOriginationIdentityResponse_httpStatus,
+
+    -- ** ListPoolOriginationIdentities
+    listPoolOriginationIdentities_filters,
+    listPoolOriginationIdentities_maxResults,
+    listPoolOriginationIdentities_nextToken,
+    listPoolOriginationIdentities_poolId,
+    listPoolOriginationIdentitiesResponse_nextToken,
+    listPoolOriginationIdentitiesResponse_originationIdentities,
+    listPoolOriginationIdentitiesResponse_poolArn,
+    listPoolOriginationIdentitiesResponse_poolId,
+    listPoolOriginationIdentitiesResponse_httpStatus,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_resourceArn,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** PutKeyword
+    putKeyword_keywordAction,
+    putKeyword_originationIdentity,
+    putKeyword_keyword,
+    putKeyword_keywordMessage,
+    putKeywordResponse_keyword,
+    putKeywordResponse_keywordAction,
+    putKeywordResponse_keywordMessage,
+    putKeywordResponse_originationIdentity,
+    putKeywordResponse_originationIdentityArn,
+    putKeywordResponse_httpStatus,
+
+    -- ** PutOptedOutNumber
+    putOptedOutNumber_optOutListName,
+    putOptedOutNumber_optedOutNumber,
+    putOptedOutNumberResponse_endUserOptedOut,
+    putOptedOutNumberResponse_optOutListArn,
+    putOptedOutNumberResponse_optOutListName,
+    putOptedOutNumberResponse_optedOutNumber,
+    putOptedOutNumberResponse_optedOutTimestamp,
+    putOptedOutNumberResponse_httpStatus,
+
+    -- ** ReleasePhoneNumber
+    releasePhoneNumber_phoneNumberId,
+    releasePhoneNumberResponse_createdTimestamp,
+    releasePhoneNumberResponse_isoCountryCode,
+    releasePhoneNumberResponse_messageType,
+    releasePhoneNumberResponse_monthlyLeasingPrice,
+    releasePhoneNumberResponse_numberCapabilities,
+    releasePhoneNumberResponse_numberType,
+    releasePhoneNumberResponse_optOutListName,
+    releasePhoneNumberResponse_phoneNumber,
+    releasePhoneNumberResponse_phoneNumberArn,
+    releasePhoneNumberResponse_phoneNumberId,
+    releasePhoneNumberResponse_selfManagedOptOutsEnabled,
+    releasePhoneNumberResponse_status,
+    releasePhoneNumberResponse_twoWayChannelArn,
+    releasePhoneNumberResponse_twoWayEnabled,
+    releasePhoneNumberResponse_httpStatus,
+
+    -- ** RequestPhoneNumber
+    requestPhoneNumber_clientToken,
+    requestPhoneNumber_deletionProtectionEnabled,
+    requestPhoneNumber_optOutListName,
+    requestPhoneNumber_poolId,
+    requestPhoneNumber_registrationId,
+    requestPhoneNumber_tags,
+    requestPhoneNumber_isoCountryCode,
+    requestPhoneNumber_messageType,
+    requestPhoneNumber_numberCapabilities,
+    requestPhoneNumber_numberType,
+    requestPhoneNumberResponse_createdTimestamp,
+    requestPhoneNumberResponse_deletionProtectionEnabled,
+    requestPhoneNumberResponse_isoCountryCode,
+    requestPhoneNumberResponse_messageType,
+    requestPhoneNumberResponse_monthlyLeasingPrice,
+    requestPhoneNumberResponse_numberCapabilities,
+    requestPhoneNumberResponse_numberType,
+    requestPhoneNumberResponse_optOutListName,
+    requestPhoneNumberResponse_phoneNumber,
+    requestPhoneNumberResponse_phoneNumberArn,
+    requestPhoneNumberResponse_phoneNumberId,
+    requestPhoneNumberResponse_poolId,
+    requestPhoneNumberResponse_selfManagedOptOutsEnabled,
+    requestPhoneNumberResponse_status,
+    requestPhoneNumberResponse_tags,
+    requestPhoneNumberResponse_twoWayChannelArn,
+    requestPhoneNumberResponse_twoWayEnabled,
+    requestPhoneNumberResponse_httpStatus,
+
+    -- ** SendTextMessage
+    sendTextMessage_configurationSetName,
+    sendTextMessage_context,
+    sendTextMessage_destinationCountryParameters,
+    sendTextMessage_dryRun,
+    sendTextMessage_keyword,
+    sendTextMessage_maxPrice,
+    sendTextMessage_messageBody,
+    sendTextMessage_messageType,
+    sendTextMessage_originationIdentity,
+    sendTextMessage_timeToLive,
+    sendTextMessage_destinationPhoneNumber,
+    sendTextMessageResponse_messageId,
+    sendTextMessageResponse_httpStatus,
+
+    -- ** SendVoiceMessage
+    sendVoiceMessage_configurationSetName,
+    sendVoiceMessage_context,
+    sendVoiceMessage_dryRun,
+    sendVoiceMessage_maxPricePerMinute,
+    sendVoiceMessage_messageBody,
+    sendVoiceMessage_messageBodyTextType,
+    sendVoiceMessage_timeToLive,
+    sendVoiceMessage_voiceId,
+    sendVoiceMessage_destinationPhoneNumber,
+    sendVoiceMessage_originationIdentity,
+    sendVoiceMessageResponse_messageId,
+    sendVoiceMessageResponse_httpStatus,
+
+    -- ** SetDefaultMessageType
+    setDefaultMessageType_configurationSetName,
+    setDefaultMessageType_messageType,
+    setDefaultMessageTypeResponse_configurationSetArn,
+    setDefaultMessageTypeResponse_configurationSetName,
+    setDefaultMessageTypeResponse_messageType,
+    setDefaultMessageTypeResponse_httpStatus,
+
+    -- ** SetDefaultSenderId
+    setDefaultSenderId_configurationSetName,
+    setDefaultSenderId_senderId,
+    setDefaultSenderIdResponse_configurationSetArn,
+    setDefaultSenderIdResponse_configurationSetName,
+    setDefaultSenderIdResponse_senderId,
+    setDefaultSenderIdResponse_httpStatus,
+
+    -- ** SetTextMessageSpendLimitOverride
+    setTextMessageSpendLimitOverride_monthlyLimit,
+    setTextMessageSpendLimitOverrideResponse_monthlyLimit,
+    setTextMessageSpendLimitOverrideResponse_httpStatus,
+
+    -- ** SetVoiceMessageSpendLimitOverride
+    setVoiceMessageSpendLimitOverride_monthlyLimit,
+    setVoiceMessageSpendLimitOverrideResponse_monthlyLimit,
+    setVoiceMessageSpendLimitOverrideResponse_httpStatus,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateEventDestination
+    updateEventDestination_cloudWatchLogsDestination,
+    updateEventDestination_enabled,
+    updateEventDestination_kinesisFirehoseDestination,
+    updateEventDestination_matchingEventTypes,
+    updateEventDestination_snsDestination,
+    updateEventDestination_configurationSetName,
+    updateEventDestination_eventDestinationName,
+    updateEventDestinationResponse_configurationSetArn,
+    updateEventDestinationResponse_configurationSetName,
+    updateEventDestinationResponse_eventDestination,
+    updateEventDestinationResponse_httpStatus,
+
+    -- ** UpdatePhoneNumber
+    updatePhoneNumber_deletionProtectionEnabled,
+    updatePhoneNumber_optOutListName,
+    updatePhoneNumber_selfManagedOptOutsEnabled,
+    updatePhoneNumber_twoWayChannelArn,
+    updatePhoneNumber_twoWayEnabled,
+    updatePhoneNumber_phoneNumberId,
+    updatePhoneNumberResponse_createdTimestamp,
+    updatePhoneNumberResponse_deletionProtectionEnabled,
+    updatePhoneNumberResponse_isoCountryCode,
+    updatePhoneNumberResponse_messageType,
+    updatePhoneNumberResponse_monthlyLeasingPrice,
+    updatePhoneNumberResponse_numberCapabilities,
+    updatePhoneNumberResponse_numberType,
+    updatePhoneNumberResponse_optOutListName,
+    updatePhoneNumberResponse_phoneNumber,
+    updatePhoneNumberResponse_phoneNumberArn,
+    updatePhoneNumberResponse_phoneNumberId,
+    updatePhoneNumberResponse_selfManagedOptOutsEnabled,
+    updatePhoneNumberResponse_status,
+    updatePhoneNumberResponse_twoWayChannelArn,
+    updatePhoneNumberResponse_twoWayEnabled,
+    updatePhoneNumberResponse_httpStatus,
+
+    -- ** UpdatePool
+    updatePool_deletionProtectionEnabled,
+    updatePool_optOutListName,
+    updatePool_selfManagedOptOutsEnabled,
+    updatePool_sharedRoutesEnabled,
+    updatePool_twoWayChannelArn,
+    updatePool_twoWayEnabled,
+    updatePool_poolId,
+    updatePoolResponse_createdTimestamp,
+    updatePoolResponse_deletionProtectionEnabled,
+    updatePoolResponse_messageType,
+    updatePoolResponse_optOutListName,
+    updatePoolResponse_poolArn,
+    updatePoolResponse_poolId,
+    updatePoolResponse_selfManagedOptOutsEnabled,
+    updatePoolResponse_sharedRoutesEnabled,
+    updatePoolResponse_status,
+    updatePoolResponse_twoWayChannelArn,
+    updatePoolResponse_twoWayEnabled,
+    updatePoolResponse_httpStatus,
+
+    -- * Types
+
+    -- ** AccountAttribute
+    accountAttribute_name,
+    accountAttribute_value,
+
+    -- ** AccountLimit
+    accountLimit_name,
+    accountLimit_used,
+    accountLimit_max,
+
+    -- ** CloudWatchLogsDestination
+    cloudWatchLogsDestination_iamRoleArn,
+    cloudWatchLogsDestination_logGroupArn,
+
+    -- ** ConfigurationSetFilter
+    configurationSetFilter_name,
+    configurationSetFilter_values,
+
+    -- ** ConfigurationSetInformation
+    configurationSetInformation_defaultMessageType,
+    configurationSetInformation_defaultSenderId,
+    configurationSetInformation_configurationSetArn,
+    configurationSetInformation_configurationSetName,
+    configurationSetInformation_eventDestinations,
+    configurationSetInformation_createdTimestamp,
+
+    -- ** EventDestination
+    eventDestination_cloudWatchLogsDestination,
+    eventDestination_kinesisFirehoseDestination,
+    eventDestination_snsDestination,
+    eventDestination_eventDestinationName,
+    eventDestination_enabled,
+    eventDestination_matchingEventTypes,
+
+    -- ** KeywordFilter
+    keywordFilter_name,
+    keywordFilter_values,
+
+    -- ** KeywordInformation
+    keywordInformation_keyword,
+    keywordInformation_keywordMessage,
+    keywordInformation_keywordAction,
+
+    -- ** KinesisFirehoseDestination
+    kinesisFirehoseDestination_iamRoleArn,
+    kinesisFirehoseDestination_deliveryStreamArn,
+
+    -- ** OptOutListInformation
+    optOutListInformation_optOutListArn,
+    optOutListInformation_optOutListName,
+    optOutListInformation_createdTimestamp,
+
+    -- ** OptedOutFilter
+    optedOutFilter_name,
+    optedOutFilter_values,
+
+    -- ** OptedOutNumberInformation
+    optedOutNumberInformation_optedOutNumber,
+    optedOutNumberInformation_optedOutTimestamp,
+    optedOutNumberInformation_endUserOptedOut,
+
+    -- ** OriginationIdentityMetadata
+    originationIdentityMetadata_originationIdentityArn,
+    originationIdentityMetadata_originationIdentity,
+    originationIdentityMetadata_isoCountryCode,
+    originationIdentityMetadata_numberCapabilities,
+
+    -- ** PhoneNumberFilter
+    phoneNumberFilter_name,
+    phoneNumberFilter_values,
+
+    -- ** PhoneNumberInformation
+    phoneNumberInformation_phoneNumberId,
+    phoneNumberInformation_poolId,
+    phoneNumberInformation_twoWayChannelArn,
+    phoneNumberInformation_phoneNumberArn,
+    phoneNumberInformation_phoneNumber,
+    phoneNumberInformation_status,
+    phoneNumberInformation_isoCountryCode,
+    phoneNumberInformation_messageType,
+    phoneNumberInformation_numberCapabilities,
+    phoneNumberInformation_numberType,
+    phoneNumberInformation_monthlyLeasingPrice,
+    phoneNumberInformation_twoWayEnabled,
+    phoneNumberInformation_selfManagedOptOutsEnabled,
+    phoneNumberInformation_optOutListName,
+    phoneNumberInformation_deletionProtectionEnabled,
+    phoneNumberInformation_createdTimestamp,
+
+    -- ** PoolFilter
+    poolFilter_name,
+    poolFilter_values,
+
+    -- ** PoolInformation
+    poolInformation_twoWayChannelArn,
+    poolInformation_poolArn,
+    poolInformation_poolId,
+    poolInformation_status,
+    poolInformation_messageType,
+    poolInformation_twoWayEnabled,
+    poolInformation_selfManagedOptOutsEnabled,
+    poolInformation_optOutListName,
+    poolInformation_sharedRoutesEnabled,
+    poolInformation_deletionProtectionEnabled,
+    poolInformation_createdTimestamp,
+
+    -- ** PoolOriginationIdentitiesFilter
+    poolOriginationIdentitiesFilter_name,
+    poolOriginationIdentitiesFilter_values,
+
+    -- ** SenderIdAndCountry
+    senderIdAndCountry_senderId,
+    senderIdAndCountry_isoCountryCode,
+
+    -- ** SenderIdFilter
+    senderIdFilter_name,
+    senderIdFilter_values,
+
+    -- ** SenderIdInformation
+    senderIdInformation_senderIdArn,
+    senderIdInformation_senderId,
+    senderIdInformation_isoCountryCode,
+    senderIdInformation_messageTypes,
+    senderIdInformation_monthlyLeasingPrice,
+
+    -- ** SnsDestination
+    snsDestination_topicArn,
+
+    -- ** SpendLimit
+    spendLimit_name,
+    spendLimit_enforcedLimit,
+    spendLimit_maxLimit,
+    spendLimit_overridden,
+
+    -- ** Tag
+    tag_key,
+    tag_value,
+  )
+where
+
+import Amazonka.PinpointSmsVoiceV2.AssociateOriginationIdentity
+import Amazonka.PinpointSmsVoiceV2.CreateConfigurationSet
+import Amazonka.PinpointSmsVoiceV2.CreateEventDestination
+import Amazonka.PinpointSmsVoiceV2.CreateOptOutList
+import Amazonka.PinpointSmsVoiceV2.CreatePool
+import Amazonka.PinpointSmsVoiceV2.DeleteConfigurationSet
+import Amazonka.PinpointSmsVoiceV2.DeleteDefaultMessageType
+import Amazonka.PinpointSmsVoiceV2.DeleteDefaultSenderId
+import Amazonka.PinpointSmsVoiceV2.DeleteEventDestination
+import Amazonka.PinpointSmsVoiceV2.DeleteKeyword
+import Amazonka.PinpointSmsVoiceV2.DeleteOptOutList
+import Amazonka.PinpointSmsVoiceV2.DeleteOptedOutNumber
+import Amazonka.PinpointSmsVoiceV2.DeletePool
+import Amazonka.PinpointSmsVoiceV2.DeleteTextMessageSpendLimitOverride
+import Amazonka.PinpointSmsVoiceV2.DeleteVoiceMessageSpendLimitOverride
+import Amazonka.PinpointSmsVoiceV2.DescribeAccountAttributes
+import Amazonka.PinpointSmsVoiceV2.DescribeAccountLimits
+import Amazonka.PinpointSmsVoiceV2.DescribeConfigurationSets
+import Amazonka.PinpointSmsVoiceV2.DescribeKeywords
+import Amazonka.PinpointSmsVoiceV2.DescribeOptOutLists
+import Amazonka.PinpointSmsVoiceV2.DescribeOptedOutNumbers
+import Amazonka.PinpointSmsVoiceV2.DescribePhoneNumbers
+import Amazonka.PinpointSmsVoiceV2.DescribePools
+import Amazonka.PinpointSmsVoiceV2.DescribeSenderIds
+import Amazonka.PinpointSmsVoiceV2.DescribeSpendLimits
+import Amazonka.PinpointSmsVoiceV2.DisassociateOriginationIdentity
+import Amazonka.PinpointSmsVoiceV2.ListPoolOriginationIdentities
+import Amazonka.PinpointSmsVoiceV2.ListTagsForResource
+import Amazonka.PinpointSmsVoiceV2.PutKeyword
+import Amazonka.PinpointSmsVoiceV2.PutOptedOutNumber
+import Amazonka.PinpointSmsVoiceV2.ReleasePhoneNumber
+import Amazonka.PinpointSmsVoiceV2.RequestPhoneNumber
+import Amazonka.PinpointSmsVoiceV2.SendTextMessage
+import Amazonka.PinpointSmsVoiceV2.SendVoiceMessage
+import Amazonka.PinpointSmsVoiceV2.SetDefaultMessageType
+import Amazonka.PinpointSmsVoiceV2.SetDefaultSenderId
+import Amazonka.PinpointSmsVoiceV2.SetTextMessageSpendLimitOverride
+import Amazonka.PinpointSmsVoiceV2.SetVoiceMessageSpendLimitOverride
+import Amazonka.PinpointSmsVoiceV2.TagResource
+import Amazonka.PinpointSmsVoiceV2.Types.AccountAttribute
+import Amazonka.PinpointSmsVoiceV2.Types.AccountLimit
+import Amazonka.PinpointSmsVoiceV2.Types.CloudWatchLogsDestination
+import Amazonka.PinpointSmsVoiceV2.Types.ConfigurationSetFilter
+import Amazonka.PinpointSmsVoiceV2.Types.ConfigurationSetInformation
+import Amazonka.PinpointSmsVoiceV2.Types.EventDestination
+import Amazonka.PinpointSmsVoiceV2.Types.KeywordFilter
+import Amazonka.PinpointSmsVoiceV2.Types.KeywordInformation
+import Amazonka.PinpointSmsVoiceV2.Types.KinesisFirehoseDestination
+import Amazonka.PinpointSmsVoiceV2.Types.OptOutListInformation
+import Amazonka.PinpointSmsVoiceV2.Types.OptedOutFilter
+import Amazonka.PinpointSmsVoiceV2.Types.OptedOutNumberInformation
+import Amazonka.PinpointSmsVoiceV2.Types.OriginationIdentityMetadata
+import Amazonka.PinpointSmsVoiceV2.Types.PhoneNumberFilter
+import Amazonka.PinpointSmsVoiceV2.Types.PhoneNumberInformation
+import Amazonka.PinpointSmsVoiceV2.Types.PoolFilter
+import Amazonka.PinpointSmsVoiceV2.Types.PoolInformation
+import Amazonka.PinpointSmsVoiceV2.Types.PoolOriginationIdentitiesFilter
+import Amazonka.PinpointSmsVoiceV2.Types.SenderIdAndCountry
+import Amazonka.PinpointSmsVoiceV2.Types.SenderIdFilter
+import Amazonka.PinpointSmsVoiceV2.Types.SenderIdInformation
+import Amazonka.PinpointSmsVoiceV2.Types.SnsDestination
+import Amazonka.PinpointSmsVoiceV2.Types.SpendLimit
+import Amazonka.PinpointSmsVoiceV2.Types.Tag
+import Amazonka.PinpointSmsVoiceV2.UntagResource
+import Amazonka.PinpointSmsVoiceV2.UpdateEventDestination
+import Amazonka.PinpointSmsVoiceV2.UpdatePhoneNumber
+import Amazonka.PinpointSmsVoiceV2.UpdatePool
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/ListPoolOriginationIdentities.hs b/gen/Amazonka/PinpointSmsVoiceV2/ListPoolOriginationIdentities.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/ListPoolOriginationIdentities.hs
@@ -0,0 +1,301 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.ListPoolOriginationIdentities
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all associated origination identities in your pool.
+--
+-- If you specify filters, the output includes information for only those
+-- origination identities that meet the filter criteria.
+--
+-- This operation returns paginated results.
+module Amazonka.PinpointSmsVoiceV2.ListPoolOriginationIdentities
+  ( -- * Creating a Request
+    ListPoolOriginationIdentities (..),
+    newListPoolOriginationIdentities,
+
+    -- * Request Lenses
+    listPoolOriginationIdentities_filters,
+    listPoolOriginationIdentities_maxResults,
+    listPoolOriginationIdentities_nextToken,
+    listPoolOriginationIdentities_poolId,
+
+    -- * Destructuring the Response
+    ListPoolOriginationIdentitiesResponse (..),
+    newListPoolOriginationIdentitiesResponse,
+
+    -- * Response Lenses
+    listPoolOriginationIdentitiesResponse_nextToken,
+    listPoolOriginationIdentitiesResponse_originationIdentities,
+    listPoolOriginationIdentitiesResponse_poolArn,
+    listPoolOriginationIdentitiesResponse_poolId,
+    listPoolOriginationIdentitiesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListPoolOriginationIdentities' smart constructor.
+data ListPoolOriginationIdentities = ListPoolOriginationIdentities'
+  { -- | An array of PoolOriginationIdentitiesFilter objects to filter the
+    -- results..
+    filters :: Prelude.Maybe [PoolOriginationIdentitiesFilter],
+    -- | The maximum number of results to return per each request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results. You don\'t
+    -- need to supply a value for this field in the initial request.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier for the pool. This value can be either the PoolId
+    -- or PoolArn.
+    poolId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPoolOriginationIdentities' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filters', 'listPoolOriginationIdentities_filters' - An array of PoolOriginationIdentitiesFilter objects to filter the
+-- results..
+--
+-- 'maxResults', 'listPoolOriginationIdentities_maxResults' - The maximum number of results to return per each request.
+--
+-- 'nextToken', 'listPoolOriginationIdentities_nextToken' - The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+--
+-- 'poolId', 'listPoolOriginationIdentities_poolId' - The unique identifier for the pool. This value can be either the PoolId
+-- or PoolArn.
+newListPoolOriginationIdentities ::
+  -- | 'poolId'
+  Prelude.Text ->
+  ListPoolOriginationIdentities
+newListPoolOriginationIdentities pPoolId_ =
+  ListPoolOriginationIdentities'
+    { filters =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      poolId = pPoolId_
+    }
+
+-- | An array of PoolOriginationIdentitiesFilter objects to filter the
+-- results..
+listPoolOriginationIdentities_filters :: Lens.Lens' ListPoolOriginationIdentities (Prelude.Maybe [PoolOriginationIdentitiesFilter])
+listPoolOriginationIdentities_filters = Lens.lens (\ListPoolOriginationIdentities' {filters} -> filters) (\s@ListPoolOriginationIdentities' {} a -> s {filters = a} :: ListPoolOriginationIdentities) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of results to return per each request.
+listPoolOriginationIdentities_maxResults :: Lens.Lens' ListPoolOriginationIdentities (Prelude.Maybe Prelude.Natural)
+listPoolOriginationIdentities_maxResults = Lens.lens (\ListPoolOriginationIdentities' {maxResults} -> maxResults) (\s@ListPoolOriginationIdentities' {} a -> s {maxResults = a} :: ListPoolOriginationIdentities)
+
+-- | The token to be used for the next set of paginated results. You don\'t
+-- need to supply a value for this field in the initial request.
+listPoolOriginationIdentities_nextToken :: Lens.Lens' ListPoolOriginationIdentities (Prelude.Maybe Prelude.Text)
+listPoolOriginationIdentities_nextToken = Lens.lens (\ListPoolOriginationIdentities' {nextToken} -> nextToken) (\s@ListPoolOriginationIdentities' {} a -> s {nextToken = a} :: ListPoolOriginationIdentities)
+
+-- | The unique identifier for the pool. This value can be either the PoolId
+-- or PoolArn.
+listPoolOriginationIdentities_poolId :: Lens.Lens' ListPoolOriginationIdentities Prelude.Text
+listPoolOriginationIdentities_poolId = Lens.lens (\ListPoolOriginationIdentities' {poolId} -> poolId) (\s@ListPoolOriginationIdentities' {} a -> s {poolId = a} :: ListPoolOriginationIdentities)
+
+instance Core.AWSPager ListPoolOriginationIdentities where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listPoolOriginationIdentitiesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listPoolOriginationIdentitiesResponse_originationIdentities
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listPoolOriginationIdentities_nextToken
+          Lens..~ rs
+          Lens.^? listPoolOriginationIdentitiesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance
+  Core.AWSRequest
+    ListPoolOriginationIdentities
+  where
+  type
+    AWSResponse ListPoolOriginationIdentities =
+      ListPoolOriginationIdentitiesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListPoolOriginationIdentitiesResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> ( x
+                            Data..?> "OriginationIdentities"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "PoolArn")
+            Prelude.<*> (x Data..?> "PoolId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    ListPoolOriginationIdentities
+  where
+  hashWithSalt _salt ListPoolOriginationIdentities' {..} =
+    _salt
+      `Prelude.hashWithSalt` filters
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` poolId
+
+instance Prelude.NFData ListPoolOriginationIdentities where
+  rnf ListPoolOriginationIdentities' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf poolId
+
+instance Data.ToHeaders ListPoolOriginationIdentities where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.ListPoolOriginationIdentities" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListPoolOriginationIdentities where
+  toJSON ListPoolOriginationIdentities' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Filters" Data..=) Prelude.<$> filters,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("PoolId" Data..= poolId)
+          ]
+      )
+
+instance Data.ToPath ListPoolOriginationIdentities where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListPoolOriginationIdentities where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListPoolOriginationIdentitiesResponse' smart constructor.
+data ListPoolOriginationIdentitiesResponse = ListPoolOriginationIdentitiesResponse'
+  { -- | The token to be used for the next set of paginated results. If this
+    -- field is empty then there are no more results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | An array of any OriginationIdentityMetadata objects.
+    originationIdentities :: Prelude.Maybe [OriginationIdentityMetadata],
+    -- | The Amazon Resource Name (ARN) for the pool.
+    poolArn :: Prelude.Maybe Prelude.Text,
+    -- | The unique PoolId of the pool.
+    poolId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPoolOriginationIdentitiesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listPoolOriginationIdentitiesResponse_nextToken' - The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+--
+-- 'originationIdentities', 'listPoolOriginationIdentitiesResponse_originationIdentities' - An array of any OriginationIdentityMetadata objects.
+--
+-- 'poolArn', 'listPoolOriginationIdentitiesResponse_poolArn' - The Amazon Resource Name (ARN) for the pool.
+--
+-- 'poolId', 'listPoolOriginationIdentitiesResponse_poolId' - The unique PoolId of the pool.
+--
+-- 'httpStatus', 'listPoolOriginationIdentitiesResponse_httpStatus' - The response's http status code.
+newListPoolOriginationIdentitiesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListPoolOriginationIdentitiesResponse
+newListPoolOriginationIdentitiesResponse pHttpStatus_ =
+  ListPoolOriginationIdentitiesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      originationIdentities =
+        Prelude.Nothing,
+      poolArn = Prelude.Nothing,
+      poolId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The token to be used for the next set of paginated results. If this
+-- field is empty then there are no more results.
+listPoolOriginationIdentitiesResponse_nextToken :: Lens.Lens' ListPoolOriginationIdentitiesResponse (Prelude.Maybe Prelude.Text)
+listPoolOriginationIdentitiesResponse_nextToken = Lens.lens (\ListPoolOriginationIdentitiesResponse' {nextToken} -> nextToken) (\s@ListPoolOriginationIdentitiesResponse' {} a -> s {nextToken = a} :: ListPoolOriginationIdentitiesResponse)
+
+-- | An array of any OriginationIdentityMetadata objects.
+listPoolOriginationIdentitiesResponse_originationIdentities :: Lens.Lens' ListPoolOriginationIdentitiesResponse (Prelude.Maybe [OriginationIdentityMetadata])
+listPoolOriginationIdentitiesResponse_originationIdentities = Lens.lens (\ListPoolOriginationIdentitiesResponse' {originationIdentities} -> originationIdentities) (\s@ListPoolOriginationIdentitiesResponse' {} a -> s {originationIdentities = a} :: ListPoolOriginationIdentitiesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon Resource Name (ARN) for the pool.
+listPoolOriginationIdentitiesResponse_poolArn :: Lens.Lens' ListPoolOriginationIdentitiesResponse (Prelude.Maybe Prelude.Text)
+listPoolOriginationIdentitiesResponse_poolArn = Lens.lens (\ListPoolOriginationIdentitiesResponse' {poolArn} -> poolArn) (\s@ListPoolOriginationIdentitiesResponse' {} a -> s {poolArn = a} :: ListPoolOriginationIdentitiesResponse)
+
+-- | The unique PoolId of the pool.
+listPoolOriginationIdentitiesResponse_poolId :: Lens.Lens' ListPoolOriginationIdentitiesResponse (Prelude.Maybe Prelude.Text)
+listPoolOriginationIdentitiesResponse_poolId = Lens.lens (\ListPoolOriginationIdentitiesResponse' {poolId} -> poolId) (\s@ListPoolOriginationIdentitiesResponse' {} a -> s {poolId = a} :: ListPoolOriginationIdentitiesResponse)
+
+-- | The response's http status code.
+listPoolOriginationIdentitiesResponse_httpStatus :: Lens.Lens' ListPoolOriginationIdentitiesResponse Prelude.Int
+listPoolOriginationIdentitiesResponse_httpStatus = Lens.lens (\ListPoolOriginationIdentitiesResponse' {httpStatus} -> httpStatus) (\s@ListPoolOriginationIdentitiesResponse' {} a -> s {httpStatus = a} :: ListPoolOriginationIdentitiesResponse)
+
+instance
+  Prelude.NFData
+    ListPoolOriginationIdentitiesResponse
+  where
+  rnf ListPoolOriginationIdentitiesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf originationIdentities
+      `Prelude.seq` Prelude.rnf poolArn
+      `Prelude.seq` Prelude.rnf poolId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/ListTagsForResource.hs b/gen/Amazonka/PinpointSmsVoiceV2/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/ListTagsForResource.hs
@@ -0,0 +1,184 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.ListTagsForResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- List all tags associated with a resource.
+module Amazonka.PinpointSmsVoiceV2.ListTagsForResource
+  ( -- * Creating a Request
+    ListTagsForResource (..),
+    newListTagsForResource,
+
+    -- * Request Lenses
+    listTagsForResource_resourceArn,
+
+    -- * Destructuring the Response
+    ListTagsForResourceResponse (..),
+    newListTagsForResourceResponse,
+
+    -- * Response Lenses
+    listTagsForResourceResponse_resourceArn,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+  { -- | The Amazon Resource Name (ARN) of the resource to query for.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'listTagsForResource_resourceArn' - The Amazon Resource Name (ARN) of the resource to query for.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | The Amazon Resource Name (ARN) of the resource to query for.
+listTagsForResource_resourceArn :: Lens.Lens' ListTagsForResource Prelude.Text
+listTagsForResource_resourceArn = Lens.lens (\ListTagsForResource' {resourceArn} -> resourceArn) (\s@ListTagsForResource' {} a -> s {resourceArn = a} :: ListTagsForResource)
+
+instance Core.AWSRequest ListTagsForResource where
+  type
+    AWSResponse ListTagsForResource =
+      ListTagsForResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTagsForResourceResponse'
+            Prelude.<$> (x Data..?> "ResourceArn")
+            Prelude.<*> (x Data..?> "Tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTagsForResource where
+  hashWithSalt _salt ListTagsForResource' {..} =
+    _salt `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData ListTagsForResource where
+  rnf ListTagsForResource' {..} =
+    Prelude.rnf resourceArn
+
+instance Data.ToHeaders ListTagsForResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.ListTagsForResource" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListTagsForResource where
+  toJSON ListTagsForResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("ResourceArn" Data..= resourceArn)]
+      )
+
+instance Data.ToPath ListTagsForResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | The ARN of the resource.
+    resourceArn :: Prelude.Maybe Prelude.Text,
+    -- | An array of key and value pair tags that are associated with the
+    -- resource.
+    tags :: Prelude.Maybe [Tag],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'listTagsForResourceResponse_resourceArn' - The ARN of the resource.
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - An array of key and value pair tags that are associated with the
+-- resource.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { resourceArn =
+        Prelude.Nothing,
+      tags = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The ARN of the resource.
+listTagsForResourceResponse_resourceArn :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe Prelude.Text)
+listTagsForResourceResponse_resourceArn = Lens.lens (\ListTagsForResourceResponse' {resourceArn} -> resourceArn) (\s@ListTagsForResourceResponse' {} a -> s {resourceArn = a} :: ListTagsForResourceResponse)
+
+-- | An array of key and value pair tags that are associated with the
+-- resource.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe [Tag])
+listTagsForResourceResponse_tags = Lens.lens (\ListTagsForResourceResponse' {tags} -> tags) (\s@ListTagsForResourceResponse' {} a -> s {tags = a} :: ListTagsForResourceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTagsForResourceResponse_httpStatus :: Lens.Lens' ListTagsForResourceResponse Prelude.Int
+listTagsForResourceResponse_httpStatus = Lens.lens (\ListTagsForResourceResponse' {httpStatus} -> httpStatus) (\s@ListTagsForResourceResponse' {} a -> s {httpStatus = a} :: ListTagsForResourceResponse)
+
+instance Prelude.NFData ListTagsForResourceResponse where
+  rnf ListTagsForResourceResponse' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/PutKeyword.hs b/gen/Amazonka/PinpointSmsVoiceV2/PutKeyword.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/PutKeyword.hs
@@ -0,0 +1,302 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.PutKeyword
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates or updates a keyword configuration on an origination phone
+-- number or pool.
+--
+-- A keyword is a word that you can search for on a particular phone number
+-- or pool. It is also a specific word or phrase that an end user can send
+-- to your number to elicit a response, such as an informational message or
+-- a special offer. When your number receives a message that begins with a
+-- keyword, Amazon Pinpoint responds with a customizable message.
+--
+-- If you specify a keyword that isn\'t valid, an Error is returned.
+module Amazonka.PinpointSmsVoiceV2.PutKeyword
+  ( -- * Creating a Request
+    PutKeyword (..),
+    newPutKeyword,
+
+    -- * Request Lenses
+    putKeyword_keywordAction,
+    putKeyword_originationIdentity,
+    putKeyword_keyword,
+    putKeyword_keywordMessage,
+
+    -- * Destructuring the Response
+    PutKeywordResponse (..),
+    newPutKeywordResponse,
+
+    -- * Response Lenses
+    putKeywordResponse_keyword,
+    putKeywordResponse_keywordAction,
+    putKeywordResponse_keywordMessage,
+    putKeywordResponse_originationIdentity,
+    putKeywordResponse_originationIdentityArn,
+    putKeywordResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newPutKeyword' smart constructor.
+data PutKeyword = PutKeyword'
+  { -- | The action to perform for the new keyword when it is received.
+    keywordAction :: Prelude.Maybe KeywordAction,
+    -- | The origination identity to use such as a PhoneNumberId, PhoneNumberArn,
+    -- SenderId or SenderIdArn. You can use DescribePhoneNumbers get the values
+    -- for PhoneNumberId and PhoneNumberArn while DescribeSenderIds can be used
+    -- to get the values for SenderId and SenderIdArn.
+    originationIdentity :: Prelude.Text,
+    -- | The new keyword to add.
+    keyword :: Prelude.Text,
+    -- | The message associated with the keyword.
+    --
+    -- -   AUTOMATIC_RESPONSE: A message is sent to the recipient.
+    --
+    -- -   OPT_OUT: Keeps the recipient from receiving future messages.
+    --
+    -- -   OPT_IN: The recipient wants to receive future messages.
+    keywordMessage :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutKeyword' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'keywordAction', 'putKeyword_keywordAction' - The action to perform for the new keyword when it is received.
+--
+-- 'originationIdentity', 'putKeyword_originationIdentity' - The origination identity to use such as a PhoneNumberId, PhoneNumberArn,
+-- SenderId or SenderIdArn. You can use DescribePhoneNumbers get the values
+-- for PhoneNumberId and PhoneNumberArn while DescribeSenderIds can be used
+-- to get the values for SenderId and SenderIdArn.
+--
+-- 'keyword', 'putKeyword_keyword' - The new keyword to add.
+--
+-- 'keywordMessage', 'putKeyword_keywordMessage' - The message associated with the keyword.
+--
+-- -   AUTOMATIC_RESPONSE: A message is sent to the recipient.
+--
+-- -   OPT_OUT: Keeps the recipient from receiving future messages.
+--
+-- -   OPT_IN: The recipient wants to receive future messages.
+newPutKeyword ::
+  -- | 'originationIdentity'
+  Prelude.Text ->
+  -- | 'keyword'
+  Prelude.Text ->
+  -- | 'keywordMessage'
+  Prelude.Text ->
+  PutKeyword
+newPutKeyword
+  pOriginationIdentity_
+  pKeyword_
+  pKeywordMessage_ =
+    PutKeyword'
+      { keywordAction = Prelude.Nothing,
+        originationIdentity = pOriginationIdentity_,
+        keyword = pKeyword_,
+        keywordMessage = pKeywordMessage_
+      }
+
+-- | The action to perform for the new keyword when it is received.
+putKeyword_keywordAction :: Lens.Lens' PutKeyword (Prelude.Maybe KeywordAction)
+putKeyword_keywordAction = Lens.lens (\PutKeyword' {keywordAction} -> keywordAction) (\s@PutKeyword' {} a -> s {keywordAction = a} :: PutKeyword)
+
+-- | The origination identity to use such as a PhoneNumberId, PhoneNumberArn,
+-- SenderId or SenderIdArn. You can use DescribePhoneNumbers get the values
+-- for PhoneNumberId and PhoneNumberArn while DescribeSenderIds can be used
+-- to get the values for SenderId and SenderIdArn.
+putKeyword_originationIdentity :: Lens.Lens' PutKeyword Prelude.Text
+putKeyword_originationIdentity = Lens.lens (\PutKeyword' {originationIdentity} -> originationIdentity) (\s@PutKeyword' {} a -> s {originationIdentity = a} :: PutKeyword)
+
+-- | The new keyword to add.
+putKeyword_keyword :: Lens.Lens' PutKeyword Prelude.Text
+putKeyword_keyword = Lens.lens (\PutKeyword' {keyword} -> keyword) (\s@PutKeyword' {} a -> s {keyword = a} :: PutKeyword)
+
+-- | The message associated with the keyword.
+--
+-- -   AUTOMATIC_RESPONSE: A message is sent to the recipient.
+--
+-- -   OPT_OUT: Keeps the recipient from receiving future messages.
+--
+-- -   OPT_IN: The recipient wants to receive future messages.
+putKeyword_keywordMessage :: Lens.Lens' PutKeyword Prelude.Text
+putKeyword_keywordMessage = Lens.lens (\PutKeyword' {keywordMessage} -> keywordMessage) (\s@PutKeyword' {} a -> s {keywordMessage = a} :: PutKeyword)
+
+instance Core.AWSRequest PutKeyword where
+  type AWSResponse PutKeyword = PutKeywordResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          PutKeywordResponse'
+            Prelude.<$> (x Data..?> "Keyword")
+            Prelude.<*> (x Data..?> "KeywordAction")
+            Prelude.<*> (x Data..?> "KeywordMessage")
+            Prelude.<*> (x Data..?> "OriginationIdentity")
+            Prelude.<*> (x Data..?> "OriginationIdentityArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable PutKeyword where
+  hashWithSalt _salt PutKeyword' {..} =
+    _salt
+      `Prelude.hashWithSalt` keywordAction
+      `Prelude.hashWithSalt` originationIdentity
+      `Prelude.hashWithSalt` keyword
+      `Prelude.hashWithSalt` keywordMessage
+
+instance Prelude.NFData PutKeyword where
+  rnf PutKeyword' {..} =
+    Prelude.rnf keywordAction
+      `Prelude.seq` Prelude.rnf originationIdentity
+      `Prelude.seq` Prelude.rnf keyword
+      `Prelude.seq` Prelude.rnf keywordMessage
+
+instance Data.ToHeaders PutKeyword where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.PutKeyword" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutKeyword where
+  toJSON PutKeyword' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("KeywordAction" Data..=) Prelude.<$> keywordAction,
+            Prelude.Just
+              ("OriginationIdentity" Data..= originationIdentity),
+            Prelude.Just ("Keyword" Data..= keyword),
+            Prelude.Just
+              ("KeywordMessage" Data..= keywordMessage)
+          ]
+      )
+
+instance Data.ToPath PutKeyword where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery PutKeyword where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutKeywordResponse' smart constructor.
+data PutKeywordResponse = PutKeywordResponse'
+  { -- | The keyword that was added.
+    keyword :: Prelude.Maybe Prelude.Text,
+    -- | The action to perform when the keyword is used.
+    keywordAction :: Prelude.Maybe KeywordAction,
+    -- | The message associated with the keyword.
+    keywordMessage :: Prelude.Maybe Prelude.Text,
+    -- | The PhoneNumberId or PoolId that the keyword was associated with.
+    originationIdentity :: Prelude.Maybe Prelude.Text,
+    -- | The PhoneNumberArn or PoolArn that the keyword was associated with.
+    originationIdentityArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutKeywordResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'keyword', 'putKeywordResponse_keyword' - The keyword that was added.
+--
+-- 'keywordAction', 'putKeywordResponse_keywordAction' - The action to perform when the keyword is used.
+--
+-- 'keywordMessage', 'putKeywordResponse_keywordMessage' - The message associated with the keyword.
+--
+-- 'originationIdentity', 'putKeywordResponse_originationIdentity' - The PhoneNumberId or PoolId that the keyword was associated with.
+--
+-- 'originationIdentityArn', 'putKeywordResponse_originationIdentityArn' - The PhoneNumberArn or PoolArn that the keyword was associated with.
+--
+-- 'httpStatus', 'putKeywordResponse_httpStatus' - The response's http status code.
+newPutKeywordResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  PutKeywordResponse
+newPutKeywordResponse pHttpStatus_ =
+  PutKeywordResponse'
+    { keyword = Prelude.Nothing,
+      keywordAction = Prelude.Nothing,
+      keywordMessage = Prelude.Nothing,
+      originationIdentity = Prelude.Nothing,
+      originationIdentityArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The keyword that was added.
+putKeywordResponse_keyword :: Lens.Lens' PutKeywordResponse (Prelude.Maybe Prelude.Text)
+putKeywordResponse_keyword = Lens.lens (\PutKeywordResponse' {keyword} -> keyword) (\s@PutKeywordResponse' {} a -> s {keyword = a} :: PutKeywordResponse)
+
+-- | The action to perform when the keyword is used.
+putKeywordResponse_keywordAction :: Lens.Lens' PutKeywordResponse (Prelude.Maybe KeywordAction)
+putKeywordResponse_keywordAction = Lens.lens (\PutKeywordResponse' {keywordAction} -> keywordAction) (\s@PutKeywordResponse' {} a -> s {keywordAction = a} :: PutKeywordResponse)
+
+-- | The message associated with the keyword.
+putKeywordResponse_keywordMessage :: Lens.Lens' PutKeywordResponse (Prelude.Maybe Prelude.Text)
+putKeywordResponse_keywordMessage = Lens.lens (\PutKeywordResponse' {keywordMessage} -> keywordMessage) (\s@PutKeywordResponse' {} a -> s {keywordMessage = a} :: PutKeywordResponse)
+
+-- | The PhoneNumberId or PoolId that the keyword was associated with.
+putKeywordResponse_originationIdentity :: Lens.Lens' PutKeywordResponse (Prelude.Maybe Prelude.Text)
+putKeywordResponse_originationIdentity = Lens.lens (\PutKeywordResponse' {originationIdentity} -> originationIdentity) (\s@PutKeywordResponse' {} a -> s {originationIdentity = a} :: PutKeywordResponse)
+
+-- | The PhoneNumberArn or PoolArn that the keyword was associated with.
+putKeywordResponse_originationIdentityArn :: Lens.Lens' PutKeywordResponse (Prelude.Maybe Prelude.Text)
+putKeywordResponse_originationIdentityArn = Lens.lens (\PutKeywordResponse' {originationIdentityArn} -> originationIdentityArn) (\s@PutKeywordResponse' {} a -> s {originationIdentityArn = a} :: PutKeywordResponse)
+
+-- | The response's http status code.
+putKeywordResponse_httpStatus :: Lens.Lens' PutKeywordResponse Prelude.Int
+putKeywordResponse_httpStatus = Lens.lens (\PutKeywordResponse' {httpStatus} -> httpStatus) (\s@PutKeywordResponse' {} a -> s {httpStatus = a} :: PutKeywordResponse)
+
+instance Prelude.NFData PutKeywordResponse where
+  rnf PutKeywordResponse' {..} =
+    Prelude.rnf keyword
+      `Prelude.seq` Prelude.rnf keywordAction
+      `Prelude.seq` Prelude.rnf keywordMessage
+      `Prelude.seq` Prelude.rnf originationIdentity
+      `Prelude.seq` Prelude.rnf originationIdentityArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/PutOptedOutNumber.hs b/gen/Amazonka/PinpointSmsVoiceV2/PutOptedOutNumber.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/PutOptedOutNumber.hs
@@ -0,0 +1,250 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.PutOptedOutNumber
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates an opted out destination phone number in the opt-out list.
+--
+-- If the destination phone number isn\'t valid or if the specified opt-out
+-- list doesn\'t exist, an Error is returned.
+module Amazonka.PinpointSmsVoiceV2.PutOptedOutNumber
+  ( -- * Creating a Request
+    PutOptedOutNumber (..),
+    newPutOptedOutNumber,
+
+    -- * Request Lenses
+    putOptedOutNumber_optOutListName,
+    putOptedOutNumber_optedOutNumber,
+
+    -- * Destructuring the Response
+    PutOptedOutNumberResponse (..),
+    newPutOptedOutNumberResponse,
+
+    -- * Response Lenses
+    putOptedOutNumberResponse_endUserOptedOut,
+    putOptedOutNumberResponse_optOutListArn,
+    putOptedOutNumberResponse_optOutListName,
+    putOptedOutNumberResponse_optedOutNumber,
+    putOptedOutNumberResponse_optedOutTimestamp,
+    putOptedOutNumberResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newPutOptedOutNumber' smart constructor.
+data PutOptedOutNumber = PutOptedOutNumber'
+  { -- | The OptOutListName or OptOutListArn to add the phone number to.
+    optOutListName :: Prelude.Text,
+    -- | The phone number to add to the OptOutList in E.164 format.
+    optedOutNumber :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutOptedOutNumber' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'optOutListName', 'putOptedOutNumber_optOutListName' - The OptOutListName or OptOutListArn to add the phone number to.
+--
+-- 'optedOutNumber', 'putOptedOutNumber_optedOutNumber' - The phone number to add to the OptOutList in E.164 format.
+newPutOptedOutNumber ::
+  -- | 'optOutListName'
+  Prelude.Text ->
+  -- | 'optedOutNumber'
+  Prelude.Text ->
+  PutOptedOutNumber
+newPutOptedOutNumber
+  pOptOutListName_
+  pOptedOutNumber_ =
+    PutOptedOutNumber'
+      { optOutListName =
+          pOptOutListName_,
+        optedOutNumber = pOptedOutNumber_
+      }
+
+-- | The OptOutListName or OptOutListArn to add the phone number to.
+putOptedOutNumber_optOutListName :: Lens.Lens' PutOptedOutNumber Prelude.Text
+putOptedOutNumber_optOutListName = Lens.lens (\PutOptedOutNumber' {optOutListName} -> optOutListName) (\s@PutOptedOutNumber' {} a -> s {optOutListName = a} :: PutOptedOutNumber)
+
+-- | The phone number to add to the OptOutList in E.164 format.
+putOptedOutNumber_optedOutNumber :: Lens.Lens' PutOptedOutNumber Prelude.Text
+putOptedOutNumber_optedOutNumber = Lens.lens (\PutOptedOutNumber' {optedOutNumber} -> optedOutNumber) (\s@PutOptedOutNumber' {} a -> s {optedOutNumber = a} :: PutOptedOutNumber)
+
+instance Core.AWSRequest PutOptedOutNumber where
+  type
+    AWSResponse PutOptedOutNumber =
+      PutOptedOutNumberResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          PutOptedOutNumberResponse'
+            Prelude.<$> (x Data..?> "EndUserOptedOut")
+            Prelude.<*> (x Data..?> "OptOutListArn")
+            Prelude.<*> (x Data..?> "OptOutListName")
+            Prelude.<*> (x Data..?> "OptedOutNumber")
+            Prelude.<*> (x Data..?> "OptedOutTimestamp")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable PutOptedOutNumber where
+  hashWithSalt _salt PutOptedOutNumber' {..} =
+    _salt
+      `Prelude.hashWithSalt` optOutListName
+      `Prelude.hashWithSalt` optedOutNumber
+
+instance Prelude.NFData PutOptedOutNumber where
+  rnf PutOptedOutNumber' {..} =
+    Prelude.rnf optOutListName
+      `Prelude.seq` Prelude.rnf optedOutNumber
+
+instance Data.ToHeaders PutOptedOutNumber where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.PutOptedOutNumber" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutOptedOutNumber where
+  toJSON PutOptedOutNumber' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("OptOutListName" Data..= optOutListName),
+            Prelude.Just
+              ("OptedOutNumber" Data..= optedOutNumber)
+          ]
+      )
+
+instance Data.ToPath PutOptedOutNumber where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery PutOptedOutNumber where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutOptedOutNumberResponse' smart constructor.
+data PutOptedOutNumberResponse = PutOptedOutNumberResponse'
+  { -- | This is true if it was the end user who requested their phone number be
+    -- removed.
+    endUserOptedOut :: Prelude.Maybe Prelude.Bool,
+    -- | The OptOutListArn that the phone number was removed from.
+    optOutListArn :: Prelude.Maybe Prelude.Text,
+    -- | The OptOutListName that the phone number was removed from.
+    optOutListName :: Prelude.Maybe Prelude.Text,
+    -- | The phone number that was added to the OptOutList.
+    optedOutNumber :: Prelude.Maybe Prelude.Text,
+    -- | The time that the phone number was added to the OptOutList, in
+    -- <https://www.epochconverter.com/ UNIX epoch time> format.
+    optedOutTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutOptedOutNumberResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'endUserOptedOut', 'putOptedOutNumberResponse_endUserOptedOut' - This is true if it was the end user who requested their phone number be
+-- removed.
+--
+-- 'optOutListArn', 'putOptedOutNumberResponse_optOutListArn' - The OptOutListArn that the phone number was removed from.
+--
+-- 'optOutListName', 'putOptedOutNumberResponse_optOutListName' - The OptOutListName that the phone number was removed from.
+--
+-- 'optedOutNumber', 'putOptedOutNumberResponse_optedOutNumber' - The phone number that was added to the OptOutList.
+--
+-- 'optedOutTimestamp', 'putOptedOutNumberResponse_optedOutTimestamp' - The time that the phone number was added to the OptOutList, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+--
+-- 'httpStatus', 'putOptedOutNumberResponse_httpStatus' - The response's http status code.
+newPutOptedOutNumberResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  PutOptedOutNumberResponse
+newPutOptedOutNumberResponse pHttpStatus_ =
+  PutOptedOutNumberResponse'
+    { endUserOptedOut =
+        Prelude.Nothing,
+      optOutListArn = Prelude.Nothing,
+      optOutListName = Prelude.Nothing,
+      optedOutNumber = Prelude.Nothing,
+      optedOutTimestamp = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | This is true if it was the end user who requested their phone number be
+-- removed.
+putOptedOutNumberResponse_endUserOptedOut :: Lens.Lens' PutOptedOutNumberResponse (Prelude.Maybe Prelude.Bool)
+putOptedOutNumberResponse_endUserOptedOut = Lens.lens (\PutOptedOutNumberResponse' {endUserOptedOut} -> endUserOptedOut) (\s@PutOptedOutNumberResponse' {} a -> s {endUserOptedOut = a} :: PutOptedOutNumberResponse)
+
+-- | The OptOutListArn that the phone number was removed from.
+putOptedOutNumberResponse_optOutListArn :: Lens.Lens' PutOptedOutNumberResponse (Prelude.Maybe Prelude.Text)
+putOptedOutNumberResponse_optOutListArn = Lens.lens (\PutOptedOutNumberResponse' {optOutListArn} -> optOutListArn) (\s@PutOptedOutNumberResponse' {} a -> s {optOutListArn = a} :: PutOptedOutNumberResponse)
+
+-- | The OptOutListName that the phone number was removed from.
+putOptedOutNumberResponse_optOutListName :: Lens.Lens' PutOptedOutNumberResponse (Prelude.Maybe Prelude.Text)
+putOptedOutNumberResponse_optOutListName = Lens.lens (\PutOptedOutNumberResponse' {optOutListName} -> optOutListName) (\s@PutOptedOutNumberResponse' {} a -> s {optOutListName = a} :: PutOptedOutNumberResponse)
+
+-- | The phone number that was added to the OptOutList.
+putOptedOutNumberResponse_optedOutNumber :: Lens.Lens' PutOptedOutNumberResponse (Prelude.Maybe Prelude.Text)
+putOptedOutNumberResponse_optedOutNumber = Lens.lens (\PutOptedOutNumberResponse' {optedOutNumber} -> optedOutNumber) (\s@PutOptedOutNumberResponse' {} a -> s {optedOutNumber = a} :: PutOptedOutNumberResponse)
+
+-- | The time that the phone number was added to the OptOutList, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+putOptedOutNumberResponse_optedOutTimestamp :: Lens.Lens' PutOptedOutNumberResponse (Prelude.Maybe Prelude.UTCTime)
+putOptedOutNumberResponse_optedOutTimestamp = Lens.lens (\PutOptedOutNumberResponse' {optedOutTimestamp} -> optedOutTimestamp) (\s@PutOptedOutNumberResponse' {} a -> s {optedOutTimestamp = a} :: PutOptedOutNumberResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The response's http status code.
+putOptedOutNumberResponse_httpStatus :: Lens.Lens' PutOptedOutNumberResponse Prelude.Int
+putOptedOutNumberResponse_httpStatus = Lens.lens (\PutOptedOutNumberResponse' {httpStatus} -> httpStatus) (\s@PutOptedOutNumberResponse' {} a -> s {httpStatus = a} :: PutOptedOutNumberResponse)
+
+instance Prelude.NFData PutOptedOutNumberResponse where
+  rnf PutOptedOutNumberResponse' {..} =
+    Prelude.rnf endUserOptedOut
+      `Prelude.seq` Prelude.rnf optOutListArn
+      `Prelude.seq` Prelude.rnf optOutListName
+      `Prelude.seq` Prelude.rnf optedOutNumber
+      `Prelude.seq` Prelude.rnf optedOutTimestamp
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/ReleasePhoneNumber.hs b/gen/Amazonka/PinpointSmsVoiceV2/ReleasePhoneNumber.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/ReleasePhoneNumber.hs
@@ -0,0 +1,364 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.ReleasePhoneNumber
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Releases an existing origination phone number in your account. Once
+-- released, a phone number is no longer available for sending messages.
+--
+-- If the origination phone number has deletion protection enabled or is
+-- associated with a pool, an Error is returned.
+module Amazonka.PinpointSmsVoiceV2.ReleasePhoneNumber
+  ( -- * Creating a Request
+    ReleasePhoneNumber (..),
+    newReleasePhoneNumber,
+
+    -- * Request Lenses
+    releasePhoneNumber_phoneNumberId,
+
+    -- * Destructuring the Response
+    ReleasePhoneNumberResponse (..),
+    newReleasePhoneNumberResponse,
+
+    -- * Response Lenses
+    releasePhoneNumberResponse_createdTimestamp,
+    releasePhoneNumberResponse_isoCountryCode,
+    releasePhoneNumberResponse_messageType,
+    releasePhoneNumberResponse_monthlyLeasingPrice,
+    releasePhoneNumberResponse_numberCapabilities,
+    releasePhoneNumberResponse_numberType,
+    releasePhoneNumberResponse_optOutListName,
+    releasePhoneNumberResponse_phoneNumber,
+    releasePhoneNumberResponse_phoneNumberArn,
+    releasePhoneNumberResponse_phoneNumberId,
+    releasePhoneNumberResponse_selfManagedOptOutsEnabled,
+    releasePhoneNumberResponse_status,
+    releasePhoneNumberResponse_twoWayChannelArn,
+    releasePhoneNumberResponse_twoWayEnabled,
+    releasePhoneNumberResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newReleasePhoneNumber' smart constructor.
+data ReleasePhoneNumber = ReleasePhoneNumber'
+  { -- | The PhoneNumberId or PhoneNumberArn of the phone number to release. You
+    -- can use DescribePhoneNumbers to get the values for PhoneNumberId and
+    -- PhoneNumberArn.
+    phoneNumberId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ReleasePhoneNumber' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'phoneNumberId', 'releasePhoneNumber_phoneNumberId' - The PhoneNumberId or PhoneNumberArn of the phone number to release. You
+-- can use DescribePhoneNumbers to get the values for PhoneNumberId and
+-- PhoneNumberArn.
+newReleasePhoneNumber ::
+  -- | 'phoneNumberId'
+  Prelude.Text ->
+  ReleasePhoneNumber
+newReleasePhoneNumber pPhoneNumberId_ =
+  ReleasePhoneNumber'
+    { phoneNumberId =
+        pPhoneNumberId_
+    }
+
+-- | The PhoneNumberId or PhoneNumberArn of the phone number to release. You
+-- can use DescribePhoneNumbers to get the values for PhoneNumberId and
+-- PhoneNumberArn.
+releasePhoneNumber_phoneNumberId :: Lens.Lens' ReleasePhoneNumber Prelude.Text
+releasePhoneNumber_phoneNumberId = Lens.lens (\ReleasePhoneNumber' {phoneNumberId} -> phoneNumberId) (\s@ReleasePhoneNumber' {} a -> s {phoneNumberId = a} :: ReleasePhoneNumber)
+
+instance Core.AWSRequest ReleasePhoneNumber where
+  type
+    AWSResponse ReleasePhoneNumber =
+      ReleasePhoneNumberResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ReleasePhoneNumberResponse'
+            Prelude.<$> (x Data..?> "CreatedTimestamp")
+            Prelude.<*> (x Data..?> "IsoCountryCode")
+            Prelude.<*> (x Data..?> "MessageType")
+            Prelude.<*> (x Data..?> "MonthlyLeasingPrice")
+            Prelude.<*> (x Data..?> "NumberCapabilities")
+            Prelude.<*> (x Data..?> "NumberType")
+            Prelude.<*> (x Data..?> "OptOutListName")
+            Prelude.<*> (x Data..?> "PhoneNumber")
+            Prelude.<*> (x Data..?> "PhoneNumberArn")
+            Prelude.<*> (x Data..?> "PhoneNumberId")
+            Prelude.<*> (x Data..?> "SelfManagedOptOutsEnabled")
+            Prelude.<*> (x Data..?> "Status")
+            Prelude.<*> (x Data..?> "TwoWayChannelArn")
+            Prelude.<*> (x Data..?> "TwoWayEnabled")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ReleasePhoneNumber where
+  hashWithSalt _salt ReleasePhoneNumber' {..} =
+    _salt `Prelude.hashWithSalt` phoneNumberId
+
+instance Prelude.NFData ReleasePhoneNumber where
+  rnf ReleasePhoneNumber' {..} =
+    Prelude.rnf phoneNumberId
+
+instance Data.ToHeaders ReleasePhoneNumber where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.ReleasePhoneNumber" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ReleasePhoneNumber where
+  toJSON ReleasePhoneNumber' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("PhoneNumberId" Data..= phoneNumberId)
+          ]
+      )
+
+instance Data.ToPath ReleasePhoneNumber where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ReleasePhoneNumber where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newReleasePhoneNumberResponse' smart constructor.
+data ReleasePhoneNumberResponse = ReleasePhoneNumberResponse'
+  { -- | The time when the phone number was created, in
+    -- <https://www.epochconverter.com/ UNIX epoch time> format.
+    createdTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+    -- region.
+    isoCountryCode :: Prelude.Maybe Prelude.Text,
+    -- | The message type that was associated with the phone number.
+    messageType :: Prelude.Maybe MessageType,
+    -- | The monthly price of the phone number, in US dollars.
+    monthlyLeasingPrice :: Prelude.Maybe Prelude.Text,
+    -- | Specifies if the number could be used for text messages, voice, or both.
+    numberCapabilities :: Prelude.Maybe (Prelude.NonEmpty NumberCapability),
+    -- | The type of number that was released.
+    numberType :: Prelude.Maybe NumberType,
+    -- | The name of the OptOutList that was associated with the phone number.
+    optOutListName :: Prelude.Maybe Prelude.Text,
+    -- | The phone number that was released.
+    phoneNumber :: Prelude.Maybe Prelude.Text,
+    -- | The PhoneNumberArn of the phone number that was released.
+    phoneNumberArn :: Prelude.Maybe Prelude.Text,
+    -- | The PhoneNumberId of the phone number that was released.
+    phoneNumberId :: Prelude.Maybe Prelude.Text,
+    -- | By default this is set to false. When an end recipient sends a message
+    -- that begins with HELP or STOP to one of your dedicated numbers, Amazon
+    -- Pinpoint automatically replies with a customizable message and adds the
+    -- end recipient to the OptOutList. When set to true you\'re responsible
+    -- for responding to HELP and STOP requests. You\'re also responsible for
+    -- tracking and honoring opt-out requests.
+    selfManagedOptOutsEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The current status of the request.
+    status :: Prelude.Maybe NumberStatus,
+    -- | The Amazon Resource Name (ARN) of the TwoWayChannel.
+    twoWayChannelArn :: Prelude.Maybe Prelude.Text,
+    -- | By default this is set to false. When set to true you can receive
+    -- incoming text messages from your end recipients.
+    twoWayEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ReleasePhoneNumberResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdTimestamp', 'releasePhoneNumberResponse_createdTimestamp' - The time when the phone number was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+--
+-- 'isoCountryCode', 'releasePhoneNumberResponse_isoCountryCode' - The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+--
+-- 'messageType', 'releasePhoneNumberResponse_messageType' - The message type that was associated with the phone number.
+--
+-- 'monthlyLeasingPrice', 'releasePhoneNumberResponse_monthlyLeasingPrice' - The monthly price of the phone number, in US dollars.
+--
+-- 'numberCapabilities', 'releasePhoneNumberResponse_numberCapabilities' - Specifies if the number could be used for text messages, voice, or both.
+--
+-- 'numberType', 'releasePhoneNumberResponse_numberType' - The type of number that was released.
+--
+-- 'optOutListName', 'releasePhoneNumberResponse_optOutListName' - The name of the OptOutList that was associated with the phone number.
+--
+-- 'phoneNumber', 'releasePhoneNumberResponse_phoneNumber' - The phone number that was released.
+--
+-- 'phoneNumberArn', 'releasePhoneNumberResponse_phoneNumberArn' - The PhoneNumberArn of the phone number that was released.
+--
+-- 'phoneNumberId', 'releasePhoneNumberResponse_phoneNumberId' - The PhoneNumberId of the phone number that was released.
+--
+-- 'selfManagedOptOutsEnabled', 'releasePhoneNumberResponse_selfManagedOptOutsEnabled' - By default this is set to false. When an end recipient sends a message
+-- that begins with HELP or STOP to one of your dedicated numbers, Amazon
+-- Pinpoint automatically replies with a customizable message and adds the
+-- end recipient to the OptOutList. When set to true you\'re responsible
+-- for responding to HELP and STOP requests. You\'re also responsible for
+-- tracking and honoring opt-out requests.
+--
+-- 'status', 'releasePhoneNumberResponse_status' - The current status of the request.
+--
+-- 'twoWayChannelArn', 'releasePhoneNumberResponse_twoWayChannelArn' - The Amazon Resource Name (ARN) of the TwoWayChannel.
+--
+-- 'twoWayEnabled', 'releasePhoneNumberResponse_twoWayEnabled' - By default this is set to false. When set to true you can receive
+-- incoming text messages from your end recipients.
+--
+-- 'httpStatus', 'releasePhoneNumberResponse_httpStatus' - The response's http status code.
+newReleasePhoneNumberResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ReleasePhoneNumberResponse
+newReleasePhoneNumberResponse pHttpStatus_ =
+  ReleasePhoneNumberResponse'
+    { createdTimestamp =
+        Prelude.Nothing,
+      isoCountryCode = Prelude.Nothing,
+      messageType = Prelude.Nothing,
+      monthlyLeasingPrice = Prelude.Nothing,
+      numberCapabilities = Prelude.Nothing,
+      numberType = Prelude.Nothing,
+      optOutListName = Prelude.Nothing,
+      phoneNumber = Prelude.Nothing,
+      phoneNumberArn = Prelude.Nothing,
+      phoneNumberId = Prelude.Nothing,
+      selfManagedOptOutsEnabled = Prelude.Nothing,
+      status = Prelude.Nothing,
+      twoWayChannelArn = Prelude.Nothing,
+      twoWayEnabled = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The time when the phone number was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+releasePhoneNumberResponse_createdTimestamp :: Lens.Lens' ReleasePhoneNumberResponse (Prelude.Maybe Prelude.UTCTime)
+releasePhoneNumberResponse_createdTimestamp = Lens.lens (\ReleasePhoneNumberResponse' {createdTimestamp} -> createdTimestamp) (\s@ReleasePhoneNumberResponse' {} a -> s {createdTimestamp = a} :: ReleasePhoneNumberResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+releasePhoneNumberResponse_isoCountryCode :: Lens.Lens' ReleasePhoneNumberResponse (Prelude.Maybe Prelude.Text)
+releasePhoneNumberResponse_isoCountryCode = Lens.lens (\ReleasePhoneNumberResponse' {isoCountryCode} -> isoCountryCode) (\s@ReleasePhoneNumberResponse' {} a -> s {isoCountryCode = a} :: ReleasePhoneNumberResponse)
+
+-- | The message type that was associated with the phone number.
+releasePhoneNumberResponse_messageType :: Lens.Lens' ReleasePhoneNumberResponse (Prelude.Maybe MessageType)
+releasePhoneNumberResponse_messageType = Lens.lens (\ReleasePhoneNumberResponse' {messageType} -> messageType) (\s@ReleasePhoneNumberResponse' {} a -> s {messageType = a} :: ReleasePhoneNumberResponse)
+
+-- | The monthly price of the phone number, in US dollars.
+releasePhoneNumberResponse_monthlyLeasingPrice :: Lens.Lens' ReleasePhoneNumberResponse (Prelude.Maybe Prelude.Text)
+releasePhoneNumberResponse_monthlyLeasingPrice = Lens.lens (\ReleasePhoneNumberResponse' {monthlyLeasingPrice} -> monthlyLeasingPrice) (\s@ReleasePhoneNumberResponse' {} a -> s {monthlyLeasingPrice = a} :: ReleasePhoneNumberResponse)
+
+-- | Specifies if the number could be used for text messages, voice, or both.
+releasePhoneNumberResponse_numberCapabilities :: Lens.Lens' ReleasePhoneNumberResponse (Prelude.Maybe (Prelude.NonEmpty NumberCapability))
+releasePhoneNumberResponse_numberCapabilities = Lens.lens (\ReleasePhoneNumberResponse' {numberCapabilities} -> numberCapabilities) (\s@ReleasePhoneNumberResponse' {} a -> s {numberCapabilities = a} :: ReleasePhoneNumberResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The type of number that was released.
+releasePhoneNumberResponse_numberType :: Lens.Lens' ReleasePhoneNumberResponse (Prelude.Maybe NumberType)
+releasePhoneNumberResponse_numberType = Lens.lens (\ReleasePhoneNumberResponse' {numberType} -> numberType) (\s@ReleasePhoneNumberResponse' {} a -> s {numberType = a} :: ReleasePhoneNumberResponse)
+
+-- | The name of the OptOutList that was associated with the phone number.
+releasePhoneNumberResponse_optOutListName :: Lens.Lens' ReleasePhoneNumberResponse (Prelude.Maybe Prelude.Text)
+releasePhoneNumberResponse_optOutListName = Lens.lens (\ReleasePhoneNumberResponse' {optOutListName} -> optOutListName) (\s@ReleasePhoneNumberResponse' {} a -> s {optOutListName = a} :: ReleasePhoneNumberResponse)
+
+-- | The phone number that was released.
+releasePhoneNumberResponse_phoneNumber :: Lens.Lens' ReleasePhoneNumberResponse (Prelude.Maybe Prelude.Text)
+releasePhoneNumberResponse_phoneNumber = Lens.lens (\ReleasePhoneNumberResponse' {phoneNumber} -> phoneNumber) (\s@ReleasePhoneNumberResponse' {} a -> s {phoneNumber = a} :: ReleasePhoneNumberResponse)
+
+-- | The PhoneNumberArn of the phone number that was released.
+releasePhoneNumberResponse_phoneNumberArn :: Lens.Lens' ReleasePhoneNumberResponse (Prelude.Maybe Prelude.Text)
+releasePhoneNumberResponse_phoneNumberArn = Lens.lens (\ReleasePhoneNumberResponse' {phoneNumberArn} -> phoneNumberArn) (\s@ReleasePhoneNumberResponse' {} a -> s {phoneNumberArn = a} :: ReleasePhoneNumberResponse)
+
+-- | The PhoneNumberId of the phone number that was released.
+releasePhoneNumberResponse_phoneNumberId :: Lens.Lens' ReleasePhoneNumberResponse (Prelude.Maybe Prelude.Text)
+releasePhoneNumberResponse_phoneNumberId = Lens.lens (\ReleasePhoneNumberResponse' {phoneNumberId} -> phoneNumberId) (\s@ReleasePhoneNumberResponse' {} a -> s {phoneNumberId = a} :: ReleasePhoneNumberResponse)
+
+-- | By default this is set to false. When an end recipient sends a message
+-- that begins with HELP or STOP to one of your dedicated numbers, Amazon
+-- Pinpoint automatically replies with a customizable message and adds the
+-- end recipient to the OptOutList. When set to true you\'re responsible
+-- for responding to HELP and STOP requests. You\'re also responsible for
+-- tracking and honoring opt-out requests.
+releasePhoneNumberResponse_selfManagedOptOutsEnabled :: Lens.Lens' ReleasePhoneNumberResponse (Prelude.Maybe Prelude.Bool)
+releasePhoneNumberResponse_selfManagedOptOutsEnabled = Lens.lens (\ReleasePhoneNumberResponse' {selfManagedOptOutsEnabled} -> selfManagedOptOutsEnabled) (\s@ReleasePhoneNumberResponse' {} a -> s {selfManagedOptOutsEnabled = a} :: ReleasePhoneNumberResponse)
+
+-- | The current status of the request.
+releasePhoneNumberResponse_status :: Lens.Lens' ReleasePhoneNumberResponse (Prelude.Maybe NumberStatus)
+releasePhoneNumberResponse_status = Lens.lens (\ReleasePhoneNumberResponse' {status} -> status) (\s@ReleasePhoneNumberResponse' {} a -> s {status = a} :: ReleasePhoneNumberResponse)
+
+-- | The Amazon Resource Name (ARN) of the TwoWayChannel.
+releasePhoneNumberResponse_twoWayChannelArn :: Lens.Lens' ReleasePhoneNumberResponse (Prelude.Maybe Prelude.Text)
+releasePhoneNumberResponse_twoWayChannelArn = Lens.lens (\ReleasePhoneNumberResponse' {twoWayChannelArn} -> twoWayChannelArn) (\s@ReleasePhoneNumberResponse' {} a -> s {twoWayChannelArn = a} :: ReleasePhoneNumberResponse)
+
+-- | By default this is set to false. When set to true you can receive
+-- incoming text messages from your end recipients.
+releasePhoneNumberResponse_twoWayEnabled :: Lens.Lens' ReleasePhoneNumberResponse (Prelude.Maybe Prelude.Bool)
+releasePhoneNumberResponse_twoWayEnabled = Lens.lens (\ReleasePhoneNumberResponse' {twoWayEnabled} -> twoWayEnabled) (\s@ReleasePhoneNumberResponse' {} a -> s {twoWayEnabled = a} :: ReleasePhoneNumberResponse)
+
+-- | The response's http status code.
+releasePhoneNumberResponse_httpStatus :: Lens.Lens' ReleasePhoneNumberResponse Prelude.Int
+releasePhoneNumberResponse_httpStatus = Lens.lens (\ReleasePhoneNumberResponse' {httpStatus} -> httpStatus) (\s@ReleasePhoneNumberResponse' {} a -> s {httpStatus = a} :: ReleasePhoneNumberResponse)
+
+instance Prelude.NFData ReleasePhoneNumberResponse where
+  rnf ReleasePhoneNumberResponse' {..} =
+    Prelude.rnf createdTimestamp
+      `Prelude.seq` Prelude.rnf isoCountryCode
+      `Prelude.seq` Prelude.rnf messageType
+      `Prelude.seq` Prelude.rnf monthlyLeasingPrice
+      `Prelude.seq` Prelude.rnf numberCapabilities
+      `Prelude.seq` Prelude.rnf numberType
+      `Prelude.seq` Prelude.rnf optOutListName
+      `Prelude.seq` Prelude.rnf phoneNumber
+      `Prelude.seq` Prelude.rnf phoneNumberArn
+      `Prelude.seq` Prelude.rnf phoneNumberId
+      `Prelude.seq` Prelude.rnf selfManagedOptOutsEnabled
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf twoWayChannelArn
+      `Prelude.seq` Prelude.rnf twoWayEnabled
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/RequestPhoneNumber.hs b/gen/Amazonka/PinpointSmsVoiceV2/RequestPhoneNumber.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/RequestPhoneNumber.hs
@@ -0,0 +1,576 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.RequestPhoneNumber
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Request an origination phone number for use in your account. For more
+-- information on phone number request see
+-- <https://docs.aws.amazon.com/pinpoint/latest/userguide/settings-sms-request-number.html Requesting a number>
+-- in the /Amazon Pinpoint User Guide/.
+module Amazonka.PinpointSmsVoiceV2.RequestPhoneNumber
+  ( -- * Creating a Request
+    RequestPhoneNumber (..),
+    newRequestPhoneNumber,
+
+    -- * Request Lenses
+    requestPhoneNumber_clientToken,
+    requestPhoneNumber_deletionProtectionEnabled,
+    requestPhoneNumber_optOutListName,
+    requestPhoneNumber_poolId,
+    requestPhoneNumber_registrationId,
+    requestPhoneNumber_tags,
+    requestPhoneNumber_isoCountryCode,
+    requestPhoneNumber_messageType,
+    requestPhoneNumber_numberCapabilities,
+    requestPhoneNumber_numberType,
+
+    -- * Destructuring the Response
+    RequestPhoneNumberResponse (..),
+    newRequestPhoneNumberResponse,
+
+    -- * Response Lenses
+    requestPhoneNumberResponse_createdTimestamp,
+    requestPhoneNumberResponse_deletionProtectionEnabled,
+    requestPhoneNumberResponse_isoCountryCode,
+    requestPhoneNumberResponse_messageType,
+    requestPhoneNumberResponse_monthlyLeasingPrice,
+    requestPhoneNumberResponse_numberCapabilities,
+    requestPhoneNumberResponse_numberType,
+    requestPhoneNumberResponse_optOutListName,
+    requestPhoneNumberResponse_phoneNumber,
+    requestPhoneNumberResponse_phoneNumberArn,
+    requestPhoneNumberResponse_phoneNumberId,
+    requestPhoneNumberResponse_poolId,
+    requestPhoneNumberResponse_selfManagedOptOutsEnabled,
+    requestPhoneNumberResponse_status,
+    requestPhoneNumberResponse_tags,
+    requestPhoneNumberResponse_twoWayChannelArn,
+    requestPhoneNumberResponse_twoWayEnabled,
+    requestPhoneNumberResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newRequestPhoneNumber' smart constructor.
+data RequestPhoneNumber = RequestPhoneNumber'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. If you don\'t specify a client token, a
+    -- randomly generated token is used for the request to ensure idempotency.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | By default this is set to false. When set to true the phone number
+    -- can\'t be deleted.
+    deletionProtectionEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The name of the OptOutList to associate with the phone number. You can
+    -- use the OutOutListName or OptPutListArn.
+    optOutListName :: Prelude.Maybe Prelude.Text,
+    -- | The pool to associated with the phone number. You can use the PoolId or
+    -- PoolArn.
+    poolId :: Prelude.Maybe Prelude.Text,
+    -- | Use this field to attach your phone number for an external registration
+    -- process.
+    registrationId :: Prelude.Maybe Prelude.Text,
+    -- | An array of tags (key and value pairs) associate with the requested
+    -- phone number.
+    tags :: Prelude.Maybe [Tag],
+    -- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+    -- region.
+    isoCountryCode :: Prelude.Text,
+    -- | The type of message. Valid values are TRANSACTIONAL for messages that
+    -- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+    -- critical or time-sensitive.
+    messageType :: MessageType,
+    -- | Indicates if the phone number will be used for text messages, voice
+    -- messages, or both.
+    numberCapabilities :: Prelude.NonEmpty NumberCapability,
+    -- | The type of phone number to request.
+    numberType :: RequestableNumberType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RequestPhoneNumber' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'requestPhoneNumber_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. If you don\'t specify a client token, a
+-- randomly generated token is used for the request to ensure idempotency.
+--
+-- 'deletionProtectionEnabled', 'requestPhoneNumber_deletionProtectionEnabled' - By default this is set to false. When set to true the phone number
+-- can\'t be deleted.
+--
+-- 'optOutListName', 'requestPhoneNumber_optOutListName' - The name of the OptOutList to associate with the phone number. You can
+-- use the OutOutListName or OptPutListArn.
+--
+-- 'poolId', 'requestPhoneNumber_poolId' - The pool to associated with the phone number. You can use the PoolId or
+-- PoolArn.
+--
+-- 'registrationId', 'requestPhoneNumber_registrationId' - Use this field to attach your phone number for an external registration
+-- process.
+--
+-- 'tags', 'requestPhoneNumber_tags' - An array of tags (key and value pairs) associate with the requested
+-- phone number.
+--
+-- 'isoCountryCode', 'requestPhoneNumber_isoCountryCode' - The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+--
+-- 'messageType', 'requestPhoneNumber_messageType' - The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+--
+-- 'numberCapabilities', 'requestPhoneNumber_numberCapabilities' - Indicates if the phone number will be used for text messages, voice
+-- messages, or both.
+--
+-- 'numberType', 'requestPhoneNumber_numberType' - The type of phone number to request.
+newRequestPhoneNumber ::
+  -- | 'isoCountryCode'
+  Prelude.Text ->
+  -- | 'messageType'
+  MessageType ->
+  -- | 'numberCapabilities'
+  Prelude.NonEmpty NumberCapability ->
+  -- | 'numberType'
+  RequestableNumberType ->
+  RequestPhoneNumber
+newRequestPhoneNumber
+  pIsoCountryCode_
+  pMessageType_
+  pNumberCapabilities_
+  pNumberType_ =
+    RequestPhoneNumber'
+      { clientToken = Prelude.Nothing,
+        deletionProtectionEnabled = Prelude.Nothing,
+        optOutListName = Prelude.Nothing,
+        poolId = Prelude.Nothing,
+        registrationId = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        isoCountryCode = pIsoCountryCode_,
+        messageType = pMessageType_,
+        numberCapabilities =
+          Lens.coerced Lens.# pNumberCapabilities_,
+        numberType = pNumberType_
+      }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. If you don\'t specify a client token, a
+-- randomly generated token is used for the request to ensure idempotency.
+requestPhoneNumber_clientToken :: Lens.Lens' RequestPhoneNumber (Prelude.Maybe Prelude.Text)
+requestPhoneNumber_clientToken = Lens.lens (\RequestPhoneNumber' {clientToken} -> clientToken) (\s@RequestPhoneNumber' {} a -> s {clientToken = a} :: RequestPhoneNumber)
+
+-- | By default this is set to false. When set to true the phone number
+-- can\'t be deleted.
+requestPhoneNumber_deletionProtectionEnabled :: Lens.Lens' RequestPhoneNumber (Prelude.Maybe Prelude.Bool)
+requestPhoneNumber_deletionProtectionEnabled = Lens.lens (\RequestPhoneNumber' {deletionProtectionEnabled} -> deletionProtectionEnabled) (\s@RequestPhoneNumber' {} a -> s {deletionProtectionEnabled = a} :: RequestPhoneNumber)
+
+-- | The name of the OptOutList to associate with the phone number. You can
+-- use the OutOutListName or OptPutListArn.
+requestPhoneNumber_optOutListName :: Lens.Lens' RequestPhoneNumber (Prelude.Maybe Prelude.Text)
+requestPhoneNumber_optOutListName = Lens.lens (\RequestPhoneNumber' {optOutListName} -> optOutListName) (\s@RequestPhoneNumber' {} a -> s {optOutListName = a} :: RequestPhoneNumber)
+
+-- | The pool to associated with the phone number. You can use the PoolId or
+-- PoolArn.
+requestPhoneNumber_poolId :: Lens.Lens' RequestPhoneNumber (Prelude.Maybe Prelude.Text)
+requestPhoneNumber_poolId = Lens.lens (\RequestPhoneNumber' {poolId} -> poolId) (\s@RequestPhoneNumber' {} a -> s {poolId = a} :: RequestPhoneNumber)
+
+-- | Use this field to attach your phone number for an external registration
+-- process.
+requestPhoneNumber_registrationId :: Lens.Lens' RequestPhoneNumber (Prelude.Maybe Prelude.Text)
+requestPhoneNumber_registrationId = Lens.lens (\RequestPhoneNumber' {registrationId} -> registrationId) (\s@RequestPhoneNumber' {} a -> s {registrationId = a} :: RequestPhoneNumber)
+
+-- | An array of tags (key and value pairs) associate with the requested
+-- phone number.
+requestPhoneNumber_tags :: Lens.Lens' RequestPhoneNumber (Prelude.Maybe [Tag])
+requestPhoneNumber_tags = Lens.lens (\RequestPhoneNumber' {tags} -> tags) (\s@RequestPhoneNumber' {} a -> s {tags = a} :: RequestPhoneNumber) Prelude.. Lens.mapping Lens.coerced
+
+-- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+requestPhoneNumber_isoCountryCode :: Lens.Lens' RequestPhoneNumber Prelude.Text
+requestPhoneNumber_isoCountryCode = Lens.lens (\RequestPhoneNumber' {isoCountryCode} -> isoCountryCode) (\s@RequestPhoneNumber' {} a -> s {isoCountryCode = a} :: RequestPhoneNumber)
+
+-- | The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+requestPhoneNumber_messageType :: Lens.Lens' RequestPhoneNumber MessageType
+requestPhoneNumber_messageType = Lens.lens (\RequestPhoneNumber' {messageType} -> messageType) (\s@RequestPhoneNumber' {} a -> s {messageType = a} :: RequestPhoneNumber)
+
+-- | Indicates if the phone number will be used for text messages, voice
+-- messages, or both.
+requestPhoneNumber_numberCapabilities :: Lens.Lens' RequestPhoneNumber (Prelude.NonEmpty NumberCapability)
+requestPhoneNumber_numberCapabilities = Lens.lens (\RequestPhoneNumber' {numberCapabilities} -> numberCapabilities) (\s@RequestPhoneNumber' {} a -> s {numberCapabilities = a} :: RequestPhoneNumber) Prelude.. Lens.coerced
+
+-- | The type of phone number to request.
+requestPhoneNumber_numberType :: Lens.Lens' RequestPhoneNumber RequestableNumberType
+requestPhoneNumber_numberType = Lens.lens (\RequestPhoneNumber' {numberType} -> numberType) (\s@RequestPhoneNumber' {} a -> s {numberType = a} :: RequestPhoneNumber)
+
+instance Core.AWSRequest RequestPhoneNumber where
+  type
+    AWSResponse RequestPhoneNumber =
+      RequestPhoneNumberResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          RequestPhoneNumberResponse'
+            Prelude.<$> (x Data..?> "CreatedTimestamp")
+            Prelude.<*> (x Data..?> "DeletionProtectionEnabled")
+            Prelude.<*> (x Data..?> "IsoCountryCode")
+            Prelude.<*> (x Data..?> "MessageType")
+            Prelude.<*> (x Data..?> "MonthlyLeasingPrice")
+            Prelude.<*> (x Data..?> "NumberCapabilities")
+            Prelude.<*> (x Data..?> "NumberType")
+            Prelude.<*> (x Data..?> "OptOutListName")
+            Prelude.<*> (x Data..?> "PhoneNumber")
+            Prelude.<*> (x Data..?> "PhoneNumberArn")
+            Prelude.<*> (x Data..?> "PhoneNumberId")
+            Prelude.<*> (x Data..?> "PoolId")
+            Prelude.<*> (x Data..?> "SelfManagedOptOutsEnabled")
+            Prelude.<*> (x Data..?> "Status")
+            Prelude.<*> (x Data..?> "Tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "TwoWayChannelArn")
+            Prelude.<*> (x Data..?> "TwoWayEnabled")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable RequestPhoneNumber where
+  hashWithSalt _salt RequestPhoneNumber' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` deletionProtectionEnabled
+      `Prelude.hashWithSalt` optOutListName
+      `Prelude.hashWithSalt` poolId
+      `Prelude.hashWithSalt` registrationId
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` isoCountryCode
+      `Prelude.hashWithSalt` messageType
+      `Prelude.hashWithSalt` numberCapabilities
+      `Prelude.hashWithSalt` numberType
+
+instance Prelude.NFData RequestPhoneNumber where
+  rnf RequestPhoneNumber' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf deletionProtectionEnabled
+      `Prelude.seq` Prelude.rnf optOutListName
+      `Prelude.seq` Prelude.rnf poolId
+      `Prelude.seq` Prelude.rnf registrationId
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf isoCountryCode
+      `Prelude.seq` Prelude.rnf messageType
+      `Prelude.seq` Prelude.rnf numberCapabilities
+      `Prelude.seq` Prelude.rnf numberType
+
+instance Data.ToHeaders RequestPhoneNumber where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.RequestPhoneNumber" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON RequestPhoneNumber where
+  toJSON RequestPhoneNumber' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClientToken" Data..=) Prelude.<$> clientToken,
+            ("DeletionProtectionEnabled" Data..=)
+              Prelude.<$> deletionProtectionEnabled,
+            ("OptOutListName" Data..=)
+              Prelude.<$> optOutListName,
+            ("PoolId" Data..=) Prelude.<$> poolId,
+            ("RegistrationId" Data..=)
+              Prelude.<$> registrationId,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ("IsoCountryCode" Data..= isoCountryCode),
+            Prelude.Just ("MessageType" Data..= messageType),
+            Prelude.Just
+              ("NumberCapabilities" Data..= numberCapabilities),
+            Prelude.Just ("NumberType" Data..= numberType)
+          ]
+      )
+
+instance Data.ToPath RequestPhoneNumber where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery RequestPhoneNumber where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newRequestPhoneNumberResponse' smart constructor.
+data RequestPhoneNumberResponse = RequestPhoneNumberResponse'
+  { -- | The time when the phone number was created, in
+    -- <https://www.epochconverter.com/ UNIX epoch time> format.
+    createdTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | By default this is set to false. When set to true the phone number
+    -- can\'t be deleted.
+    deletionProtectionEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+    -- region.
+    isoCountryCode :: Prelude.Maybe Prelude.Text,
+    -- | The type of message. Valid values are TRANSACTIONAL for messages that
+    -- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+    -- critical or time-sensitive.
+    messageType :: Prelude.Maybe MessageType,
+    -- | The monthly price, in US dollars, to lease the phone number.
+    monthlyLeasingPrice :: Prelude.Maybe Prelude.Text,
+    -- | Indicates if the phone number will be used for text messages, voice
+    -- messages or both.
+    numberCapabilities :: Prelude.Maybe (Prelude.NonEmpty NumberCapability),
+    -- | The type of number that was released.
+    numberType :: Prelude.Maybe RequestableNumberType,
+    -- | The name of the OptOutList that is associated with the requested phone
+    -- number.
+    optOutListName :: Prelude.Maybe Prelude.Text,
+    -- | The new phone number that was requested.
+    phoneNumber :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the requested phone number.
+    phoneNumberArn :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of the new phone number.
+    phoneNumberId :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of the pool associated with the phone number
+    poolId :: Prelude.Maybe Prelude.Text,
+    -- | By default this is set to false. When an end recipient sends a message
+    -- that begins with HELP or STOP to one of your dedicated numbers, Amazon
+    -- Pinpoint automatically replies with a customizable message and adds the
+    -- end recipient to the OptOutList. When set to true you\'re responsible
+    -- for responding to HELP and STOP requests. You\'re also responsible for
+    -- tracking and honoring opt-out requests.
+    selfManagedOptOutsEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The current status of the request.
+    status :: Prelude.Maybe NumberStatus,
+    -- | An array of key and value pair tags that are associated with the phone
+    -- number.
+    tags :: Prelude.Maybe [Tag],
+    -- | The ARN used to identify the two way channel.
+    twoWayChannelArn :: Prelude.Maybe Prelude.Text,
+    -- | By default this is set to false. When set to true you can receive
+    -- incoming text messages from your end recipients.
+    twoWayEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RequestPhoneNumberResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdTimestamp', 'requestPhoneNumberResponse_createdTimestamp' - The time when the phone number was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+--
+-- 'deletionProtectionEnabled', 'requestPhoneNumberResponse_deletionProtectionEnabled' - By default this is set to false. When set to true the phone number
+-- can\'t be deleted.
+--
+-- 'isoCountryCode', 'requestPhoneNumberResponse_isoCountryCode' - The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+--
+-- 'messageType', 'requestPhoneNumberResponse_messageType' - The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+--
+-- 'monthlyLeasingPrice', 'requestPhoneNumberResponse_monthlyLeasingPrice' - The monthly price, in US dollars, to lease the phone number.
+--
+-- 'numberCapabilities', 'requestPhoneNumberResponse_numberCapabilities' - Indicates if the phone number will be used for text messages, voice
+-- messages or both.
+--
+-- 'numberType', 'requestPhoneNumberResponse_numberType' - The type of number that was released.
+--
+-- 'optOutListName', 'requestPhoneNumberResponse_optOutListName' - The name of the OptOutList that is associated with the requested phone
+-- number.
+--
+-- 'phoneNumber', 'requestPhoneNumberResponse_phoneNumber' - The new phone number that was requested.
+--
+-- 'phoneNumberArn', 'requestPhoneNumberResponse_phoneNumberArn' - The Amazon Resource Name (ARN) of the requested phone number.
+--
+-- 'phoneNumberId', 'requestPhoneNumberResponse_phoneNumberId' - The unique identifier of the new phone number.
+--
+-- 'poolId', 'requestPhoneNumberResponse_poolId' - The unique identifier of the pool associated with the phone number
+--
+-- 'selfManagedOptOutsEnabled', 'requestPhoneNumberResponse_selfManagedOptOutsEnabled' - By default this is set to false. When an end recipient sends a message
+-- that begins with HELP or STOP to one of your dedicated numbers, Amazon
+-- Pinpoint automatically replies with a customizable message and adds the
+-- end recipient to the OptOutList. When set to true you\'re responsible
+-- for responding to HELP and STOP requests. You\'re also responsible for
+-- tracking and honoring opt-out requests.
+--
+-- 'status', 'requestPhoneNumberResponse_status' - The current status of the request.
+--
+-- 'tags', 'requestPhoneNumberResponse_tags' - An array of key and value pair tags that are associated with the phone
+-- number.
+--
+-- 'twoWayChannelArn', 'requestPhoneNumberResponse_twoWayChannelArn' - The ARN used to identify the two way channel.
+--
+-- 'twoWayEnabled', 'requestPhoneNumberResponse_twoWayEnabled' - By default this is set to false. When set to true you can receive
+-- incoming text messages from your end recipients.
+--
+-- 'httpStatus', 'requestPhoneNumberResponse_httpStatus' - The response's http status code.
+newRequestPhoneNumberResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  RequestPhoneNumberResponse
+newRequestPhoneNumberResponse pHttpStatus_ =
+  RequestPhoneNumberResponse'
+    { createdTimestamp =
+        Prelude.Nothing,
+      deletionProtectionEnabled = Prelude.Nothing,
+      isoCountryCode = Prelude.Nothing,
+      messageType = Prelude.Nothing,
+      monthlyLeasingPrice = Prelude.Nothing,
+      numberCapabilities = Prelude.Nothing,
+      numberType = Prelude.Nothing,
+      optOutListName = Prelude.Nothing,
+      phoneNumber = Prelude.Nothing,
+      phoneNumberArn = Prelude.Nothing,
+      phoneNumberId = Prelude.Nothing,
+      poolId = Prelude.Nothing,
+      selfManagedOptOutsEnabled = Prelude.Nothing,
+      status = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      twoWayChannelArn = Prelude.Nothing,
+      twoWayEnabled = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The time when the phone number was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+requestPhoneNumberResponse_createdTimestamp :: Lens.Lens' RequestPhoneNumberResponse (Prelude.Maybe Prelude.UTCTime)
+requestPhoneNumberResponse_createdTimestamp = Lens.lens (\RequestPhoneNumberResponse' {createdTimestamp} -> createdTimestamp) (\s@RequestPhoneNumberResponse' {} a -> s {createdTimestamp = a} :: RequestPhoneNumberResponse) Prelude.. Lens.mapping Data._Time
+
+-- | By default this is set to false. When set to true the phone number
+-- can\'t be deleted.
+requestPhoneNumberResponse_deletionProtectionEnabled :: Lens.Lens' RequestPhoneNumberResponse (Prelude.Maybe Prelude.Bool)
+requestPhoneNumberResponse_deletionProtectionEnabled = Lens.lens (\RequestPhoneNumberResponse' {deletionProtectionEnabled} -> deletionProtectionEnabled) (\s@RequestPhoneNumberResponse' {} a -> s {deletionProtectionEnabled = a} :: RequestPhoneNumberResponse)
+
+-- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+requestPhoneNumberResponse_isoCountryCode :: Lens.Lens' RequestPhoneNumberResponse (Prelude.Maybe Prelude.Text)
+requestPhoneNumberResponse_isoCountryCode = Lens.lens (\RequestPhoneNumberResponse' {isoCountryCode} -> isoCountryCode) (\s@RequestPhoneNumberResponse' {} a -> s {isoCountryCode = a} :: RequestPhoneNumberResponse)
+
+-- | The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+requestPhoneNumberResponse_messageType :: Lens.Lens' RequestPhoneNumberResponse (Prelude.Maybe MessageType)
+requestPhoneNumberResponse_messageType = Lens.lens (\RequestPhoneNumberResponse' {messageType} -> messageType) (\s@RequestPhoneNumberResponse' {} a -> s {messageType = a} :: RequestPhoneNumberResponse)
+
+-- | The monthly price, in US dollars, to lease the phone number.
+requestPhoneNumberResponse_monthlyLeasingPrice :: Lens.Lens' RequestPhoneNumberResponse (Prelude.Maybe Prelude.Text)
+requestPhoneNumberResponse_monthlyLeasingPrice = Lens.lens (\RequestPhoneNumberResponse' {monthlyLeasingPrice} -> monthlyLeasingPrice) (\s@RequestPhoneNumberResponse' {} a -> s {monthlyLeasingPrice = a} :: RequestPhoneNumberResponse)
+
+-- | Indicates if the phone number will be used for text messages, voice
+-- messages or both.
+requestPhoneNumberResponse_numberCapabilities :: Lens.Lens' RequestPhoneNumberResponse (Prelude.Maybe (Prelude.NonEmpty NumberCapability))
+requestPhoneNumberResponse_numberCapabilities = Lens.lens (\RequestPhoneNumberResponse' {numberCapabilities} -> numberCapabilities) (\s@RequestPhoneNumberResponse' {} a -> s {numberCapabilities = a} :: RequestPhoneNumberResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The type of number that was released.
+requestPhoneNumberResponse_numberType :: Lens.Lens' RequestPhoneNumberResponse (Prelude.Maybe RequestableNumberType)
+requestPhoneNumberResponse_numberType = Lens.lens (\RequestPhoneNumberResponse' {numberType} -> numberType) (\s@RequestPhoneNumberResponse' {} a -> s {numberType = a} :: RequestPhoneNumberResponse)
+
+-- | The name of the OptOutList that is associated with the requested phone
+-- number.
+requestPhoneNumberResponse_optOutListName :: Lens.Lens' RequestPhoneNumberResponse (Prelude.Maybe Prelude.Text)
+requestPhoneNumberResponse_optOutListName = Lens.lens (\RequestPhoneNumberResponse' {optOutListName} -> optOutListName) (\s@RequestPhoneNumberResponse' {} a -> s {optOutListName = a} :: RequestPhoneNumberResponse)
+
+-- | The new phone number that was requested.
+requestPhoneNumberResponse_phoneNumber :: Lens.Lens' RequestPhoneNumberResponse (Prelude.Maybe Prelude.Text)
+requestPhoneNumberResponse_phoneNumber = Lens.lens (\RequestPhoneNumberResponse' {phoneNumber} -> phoneNumber) (\s@RequestPhoneNumberResponse' {} a -> s {phoneNumber = a} :: RequestPhoneNumberResponse)
+
+-- | The Amazon Resource Name (ARN) of the requested phone number.
+requestPhoneNumberResponse_phoneNumberArn :: Lens.Lens' RequestPhoneNumberResponse (Prelude.Maybe Prelude.Text)
+requestPhoneNumberResponse_phoneNumberArn = Lens.lens (\RequestPhoneNumberResponse' {phoneNumberArn} -> phoneNumberArn) (\s@RequestPhoneNumberResponse' {} a -> s {phoneNumberArn = a} :: RequestPhoneNumberResponse)
+
+-- | The unique identifier of the new phone number.
+requestPhoneNumberResponse_phoneNumberId :: Lens.Lens' RequestPhoneNumberResponse (Prelude.Maybe Prelude.Text)
+requestPhoneNumberResponse_phoneNumberId = Lens.lens (\RequestPhoneNumberResponse' {phoneNumberId} -> phoneNumberId) (\s@RequestPhoneNumberResponse' {} a -> s {phoneNumberId = a} :: RequestPhoneNumberResponse)
+
+-- | The unique identifier of the pool associated with the phone number
+requestPhoneNumberResponse_poolId :: Lens.Lens' RequestPhoneNumberResponse (Prelude.Maybe Prelude.Text)
+requestPhoneNumberResponse_poolId = Lens.lens (\RequestPhoneNumberResponse' {poolId} -> poolId) (\s@RequestPhoneNumberResponse' {} a -> s {poolId = a} :: RequestPhoneNumberResponse)
+
+-- | By default this is set to false. When an end recipient sends a message
+-- that begins with HELP or STOP to one of your dedicated numbers, Amazon
+-- Pinpoint automatically replies with a customizable message and adds the
+-- end recipient to the OptOutList. When set to true you\'re responsible
+-- for responding to HELP and STOP requests. You\'re also responsible for
+-- tracking and honoring opt-out requests.
+requestPhoneNumberResponse_selfManagedOptOutsEnabled :: Lens.Lens' RequestPhoneNumberResponse (Prelude.Maybe Prelude.Bool)
+requestPhoneNumberResponse_selfManagedOptOutsEnabled = Lens.lens (\RequestPhoneNumberResponse' {selfManagedOptOutsEnabled} -> selfManagedOptOutsEnabled) (\s@RequestPhoneNumberResponse' {} a -> s {selfManagedOptOutsEnabled = a} :: RequestPhoneNumberResponse)
+
+-- | The current status of the request.
+requestPhoneNumberResponse_status :: Lens.Lens' RequestPhoneNumberResponse (Prelude.Maybe NumberStatus)
+requestPhoneNumberResponse_status = Lens.lens (\RequestPhoneNumberResponse' {status} -> status) (\s@RequestPhoneNumberResponse' {} a -> s {status = a} :: RequestPhoneNumberResponse)
+
+-- | An array of key and value pair tags that are associated with the phone
+-- number.
+requestPhoneNumberResponse_tags :: Lens.Lens' RequestPhoneNumberResponse (Prelude.Maybe [Tag])
+requestPhoneNumberResponse_tags = Lens.lens (\RequestPhoneNumberResponse' {tags} -> tags) (\s@RequestPhoneNumberResponse' {} a -> s {tags = a} :: RequestPhoneNumberResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ARN used to identify the two way channel.
+requestPhoneNumberResponse_twoWayChannelArn :: Lens.Lens' RequestPhoneNumberResponse (Prelude.Maybe Prelude.Text)
+requestPhoneNumberResponse_twoWayChannelArn = Lens.lens (\RequestPhoneNumberResponse' {twoWayChannelArn} -> twoWayChannelArn) (\s@RequestPhoneNumberResponse' {} a -> s {twoWayChannelArn = a} :: RequestPhoneNumberResponse)
+
+-- | By default this is set to false. When set to true you can receive
+-- incoming text messages from your end recipients.
+requestPhoneNumberResponse_twoWayEnabled :: Lens.Lens' RequestPhoneNumberResponse (Prelude.Maybe Prelude.Bool)
+requestPhoneNumberResponse_twoWayEnabled = Lens.lens (\RequestPhoneNumberResponse' {twoWayEnabled} -> twoWayEnabled) (\s@RequestPhoneNumberResponse' {} a -> s {twoWayEnabled = a} :: RequestPhoneNumberResponse)
+
+-- | The response's http status code.
+requestPhoneNumberResponse_httpStatus :: Lens.Lens' RequestPhoneNumberResponse Prelude.Int
+requestPhoneNumberResponse_httpStatus = Lens.lens (\RequestPhoneNumberResponse' {httpStatus} -> httpStatus) (\s@RequestPhoneNumberResponse' {} a -> s {httpStatus = a} :: RequestPhoneNumberResponse)
+
+instance Prelude.NFData RequestPhoneNumberResponse where
+  rnf RequestPhoneNumberResponse' {..} =
+    Prelude.rnf createdTimestamp
+      `Prelude.seq` Prelude.rnf deletionProtectionEnabled
+      `Prelude.seq` Prelude.rnf isoCountryCode
+      `Prelude.seq` Prelude.rnf messageType
+      `Prelude.seq` Prelude.rnf monthlyLeasingPrice
+      `Prelude.seq` Prelude.rnf numberCapabilities
+      `Prelude.seq` Prelude.rnf numberType
+      `Prelude.seq` Prelude.rnf optOutListName
+      `Prelude.seq` Prelude.rnf phoneNumber
+      `Prelude.seq` Prelude.rnf phoneNumberArn
+      `Prelude.seq` Prelude.rnf phoneNumberId
+      `Prelude.seq` Prelude.rnf poolId
+      `Prelude.seq` Prelude.rnf selfManagedOptOutsEnabled
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf twoWayChannelArn
+      `Prelude.seq` Prelude.rnf twoWayEnabled
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/SendTextMessage.hs b/gen/Amazonka/PinpointSmsVoiceV2/SendTextMessage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/SendTextMessage.hs
@@ -0,0 +1,353 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.SendTextMessage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a new text message and sends it to a recipient\'s phone number.
+--
+-- SMS throughput limits are measured in Message Parts per Second (MPS).
+-- Your MPS limit depends on the destination country of your messages, as
+-- well as the type of phone number (origination number) that you use to
+-- send the message. For more information, see
+-- <https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-limitations-mps.html Message Parts per Second (MPS) limits>
+-- in the /Amazon Pinpoint User Guide/.
+module Amazonka.PinpointSmsVoiceV2.SendTextMessage
+  ( -- * Creating a Request
+    SendTextMessage (..),
+    newSendTextMessage,
+
+    -- * Request Lenses
+    sendTextMessage_configurationSetName,
+    sendTextMessage_context,
+    sendTextMessage_destinationCountryParameters,
+    sendTextMessage_dryRun,
+    sendTextMessage_keyword,
+    sendTextMessage_maxPrice,
+    sendTextMessage_messageBody,
+    sendTextMessage_messageType,
+    sendTextMessage_originationIdentity,
+    sendTextMessage_timeToLive,
+    sendTextMessage_destinationPhoneNumber,
+
+    -- * Destructuring the Response
+    SendTextMessageResponse (..),
+    newSendTextMessageResponse,
+
+    -- * Response Lenses
+    sendTextMessageResponse_messageId,
+    sendTextMessageResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newSendTextMessage' smart constructor.
+data SendTextMessage = SendTextMessage'
+  { -- | The name of the configuration set to use. This can be either the
+    -- ConfigurationSetName or ConfigurationSetArn.
+    configurationSetName :: Prelude.Maybe Prelude.Text,
+    -- | You can specify custom data in this field. If you do, that data is
+    -- logged to the event destination.
+    context :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | This field is used for any country-specific registration requirements.
+    -- Currently, this setting is only used when you send messages to
+    -- recipients in India using a sender ID. For more information see
+    -- <https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-senderid-india.html Special requirements for sending SMS messages to recipients in India>.
+    destinationCountryParameters :: Prelude.Maybe (Prelude.HashMap DestinationCountryParameterKey Prelude.Text),
+    -- | When set to true, the message is checked and validated, but isn\'t sent
+    -- to the end recipient.
+    dryRun :: Prelude.Maybe Prelude.Bool,
+    -- | When you register a short code in the US, you must specify a program
+    -- name. If you don’t have a US short code, omit this attribute.
+    keyword :: Prelude.Maybe Prelude.Text,
+    -- | The maximum amount that you want to spend, in US dollars, per each text
+    -- message part. A text message can contain multiple parts.
+    maxPrice :: Prelude.Maybe Prelude.Text,
+    -- | The body of the text message.
+    messageBody :: Prelude.Maybe Prelude.Text,
+    -- | The type of message. Valid values are TRANSACTIONAL for messages that
+    -- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+    -- critical or time-sensitive.
+    messageType :: Prelude.Maybe MessageType,
+    -- | The origination identity of the message. This can be either the
+    -- PhoneNumber, PhoneNumberId, PhoneNumberArn, SenderId, SenderIdArn,
+    -- PoolId, or PoolArn.
+    originationIdentity :: Prelude.Maybe Prelude.Text,
+    -- | How long the text message is valid for. By default this is 72 hours.
+    timeToLive :: Prelude.Maybe Prelude.Natural,
+    -- | The destination phone number in E.164 format.
+    destinationPhoneNumber :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SendTextMessage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationSetName', 'sendTextMessage_configurationSetName' - The name of the configuration set to use. This can be either the
+-- ConfigurationSetName or ConfigurationSetArn.
+--
+-- 'context', 'sendTextMessage_context' - You can specify custom data in this field. If you do, that data is
+-- logged to the event destination.
+--
+-- 'destinationCountryParameters', 'sendTextMessage_destinationCountryParameters' - This field is used for any country-specific registration requirements.
+-- Currently, this setting is only used when you send messages to
+-- recipients in India using a sender ID. For more information see
+-- <https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-senderid-india.html Special requirements for sending SMS messages to recipients in India>.
+--
+-- 'dryRun', 'sendTextMessage_dryRun' - When set to true, the message is checked and validated, but isn\'t sent
+-- to the end recipient.
+--
+-- 'keyword', 'sendTextMessage_keyword' - When you register a short code in the US, you must specify a program
+-- name. If you don’t have a US short code, omit this attribute.
+--
+-- 'maxPrice', 'sendTextMessage_maxPrice' - The maximum amount that you want to spend, in US dollars, per each text
+-- message part. A text message can contain multiple parts.
+--
+-- 'messageBody', 'sendTextMessage_messageBody' - The body of the text message.
+--
+-- 'messageType', 'sendTextMessage_messageType' - The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+--
+-- 'originationIdentity', 'sendTextMessage_originationIdentity' - The origination identity of the message. This can be either the
+-- PhoneNumber, PhoneNumberId, PhoneNumberArn, SenderId, SenderIdArn,
+-- PoolId, or PoolArn.
+--
+-- 'timeToLive', 'sendTextMessage_timeToLive' - How long the text message is valid for. By default this is 72 hours.
+--
+-- 'destinationPhoneNumber', 'sendTextMessage_destinationPhoneNumber' - The destination phone number in E.164 format.
+newSendTextMessage ::
+  -- | 'destinationPhoneNumber'
+  Prelude.Text ->
+  SendTextMessage
+newSendTextMessage pDestinationPhoneNumber_ =
+  SendTextMessage'
+    { configurationSetName =
+        Prelude.Nothing,
+      context = Prelude.Nothing,
+      destinationCountryParameters = Prelude.Nothing,
+      dryRun = Prelude.Nothing,
+      keyword = Prelude.Nothing,
+      maxPrice = Prelude.Nothing,
+      messageBody = Prelude.Nothing,
+      messageType = Prelude.Nothing,
+      originationIdentity = Prelude.Nothing,
+      timeToLive = Prelude.Nothing,
+      destinationPhoneNumber = pDestinationPhoneNumber_
+    }
+
+-- | The name of the configuration set to use. This can be either the
+-- ConfigurationSetName or ConfigurationSetArn.
+sendTextMessage_configurationSetName :: Lens.Lens' SendTextMessage (Prelude.Maybe Prelude.Text)
+sendTextMessage_configurationSetName = Lens.lens (\SendTextMessage' {configurationSetName} -> configurationSetName) (\s@SendTextMessage' {} a -> s {configurationSetName = a} :: SendTextMessage)
+
+-- | You can specify custom data in this field. If you do, that data is
+-- logged to the event destination.
+sendTextMessage_context :: Lens.Lens' SendTextMessage (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+sendTextMessage_context = Lens.lens (\SendTextMessage' {context} -> context) (\s@SendTextMessage' {} a -> s {context = a} :: SendTextMessage) Prelude.. Lens.mapping Lens.coerced
+
+-- | This field is used for any country-specific registration requirements.
+-- Currently, this setting is only used when you send messages to
+-- recipients in India using a sender ID. For more information see
+-- <https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-senderid-india.html Special requirements for sending SMS messages to recipients in India>.
+sendTextMessage_destinationCountryParameters :: Lens.Lens' SendTextMessage (Prelude.Maybe (Prelude.HashMap DestinationCountryParameterKey Prelude.Text))
+sendTextMessage_destinationCountryParameters = Lens.lens (\SendTextMessage' {destinationCountryParameters} -> destinationCountryParameters) (\s@SendTextMessage' {} a -> s {destinationCountryParameters = a} :: SendTextMessage) Prelude.. Lens.mapping Lens.coerced
+
+-- | When set to true, the message is checked and validated, but isn\'t sent
+-- to the end recipient.
+sendTextMessage_dryRun :: Lens.Lens' SendTextMessage (Prelude.Maybe Prelude.Bool)
+sendTextMessage_dryRun = Lens.lens (\SendTextMessage' {dryRun} -> dryRun) (\s@SendTextMessage' {} a -> s {dryRun = a} :: SendTextMessage)
+
+-- | When you register a short code in the US, you must specify a program
+-- name. If you don’t have a US short code, omit this attribute.
+sendTextMessage_keyword :: Lens.Lens' SendTextMessage (Prelude.Maybe Prelude.Text)
+sendTextMessage_keyword = Lens.lens (\SendTextMessage' {keyword} -> keyword) (\s@SendTextMessage' {} a -> s {keyword = a} :: SendTextMessage)
+
+-- | The maximum amount that you want to spend, in US dollars, per each text
+-- message part. A text message can contain multiple parts.
+sendTextMessage_maxPrice :: Lens.Lens' SendTextMessage (Prelude.Maybe Prelude.Text)
+sendTextMessage_maxPrice = Lens.lens (\SendTextMessage' {maxPrice} -> maxPrice) (\s@SendTextMessage' {} a -> s {maxPrice = a} :: SendTextMessage)
+
+-- | The body of the text message.
+sendTextMessage_messageBody :: Lens.Lens' SendTextMessage (Prelude.Maybe Prelude.Text)
+sendTextMessage_messageBody = Lens.lens (\SendTextMessage' {messageBody} -> messageBody) (\s@SendTextMessage' {} a -> s {messageBody = a} :: SendTextMessage)
+
+-- | The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+sendTextMessage_messageType :: Lens.Lens' SendTextMessage (Prelude.Maybe MessageType)
+sendTextMessage_messageType = Lens.lens (\SendTextMessage' {messageType} -> messageType) (\s@SendTextMessage' {} a -> s {messageType = a} :: SendTextMessage)
+
+-- | The origination identity of the message. This can be either the
+-- PhoneNumber, PhoneNumberId, PhoneNumberArn, SenderId, SenderIdArn,
+-- PoolId, or PoolArn.
+sendTextMessage_originationIdentity :: Lens.Lens' SendTextMessage (Prelude.Maybe Prelude.Text)
+sendTextMessage_originationIdentity = Lens.lens (\SendTextMessage' {originationIdentity} -> originationIdentity) (\s@SendTextMessage' {} a -> s {originationIdentity = a} :: SendTextMessage)
+
+-- | How long the text message is valid for. By default this is 72 hours.
+sendTextMessage_timeToLive :: Lens.Lens' SendTextMessage (Prelude.Maybe Prelude.Natural)
+sendTextMessage_timeToLive = Lens.lens (\SendTextMessage' {timeToLive} -> timeToLive) (\s@SendTextMessage' {} a -> s {timeToLive = a} :: SendTextMessage)
+
+-- | The destination phone number in E.164 format.
+sendTextMessage_destinationPhoneNumber :: Lens.Lens' SendTextMessage Prelude.Text
+sendTextMessage_destinationPhoneNumber = Lens.lens (\SendTextMessage' {destinationPhoneNumber} -> destinationPhoneNumber) (\s@SendTextMessage' {} a -> s {destinationPhoneNumber = a} :: SendTextMessage)
+
+instance Core.AWSRequest SendTextMessage where
+  type
+    AWSResponse SendTextMessage =
+      SendTextMessageResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          SendTextMessageResponse'
+            Prelude.<$> (x Data..?> "MessageId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable SendTextMessage where
+  hashWithSalt _salt SendTextMessage' {..} =
+    _salt
+      `Prelude.hashWithSalt` configurationSetName
+      `Prelude.hashWithSalt` context
+      `Prelude.hashWithSalt` destinationCountryParameters
+      `Prelude.hashWithSalt` dryRun
+      `Prelude.hashWithSalt` keyword
+      `Prelude.hashWithSalt` maxPrice
+      `Prelude.hashWithSalt` messageBody
+      `Prelude.hashWithSalt` messageType
+      `Prelude.hashWithSalt` originationIdentity
+      `Prelude.hashWithSalt` timeToLive
+      `Prelude.hashWithSalt` destinationPhoneNumber
+
+instance Prelude.NFData SendTextMessage where
+  rnf SendTextMessage' {..} =
+    Prelude.rnf configurationSetName
+      `Prelude.seq` Prelude.rnf context
+      `Prelude.seq` Prelude.rnf destinationCountryParameters
+      `Prelude.seq` Prelude.rnf dryRun
+      `Prelude.seq` Prelude.rnf keyword
+      `Prelude.seq` Prelude.rnf maxPrice
+      `Prelude.seq` Prelude.rnf messageBody
+      `Prelude.seq` Prelude.rnf messageType
+      `Prelude.seq` Prelude.rnf originationIdentity
+      `Prelude.seq` Prelude.rnf timeToLive
+      `Prelude.seq` Prelude.rnf destinationPhoneNumber
+
+instance Data.ToHeaders SendTextMessage where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.SendTextMessage" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON SendTextMessage where
+  toJSON SendTextMessage' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ConfigurationSetName" Data..=)
+              Prelude.<$> configurationSetName,
+            ("Context" Data..=) Prelude.<$> context,
+            ("DestinationCountryParameters" Data..=)
+              Prelude.<$> destinationCountryParameters,
+            ("DryRun" Data..=) Prelude.<$> dryRun,
+            ("Keyword" Data..=) Prelude.<$> keyword,
+            ("MaxPrice" Data..=) Prelude.<$> maxPrice,
+            ("MessageBody" Data..=) Prelude.<$> messageBody,
+            ("MessageType" Data..=) Prelude.<$> messageType,
+            ("OriginationIdentity" Data..=)
+              Prelude.<$> originationIdentity,
+            ("TimeToLive" Data..=) Prelude.<$> timeToLive,
+            Prelude.Just
+              ( "DestinationPhoneNumber"
+                  Data..= destinationPhoneNumber
+              )
+          ]
+      )
+
+instance Data.ToPath SendTextMessage where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery SendTextMessage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newSendTextMessageResponse' smart constructor.
+data SendTextMessageResponse = SendTextMessageResponse'
+  { -- | The unique identifier for the message.
+    messageId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SendTextMessageResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'messageId', 'sendTextMessageResponse_messageId' - The unique identifier for the message.
+--
+-- 'httpStatus', 'sendTextMessageResponse_httpStatus' - The response's http status code.
+newSendTextMessageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  SendTextMessageResponse
+newSendTextMessageResponse pHttpStatus_ =
+  SendTextMessageResponse'
+    { messageId =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The unique identifier for the message.
+sendTextMessageResponse_messageId :: Lens.Lens' SendTextMessageResponse (Prelude.Maybe Prelude.Text)
+sendTextMessageResponse_messageId = Lens.lens (\SendTextMessageResponse' {messageId} -> messageId) (\s@SendTextMessageResponse' {} a -> s {messageId = a} :: SendTextMessageResponse)
+
+-- | The response's http status code.
+sendTextMessageResponse_httpStatus :: Lens.Lens' SendTextMessageResponse Prelude.Int
+sendTextMessageResponse_httpStatus = Lens.lens (\SendTextMessageResponse' {httpStatus} -> httpStatus) (\s@SendTextMessageResponse' {} a -> s {httpStatus = a} :: SendTextMessageResponse)
+
+instance Prelude.NFData SendTextMessageResponse where
+  rnf SendTextMessageResponse' {..} =
+    Prelude.rnf messageId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/SendVoiceMessage.hs b/gen/Amazonka/PinpointSmsVoiceV2/SendVoiceMessage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/SendVoiceMessage.hs
@@ -0,0 +1,344 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.SendVoiceMessage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Allows you to send a request that sends a text message through Amazon
+-- Pinpoint. This operation uses
+-- <http://aws.amazon.com/polly/ Amazon Polly> to convert a text script
+-- into a voice message.
+module Amazonka.PinpointSmsVoiceV2.SendVoiceMessage
+  ( -- * Creating a Request
+    SendVoiceMessage (..),
+    newSendVoiceMessage,
+
+    -- * Request Lenses
+    sendVoiceMessage_configurationSetName,
+    sendVoiceMessage_context,
+    sendVoiceMessage_dryRun,
+    sendVoiceMessage_maxPricePerMinute,
+    sendVoiceMessage_messageBody,
+    sendVoiceMessage_messageBodyTextType,
+    sendVoiceMessage_timeToLive,
+    sendVoiceMessage_voiceId,
+    sendVoiceMessage_destinationPhoneNumber,
+    sendVoiceMessage_originationIdentity,
+
+    -- * Destructuring the Response
+    SendVoiceMessageResponse (..),
+    newSendVoiceMessageResponse,
+
+    -- * Response Lenses
+    sendVoiceMessageResponse_messageId,
+    sendVoiceMessageResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newSendVoiceMessage' smart constructor.
+data SendVoiceMessage = SendVoiceMessage'
+  { -- | The name of the configuration set to use. This can be either the
+    -- ConfigurationSetName or ConfigurationSetArn.
+    configurationSetName :: Prelude.Maybe Prelude.Text,
+    -- | You can specify custom data in this field. If you do, that data is
+    -- logged to the event destination.
+    context :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | When set to true, the message is checked and validated, but isn\'t sent
+    -- to the end recipient.
+    dryRun :: Prelude.Maybe Prelude.Bool,
+    -- | The maximum amount to spend per voice message, in US dollars.
+    maxPricePerMinute :: Prelude.Maybe Prelude.Text,
+    -- | The text to convert to a voice message.
+    messageBody :: Prelude.Maybe Prelude.Text,
+    -- | Specifies if the MessageBody field contains text or
+    -- <https://docs.aws.amazon.com/polly/latest/dg/what-is.html speech synthesis markup language (SSML)>.
+    --
+    -- -   TEXT: This is the default value. When used the maximum character
+    --     limit is 3000.
+    --
+    -- -   SSML: When used the maximum character limit is 6000 including SSML
+    --     tagging.
+    messageBodyTextType :: Prelude.Maybe VoiceMessageBodyTextType,
+    -- | How long the voice message is valid for. By default this is 72 hours.
+    timeToLive :: Prelude.Maybe Prelude.Natural,
+    -- | The voice for the
+    -- <https://docs.aws.amazon.com/polly/latest/dg/what-is.html Amazon Polly>
+    -- service to use. By default this is set to \"MATTHEW\".
+    voiceId :: Prelude.Maybe VoiceId,
+    -- | The destination phone number in E.164 format.
+    destinationPhoneNumber :: Prelude.Text,
+    -- | The origination identity to use for the voice call. This can be the
+    -- PhoneNumber, PhoneNumberId, PhoneNumberArn, PoolId, or PoolArn.
+    originationIdentity :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SendVoiceMessage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationSetName', 'sendVoiceMessage_configurationSetName' - The name of the configuration set to use. This can be either the
+-- ConfigurationSetName or ConfigurationSetArn.
+--
+-- 'context', 'sendVoiceMessage_context' - You can specify custom data in this field. If you do, that data is
+-- logged to the event destination.
+--
+-- 'dryRun', 'sendVoiceMessage_dryRun' - When set to true, the message is checked and validated, but isn\'t sent
+-- to the end recipient.
+--
+-- 'maxPricePerMinute', 'sendVoiceMessage_maxPricePerMinute' - The maximum amount to spend per voice message, in US dollars.
+--
+-- 'messageBody', 'sendVoiceMessage_messageBody' - The text to convert to a voice message.
+--
+-- 'messageBodyTextType', 'sendVoiceMessage_messageBodyTextType' - Specifies if the MessageBody field contains text or
+-- <https://docs.aws.amazon.com/polly/latest/dg/what-is.html speech synthesis markup language (SSML)>.
+--
+-- -   TEXT: This is the default value. When used the maximum character
+--     limit is 3000.
+--
+-- -   SSML: When used the maximum character limit is 6000 including SSML
+--     tagging.
+--
+-- 'timeToLive', 'sendVoiceMessage_timeToLive' - How long the voice message is valid for. By default this is 72 hours.
+--
+-- 'voiceId', 'sendVoiceMessage_voiceId' - The voice for the
+-- <https://docs.aws.amazon.com/polly/latest/dg/what-is.html Amazon Polly>
+-- service to use. By default this is set to \"MATTHEW\".
+--
+-- 'destinationPhoneNumber', 'sendVoiceMessage_destinationPhoneNumber' - The destination phone number in E.164 format.
+--
+-- 'originationIdentity', 'sendVoiceMessage_originationIdentity' - The origination identity to use for the voice call. This can be the
+-- PhoneNumber, PhoneNumberId, PhoneNumberArn, PoolId, or PoolArn.
+newSendVoiceMessage ::
+  -- | 'destinationPhoneNumber'
+  Prelude.Text ->
+  -- | 'originationIdentity'
+  Prelude.Text ->
+  SendVoiceMessage
+newSendVoiceMessage
+  pDestinationPhoneNumber_
+  pOriginationIdentity_ =
+    SendVoiceMessage'
+      { configurationSetName =
+          Prelude.Nothing,
+        context = Prelude.Nothing,
+        dryRun = Prelude.Nothing,
+        maxPricePerMinute = Prelude.Nothing,
+        messageBody = Prelude.Nothing,
+        messageBodyTextType = Prelude.Nothing,
+        timeToLive = Prelude.Nothing,
+        voiceId = Prelude.Nothing,
+        destinationPhoneNumber = pDestinationPhoneNumber_,
+        originationIdentity = pOriginationIdentity_
+      }
+
+-- | The name of the configuration set to use. This can be either the
+-- ConfigurationSetName or ConfigurationSetArn.
+sendVoiceMessage_configurationSetName :: Lens.Lens' SendVoiceMessage (Prelude.Maybe Prelude.Text)
+sendVoiceMessage_configurationSetName = Lens.lens (\SendVoiceMessage' {configurationSetName} -> configurationSetName) (\s@SendVoiceMessage' {} a -> s {configurationSetName = a} :: SendVoiceMessage)
+
+-- | You can specify custom data in this field. If you do, that data is
+-- logged to the event destination.
+sendVoiceMessage_context :: Lens.Lens' SendVoiceMessage (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+sendVoiceMessage_context = Lens.lens (\SendVoiceMessage' {context} -> context) (\s@SendVoiceMessage' {} a -> s {context = a} :: SendVoiceMessage) Prelude.. Lens.mapping Lens.coerced
+
+-- | When set to true, the message is checked and validated, but isn\'t sent
+-- to the end recipient.
+sendVoiceMessage_dryRun :: Lens.Lens' SendVoiceMessage (Prelude.Maybe Prelude.Bool)
+sendVoiceMessage_dryRun = Lens.lens (\SendVoiceMessage' {dryRun} -> dryRun) (\s@SendVoiceMessage' {} a -> s {dryRun = a} :: SendVoiceMessage)
+
+-- | The maximum amount to spend per voice message, in US dollars.
+sendVoiceMessage_maxPricePerMinute :: Lens.Lens' SendVoiceMessage (Prelude.Maybe Prelude.Text)
+sendVoiceMessage_maxPricePerMinute = Lens.lens (\SendVoiceMessage' {maxPricePerMinute} -> maxPricePerMinute) (\s@SendVoiceMessage' {} a -> s {maxPricePerMinute = a} :: SendVoiceMessage)
+
+-- | The text to convert to a voice message.
+sendVoiceMessage_messageBody :: Lens.Lens' SendVoiceMessage (Prelude.Maybe Prelude.Text)
+sendVoiceMessage_messageBody = Lens.lens (\SendVoiceMessage' {messageBody} -> messageBody) (\s@SendVoiceMessage' {} a -> s {messageBody = a} :: SendVoiceMessage)
+
+-- | Specifies if the MessageBody field contains text or
+-- <https://docs.aws.amazon.com/polly/latest/dg/what-is.html speech synthesis markup language (SSML)>.
+--
+-- -   TEXT: This is the default value. When used the maximum character
+--     limit is 3000.
+--
+-- -   SSML: When used the maximum character limit is 6000 including SSML
+--     tagging.
+sendVoiceMessage_messageBodyTextType :: Lens.Lens' SendVoiceMessage (Prelude.Maybe VoiceMessageBodyTextType)
+sendVoiceMessage_messageBodyTextType = Lens.lens (\SendVoiceMessage' {messageBodyTextType} -> messageBodyTextType) (\s@SendVoiceMessage' {} a -> s {messageBodyTextType = a} :: SendVoiceMessage)
+
+-- | How long the voice message is valid for. By default this is 72 hours.
+sendVoiceMessage_timeToLive :: Lens.Lens' SendVoiceMessage (Prelude.Maybe Prelude.Natural)
+sendVoiceMessage_timeToLive = Lens.lens (\SendVoiceMessage' {timeToLive} -> timeToLive) (\s@SendVoiceMessage' {} a -> s {timeToLive = a} :: SendVoiceMessage)
+
+-- | The voice for the
+-- <https://docs.aws.amazon.com/polly/latest/dg/what-is.html Amazon Polly>
+-- service to use. By default this is set to \"MATTHEW\".
+sendVoiceMessage_voiceId :: Lens.Lens' SendVoiceMessage (Prelude.Maybe VoiceId)
+sendVoiceMessage_voiceId = Lens.lens (\SendVoiceMessage' {voiceId} -> voiceId) (\s@SendVoiceMessage' {} a -> s {voiceId = a} :: SendVoiceMessage)
+
+-- | The destination phone number in E.164 format.
+sendVoiceMessage_destinationPhoneNumber :: Lens.Lens' SendVoiceMessage Prelude.Text
+sendVoiceMessage_destinationPhoneNumber = Lens.lens (\SendVoiceMessage' {destinationPhoneNumber} -> destinationPhoneNumber) (\s@SendVoiceMessage' {} a -> s {destinationPhoneNumber = a} :: SendVoiceMessage)
+
+-- | The origination identity to use for the voice call. This can be the
+-- PhoneNumber, PhoneNumberId, PhoneNumberArn, PoolId, or PoolArn.
+sendVoiceMessage_originationIdentity :: Lens.Lens' SendVoiceMessage Prelude.Text
+sendVoiceMessage_originationIdentity = Lens.lens (\SendVoiceMessage' {originationIdentity} -> originationIdentity) (\s@SendVoiceMessage' {} a -> s {originationIdentity = a} :: SendVoiceMessage)
+
+instance Core.AWSRequest SendVoiceMessage where
+  type
+    AWSResponse SendVoiceMessage =
+      SendVoiceMessageResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          SendVoiceMessageResponse'
+            Prelude.<$> (x Data..?> "MessageId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable SendVoiceMessage where
+  hashWithSalt _salt SendVoiceMessage' {..} =
+    _salt
+      `Prelude.hashWithSalt` configurationSetName
+      `Prelude.hashWithSalt` context
+      `Prelude.hashWithSalt` dryRun
+      `Prelude.hashWithSalt` maxPricePerMinute
+      `Prelude.hashWithSalt` messageBody
+      `Prelude.hashWithSalt` messageBodyTextType
+      `Prelude.hashWithSalt` timeToLive
+      `Prelude.hashWithSalt` voiceId
+      `Prelude.hashWithSalt` destinationPhoneNumber
+      `Prelude.hashWithSalt` originationIdentity
+
+instance Prelude.NFData SendVoiceMessage where
+  rnf SendVoiceMessage' {..} =
+    Prelude.rnf configurationSetName
+      `Prelude.seq` Prelude.rnf context
+      `Prelude.seq` Prelude.rnf dryRun
+      `Prelude.seq` Prelude.rnf maxPricePerMinute
+      `Prelude.seq` Prelude.rnf messageBody
+      `Prelude.seq` Prelude.rnf messageBodyTextType
+      `Prelude.seq` Prelude.rnf timeToLive
+      `Prelude.seq` Prelude.rnf voiceId
+      `Prelude.seq` Prelude.rnf destinationPhoneNumber
+      `Prelude.seq` Prelude.rnf originationIdentity
+
+instance Data.ToHeaders SendVoiceMessage where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.SendVoiceMessage" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON SendVoiceMessage where
+  toJSON SendVoiceMessage' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ConfigurationSetName" Data..=)
+              Prelude.<$> configurationSetName,
+            ("Context" Data..=) Prelude.<$> context,
+            ("DryRun" Data..=) Prelude.<$> dryRun,
+            ("MaxPricePerMinute" Data..=)
+              Prelude.<$> maxPricePerMinute,
+            ("MessageBody" Data..=) Prelude.<$> messageBody,
+            ("MessageBodyTextType" Data..=)
+              Prelude.<$> messageBodyTextType,
+            ("TimeToLive" Data..=) Prelude.<$> timeToLive,
+            ("VoiceId" Data..=) Prelude.<$> voiceId,
+            Prelude.Just
+              ( "DestinationPhoneNumber"
+                  Data..= destinationPhoneNumber
+              ),
+            Prelude.Just
+              ("OriginationIdentity" Data..= originationIdentity)
+          ]
+      )
+
+instance Data.ToPath SendVoiceMessage where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery SendVoiceMessage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newSendVoiceMessageResponse' smart constructor.
+data SendVoiceMessageResponse = SendVoiceMessageResponse'
+  { -- | The unique identifier for the message.
+    messageId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SendVoiceMessageResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'messageId', 'sendVoiceMessageResponse_messageId' - The unique identifier for the message.
+--
+-- 'httpStatus', 'sendVoiceMessageResponse_httpStatus' - The response's http status code.
+newSendVoiceMessageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  SendVoiceMessageResponse
+newSendVoiceMessageResponse pHttpStatus_ =
+  SendVoiceMessageResponse'
+    { messageId =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The unique identifier for the message.
+sendVoiceMessageResponse_messageId :: Lens.Lens' SendVoiceMessageResponse (Prelude.Maybe Prelude.Text)
+sendVoiceMessageResponse_messageId = Lens.lens (\SendVoiceMessageResponse' {messageId} -> messageId) (\s@SendVoiceMessageResponse' {} a -> s {messageId = a} :: SendVoiceMessageResponse)
+
+-- | The response's http status code.
+sendVoiceMessageResponse_httpStatus :: Lens.Lens' SendVoiceMessageResponse Prelude.Int
+sendVoiceMessageResponse_httpStatus = Lens.lens (\SendVoiceMessageResponse' {httpStatus} -> httpStatus) (\s@SendVoiceMessageResponse' {} a -> s {httpStatus = a} :: SendVoiceMessageResponse)
+
+instance Prelude.NFData SendVoiceMessageResponse where
+  rnf SendVoiceMessageResponse' {..} =
+    Prelude.rnf messageId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/SetDefaultMessageType.hs b/gen/Amazonka/PinpointSmsVoiceV2/SetDefaultMessageType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/SetDefaultMessageType.hs
@@ -0,0 +1,234 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.SetDefaultMessageType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Sets the default message type on a configuration set.
+--
+-- Choose the category of SMS messages that you plan to send from this
+-- account. If you send account-related messages or time-sensitive messages
+-- such as one-time passcodes, choose __Transactional__. If you plan to
+-- send messages that contain marketing material or other promotional
+-- content, choose __Promotional__. This setting applies to your entire
+-- Amazon Web Services account.
+module Amazonka.PinpointSmsVoiceV2.SetDefaultMessageType
+  ( -- * Creating a Request
+    SetDefaultMessageType (..),
+    newSetDefaultMessageType,
+
+    -- * Request Lenses
+    setDefaultMessageType_configurationSetName,
+    setDefaultMessageType_messageType,
+
+    -- * Destructuring the Response
+    SetDefaultMessageTypeResponse (..),
+    newSetDefaultMessageTypeResponse,
+
+    -- * Response Lenses
+    setDefaultMessageTypeResponse_configurationSetArn,
+    setDefaultMessageTypeResponse_configurationSetName,
+    setDefaultMessageTypeResponse_messageType,
+    setDefaultMessageTypeResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newSetDefaultMessageType' smart constructor.
+data SetDefaultMessageType = SetDefaultMessageType'
+  { -- | The configuration set to update with a new default message type. This
+    -- field can be the ConsigurationSetName or ConfigurationSetArn.
+    configurationSetName :: Prelude.Text,
+    -- | The type of message. Valid values are TRANSACTIONAL for messages that
+    -- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+    -- critical or time-sensitive.
+    messageType :: MessageType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SetDefaultMessageType' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationSetName', 'setDefaultMessageType_configurationSetName' - The configuration set to update with a new default message type. This
+-- field can be the ConsigurationSetName or ConfigurationSetArn.
+--
+-- 'messageType', 'setDefaultMessageType_messageType' - The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+newSetDefaultMessageType ::
+  -- | 'configurationSetName'
+  Prelude.Text ->
+  -- | 'messageType'
+  MessageType ->
+  SetDefaultMessageType
+newSetDefaultMessageType
+  pConfigurationSetName_
+  pMessageType_ =
+    SetDefaultMessageType'
+      { configurationSetName =
+          pConfigurationSetName_,
+        messageType = pMessageType_
+      }
+
+-- | The configuration set to update with a new default message type. This
+-- field can be the ConsigurationSetName or ConfigurationSetArn.
+setDefaultMessageType_configurationSetName :: Lens.Lens' SetDefaultMessageType Prelude.Text
+setDefaultMessageType_configurationSetName = Lens.lens (\SetDefaultMessageType' {configurationSetName} -> configurationSetName) (\s@SetDefaultMessageType' {} a -> s {configurationSetName = a} :: SetDefaultMessageType)
+
+-- | The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+setDefaultMessageType_messageType :: Lens.Lens' SetDefaultMessageType MessageType
+setDefaultMessageType_messageType = Lens.lens (\SetDefaultMessageType' {messageType} -> messageType) (\s@SetDefaultMessageType' {} a -> s {messageType = a} :: SetDefaultMessageType)
+
+instance Core.AWSRequest SetDefaultMessageType where
+  type
+    AWSResponse SetDefaultMessageType =
+      SetDefaultMessageTypeResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          SetDefaultMessageTypeResponse'
+            Prelude.<$> (x Data..?> "ConfigurationSetArn")
+            Prelude.<*> (x Data..?> "ConfigurationSetName")
+            Prelude.<*> (x Data..?> "MessageType")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable SetDefaultMessageType where
+  hashWithSalt _salt SetDefaultMessageType' {..} =
+    _salt
+      `Prelude.hashWithSalt` configurationSetName
+      `Prelude.hashWithSalt` messageType
+
+instance Prelude.NFData SetDefaultMessageType where
+  rnf SetDefaultMessageType' {..} =
+    Prelude.rnf configurationSetName
+      `Prelude.seq` Prelude.rnf messageType
+
+instance Data.ToHeaders SetDefaultMessageType where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.SetDefaultMessageType" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON SetDefaultMessageType where
+  toJSON SetDefaultMessageType' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "ConfigurationSetName"
+                  Data..= configurationSetName
+              ),
+            Prelude.Just ("MessageType" Data..= messageType)
+          ]
+      )
+
+instance Data.ToPath SetDefaultMessageType where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery SetDefaultMessageType where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newSetDefaultMessageTypeResponse' smart constructor.
+data SetDefaultMessageTypeResponse = SetDefaultMessageTypeResponse'
+  { -- | The Amazon Resource Name (ARN) of the updated configuration set.
+    configurationSetArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the configuration set that was updated.
+    configurationSetName :: Prelude.Maybe Prelude.Text,
+    -- | The new default message type of the configuration set.
+    messageType :: Prelude.Maybe MessageType,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SetDefaultMessageTypeResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationSetArn', 'setDefaultMessageTypeResponse_configurationSetArn' - The Amazon Resource Name (ARN) of the updated configuration set.
+--
+-- 'configurationSetName', 'setDefaultMessageTypeResponse_configurationSetName' - The name of the configuration set that was updated.
+--
+-- 'messageType', 'setDefaultMessageTypeResponse_messageType' - The new default message type of the configuration set.
+--
+-- 'httpStatus', 'setDefaultMessageTypeResponse_httpStatus' - The response's http status code.
+newSetDefaultMessageTypeResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  SetDefaultMessageTypeResponse
+newSetDefaultMessageTypeResponse pHttpStatus_ =
+  SetDefaultMessageTypeResponse'
+    { configurationSetArn =
+        Prelude.Nothing,
+      configurationSetName = Prelude.Nothing,
+      messageType = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the updated configuration set.
+setDefaultMessageTypeResponse_configurationSetArn :: Lens.Lens' SetDefaultMessageTypeResponse (Prelude.Maybe Prelude.Text)
+setDefaultMessageTypeResponse_configurationSetArn = Lens.lens (\SetDefaultMessageTypeResponse' {configurationSetArn} -> configurationSetArn) (\s@SetDefaultMessageTypeResponse' {} a -> s {configurationSetArn = a} :: SetDefaultMessageTypeResponse)
+
+-- | The name of the configuration set that was updated.
+setDefaultMessageTypeResponse_configurationSetName :: Lens.Lens' SetDefaultMessageTypeResponse (Prelude.Maybe Prelude.Text)
+setDefaultMessageTypeResponse_configurationSetName = Lens.lens (\SetDefaultMessageTypeResponse' {configurationSetName} -> configurationSetName) (\s@SetDefaultMessageTypeResponse' {} a -> s {configurationSetName = a} :: SetDefaultMessageTypeResponse)
+
+-- | The new default message type of the configuration set.
+setDefaultMessageTypeResponse_messageType :: Lens.Lens' SetDefaultMessageTypeResponse (Prelude.Maybe MessageType)
+setDefaultMessageTypeResponse_messageType = Lens.lens (\SetDefaultMessageTypeResponse' {messageType} -> messageType) (\s@SetDefaultMessageTypeResponse' {} a -> s {messageType = a} :: SetDefaultMessageTypeResponse)
+
+-- | The response's http status code.
+setDefaultMessageTypeResponse_httpStatus :: Lens.Lens' SetDefaultMessageTypeResponse Prelude.Int
+setDefaultMessageTypeResponse_httpStatus = Lens.lens (\SetDefaultMessageTypeResponse' {httpStatus} -> httpStatus) (\s@SetDefaultMessageTypeResponse' {} a -> s {httpStatus = a} :: SetDefaultMessageTypeResponse)
+
+instance Prelude.NFData SetDefaultMessageTypeResponse where
+  rnf SetDefaultMessageTypeResponse' {..} =
+    Prelude.rnf configurationSetArn
+      `Prelude.seq` Prelude.rnf configurationSetName
+      `Prelude.seq` Prelude.rnf messageType
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/SetDefaultSenderId.hs b/gen/Amazonka/PinpointSmsVoiceV2/SetDefaultSenderId.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/SetDefaultSenderId.hs
@@ -0,0 +1,241 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.SetDefaultSenderId
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Sets default sender ID on a configuration set.
+--
+-- When sending a text message to a destination country that supports
+-- sender IDs, the default sender ID on the configuration set specified
+-- will be used if no dedicated origination phone numbers or registered
+-- sender IDs are available in your account.
+module Amazonka.PinpointSmsVoiceV2.SetDefaultSenderId
+  ( -- * Creating a Request
+    SetDefaultSenderId (..),
+    newSetDefaultSenderId,
+
+    -- * Request Lenses
+    setDefaultSenderId_configurationSetName,
+    setDefaultSenderId_senderId,
+
+    -- * Destructuring the Response
+    SetDefaultSenderIdResponse (..),
+    newSetDefaultSenderIdResponse,
+
+    -- * Response Lenses
+    setDefaultSenderIdResponse_configurationSetArn,
+    setDefaultSenderIdResponse_configurationSetName,
+    setDefaultSenderIdResponse_senderId,
+    setDefaultSenderIdResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newSetDefaultSenderId' smart constructor.
+data SetDefaultSenderId = SetDefaultSenderId'
+  { -- | The configuration set to updated with a new default SenderId. This field
+    -- can be the ConsigurationSetName or ConfigurationSetArn.
+    configurationSetName :: Prelude.Text,
+    -- | The current sender ID for the configuration set. When sending a text
+    -- message to a destination country which supports SenderIds, the default
+    -- sender ID on the configuration set specified on SendTextMessage will be
+    -- used if no dedicated origination phone numbers or registered SenderIds
+    -- are available in your account, instead of a generic sender ID, such as
+    -- \'NOTICE\'.
+    senderId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SetDefaultSenderId' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationSetName', 'setDefaultSenderId_configurationSetName' - The configuration set to updated with a new default SenderId. This field
+-- can be the ConsigurationSetName or ConfigurationSetArn.
+--
+-- 'senderId', 'setDefaultSenderId_senderId' - The current sender ID for the configuration set. When sending a text
+-- message to a destination country which supports SenderIds, the default
+-- sender ID on the configuration set specified on SendTextMessage will be
+-- used if no dedicated origination phone numbers or registered SenderIds
+-- are available in your account, instead of a generic sender ID, such as
+-- \'NOTICE\'.
+newSetDefaultSenderId ::
+  -- | 'configurationSetName'
+  Prelude.Text ->
+  -- | 'senderId'
+  Prelude.Text ->
+  SetDefaultSenderId
+newSetDefaultSenderId
+  pConfigurationSetName_
+  pSenderId_ =
+    SetDefaultSenderId'
+      { configurationSetName =
+          pConfigurationSetName_,
+        senderId = pSenderId_
+      }
+
+-- | The configuration set to updated with a new default SenderId. This field
+-- can be the ConsigurationSetName or ConfigurationSetArn.
+setDefaultSenderId_configurationSetName :: Lens.Lens' SetDefaultSenderId Prelude.Text
+setDefaultSenderId_configurationSetName = Lens.lens (\SetDefaultSenderId' {configurationSetName} -> configurationSetName) (\s@SetDefaultSenderId' {} a -> s {configurationSetName = a} :: SetDefaultSenderId)
+
+-- | The current sender ID for the configuration set. When sending a text
+-- message to a destination country which supports SenderIds, the default
+-- sender ID on the configuration set specified on SendTextMessage will be
+-- used if no dedicated origination phone numbers or registered SenderIds
+-- are available in your account, instead of a generic sender ID, such as
+-- \'NOTICE\'.
+setDefaultSenderId_senderId :: Lens.Lens' SetDefaultSenderId Prelude.Text
+setDefaultSenderId_senderId = Lens.lens (\SetDefaultSenderId' {senderId} -> senderId) (\s@SetDefaultSenderId' {} a -> s {senderId = a} :: SetDefaultSenderId)
+
+instance Core.AWSRequest SetDefaultSenderId where
+  type
+    AWSResponse SetDefaultSenderId =
+      SetDefaultSenderIdResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          SetDefaultSenderIdResponse'
+            Prelude.<$> (x Data..?> "ConfigurationSetArn")
+            Prelude.<*> (x Data..?> "ConfigurationSetName")
+            Prelude.<*> (x Data..?> "SenderId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable SetDefaultSenderId where
+  hashWithSalt _salt SetDefaultSenderId' {..} =
+    _salt
+      `Prelude.hashWithSalt` configurationSetName
+      `Prelude.hashWithSalt` senderId
+
+instance Prelude.NFData SetDefaultSenderId where
+  rnf SetDefaultSenderId' {..} =
+    Prelude.rnf configurationSetName
+      `Prelude.seq` Prelude.rnf senderId
+
+instance Data.ToHeaders SetDefaultSenderId where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.SetDefaultSenderId" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON SetDefaultSenderId where
+  toJSON SetDefaultSenderId' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "ConfigurationSetName"
+                  Data..= configurationSetName
+              ),
+            Prelude.Just ("SenderId" Data..= senderId)
+          ]
+      )
+
+instance Data.ToPath SetDefaultSenderId where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery SetDefaultSenderId where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newSetDefaultSenderIdResponse' smart constructor.
+data SetDefaultSenderIdResponse = SetDefaultSenderIdResponse'
+  { -- | The Amazon Resource Name (ARN) of the updated configuration set.
+    configurationSetArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the configuration set that was updated.
+    configurationSetName :: Prelude.Maybe Prelude.Text,
+    -- | The default sender ID to set for the ConfigurationSet.
+    senderId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SetDefaultSenderIdResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationSetArn', 'setDefaultSenderIdResponse_configurationSetArn' - The Amazon Resource Name (ARN) of the updated configuration set.
+--
+-- 'configurationSetName', 'setDefaultSenderIdResponse_configurationSetName' - The name of the configuration set that was updated.
+--
+-- 'senderId', 'setDefaultSenderIdResponse_senderId' - The default sender ID to set for the ConfigurationSet.
+--
+-- 'httpStatus', 'setDefaultSenderIdResponse_httpStatus' - The response's http status code.
+newSetDefaultSenderIdResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  SetDefaultSenderIdResponse
+newSetDefaultSenderIdResponse pHttpStatus_ =
+  SetDefaultSenderIdResponse'
+    { configurationSetArn =
+        Prelude.Nothing,
+      configurationSetName = Prelude.Nothing,
+      senderId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the updated configuration set.
+setDefaultSenderIdResponse_configurationSetArn :: Lens.Lens' SetDefaultSenderIdResponse (Prelude.Maybe Prelude.Text)
+setDefaultSenderIdResponse_configurationSetArn = Lens.lens (\SetDefaultSenderIdResponse' {configurationSetArn} -> configurationSetArn) (\s@SetDefaultSenderIdResponse' {} a -> s {configurationSetArn = a} :: SetDefaultSenderIdResponse)
+
+-- | The name of the configuration set that was updated.
+setDefaultSenderIdResponse_configurationSetName :: Lens.Lens' SetDefaultSenderIdResponse (Prelude.Maybe Prelude.Text)
+setDefaultSenderIdResponse_configurationSetName = Lens.lens (\SetDefaultSenderIdResponse' {configurationSetName} -> configurationSetName) (\s@SetDefaultSenderIdResponse' {} a -> s {configurationSetName = a} :: SetDefaultSenderIdResponse)
+
+-- | The default sender ID to set for the ConfigurationSet.
+setDefaultSenderIdResponse_senderId :: Lens.Lens' SetDefaultSenderIdResponse (Prelude.Maybe Prelude.Text)
+setDefaultSenderIdResponse_senderId = Lens.lens (\SetDefaultSenderIdResponse' {senderId} -> senderId) (\s@SetDefaultSenderIdResponse' {} a -> s {senderId = a} :: SetDefaultSenderIdResponse)
+
+-- | The response's http status code.
+setDefaultSenderIdResponse_httpStatus :: Lens.Lens' SetDefaultSenderIdResponse Prelude.Int
+setDefaultSenderIdResponse_httpStatus = Lens.lens (\SetDefaultSenderIdResponse' {httpStatus} -> httpStatus) (\s@SetDefaultSenderIdResponse' {} a -> s {httpStatus = a} :: SetDefaultSenderIdResponse)
+
+instance Prelude.NFData SetDefaultSenderIdResponse where
+  rnf SetDefaultSenderIdResponse' {..} =
+    Prelude.rnf configurationSetArn
+      `Prelude.seq` Prelude.rnf configurationSetName
+      `Prelude.seq` Prelude.rnf senderId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/SetTextMessageSpendLimitOverride.hs b/gen/Amazonka/PinpointSmsVoiceV2/SetTextMessageSpendLimitOverride.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/SetTextMessageSpendLimitOverride.hs
@@ -0,0 +1,195 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.SetTextMessageSpendLimitOverride
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Sets an account level monthly spend limit override for sending text
+-- messages. The requested spend limit must be less than or equal to the
+-- @MaxLimit@, which is set by Amazon Web Services.
+module Amazonka.PinpointSmsVoiceV2.SetTextMessageSpendLimitOverride
+  ( -- * Creating a Request
+    SetTextMessageSpendLimitOverride (..),
+    newSetTextMessageSpendLimitOverride,
+
+    -- * Request Lenses
+    setTextMessageSpendLimitOverride_monthlyLimit,
+
+    -- * Destructuring the Response
+    SetTextMessageSpendLimitOverrideResponse (..),
+    newSetTextMessageSpendLimitOverrideResponse,
+
+    -- * Response Lenses
+    setTextMessageSpendLimitOverrideResponse_monthlyLimit,
+    setTextMessageSpendLimitOverrideResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newSetTextMessageSpendLimitOverride' smart constructor.
+data SetTextMessageSpendLimitOverride = SetTextMessageSpendLimitOverride'
+  { -- | The new monthly limit to enforce on text messages.
+    monthlyLimit :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SetTextMessageSpendLimitOverride' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'monthlyLimit', 'setTextMessageSpendLimitOverride_monthlyLimit' - The new monthly limit to enforce on text messages.
+newSetTextMessageSpendLimitOverride ::
+  -- | 'monthlyLimit'
+  Prelude.Natural ->
+  SetTextMessageSpendLimitOverride
+newSetTextMessageSpendLimitOverride pMonthlyLimit_ =
+  SetTextMessageSpendLimitOverride'
+    { monthlyLimit =
+        pMonthlyLimit_
+    }
+
+-- | The new monthly limit to enforce on text messages.
+setTextMessageSpendLimitOverride_monthlyLimit :: Lens.Lens' SetTextMessageSpendLimitOverride Prelude.Natural
+setTextMessageSpendLimitOverride_monthlyLimit = Lens.lens (\SetTextMessageSpendLimitOverride' {monthlyLimit} -> monthlyLimit) (\s@SetTextMessageSpendLimitOverride' {} a -> s {monthlyLimit = a} :: SetTextMessageSpendLimitOverride)
+
+instance
+  Core.AWSRequest
+    SetTextMessageSpendLimitOverride
+  where
+  type
+    AWSResponse SetTextMessageSpendLimitOverride =
+      SetTextMessageSpendLimitOverrideResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          SetTextMessageSpendLimitOverrideResponse'
+            Prelude.<$> (x Data..?> "MonthlyLimit")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    SetTextMessageSpendLimitOverride
+  where
+  hashWithSalt
+    _salt
+    SetTextMessageSpendLimitOverride' {..} =
+      _salt `Prelude.hashWithSalt` monthlyLimit
+
+instance
+  Prelude.NFData
+    SetTextMessageSpendLimitOverride
+  where
+  rnf SetTextMessageSpendLimitOverride' {..} =
+    Prelude.rnf monthlyLimit
+
+instance
+  Data.ToHeaders
+    SetTextMessageSpendLimitOverride
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.SetTextMessageSpendLimitOverride" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON SetTextMessageSpendLimitOverride where
+  toJSON SetTextMessageSpendLimitOverride' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("MonthlyLimit" Data..= monthlyLimit)]
+      )
+
+instance Data.ToPath SetTextMessageSpendLimitOverride where
+  toPath = Prelude.const "/"
+
+instance
+  Data.ToQuery
+    SetTextMessageSpendLimitOverride
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newSetTextMessageSpendLimitOverrideResponse' smart constructor.
+data SetTextMessageSpendLimitOverrideResponse = SetTextMessageSpendLimitOverrideResponse'
+  { -- | The current monthly limit to enforce on sending text messages.
+    monthlyLimit :: Prelude.Maybe Prelude.Natural,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SetTextMessageSpendLimitOverrideResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'monthlyLimit', 'setTextMessageSpendLimitOverrideResponse_monthlyLimit' - The current monthly limit to enforce on sending text messages.
+--
+-- 'httpStatus', 'setTextMessageSpendLimitOverrideResponse_httpStatus' - The response's http status code.
+newSetTextMessageSpendLimitOverrideResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  SetTextMessageSpendLimitOverrideResponse
+newSetTextMessageSpendLimitOverrideResponse
+  pHttpStatus_ =
+    SetTextMessageSpendLimitOverrideResponse'
+      { monthlyLimit =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | The current monthly limit to enforce on sending text messages.
+setTextMessageSpendLimitOverrideResponse_monthlyLimit :: Lens.Lens' SetTextMessageSpendLimitOverrideResponse (Prelude.Maybe Prelude.Natural)
+setTextMessageSpendLimitOverrideResponse_monthlyLimit = Lens.lens (\SetTextMessageSpendLimitOverrideResponse' {monthlyLimit} -> monthlyLimit) (\s@SetTextMessageSpendLimitOverrideResponse' {} a -> s {monthlyLimit = a} :: SetTextMessageSpendLimitOverrideResponse)
+
+-- | The response's http status code.
+setTextMessageSpendLimitOverrideResponse_httpStatus :: Lens.Lens' SetTextMessageSpendLimitOverrideResponse Prelude.Int
+setTextMessageSpendLimitOverrideResponse_httpStatus = Lens.lens (\SetTextMessageSpendLimitOverrideResponse' {httpStatus} -> httpStatus) (\s@SetTextMessageSpendLimitOverrideResponse' {} a -> s {httpStatus = a} :: SetTextMessageSpendLimitOverrideResponse)
+
+instance
+  Prelude.NFData
+    SetTextMessageSpendLimitOverrideResponse
+  where
+  rnf SetTextMessageSpendLimitOverrideResponse' {..} =
+    Prelude.rnf monthlyLimit
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/SetVoiceMessageSpendLimitOverride.hs b/gen/Amazonka/PinpointSmsVoiceV2/SetVoiceMessageSpendLimitOverride.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/SetVoiceMessageSpendLimitOverride.hs
@@ -0,0 +1,201 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.SetVoiceMessageSpendLimitOverride
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Sets an account level monthly spend limit override for sending voice
+-- messages. The requested spend limit must be less than or equal to the
+-- @MaxLimit@, which is set by Amazon Web Services.
+module Amazonka.PinpointSmsVoiceV2.SetVoiceMessageSpendLimitOverride
+  ( -- * Creating a Request
+    SetVoiceMessageSpendLimitOverride (..),
+    newSetVoiceMessageSpendLimitOverride,
+
+    -- * Request Lenses
+    setVoiceMessageSpendLimitOverride_monthlyLimit,
+
+    -- * Destructuring the Response
+    SetVoiceMessageSpendLimitOverrideResponse (..),
+    newSetVoiceMessageSpendLimitOverrideResponse,
+
+    -- * Response Lenses
+    setVoiceMessageSpendLimitOverrideResponse_monthlyLimit,
+    setVoiceMessageSpendLimitOverrideResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newSetVoiceMessageSpendLimitOverride' smart constructor.
+data SetVoiceMessageSpendLimitOverride = SetVoiceMessageSpendLimitOverride'
+  { -- | The new monthly limit to enforce on voice messages.
+    monthlyLimit :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SetVoiceMessageSpendLimitOverride' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'monthlyLimit', 'setVoiceMessageSpendLimitOverride_monthlyLimit' - The new monthly limit to enforce on voice messages.
+newSetVoiceMessageSpendLimitOverride ::
+  -- | 'monthlyLimit'
+  Prelude.Natural ->
+  SetVoiceMessageSpendLimitOverride
+newSetVoiceMessageSpendLimitOverride pMonthlyLimit_ =
+  SetVoiceMessageSpendLimitOverride'
+    { monthlyLimit =
+        pMonthlyLimit_
+    }
+
+-- | The new monthly limit to enforce on voice messages.
+setVoiceMessageSpendLimitOverride_monthlyLimit :: Lens.Lens' SetVoiceMessageSpendLimitOverride Prelude.Natural
+setVoiceMessageSpendLimitOverride_monthlyLimit = Lens.lens (\SetVoiceMessageSpendLimitOverride' {monthlyLimit} -> monthlyLimit) (\s@SetVoiceMessageSpendLimitOverride' {} a -> s {monthlyLimit = a} :: SetVoiceMessageSpendLimitOverride)
+
+instance
+  Core.AWSRequest
+    SetVoiceMessageSpendLimitOverride
+  where
+  type
+    AWSResponse SetVoiceMessageSpendLimitOverride =
+      SetVoiceMessageSpendLimitOverrideResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          SetVoiceMessageSpendLimitOverrideResponse'
+            Prelude.<$> (x Data..?> "MonthlyLimit")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    SetVoiceMessageSpendLimitOverride
+  where
+  hashWithSalt
+    _salt
+    SetVoiceMessageSpendLimitOverride' {..} =
+      _salt `Prelude.hashWithSalt` monthlyLimit
+
+instance
+  Prelude.NFData
+    SetVoiceMessageSpendLimitOverride
+  where
+  rnf SetVoiceMessageSpendLimitOverride' {..} =
+    Prelude.rnf monthlyLimit
+
+instance
+  Data.ToHeaders
+    SetVoiceMessageSpendLimitOverride
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.SetVoiceMessageSpendLimitOverride" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance
+  Data.ToJSON
+    SetVoiceMessageSpendLimitOverride
+  where
+  toJSON SetVoiceMessageSpendLimitOverride' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("MonthlyLimit" Data..= monthlyLimit)]
+      )
+
+instance
+  Data.ToPath
+    SetVoiceMessageSpendLimitOverride
+  where
+  toPath = Prelude.const "/"
+
+instance
+  Data.ToQuery
+    SetVoiceMessageSpendLimitOverride
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newSetVoiceMessageSpendLimitOverrideResponse' smart constructor.
+data SetVoiceMessageSpendLimitOverrideResponse = SetVoiceMessageSpendLimitOverrideResponse'
+  { -- | The current monthly limit to enforce on sending voice messages.
+    monthlyLimit :: Prelude.Maybe Prelude.Natural,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SetVoiceMessageSpendLimitOverrideResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'monthlyLimit', 'setVoiceMessageSpendLimitOverrideResponse_monthlyLimit' - The current monthly limit to enforce on sending voice messages.
+--
+-- 'httpStatus', 'setVoiceMessageSpendLimitOverrideResponse_httpStatus' - The response's http status code.
+newSetVoiceMessageSpendLimitOverrideResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  SetVoiceMessageSpendLimitOverrideResponse
+newSetVoiceMessageSpendLimitOverrideResponse
+  pHttpStatus_ =
+    SetVoiceMessageSpendLimitOverrideResponse'
+      { monthlyLimit =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | The current monthly limit to enforce on sending voice messages.
+setVoiceMessageSpendLimitOverrideResponse_monthlyLimit :: Lens.Lens' SetVoiceMessageSpendLimitOverrideResponse (Prelude.Maybe Prelude.Natural)
+setVoiceMessageSpendLimitOverrideResponse_monthlyLimit = Lens.lens (\SetVoiceMessageSpendLimitOverrideResponse' {monthlyLimit} -> monthlyLimit) (\s@SetVoiceMessageSpendLimitOverrideResponse' {} a -> s {monthlyLimit = a} :: SetVoiceMessageSpendLimitOverrideResponse)
+
+-- | The response's http status code.
+setVoiceMessageSpendLimitOverrideResponse_httpStatus :: Lens.Lens' SetVoiceMessageSpendLimitOverrideResponse Prelude.Int
+setVoiceMessageSpendLimitOverrideResponse_httpStatus = Lens.lens (\SetVoiceMessageSpendLimitOverrideResponse' {httpStatus} -> httpStatus) (\s@SetVoiceMessageSpendLimitOverrideResponse' {} a -> s {httpStatus = a} :: SetVoiceMessageSpendLimitOverrideResponse)
+
+instance
+  Prelude.NFData
+    SetVoiceMessageSpendLimitOverrideResponse
+  where
+  rnf SetVoiceMessageSpendLimitOverrideResponse' {..} =
+    Prelude.rnf monthlyLimit
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/TagResource.hs b/gen/Amazonka/PinpointSmsVoiceV2/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/TagResource.hs
@@ -0,0 +1,180 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.TagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Adds or overwrites only the specified tags for the specified Amazon
+-- Pinpoint SMS Voice, version 2 resource. When you specify an existing tag
+-- key, the value is overwritten with the new value. Each resource can have
+-- a maximum of 50 tags. Each tag consists of a key and an optional value.
+-- Tag keys must be unique per resource. For more information about tags,
+-- see
+-- <https://docs.aws.amazon.com/pinpoint/latest/developerguide/tagging-resources.html Tagging Amazon Pinpoint resources>
+-- in the /Amazon Pinpoint Developer Guide/.
+module Amazonka.PinpointSmsVoiceV2.TagResource
+  ( -- * Creating a Request
+    TagResource (..),
+    newTagResource,
+
+    -- * Request Lenses
+    tagResource_resourceArn,
+    tagResource_tags,
+
+    -- * Destructuring the Response
+    TagResourceResponse (..),
+    newTagResourceResponse,
+
+    -- * Response Lenses
+    tagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | The Amazon Resource Name (ARN) of the resource.
+    resourceArn :: Prelude.Text,
+    -- | An array of key and value pair tags that are associated with the
+    -- resource.
+    tags :: Prelude.NonEmpty Tag
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'tagResource_resourceArn' - The Amazon Resource Name (ARN) of the resource.
+--
+-- 'tags', 'tagResource_tags' - An array of key and value pair tags that are associated with the
+-- resource.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  -- | 'tags'
+  Prelude.NonEmpty Tag ->
+  TagResource
+newTagResource pResourceArn_ pTags_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Lens.coerced Lens.# pTags_
+    }
+
+-- | The Amazon Resource Name (ARN) of the resource.
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | An array of key and value pair tags that are associated with the
+-- resource.
+tagResource_tags :: Lens.Lens' TagResource (Prelude.NonEmpty Tag)
+tagResource_tags = Lens.lens (\TagResource' {tags} -> tags) (\s@TagResource' {} a -> s {tags = a} :: TagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest TagResource where
+  type AWSResponse TagResource = TagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          TagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable TagResource where
+  hashWithSalt _salt TagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData TagResource where
+  rnf TagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tags
+
+instance Data.ToHeaders TagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.TagResource" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON TagResource where
+  toJSON TagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("ResourceArn" Data..= resourceArn),
+            Prelude.Just ("Tags" Data..= tags)
+          ]
+      )
+
+instance Data.ToPath TagResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery TagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newTagResourceResponse' smart constructor.
+data TagResourceResponse = TagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'tagResourceResponse_httpStatus' - The response's http status code.
+newTagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  TagResourceResponse
+newTagResourceResponse pHttpStatus_ =
+  TagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+tagResourceResponse_httpStatus :: Lens.Lens' TagResourceResponse Prelude.Int
+tagResourceResponse_httpStatus = Lens.lens (\TagResourceResponse' {httpStatus} -> httpStatus) (\s@TagResourceResponse' {} a -> s {httpStatus = a} :: TagResourceResponse)
+
+instance Prelude.NFData TagResourceResponse where
+  rnf TagResourceResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types.hs
@@ -0,0 +1,454 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _AccessDeniedException,
+    _ConflictException,
+    _InternalServerException,
+    _ResourceNotFoundException,
+    _ServiceQuotaExceededException,
+    _ThrottlingException,
+    _ValidationException,
+
+    -- * AccountAttributeName
+    AccountAttributeName (..),
+
+    -- * AccountLimitName
+    AccountLimitName (..),
+
+    -- * ConfigurationSetFilterName
+    ConfigurationSetFilterName (..),
+
+    -- * DestinationCountryParameterKey
+    DestinationCountryParameterKey (..),
+
+    -- * EventType
+    EventType (..),
+
+    -- * KeywordAction
+    KeywordAction (..),
+
+    -- * KeywordFilterName
+    KeywordFilterName (..),
+
+    -- * MessageType
+    MessageType (..),
+
+    -- * NumberCapability
+    NumberCapability (..),
+
+    -- * NumberStatus
+    NumberStatus (..),
+
+    -- * NumberType
+    NumberType (..),
+
+    -- * OptedOutFilterName
+    OptedOutFilterName (..),
+
+    -- * PhoneNumberFilterName
+    PhoneNumberFilterName (..),
+
+    -- * PoolFilterName
+    PoolFilterName (..),
+
+    -- * PoolOriginationIdentitiesFilterName
+    PoolOriginationIdentitiesFilterName (..),
+
+    -- * PoolStatus
+    PoolStatus (..),
+
+    -- * RequestableNumberType
+    RequestableNumberType (..),
+
+    -- * SenderIdFilterName
+    SenderIdFilterName (..),
+
+    -- * SpendLimitName
+    SpendLimitName (..),
+
+    -- * VoiceId
+    VoiceId (..),
+
+    -- * VoiceMessageBodyTextType
+    VoiceMessageBodyTextType (..),
+
+    -- * AccountAttribute
+    AccountAttribute (..),
+    newAccountAttribute,
+    accountAttribute_name,
+    accountAttribute_value,
+
+    -- * AccountLimit
+    AccountLimit (..),
+    newAccountLimit,
+    accountLimit_name,
+    accountLimit_used,
+    accountLimit_max,
+
+    -- * CloudWatchLogsDestination
+    CloudWatchLogsDestination (..),
+    newCloudWatchLogsDestination,
+    cloudWatchLogsDestination_iamRoleArn,
+    cloudWatchLogsDestination_logGroupArn,
+
+    -- * ConfigurationSetFilter
+    ConfigurationSetFilter (..),
+    newConfigurationSetFilter,
+    configurationSetFilter_name,
+    configurationSetFilter_values,
+
+    -- * ConfigurationSetInformation
+    ConfigurationSetInformation (..),
+    newConfigurationSetInformation,
+    configurationSetInformation_defaultMessageType,
+    configurationSetInformation_defaultSenderId,
+    configurationSetInformation_configurationSetArn,
+    configurationSetInformation_configurationSetName,
+    configurationSetInformation_eventDestinations,
+    configurationSetInformation_createdTimestamp,
+
+    -- * EventDestination
+    EventDestination (..),
+    newEventDestination,
+    eventDestination_cloudWatchLogsDestination,
+    eventDestination_kinesisFirehoseDestination,
+    eventDestination_snsDestination,
+    eventDestination_eventDestinationName,
+    eventDestination_enabled,
+    eventDestination_matchingEventTypes,
+
+    -- * KeywordFilter
+    KeywordFilter (..),
+    newKeywordFilter,
+    keywordFilter_name,
+    keywordFilter_values,
+
+    -- * KeywordInformation
+    KeywordInformation (..),
+    newKeywordInformation,
+    keywordInformation_keyword,
+    keywordInformation_keywordMessage,
+    keywordInformation_keywordAction,
+
+    -- * KinesisFirehoseDestination
+    KinesisFirehoseDestination (..),
+    newKinesisFirehoseDestination,
+    kinesisFirehoseDestination_iamRoleArn,
+    kinesisFirehoseDestination_deliveryStreamArn,
+
+    -- * OptOutListInformation
+    OptOutListInformation (..),
+    newOptOutListInformation,
+    optOutListInformation_optOutListArn,
+    optOutListInformation_optOutListName,
+    optOutListInformation_createdTimestamp,
+
+    -- * OptedOutFilter
+    OptedOutFilter (..),
+    newOptedOutFilter,
+    optedOutFilter_name,
+    optedOutFilter_values,
+
+    -- * OptedOutNumberInformation
+    OptedOutNumberInformation (..),
+    newOptedOutNumberInformation,
+    optedOutNumberInformation_optedOutNumber,
+    optedOutNumberInformation_optedOutTimestamp,
+    optedOutNumberInformation_endUserOptedOut,
+
+    -- * OriginationIdentityMetadata
+    OriginationIdentityMetadata (..),
+    newOriginationIdentityMetadata,
+    originationIdentityMetadata_originationIdentityArn,
+    originationIdentityMetadata_originationIdentity,
+    originationIdentityMetadata_isoCountryCode,
+    originationIdentityMetadata_numberCapabilities,
+
+    -- * PhoneNumberFilter
+    PhoneNumberFilter (..),
+    newPhoneNumberFilter,
+    phoneNumberFilter_name,
+    phoneNumberFilter_values,
+
+    -- * PhoneNumberInformation
+    PhoneNumberInformation (..),
+    newPhoneNumberInformation,
+    phoneNumberInformation_phoneNumberId,
+    phoneNumberInformation_poolId,
+    phoneNumberInformation_twoWayChannelArn,
+    phoneNumberInformation_phoneNumberArn,
+    phoneNumberInformation_phoneNumber,
+    phoneNumberInformation_status,
+    phoneNumberInformation_isoCountryCode,
+    phoneNumberInformation_messageType,
+    phoneNumberInformation_numberCapabilities,
+    phoneNumberInformation_numberType,
+    phoneNumberInformation_monthlyLeasingPrice,
+    phoneNumberInformation_twoWayEnabled,
+    phoneNumberInformation_selfManagedOptOutsEnabled,
+    phoneNumberInformation_optOutListName,
+    phoneNumberInformation_deletionProtectionEnabled,
+    phoneNumberInformation_createdTimestamp,
+
+    -- * PoolFilter
+    PoolFilter (..),
+    newPoolFilter,
+    poolFilter_name,
+    poolFilter_values,
+
+    -- * PoolInformation
+    PoolInformation (..),
+    newPoolInformation,
+    poolInformation_twoWayChannelArn,
+    poolInformation_poolArn,
+    poolInformation_poolId,
+    poolInformation_status,
+    poolInformation_messageType,
+    poolInformation_twoWayEnabled,
+    poolInformation_selfManagedOptOutsEnabled,
+    poolInformation_optOutListName,
+    poolInformation_sharedRoutesEnabled,
+    poolInformation_deletionProtectionEnabled,
+    poolInformation_createdTimestamp,
+
+    -- * PoolOriginationIdentitiesFilter
+    PoolOriginationIdentitiesFilter (..),
+    newPoolOriginationIdentitiesFilter,
+    poolOriginationIdentitiesFilter_name,
+    poolOriginationIdentitiesFilter_values,
+
+    -- * SenderIdAndCountry
+    SenderIdAndCountry (..),
+    newSenderIdAndCountry,
+    senderIdAndCountry_senderId,
+    senderIdAndCountry_isoCountryCode,
+
+    -- * SenderIdFilter
+    SenderIdFilter (..),
+    newSenderIdFilter,
+    senderIdFilter_name,
+    senderIdFilter_values,
+
+    -- * SenderIdInformation
+    SenderIdInformation (..),
+    newSenderIdInformation,
+    senderIdInformation_senderIdArn,
+    senderIdInformation_senderId,
+    senderIdInformation_isoCountryCode,
+    senderIdInformation_messageTypes,
+    senderIdInformation_monthlyLeasingPrice,
+
+    -- * SnsDestination
+    SnsDestination (..),
+    newSnsDestination,
+    snsDestination_topicArn,
+
+    -- * SpendLimit
+    SpendLimit (..),
+    newSpendLimit,
+    spendLimit_name,
+    spendLimit_enforcedLimit,
+    spendLimit_maxLimit,
+    spendLimit_overridden,
+
+    -- * Tag
+    Tag (..),
+    newTag,
+    tag_key,
+    tag_value,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.PinpointSmsVoiceV2.Types.AccountAttribute
+import Amazonka.PinpointSmsVoiceV2.Types.AccountAttributeName
+import Amazonka.PinpointSmsVoiceV2.Types.AccountLimit
+import Amazonka.PinpointSmsVoiceV2.Types.AccountLimitName
+import Amazonka.PinpointSmsVoiceV2.Types.CloudWatchLogsDestination
+import Amazonka.PinpointSmsVoiceV2.Types.ConfigurationSetFilter
+import Amazonka.PinpointSmsVoiceV2.Types.ConfigurationSetFilterName
+import Amazonka.PinpointSmsVoiceV2.Types.ConfigurationSetInformation
+import Amazonka.PinpointSmsVoiceV2.Types.DestinationCountryParameterKey
+import Amazonka.PinpointSmsVoiceV2.Types.EventDestination
+import Amazonka.PinpointSmsVoiceV2.Types.EventType
+import Amazonka.PinpointSmsVoiceV2.Types.KeywordAction
+import Amazonka.PinpointSmsVoiceV2.Types.KeywordFilter
+import Amazonka.PinpointSmsVoiceV2.Types.KeywordFilterName
+import Amazonka.PinpointSmsVoiceV2.Types.KeywordInformation
+import Amazonka.PinpointSmsVoiceV2.Types.KinesisFirehoseDestination
+import Amazonka.PinpointSmsVoiceV2.Types.MessageType
+import Amazonka.PinpointSmsVoiceV2.Types.NumberCapability
+import Amazonka.PinpointSmsVoiceV2.Types.NumberStatus
+import Amazonka.PinpointSmsVoiceV2.Types.NumberType
+import Amazonka.PinpointSmsVoiceV2.Types.OptOutListInformation
+import Amazonka.PinpointSmsVoiceV2.Types.OptedOutFilter
+import Amazonka.PinpointSmsVoiceV2.Types.OptedOutFilterName
+import Amazonka.PinpointSmsVoiceV2.Types.OptedOutNumberInformation
+import Amazonka.PinpointSmsVoiceV2.Types.OriginationIdentityMetadata
+import Amazonka.PinpointSmsVoiceV2.Types.PhoneNumberFilter
+import Amazonka.PinpointSmsVoiceV2.Types.PhoneNumberFilterName
+import Amazonka.PinpointSmsVoiceV2.Types.PhoneNumberInformation
+import Amazonka.PinpointSmsVoiceV2.Types.PoolFilter
+import Amazonka.PinpointSmsVoiceV2.Types.PoolFilterName
+import Amazonka.PinpointSmsVoiceV2.Types.PoolInformation
+import Amazonka.PinpointSmsVoiceV2.Types.PoolOriginationIdentitiesFilter
+import Amazonka.PinpointSmsVoiceV2.Types.PoolOriginationIdentitiesFilterName
+import Amazonka.PinpointSmsVoiceV2.Types.PoolStatus
+import Amazonka.PinpointSmsVoiceV2.Types.RequestableNumberType
+import Amazonka.PinpointSmsVoiceV2.Types.SenderIdAndCountry
+import Amazonka.PinpointSmsVoiceV2.Types.SenderIdFilter
+import Amazonka.PinpointSmsVoiceV2.Types.SenderIdFilterName
+import Amazonka.PinpointSmsVoiceV2.Types.SenderIdInformation
+import Amazonka.PinpointSmsVoiceV2.Types.SnsDestination
+import Amazonka.PinpointSmsVoiceV2.Types.SpendLimit
+import Amazonka.PinpointSmsVoiceV2.Types.SpendLimitName
+import Amazonka.PinpointSmsVoiceV2.Types.Tag
+import Amazonka.PinpointSmsVoiceV2.Types.VoiceId
+import Amazonka.PinpointSmsVoiceV2.Types.VoiceMessageBodyTextType
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2022-03-31@ of the Amazon Pinpoint SMS Voice V2 SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "PinpointSmsVoiceV2",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "sms-voice",
+      Core.signingName = "sms-voice",
+      Core.version = "2022-03-31",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error =
+        Core.parseJSONError "PinpointSmsVoiceV2",
+      Core.retry = retry
+    }
+  where
+    retry =
+      Core.Exponential
+        { Core.base = 5.0e-2,
+          Core.growth = 2,
+          Core.attempts = 5,
+          Core.check = check
+        }
+    check e
+      | Lens.has (Core.hasStatus 502) e =
+          Prelude.Just "bad_gateway"
+      | Lens.has (Core.hasStatus 504) e =
+          Prelude.Just "gateway_timeout"
+      | Lens.has (Core.hasStatus 500) e =
+          Prelude.Just "general_server_error"
+      | Lens.has (Core.hasStatus 509) e =
+          Prelude.Just "limit_exceeded"
+      | Lens.has
+          ( Core.hasCode "RequestThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "request_throttled_exception"
+      | Lens.has (Core.hasStatus 503) e =
+          Prelude.Just "service_unavailable"
+      | Lens.has
+          ( Core.hasCode "ThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttled_exception"
+      | Lens.has
+          ( Core.hasCode "Throttling"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling"
+      | Lens.has
+          ( Core.hasCode "ThrottlingException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling_exception"
+      | Lens.has
+          ( Core.hasCode
+              "ProvisionedThroughputExceededException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throughput_exceeded"
+      | Lens.has (Core.hasStatus 429) e =
+          Prelude.Just "too_many_requests"
+      | Prelude.otherwise = Prelude.Nothing
+
+-- | The request was denied because you don\'t have sufficient permissions to
+-- access the resource.
+_AccessDeniedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AccessDeniedException =
+  Core._MatchServiceError
+    defaultService
+    "AccessDeniedException"
+
+-- | Your request has conflicting operations. This can occur if you\'re
+-- trying to perform more than one operation on the same resource at the
+-- same time or it could be that the requested action isn\'t valid for the
+-- current state or configuration of the resource.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+
+-- | The API encountered an unexpected error and couldn\'t complete the
+-- request. You might be able to successfully issue the request again in
+-- the future.
+_InternalServerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerException"
+
+-- | A requested resource couldn\'t be found.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+
+-- | The request would cause a service quota to be exceeded.
+_ServiceQuotaExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceQuotaExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceQuotaExceededException"
+
+-- | An error that occurred because too many requests were sent during a
+-- certain amount of time.
+_ThrottlingException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ThrottlingException =
+  Core._MatchServiceError
+    defaultService
+    "ThrottlingException"
+
+-- | A validation exception for a field.
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/AccountAttribute.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/AccountAttribute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/AccountAttribute.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.AccountAttribute
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.AccountAttribute where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types.AccountAttributeName
+import qualified Amazonka.Prelude as Prelude
+
+-- | Displays the attributes associated with a single Amazon Web Services
+-- account.
+--
+-- /See:/ 'newAccountAttribute' smart constructor.
+data AccountAttribute = AccountAttribute'
+  { -- | The name of the account attribute.
+    name :: AccountAttributeName,
+    -- | The value associated with the account attribute name.
+    value :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AccountAttribute' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'accountAttribute_name' - The name of the account attribute.
+--
+-- 'value', 'accountAttribute_value' - The value associated with the account attribute name.
+newAccountAttribute ::
+  -- | 'name'
+  AccountAttributeName ->
+  -- | 'value'
+  Prelude.Text ->
+  AccountAttribute
+newAccountAttribute pName_ pValue_ =
+  AccountAttribute' {name = pName_, value = pValue_}
+
+-- | The name of the account attribute.
+accountAttribute_name :: Lens.Lens' AccountAttribute AccountAttributeName
+accountAttribute_name = Lens.lens (\AccountAttribute' {name} -> name) (\s@AccountAttribute' {} a -> s {name = a} :: AccountAttribute)
+
+-- | The value associated with the account attribute name.
+accountAttribute_value :: Lens.Lens' AccountAttribute Prelude.Text
+accountAttribute_value = Lens.lens (\AccountAttribute' {value} -> value) (\s@AccountAttribute' {} a -> s {value = a} :: AccountAttribute)
+
+instance Data.FromJSON AccountAttribute where
+  parseJSON =
+    Data.withObject
+      "AccountAttribute"
+      ( \x ->
+          AccountAttribute'
+            Prelude.<$> (x Data..: "Name")
+            Prelude.<*> (x Data..: "Value")
+      )
+
+instance Prelude.Hashable AccountAttribute where
+  hashWithSalt _salt AccountAttribute' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData AccountAttribute where
+  rnf AccountAttribute' {..} =
+    Prelude.rnf name `Prelude.seq` Prelude.rnf value
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/AccountAttributeName.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/AccountAttributeName.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/AccountAttributeName.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.AccountAttributeName
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.AccountAttributeName
+  ( AccountAttributeName
+      ( ..,
+        AccountAttributeName_ACCOUNT_TIER
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype AccountAttributeName = AccountAttributeName'
+  { fromAccountAttributeName ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern AccountAttributeName_ACCOUNT_TIER :: AccountAttributeName
+pattern AccountAttributeName_ACCOUNT_TIER = AccountAttributeName' "ACCOUNT_TIER"
+
+{-# COMPLETE
+  AccountAttributeName_ACCOUNT_TIER,
+  AccountAttributeName'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/AccountLimit.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/AccountLimit.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/AccountLimit.hs
@@ -0,0 +1,104 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.AccountLimit
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.AccountLimit where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types.AccountLimitName
+import qualified Amazonka.Prelude as Prelude
+
+-- | The current resource quotas associated with an Amazon Web Services
+-- account.
+--
+-- /See:/ 'newAccountLimit' smart constructor.
+data AccountLimit = AccountLimit'
+  { -- | The name of the attribute to apply the account limit to.
+    name :: AccountLimitName,
+    -- | The current amount that has been spent, in US dollars.
+    used :: Prelude.Integer,
+    -- | The Amazon Web Services set limit for that resource type, in US dollars.
+    max :: Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AccountLimit' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'accountLimit_name' - The name of the attribute to apply the account limit to.
+--
+-- 'used', 'accountLimit_used' - The current amount that has been spent, in US dollars.
+--
+-- 'max', 'accountLimit_max' - The Amazon Web Services set limit for that resource type, in US dollars.
+newAccountLimit ::
+  -- | 'name'
+  AccountLimitName ->
+  -- | 'used'
+  Prelude.Integer ->
+  -- | 'max'
+  Prelude.Integer ->
+  AccountLimit
+newAccountLimit pName_ pUsed_ pMax_ =
+  AccountLimit'
+    { name = pName_,
+      used = pUsed_,
+      max = pMax_
+    }
+
+-- | The name of the attribute to apply the account limit to.
+accountLimit_name :: Lens.Lens' AccountLimit AccountLimitName
+accountLimit_name = Lens.lens (\AccountLimit' {name} -> name) (\s@AccountLimit' {} a -> s {name = a} :: AccountLimit)
+
+-- | The current amount that has been spent, in US dollars.
+accountLimit_used :: Lens.Lens' AccountLimit Prelude.Integer
+accountLimit_used = Lens.lens (\AccountLimit' {used} -> used) (\s@AccountLimit' {} a -> s {used = a} :: AccountLimit)
+
+-- | The Amazon Web Services set limit for that resource type, in US dollars.
+accountLimit_max :: Lens.Lens' AccountLimit Prelude.Integer
+accountLimit_max = Lens.lens (\AccountLimit' {max} -> max) (\s@AccountLimit' {} a -> s {max = a} :: AccountLimit)
+
+instance Data.FromJSON AccountLimit where
+  parseJSON =
+    Data.withObject
+      "AccountLimit"
+      ( \x ->
+          AccountLimit'
+            Prelude.<$> (x Data..: "Name")
+            Prelude.<*> (x Data..: "Used")
+            Prelude.<*> (x Data..: "Max")
+      )
+
+instance Prelude.Hashable AccountLimit where
+  hashWithSalt _salt AccountLimit' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` used
+      `Prelude.hashWithSalt` max
+
+instance Prelude.NFData AccountLimit where
+  rnf AccountLimit' {..} =
+    Prelude.rnf name
+      `Prelude.seq` Prelude.rnf used
+      `Prelude.seq` Prelude.rnf max
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/AccountLimitName.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/AccountLimitName.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/AccountLimitName.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.AccountLimitName
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.AccountLimitName
+  ( AccountLimitName
+      ( ..,
+        AccountLimitName_CONFIGURATION_SETS,
+        AccountLimitName_OPT_OUT_LISTS,
+        AccountLimitName_PHONE_NUMBERS,
+        AccountLimitName_POOLS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype AccountLimitName = AccountLimitName'
+  { fromAccountLimitName ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern AccountLimitName_CONFIGURATION_SETS :: AccountLimitName
+pattern AccountLimitName_CONFIGURATION_SETS = AccountLimitName' "CONFIGURATION_SETS"
+
+pattern AccountLimitName_OPT_OUT_LISTS :: AccountLimitName
+pattern AccountLimitName_OPT_OUT_LISTS = AccountLimitName' "OPT_OUT_LISTS"
+
+pattern AccountLimitName_PHONE_NUMBERS :: AccountLimitName
+pattern AccountLimitName_PHONE_NUMBERS = AccountLimitName' "PHONE_NUMBERS"
+
+pattern AccountLimitName_POOLS :: AccountLimitName
+pattern AccountLimitName_POOLS = AccountLimitName' "POOLS"
+
+{-# COMPLETE
+  AccountLimitName_CONFIGURATION_SETS,
+  AccountLimitName_OPT_OUT_LISTS,
+  AccountLimitName_PHONE_NUMBERS,
+  AccountLimitName_POOLS,
+  AccountLimitName'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/CloudWatchLogsDestination.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/CloudWatchLogsDestination.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/CloudWatchLogsDestination.hs
@@ -0,0 +1,110 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.CloudWatchLogsDestination
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.CloudWatchLogsDestination where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains the destination configuration to use when publishing message
+-- sending events.
+--
+-- /See:/ 'newCloudWatchLogsDestination' smart constructor.
+data CloudWatchLogsDestination = CloudWatchLogsDestination'
+  { -- | The Amazon Resource Name (ARN) of an Amazon Identity and Access
+    -- Management (IAM) role that is able to write event data to an Amazon
+    -- CloudWatch destination.
+    iamRoleArn :: Prelude.Text,
+    -- | The name of the Amazon CloudWatch log group that you want to record
+    -- events in.
+    logGroupArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CloudWatchLogsDestination' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'iamRoleArn', 'cloudWatchLogsDestination_iamRoleArn' - The Amazon Resource Name (ARN) of an Amazon Identity and Access
+-- Management (IAM) role that is able to write event data to an Amazon
+-- CloudWatch destination.
+--
+-- 'logGroupArn', 'cloudWatchLogsDestination_logGroupArn' - The name of the Amazon CloudWatch log group that you want to record
+-- events in.
+newCloudWatchLogsDestination ::
+  -- | 'iamRoleArn'
+  Prelude.Text ->
+  -- | 'logGroupArn'
+  Prelude.Text ->
+  CloudWatchLogsDestination
+newCloudWatchLogsDestination
+  pIamRoleArn_
+  pLogGroupArn_ =
+    CloudWatchLogsDestination'
+      { iamRoleArn =
+          pIamRoleArn_,
+        logGroupArn = pLogGroupArn_
+      }
+
+-- | The Amazon Resource Name (ARN) of an Amazon Identity and Access
+-- Management (IAM) role that is able to write event data to an Amazon
+-- CloudWatch destination.
+cloudWatchLogsDestination_iamRoleArn :: Lens.Lens' CloudWatchLogsDestination Prelude.Text
+cloudWatchLogsDestination_iamRoleArn = Lens.lens (\CloudWatchLogsDestination' {iamRoleArn} -> iamRoleArn) (\s@CloudWatchLogsDestination' {} a -> s {iamRoleArn = a} :: CloudWatchLogsDestination)
+
+-- | The name of the Amazon CloudWatch log group that you want to record
+-- events in.
+cloudWatchLogsDestination_logGroupArn :: Lens.Lens' CloudWatchLogsDestination Prelude.Text
+cloudWatchLogsDestination_logGroupArn = Lens.lens (\CloudWatchLogsDestination' {logGroupArn} -> logGroupArn) (\s@CloudWatchLogsDestination' {} a -> s {logGroupArn = a} :: CloudWatchLogsDestination)
+
+instance Data.FromJSON CloudWatchLogsDestination where
+  parseJSON =
+    Data.withObject
+      "CloudWatchLogsDestination"
+      ( \x ->
+          CloudWatchLogsDestination'
+            Prelude.<$> (x Data..: "IamRoleArn")
+            Prelude.<*> (x Data..: "LogGroupArn")
+      )
+
+instance Prelude.Hashable CloudWatchLogsDestination where
+  hashWithSalt _salt CloudWatchLogsDestination' {..} =
+    _salt
+      `Prelude.hashWithSalt` iamRoleArn
+      `Prelude.hashWithSalt` logGroupArn
+
+instance Prelude.NFData CloudWatchLogsDestination where
+  rnf CloudWatchLogsDestination' {..} =
+    Prelude.rnf iamRoleArn
+      `Prelude.seq` Prelude.rnf logGroupArn
+
+instance Data.ToJSON CloudWatchLogsDestination where
+  toJSON CloudWatchLogsDestination' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("IamRoleArn" Data..= iamRoleArn),
+            Prelude.Just ("LogGroupArn" Data..= logGroupArn)
+          ]
+      )
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/ConfigurationSetFilter.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/ConfigurationSetFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/ConfigurationSetFilter.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.ConfigurationSetFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.ConfigurationSetFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types.ConfigurationSetFilterName
+import qualified Amazonka.Prelude as Prelude
+
+-- | The information for configuration sets that meet a specified criteria.
+--
+-- /See:/ 'newConfigurationSetFilter' smart constructor.
+data ConfigurationSetFilter = ConfigurationSetFilter'
+  { -- | The name of the attribute to filter on.
+    name :: ConfigurationSetFilterName,
+    -- | An array values to filter for.
+    values :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ConfigurationSetFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'configurationSetFilter_name' - The name of the attribute to filter on.
+--
+-- 'values', 'configurationSetFilter_values' - An array values to filter for.
+newConfigurationSetFilter ::
+  -- | 'name'
+  ConfigurationSetFilterName ->
+  -- | 'values'
+  Prelude.NonEmpty Prelude.Text ->
+  ConfigurationSetFilter
+newConfigurationSetFilter pName_ pValues_ =
+  ConfigurationSetFilter'
+    { name = pName_,
+      values = Lens.coerced Lens.# pValues_
+    }
+
+-- | The name of the attribute to filter on.
+configurationSetFilter_name :: Lens.Lens' ConfigurationSetFilter ConfigurationSetFilterName
+configurationSetFilter_name = Lens.lens (\ConfigurationSetFilter' {name} -> name) (\s@ConfigurationSetFilter' {} a -> s {name = a} :: ConfigurationSetFilter)
+
+-- | An array values to filter for.
+configurationSetFilter_values :: Lens.Lens' ConfigurationSetFilter (Prelude.NonEmpty Prelude.Text)
+configurationSetFilter_values = Lens.lens (\ConfigurationSetFilter' {values} -> values) (\s@ConfigurationSetFilter' {} a -> s {values = a} :: ConfigurationSetFilter) Prelude.. Lens.coerced
+
+instance Prelude.Hashable ConfigurationSetFilter where
+  hashWithSalt _salt ConfigurationSetFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` values
+
+instance Prelude.NFData ConfigurationSetFilter where
+  rnf ConfigurationSetFilter' {..} =
+    Prelude.rnf name `Prelude.seq` Prelude.rnf values
+
+instance Data.ToJSON ConfigurationSetFilter where
+  toJSON ConfigurationSetFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("Name" Data..= name),
+            Prelude.Just ("Values" Data..= values)
+          ]
+      )
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/ConfigurationSetFilterName.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/ConfigurationSetFilterName.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/ConfigurationSetFilterName.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.ConfigurationSetFilterName
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.ConfigurationSetFilterName
+  ( ConfigurationSetFilterName
+      ( ..,
+        ConfigurationSetFilterName_Default_message_type,
+        ConfigurationSetFilterName_Default_sender_id,
+        ConfigurationSetFilterName_Event_destination_name,
+        ConfigurationSetFilterName_Matching_event_types
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ConfigurationSetFilterName = ConfigurationSetFilterName'
+  { fromConfigurationSetFilterName ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ConfigurationSetFilterName_Default_message_type :: ConfigurationSetFilterName
+pattern ConfigurationSetFilterName_Default_message_type = ConfigurationSetFilterName' "default-message-type"
+
+pattern ConfigurationSetFilterName_Default_sender_id :: ConfigurationSetFilterName
+pattern ConfigurationSetFilterName_Default_sender_id = ConfigurationSetFilterName' "default-sender-id"
+
+pattern ConfigurationSetFilterName_Event_destination_name :: ConfigurationSetFilterName
+pattern ConfigurationSetFilterName_Event_destination_name = ConfigurationSetFilterName' "event-destination-name"
+
+pattern ConfigurationSetFilterName_Matching_event_types :: ConfigurationSetFilterName
+pattern ConfigurationSetFilterName_Matching_event_types = ConfigurationSetFilterName' "matching-event-types"
+
+{-# COMPLETE
+  ConfigurationSetFilterName_Default_message_type,
+  ConfigurationSetFilterName_Default_sender_id,
+  ConfigurationSetFilterName_Event_destination_name,
+  ConfigurationSetFilterName_Matching_event_types,
+  ConfigurationSetFilterName'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/ConfigurationSetInformation.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/ConfigurationSetInformation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/ConfigurationSetInformation.hs
@@ -0,0 +1,161 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.ConfigurationSetInformation
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.ConfigurationSetInformation where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types.EventDestination
+import Amazonka.PinpointSmsVoiceV2.Types.MessageType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information related to a given configuration set in your Amazon Web
+-- Services account.
+--
+-- /See:/ 'newConfigurationSetInformation' smart constructor.
+data ConfigurationSetInformation = ConfigurationSetInformation'
+  { -- | The type of message. Valid values are TRANSACTIONAL for messages that
+    -- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+    -- critical or time-sensitive.
+    defaultMessageType :: Prelude.Maybe MessageType,
+    -- | The default sender ID used by the ConfigurationSet.
+    defaultSenderId :: Prelude.Maybe Prelude.Text,
+    -- | The Resource Name (ARN) of the ConfigurationSet.
+    configurationSetArn :: Prelude.Text,
+    -- | The name of the ConfigurationSet.
+    configurationSetName :: Prelude.Text,
+    -- | An array of EventDestination objects that describe any events to log and
+    -- where to log them.
+    eventDestinations :: [EventDestination],
+    -- | The time when the ConfigurationSet was created, in
+    -- <https://www.epochconverter.com/ UNIX epoch time> format.
+    createdTimestamp :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ConfigurationSetInformation' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'defaultMessageType', 'configurationSetInformation_defaultMessageType' - The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+--
+-- 'defaultSenderId', 'configurationSetInformation_defaultSenderId' - The default sender ID used by the ConfigurationSet.
+--
+-- 'configurationSetArn', 'configurationSetInformation_configurationSetArn' - The Resource Name (ARN) of the ConfigurationSet.
+--
+-- 'configurationSetName', 'configurationSetInformation_configurationSetName' - The name of the ConfigurationSet.
+--
+-- 'eventDestinations', 'configurationSetInformation_eventDestinations' - An array of EventDestination objects that describe any events to log and
+-- where to log them.
+--
+-- 'createdTimestamp', 'configurationSetInformation_createdTimestamp' - The time when the ConfigurationSet was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+newConfigurationSetInformation ::
+  -- | 'configurationSetArn'
+  Prelude.Text ->
+  -- | 'configurationSetName'
+  Prelude.Text ->
+  -- | 'createdTimestamp'
+  Prelude.UTCTime ->
+  ConfigurationSetInformation
+newConfigurationSetInformation
+  pConfigurationSetArn_
+  pConfigurationSetName_
+  pCreatedTimestamp_ =
+    ConfigurationSetInformation'
+      { defaultMessageType =
+          Prelude.Nothing,
+        defaultSenderId = Prelude.Nothing,
+        configurationSetArn = pConfigurationSetArn_,
+        configurationSetName = pConfigurationSetName_,
+        eventDestinations = Prelude.mempty,
+        createdTimestamp =
+          Data._Time Lens.# pCreatedTimestamp_
+      }
+
+-- | The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+configurationSetInformation_defaultMessageType :: Lens.Lens' ConfigurationSetInformation (Prelude.Maybe MessageType)
+configurationSetInformation_defaultMessageType = Lens.lens (\ConfigurationSetInformation' {defaultMessageType} -> defaultMessageType) (\s@ConfigurationSetInformation' {} a -> s {defaultMessageType = a} :: ConfigurationSetInformation)
+
+-- | The default sender ID used by the ConfigurationSet.
+configurationSetInformation_defaultSenderId :: Lens.Lens' ConfigurationSetInformation (Prelude.Maybe Prelude.Text)
+configurationSetInformation_defaultSenderId = Lens.lens (\ConfigurationSetInformation' {defaultSenderId} -> defaultSenderId) (\s@ConfigurationSetInformation' {} a -> s {defaultSenderId = a} :: ConfigurationSetInformation)
+
+-- | The Resource Name (ARN) of the ConfigurationSet.
+configurationSetInformation_configurationSetArn :: Lens.Lens' ConfigurationSetInformation Prelude.Text
+configurationSetInformation_configurationSetArn = Lens.lens (\ConfigurationSetInformation' {configurationSetArn} -> configurationSetArn) (\s@ConfigurationSetInformation' {} a -> s {configurationSetArn = a} :: ConfigurationSetInformation)
+
+-- | The name of the ConfigurationSet.
+configurationSetInformation_configurationSetName :: Lens.Lens' ConfigurationSetInformation Prelude.Text
+configurationSetInformation_configurationSetName = Lens.lens (\ConfigurationSetInformation' {configurationSetName} -> configurationSetName) (\s@ConfigurationSetInformation' {} a -> s {configurationSetName = a} :: ConfigurationSetInformation)
+
+-- | An array of EventDestination objects that describe any events to log and
+-- where to log them.
+configurationSetInformation_eventDestinations :: Lens.Lens' ConfigurationSetInformation [EventDestination]
+configurationSetInformation_eventDestinations = Lens.lens (\ConfigurationSetInformation' {eventDestinations} -> eventDestinations) (\s@ConfigurationSetInformation' {} a -> s {eventDestinations = a} :: ConfigurationSetInformation) Prelude.. Lens.coerced
+
+-- | The time when the ConfigurationSet was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+configurationSetInformation_createdTimestamp :: Lens.Lens' ConfigurationSetInformation Prelude.UTCTime
+configurationSetInformation_createdTimestamp = Lens.lens (\ConfigurationSetInformation' {createdTimestamp} -> createdTimestamp) (\s@ConfigurationSetInformation' {} a -> s {createdTimestamp = a} :: ConfigurationSetInformation) Prelude.. Data._Time
+
+instance Data.FromJSON ConfigurationSetInformation where
+  parseJSON =
+    Data.withObject
+      "ConfigurationSetInformation"
+      ( \x ->
+          ConfigurationSetInformation'
+            Prelude.<$> (x Data..:? "DefaultMessageType")
+            Prelude.<*> (x Data..:? "DefaultSenderId")
+            Prelude.<*> (x Data..: "ConfigurationSetArn")
+            Prelude.<*> (x Data..: "ConfigurationSetName")
+            Prelude.<*> ( x
+                            Data..:? "EventDestinations"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..: "CreatedTimestamp")
+      )
+
+instance Prelude.Hashable ConfigurationSetInformation where
+  hashWithSalt _salt ConfigurationSetInformation' {..} =
+    _salt
+      `Prelude.hashWithSalt` defaultMessageType
+      `Prelude.hashWithSalt` defaultSenderId
+      `Prelude.hashWithSalt` configurationSetArn
+      `Prelude.hashWithSalt` configurationSetName
+      `Prelude.hashWithSalt` eventDestinations
+      `Prelude.hashWithSalt` createdTimestamp
+
+instance Prelude.NFData ConfigurationSetInformation where
+  rnf ConfigurationSetInformation' {..} =
+    Prelude.rnf defaultMessageType
+      `Prelude.seq` Prelude.rnf defaultSenderId
+      `Prelude.seq` Prelude.rnf configurationSetArn
+      `Prelude.seq` Prelude.rnf configurationSetName
+      `Prelude.seq` Prelude.rnf eventDestinations
+      `Prelude.seq` Prelude.rnf createdTimestamp
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/DestinationCountryParameterKey.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/DestinationCountryParameterKey.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/DestinationCountryParameterKey.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.DestinationCountryParameterKey
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.DestinationCountryParameterKey
+  ( DestinationCountryParameterKey
+      ( ..,
+        DestinationCountryParameterKey_IN_ENTITY_ID,
+        DestinationCountryParameterKey_IN_TEMPLATE_ID
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DestinationCountryParameterKey = DestinationCountryParameterKey'
+  { fromDestinationCountryParameterKey ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern DestinationCountryParameterKey_IN_ENTITY_ID :: DestinationCountryParameterKey
+pattern DestinationCountryParameterKey_IN_ENTITY_ID = DestinationCountryParameterKey' "IN_ENTITY_ID"
+
+pattern DestinationCountryParameterKey_IN_TEMPLATE_ID :: DestinationCountryParameterKey
+pattern DestinationCountryParameterKey_IN_TEMPLATE_ID = DestinationCountryParameterKey' "IN_TEMPLATE_ID"
+
+{-# COMPLETE
+  DestinationCountryParameterKey_IN_ENTITY_ID,
+  DestinationCountryParameterKey_IN_TEMPLATE_ID,
+  DestinationCountryParameterKey'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/EventDestination.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/EventDestination.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/EventDestination.hs
@@ -0,0 +1,160 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.EventDestination
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.EventDestination where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types.CloudWatchLogsDestination
+import Amazonka.PinpointSmsVoiceV2.Types.EventType
+import Amazonka.PinpointSmsVoiceV2.Types.KinesisFirehoseDestination
+import Amazonka.PinpointSmsVoiceV2.Types.SnsDestination
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about an event destination.
+--
+-- Event destinations are associated with configuration sets, which enable
+-- you to publish message sending events to Amazon CloudWatch, Amazon
+-- Kinesis Data Firehose, or Amazon SNS.
+--
+-- /See:/ 'newEventDestination' smart constructor.
+data EventDestination = EventDestination'
+  { -- | An object that contains information about an event destination that
+    -- sends logging events to Amazon CloudWatch logs.
+    cloudWatchLogsDestination :: Prelude.Maybe CloudWatchLogsDestination,
+    -- | An object that contains information about an event destination for
+    -- logging to Amazon Kinesis Data Firehose.
+    kinesisFirehoseDestination :: Prelude.Maybe KinesisFirehoseDestination,
+    -- | An object that contains information about an event destination that
+    -- sends logging events to Amazon SNS.
+    snsDestination :: Prelude.Maybe SnsDestination,
+    -- | The name of the EventDestination.
+    eventDestinationName :: Prelude.Text,
+    -- | When set to true events will be logged.
+    enabled :: Prelude.Bool,
+    -- | An array of event types that determine which events to log.
+    matchingEventTypes :: Prelude.NonEmpty EventType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EventDestination' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'cloudWatchLogsDestination', 'eventDestination_cloudWatchLogsDestination' - An object that contains information about an event destination that
+-- sends logging events to Amazon CloudWatch logs.
+--
+-- 'kinesisFirehoseDestination', 'eventDestination_kinesisFirehoseDestination' - An object that contains information about an event destination for
+-- logging to Amazon Kinesis Data Firehose.
+--
+-- 'snsDestination', 'eventDestination_snsDestination' - An object that contains information about an event destination that
+-- sends logging events to Amazon SNS.
+--
+-- 'eventDestinationName', 'eventDestination_eventDestinationName' - The name of the EventDestination.
+--
+-- 'enabled', 'eventDestination_enabled' - When set to true events will be logged.
+--
+-- 'matchingEventTypes', 'eventDestination_matchingEventTypes' - An array of event types that determine which events to log.
+newEventDestination ::
+  -- | 'eventDestinationName'
+  Prelude.Text ->
+  -- | 'enabled'
+  Prelude.Bool ->
+  -- | 'matchingEventTypes'
+  Prelude.NonEmpty EventType ->
+  EventDestination
+newEventDestination
+  pEventDestinationName_
+  pEnabled_
+  pMatchingEventTypes_ =
+    EventDestination'
+      { cloudWatchLogsDestination =
+          Prelude.Nothing,
+        kinesisFirehoseDestination = Prelude.Nothing,
+        snsDestination = Prelude.Nothing,
+        eventDestinationName = pEventDestinationName_,
+        enabled = pEnabled_,
+        matchingEventTypes =
+          Lens.coerced Lens.# pMatchingEventTypes_
+      }
+
+-- | An object that contains information about an event destination that
+-- sends logging events to Amazon CloudWatch logs.
+eventDestination_cloudWatchLogsDestination :: Lens.Lens' EventDestination (Prelude.Maybe CloudWatchLogsDestination)
+eventDestination_cloudWatchLogsDestination = Lens.lens (\EventDestination' {cloudWatchLogsDestination} -> cloudWatchLogsDestination) (\s@EventDestination' {} a -> s {cloudWatchLogsDestination = a} :: EventDestination)
+
+-- | An object that contains information about an event destination for
+-- logging to Amazon Kinesis Data Firehose.
+eventDestination_kinesisFirehoseDestination :: Lens.Lens' EventDestination (Prelude.Maybe KinesisFirehoseDestination)
+eventDestination_kinesisFirehoseDestination = Lens.lens (\EventDestination' {kinesisFirehoseDestination} -> kinesisFirehoseDestination) (\s@EventDestination' {} a -> s {kinesisFirehoseDestination = a} :: EventDestination)
+
+-- | An object that contains information about an event destination that
+-- sends logging events to Amazon SNS.
+eventDestination_snsDestination :: Lens.Lens' EventDestination (Prelude.Maybe SnsDestination)
+eventDestination_snsDestination = Lens.lens (\EventDestination' {snsDestination} -> snsDestination) (\s@EventDestination' {} a -> s {snsDestination = a} :: EventDestination)
+
+-- | The name of the EventDestination.
+eventDestination_eventDestinationName :: Lens.Lens' EventDestination Prelude.Text
+eventDestination_eventDestinationName = Lens.lens (\EventDestination' {eventDestinationName} -> eventDestinationName) (\s@EventDestination' {} a -> s {eventDestinationName = a} :: EventDestination)
+
+-- | When set to true events will be logged.
+eventDestination_enabled :: Lens.Lens' EventDestination Prelude.Bool
+eventDestination_enabled = Lens.lens (\EventDestination' {enabled} -> enabled) (\s@EventDestination' {} a -> s {enabled = a} :: EventDestination)
+
+-- | An array of event types that determine which events to log.
+eventDestination_matchingEventTypes :: Lens.Lens' EventDestination (Prelude.NonEmpty EventType)
+eventDestination_matchingEventTypes = Lens.lens (\EventDestination' {matchingEventTypes} -> matchingEventTypes) (\s@EventDestination' {} a -> s {matchingEventTypes = a} :: EventDestination) Prelude.. Lens.coerced
+
+instance Data.FromJSON EventDestination where
+  parseJSON =
+    Data.withObject
+      "EventDestination"
+      ( \x ->
+          EventDestination'
+            Prelude.<$> (x Data..:? "CloudWatchLogsDestination")
+            Prelude.<*> (x Data..:? "KinesisFirehoseDestination")
+            Prelude.<*> (x Data..:? "SnsDestination")
+            Prelude.<*> (x Data..: "EventDestinationName")
+            Prelude.<*> (x Data..: "Enabled")
+            Prelude.<*> (x Data..: "MatchingEventTypes")
+      )
+
+instance Prelude.Hashable EventDestination where
+  hashWithSalt _salt EventDestination' {..} =
+    _salt
+      `Prelude.hashWithSalt` cloudWatchLogsDestination
+      `Prelude.hashWithSalt` kinesisFirehoseDestination
+      `Prelude.hashWithSalt` snsDestination
+      `Prelude.hashWithSalt` eventDestinationName
+      `Prelude.hashWithSalt` enabled
+      `Prelude.hashWithSalt` matchingEventTypes
+
+instance Prelude.NFData EventDestination where
+  rnf EventDestination' {..} =
+    Prelude.rnf cloudWatchLogsDestination
+      `Prelude.seq` Prelude.rnf kinesisFirehoseDestination
+      `Prelude.seq` Prelude.rnf snsDestination
+      `Prelude.seq` Prelude.rnf eventDestinationName
+      `Prelude.seq` Prelude.rnf enabled
+      `Prelude.seq` Prelude.rnf matchingEventTypes
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/EventType.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/EventType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/EventType.hs
@@ -0,0 +1,186 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.EventType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.EventType
+  ( EventType
+      ( ..,
+        EventType_ALL,
+        EventType_TEXT_ALL,
+        EventType_TEXT_BLOCKED,
+        EventType_TEXT_CARRIER_BLOCKED,
+        EventType_TEXT_CARRIER_UNREACHABLE,
+        EventType_TEXT_DELIVERED,
+        EventType_TEXT_INVALID,
+        EventType_TEXT_INVALID_MESSAGE,
+        EventType_TEXT_PENDING,
+        EventType_TEXT_QUEUED,
+        EventType_TEXT_SENT,
+        EventType_TEXT_SPAM,
+        EventType_TEXT_SUCCESSFUL,
+        EventType_TEXT_TTL_EXPIRED,
+        EventType_TEXT_UNKNOWN,
+        EventType_TEXT_UNREACHABLE,
+        EventType_VOICE_ALL,
+        EventType_VOICE_ANSWERED,
+        EventType_VOICE_BUSY,
+        EventType_VOICE_COMPLETED,
+        EventType_VOICE_FAILED,
+        EventType_VOICE_INITIATED,
+        EventType_VOICE_NO_ANSWER,
+        EventType_VOICE_RINGING,
+        EventType_VOICE_TTL_EXPIRED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype EventType = EventType'
+  { fromEventType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern EventType_ALL :: EventType
+pattern EventType_ALL = EventType' "ALL"
+
+pattern EventType_TEXT_ALL :: EventType
+pattern EventType_TEXT_ALL = EventType' "TEXT_ALL"
+
+pattern EventType_TEXT_BLOCKED :: EventType
+pattern EventType_TEXT_BLOCKED = EventType' "TEXT_BLOCKED"
+
+pattern EventType_TEXT_CARRIER_BLOCKED :: EventType
+pattern EventType_TEXT_CARRIER_BLOCKED = EventType' "TEXT_CARRIER_BLOCKED"
+
+pattern EventType_TEXT_CARRIER_UNREACHABLE :: EventType
+pattern EventType_TEXT_CARRIER_UNREACHABLE = EventType' "TEXT_CARRIER_UNREACHABLE"
+
+pattern EventType_TEXT_DELIVERED :: EventType
+pattern EventType_TEXT_DELIVERED = EventType' "TEXT_DELIVERED"
+
+pattern EventType_TEXT_INVALID :: EventType
+pattern EventType_TEXT_INVALID = EventType' "TEXT_INVALID"
+
+pattern EventType_TEXT_INVALID_MESSAGE :: EventType
+pattern EventType_TEXT_INVALID_MESSAGE = EventType' "TEXT_INVALID_MESSAGE"
+
+pattern EventType_TEXT_PENDING :: EventType
+pattern EventType_TEXT_PENDING = EventType' "TEXT_PENDING"
+
+pattern EventType_TEXT_QUEUED :: EventType
+pattern EventType_TEXT_QUEUED = EventType' "TEXT_QUEUED"
+
+pattern EventType_TEXT_SENT :: EventType
+pattern EventType_TEXT_SENT = EventType' "TEXT_SENT"
+
+pattern EventType_TEXT_SPAM :: EventType
+pattern EventType_TEXT_SPAM = EventType' "TEXT_SPAM"
+
+pattern EventType_TEXT_SUCCESSFUL :: EventType
+pattern EventType_TEXT_SUCCESSFUL = EventType' "TEXT_SUCCESSFUL"
+
+pattern EventType_TEXT_TTL_EXPIRED :: EventType
+pattern EventType_TEXT_TTL_EXPIRED = EventType' "TEXT_TTL_EXPIRED"
+
+pattern EventType_TEXT_UNKNOWN :: EventType
+pattern EventType_TEXT_UNKNOWN = EventType' "TEXT_UNKNOWN"
+
+pattern EventType_TEXT_UNREACHABLE :: EventType
+pattern EventType_TEXT_UNREACHABLE = EventType' "TEXT_UNREACHABLE"
+
+pattern EventType_VOICE_ALL :: EventType
+pattern EventType_VOICE_ALL = EventType' "VOICE_ALL"
+
+pattern EventType_VOICE_ANSWERED :: EventType
+pattern EventType_VOICE_ANSWERED = EventType' "VOICE_ANSWERED"
+
+pattern EventType_VOICE_BUSY :: EventType
+pattern EventType_VOICE_BUSY = EventType' "VOICE_BUSY"
+
+pattern EventType_VOICE_COMPLETED :: EventType
+pattern EventType_VOICE_COMPLETED = EventType' "VOICE_COMPLETED"
+
+pattern EventType_VOICE_FAILED :: EventType
+pattern EventType_VOICE_FAILED = EventType' "VOICE_FAILED"
+
+pattern EventType_VOICE_INITIATED :: EventType
+pattern EventType_VOICE_INITIATED = EventType' "VOICE_INITIATED"
+
+pattern EventType_VOICE_NO_ANSWER :: EventType
+pattern EventType_VOICE_NO_ANSWER = EventType' "VOICE_NO_ANSWER"
+
+pattern EventType_VOICE_RINGING :: EventType
+pattern EventType_VOICE_RINGING = EventType' "VOICE_RINGING"
+
+pattern EventType_VOICE_TTL_EXPIRED :: EventType
+pattern EventType_VOICE_TTL_EXPIRED = EventType' "VOICE_TTL_EXPIRED"
+
+{-# COMPLETE
+  EventType_ALL,
+  EventType_TEXT_ALL,
+  EventType_TEXT_BLOCKED,
+  EventType_TEXT_CARRIER_BLOCKED,
+  EventType_TEXT_CARRIER_UNREACHABLE,
+  EventType_TEXT_DELIVERED,
+  EventType_TEXT_INVALID,
+  EventType_TEXT_INVALID_MESSAGE,
+  EventType_TEXT_PENDING,
+  EventType_TEXT_QUEUED,
+  EventType_TEXT_SENT,
+  EventType_TEXT_SPAM,
+  EventType_TEXT_SUCCESSFUL,
+  EventType_TEXT_TTL_EXPIRED,
+  EventType_TEXT_UNKNOWN,
+  EventType_TEXT_UNREACHABLE,
+  EventType_VOICE_ALL,
+  EventType_VOICE_ANSWERED,
+  EventType_VOICE_BUSY,
+  EventType_VOICE_COMPLETED,
+  EventType_VOICE_FAILED,
+  EventType_VOICE_INITIATED,
+  EventType_VOICE_NO_ANSWER,
+  EventType_VOICE_RINGING,
+  EventType_VOICE_TTL_EXPIRED,
+  EventType'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/KeywordAction.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/KeywordAction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/KeywordAction.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.KeywordAction
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.KeywordAction
+  ( KeywordAction
+      ( ..,
+        KeywordAction_AUTOMATIC_RESPONSE,
+        KeywordAction_OPT_IN,
+        KeywordAction_OPT_OUT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype KeywordAction = KeywordAction'
+  { fromKeywordAction ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern KeywordAction_AUTOMATIC_RESPONSE :: KeywordAction
+pattern KeywordAction_AUTOMATIC_RESPONSE = KeywordAction' "AUTOMATIC_RESPONSE"
+
+pattern KeywordAction_OPT_IN :: KeywordAction
+pattern KeywordAction_OPT_IN = KeywordAction' "OPT_IN"
+
+pattern KeywordAction_OPT_OUT :: KeywordAction
+pattern KeywordAction_OPT_OUT = KeywordAction' "OPT_OUT"
+
+{-# COMPLETE
+  KeywordAction_AUTOMATIC_RESPONSE,
+  KeywordAction_OPT_IN,
+  KeywordAction_OPT_OUT,
+  KeywordAction'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/KeywordFilter.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/KeywordFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/KeywordFilter.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.KeywordFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.KeywordFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types.KeywordFilterName
+import qualified Amazonka.Prelude as Prelude
+
+-- | The information for keywords that meet a specified criteria.
+--
+-- /See:/ 'newKeywordFilter' smart constructor.
+data KeywordFilter = KeywordFilter'
+  { -- | The name of the attribute to filter on.
+    name :: KeywordFilterName,
+    -- | An array values to filter for.
+    values :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'KeywordFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'keywordFilter_name' - The name of the attribute to filter on.
+--
+-- 'values', 'keywordFilter_values' - An array values to filter for.
+newKeywordFilter ::
+  -- | 'name'
+  KeywordFilterName ->
+  -- | 'values'
+  Prelude.NonEmpty Prelude.Text ->
+  KeywordFilter
+newKeywordFilter pName_ pValues_ =
+  KeywordFilter'
+    { name = pName_,
+      values = Lens.coerced Lens.# pValues_
+    }
+
+-- | The name of the attribute to filter on.
+keywordFilter_name :: Lens.Lens' KeywordFilter KeywordFilterName
+keywordFilter_name = Lens.lens (\KeywordFilter' {name} -> name) (\s@KeywordFilter' {} a -> s {name = a} :: KeywordFilter)
+
+-- | An array values to filter for.
+keywordFilter_values :: Lens.Lens' KeywordFilter (Prelude.NonEmpty Prelude.Text)
+keywordFilter_values = Lens.lens (\KeywordFilter' {values} -> values) (\s@KeywordFilter' {} a -> s {values = a} :: KeywordFilter) Prelude.. Lens.coerced
+
+instance Prelude.Hashable KeywordFilter where
+  hashWithSalt _salt KeywordFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` values
+
+instance Prelude.NFData KeywordFilter where
+  rnf KeywordFilter' {..} =
+    Prelude.rnf name `Prelude.seq` Prelude.rnf values
+
+instance Data.ToJSON KeywordFilter where
+  toJSON KeywordFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("Name" Data..= name),
+            Prelude.Just ("Values" Data..= values)
+          ]
+      )
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/KeywordFilterName.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/KeywordFilterName.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/KeywordFilterName.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.KeywordFilterName
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.KeywordFilterName
+  ( KeywordFilterName
+      ( ..,
+        KeywordFilterName_Keyword_action
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype KeywordFilterName = KeywordFilterName'
+  { fromKeywordFilterName ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern KeywordFilterName_Keyword_action :: KeywordFilterName
+pattern KeywordFilterName_Keyword_action = KeywordFilterName' "keyword-action"
+
+{-# COMPLETE
+  KeywordFilterName_Keyword_action,
+  KeywordFilterName'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/KeywordInformation.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/KeywordInformation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/KeywordInformation.hs
@@ -0,0 +1,106 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.KeywordInformation
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.KeywordInformation where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types.KeywordAction
+import qualified Amazonka.Prelude as Prelude
+
+-- | The information for all keywords in a pool.
+--
+-- /See:/ 'newKeywordInformation' smart constructor.
+data KeywordInformation = KeywordInformation'
+  { -- | The keyword as a string.
+    keyword :: Prelude.Text,
+    -- | A custom message that can be used with the keyword.
+    keywordMessage :: Prelude.Text,
+    -- | The action to perform for the keyword.
+    keywordAction :: KeywordAction
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'KeywordInformation' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'keyword', 'keywordInformation_keyword' - The keyword as a string.
+--
+-- 'keywordMessage', 'keywordInformation_keywordMessage' - A custom message that can be used with the keyword.
+--
+-- 'keywordAction', 'keywordInformation_keywordAction' - The action to perform for the keyword.
+newKeywordInformation ::
+  -- | 'keyword'
+  Prelude.Text ->
+  -- | 'keywordMessage'
+  Prelude.Text ->
+  -- | 'keywordAction'
+  KeywordAction ->
+  KeywordInformation
+newKeywordInformation
+  pKeyword_
+  pKeywordMessage_
+  pKeywordAction_ =
+    KeywordInformation'
+      { keyword = pKeyword_,
+        keywordMessage = pKeywordMessage_,
+        keywordAction = pKeywordAction_
+      }
+
+-- | The keyword as a string.
+keywordInformation_keyword :: Lens.Lens' KeywordInformation Prelude.Text
+keywordInformation_keyword = Lens.lens (\KeywordInformation' {keyword} -> keyword) (\s@KeywordInformation' {} a -> s {keyword = a} :: KeywordInformation)
+
+-- | A custom message that can be used with the keyword.
+keywordInformation_keywordMessage :: Lens.Lens' KeywordInformation Prelude.Text
+keywordInformation_keywordMessage = Lens.lens (\KeywordInformation' {keywordMessage} -> keywordMessage) (\s@KeywordInformation' {} a -> s {keywordMessage = a} :: KeywordInformation)
+
+-- | The action to perform for the keyword.
+keywordInformation_keywordAction :: Lens.Lens' KeywordInformation KeywordAction
+keywordInformation_keywordAction = Lens.lens (\KeywordInformation' {keywordAction} -> keywordAction) (\s@KeywordInformation' {} a -> s {keywordAction = a} :: KeywordInformation)
+
+instance Data.FromJSON KeywordInformation where
+  parseJSON =
+    Data.withObject
+      "KeywordInformation"
+      ( \x ->
+          KeywordInformation'
+            Prelude.<$> (x Data..: "Keyword")
+            Prelude.<*> (x Data..: "KeywordMessage")
+            Prelude.<*> (x Data..: "KeywordAction")
+      )
+
+instance Prelude.Hashable KeywordInformation where
+  hashWithSalt _salt KeywordInformation' {..} =
+    _salt
+      `Prelude.hashWithSalt` keyword
+      `Prelude.hashWithSalt` keywordMessage
+      `Prelude.hashWithSalt` keywordAction
+
+instance Prelude.NFData KeywordInformation where
+  rnf KeywordInformation' {..} =
+    Prelude.rnf keyword
+      `Prelude.seq` Prelude.rnf keywordMessage
+      `Prelude.seq` Prelude.rnf keywordAction
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/KinesisFirehoseDestination.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/KinesisFirehoseDestination.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/KinesisFirehoseDestination.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.KinesisFirehoseDestination
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.KinesisFirehoseDestination where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains the delivery stream Amazon Resource Name (ARN), and the ARN of
+-- the Identity and Access Management (IAM) role associated with an Kinesis
+-- Data Firehose event destination.
+--
+-- Event destinations, such as Kinesis Data Firehose, are associated with
+-- configuration sets, which enable you to publish message sending events.
+--
+-- /See:/ 'newKinesisFirehoseDestination' smart constructor.
+data KinesisFirehoseDestination = KinesisFirehoseDestination'
+  { -- | The ARN of an Amazon Identity and Access Management (IAM) role that is
+    -- able to write event data to an Amazon Firehose destination.
+    iamRoleArn :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the delivery stream.
+    deliveryStreamArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'KinesisFirehoseDestination' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'iamRoleArn', 'kinesisFirehoseDestination_iamRoleArn' - The ARN of an Amazon Identity and Access Management (IAM) role that is
+-- able to write event data to an Amazon Firehose destination.
+--
+-- 'deliveryStreamArn', 'kinesisFirehoseDestination_deliveryStreamArn' - The Amazon Resource Name (ARN) of the delivery stream.
+newKinesisFirehoseDestination ::
+  -- | 'iamRoleArn'
+  Prelude.Text ->
+  -- | 'deliveryStreamArn'
+  Prelude.Text ->
+  KinesisFirehoseDestination
+newKinesisFirehoseDestination
+  pIamRoleArn_
+  pDeliveryStreamArn_ =
+    KinesisFirehoseDestination'
+      { iamRoleArn =
+          pIamRoleArn_,
+        deliveryStreamArn = pDeliveryStreamArn_
+      }
+
+-- | The ARN of an Amazon Identity and Access Management (IAM) role that is
+-- able to write event data to an Amazon Firehose destination.
+kinesisFirehoseDestination_iamRoleArn :: Lens.Lens' KinesisFirehoseDestination Prelude.Text
+kinesisFirehoseDestination_iamRoleArn = Lens.lens (\KinesisFirehoseDestination' {iamRoleArn} -> iamRoleArn) (\s@KinesisFirehoseDestination' {} a -> s {iamRoleArn = a} :: KinesisFirehoseDestination)
+
+-- | The Amazon Resource Name (ARN) of the delivery stream.
+kinesisFirehoseDestination_deliveryStreamArn :: Lens.Lens' KinesisFirehoseDestination Prelude.Text
+kinesisFirehoseDestination_deliveryStreamArn = Lens.lens (\KinesisFirehoseDestination' {deliveryStreamArn} -> deliveryStreamArn) (\s@KinesisFirehoseDestination' {} a -> s {deliveryStreamArn = a} :: KinesisFirehoseDestination)
+
+instance Data.FromJSON KinesisFirehoseDestination where
+  parseJSON =
+    Data.withObject
+      "KinesisFirehoseDestination"
+      ( \x ->
+          KinesisFirehoseDestination'
+            Prelude.<$> (x Data..: "IamRoleArn")
+            Prelude.<*> (x Data..: "DeliveryStreamArn")
+      )
+
+instance Prelude.Hashable KinesisFirehoseDestination where
+  hashWithSalt _salt KinesisFirehoseDestination' {..} =
+    _salt
+      `Prelude.hashWithSalt` iamRoleArn
+      `Prelude.hashWithSalt` deliveryStreamArn
+
+instance Prelude.NFData KinesisFirehoseDestination where
+  rnf KinesisFirehoseDestination' {..} =
+    Prelude.rnf iamRoleArn
+      `Prelude.seq` Prelude.rnf deliveryStreamArn
+
+instance Data.ToJSON KinesisFirehoseDestination where
+  toJSON KinesisFirehoseDestination' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("IamRoleArn" Data..= iamRoleArn),
+            Prelude.Just
+              ("DeliveryStreamArn" Data..= deliveryStreamArn)
+          ]
+      )
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/MessageType.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/MessageType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/MessageType.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.MessageType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.MessageType
+  ( MessageType
+      ( ..,
+        MessageType_PROMOTIONAL,
+        MessageType_TRANSACTIONAL
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype MessageType = MessageType'
+  { fromMessageType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern MessageType_PROMOTIONAL :: MessageType
+pattern MessageType_PROMOTIONAL = MessageType' "PROMOTIONAL"
+
+pattern MessageType_TRANSACTIONAL :: MessageType
+pattern MessageType_TRANSACTIONAL = MessageType' "TRANSACTIONAL"
+
+{-# COMPLETE
+  MessageType_PROMOTIONAL,
+  MessageType_TRANSACTIONAL,
+  MessageType'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/NumberCapability.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/NumberCapability.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/NumberCapability.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.NumberCapability
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.NumberCapability
+  ( NumberCapability
+      ( ..,
+        NumberCapability_SMS,
+        NumberCapability_VOICE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype NumberCapability = NumberCapability'
+  { fromNumberCapability ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern NumberCapability_SMS :: NumberCapability
+pattern NumberCapability_SMS = NumberCapability' "SMS"
+
+pattern NumberCapability_VOICE :: NumberCapability
+pattern NumberCapability_VOICE = NumberCapability' "VOICE"
+
+{-# COMPLETE
+  NumberCapability_SMS,
+  NumberCapability_VOICE,
+  NumberCapability'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/NumberStatus.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/NumberStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/NumberStatus.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.NumberStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.NumberStatus
+  ( NumberStatus
+      ( ..,
+        NumberStatus_ACTIVE,
+        NumberStatus_ASSOCIATING,
+        NumberStatus_DELETED,
+        NumberStatus_DISASSOCIATING,
+        NumberStatus_PENDING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype NumberStatus = NumberStatus'
+  { fromNumberStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern NumberStatus_ACTIVE :: NumberStatus
+pattern NumberStatus_ACTIVE = NumberStatus' "ACTIVE"
+
+pattern NumberStatus_ASSOCIATING :: NumberStatus
+pattern NumberStatus_ASSOCIATING = NumberStatus' "ASSOCIATING"
+
+pattern NumberStatus_DELETED :: NumberStatus
+pattern NumberStatus_DELETED = NumberStatus' "DELETED"
+
+pattern NumberStatus_DISASSOCIATING :: NumberStatus
+pattern NumberStatus_DISASSOCIATING = NumberStatus' "DISASSOCIATING"
+
+pattern NumberStatus_PENDING :: NumberStatus
+pattern NumberStatus_PENDING = NumberStatus' "PENDING"
+
+{-# COMPLETE
+  NumberStatus_ACTIVE,
+  NumberStatus_ASSOCIATING,
+  NumberStatus_DELETED,
+  NumberStatus_DISASSOCIATING,
+  NumberStatus_PENDING,
+  NumberStatus'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/NumberType.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/NumberType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/NumberType.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.NumberType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.NumberType
+  ( NumberType
+      ( ..,
+        NumberType_LONG_CODE,
+        NumberType_SHORT_CODE,
+        NumberType_TEN_DLC,
+        NumberType_TOLL_FREE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype NumberType = NumberType'
+  { fromNumberType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern NumberType_LONG_CODE :: NumberType
+pattern NumberType_LONG_CODE = NumberType' "LONG_CODE"
+
+pattern NumberType_SHORT_CODE :: NumberType
+pattern NumberType_SHORT_CODE = NumberType' "SHORT_CODE"
+
+pattern NumberType_TEN_DLC :: NumberType
+pattern NumberType_TEN_DLC = NumberType' "TEN_DLC"
+
+pattern NumberType_TOLL_FREE :: NumberType
+pattern NumberType_TOLL_FREE = NumberType' "TOLL_FREE"
+
+{-# COMPLETE
+  NumberType_LONG_CODE,
+  NumberType_SHORT_CODE,
+  NumberType_TEN_DLC,
+  NumberType_TOLL_FREE,
+  NumberType'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/OptOutListInformation.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/OptOutListInformation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/OptOutListInformation.hs
@@ -0,0 +1,110 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.OptOutListInformation
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.OptOutListInformation where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The information for all OptOutList in an Amazon Web Services account.
+--
+-- /See:/ 'newOptOutListInformation' smart constructor.
+data OptOutListInformation = OptOutListInformation'
+  { -- | The Amazon Resource Name (ARN) of the OptOutList.
+    optOutListArn :: Prelude.Text,
+    -- | The name of the OptOutList.
+    optOutListName :: Prelude.Text,
+    -- | The time when the OutOutList was created, in
+    -- <https://www.epochconverter.com/ UNIX epoch time> format.
+    createdTimestamp :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OptOutListInformation' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'optOutListArn', 'optOutListInformation_optOutListArn' - The Amazon Resource Name (ARN) of the OptOutList.
+--
+-- 'optOutListName', 'optOutListInformation_optOutListName' - The name of the OptOutList.
+--
+-- 'createdTimestamp', 'optOutListInformation_createdTimestamp' - The time when the OutOutList was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+newOptOutListInformation ::
+  -- | 'optOutListArn'
+  Prelude.Text ->
+  -- | 'optOutListName'
+  Prelude.Text ->
+  -- | 'createdTimestamp'
+  Prelude.UTCTime ->
+  OptOutListInformation
+newOptOutListInformation
+  pOptOutListArn_
+  pOptOutListName_
+  pCreatedTimestamp_ =
+    OptOutListInformation'
+      { optOutListArn =
+          pOptOutListArn_,
+        optOutListName = pOptOutListName_,
+        createdTimestamp =
+          Data._Time Lens.# pCreatedTimestamp_
+      }
+
+-- | The Amazon Resource Name (ARN) of the OptOutList.
+optOutListInformation_optOutListArn :: Lens.Lens' OptOutListInformation Prelude.Text
+optOutListInformation_optOutListArn = Lens.lens (\OptOutListInformation' {optOutListArn} -> optOutListArn) (\s@OptOutListInformation' {} a -> s {optOutListArn = a} :: OptOutListInformation)
+
+-- | The name of the OptOutList.
+optOutListInformation_optOutListName :: Lens.Lens' OptOutListInformation Prelude.Text
+optOutListInformation_optOutListName = Lens.lens (\OptOutListInformation' {optOutListName} -> optOutListName) (\s@OptOutListInformation' {} a -> s {optOutListName = a} :: OptOutListInformation)
+
+-- | The time when the OutOutList was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+optOutListInformation_createdTimestamp :: Lens.Lens' OptOutListInformation Prelude.UTCTime
+optOutListInformation_createdTimestamp = Lens.lens (\OptOutListInformation' {createdTimestamp} -> createdTimestamp) (\s@OptOutListInformation' {} a -> s {createdTimestamp = a} :: OptOutListInformation) Prelude.. Data._Time
+
+instance Data.FromJSON OptOutListInformation where
+  parseJSON =
+    Data.withObject
+      "OptOutListInformation"
+      ( \x ->
+          OptOutListInformation'
+            Prelude.<$> (x Data..: "OptOutListArn")
+            Prelude.<*> (x Data..: "OptOutListName")
+            Prelude.<*> (x Data..: "CreatedTimestamp")
+      )
+
+instance Prelude.Hashable OptOutListInformation where
+  hashWithSalt _salt OptOutListInformation' {..} =
+    _salt
+      `Prelude.hashWithSalt` optOutListArn
+      `Prelude.hashWithSalt` optOutListName
+      `Prelude.hashWithSalt` createdTimestamp
+
+instance Prelude.NFData OptOutListInformation where
+  rnf OptOutListInformation' {..} =
+    Prelude.rnf optOutListArn
+      `Prelude.seq` Prelude.rnf optOutListName
+      `Prelude.seq` Prelude.rnf createdTimestamp
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/OptedOutFilter.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/OptedOutFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/OptedOutFilter.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.OptedOutFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.OptedOutFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types.OptedOutFilterName
+import qualified Amazonka.Prelude as Prelude
+
+-- | The information for opted out numbers that meet a specified criteria.
+--
+-- /See:/ 'newOptedOutFilter' smart constructor.
+data OptedOutFilter = OptedOutFilter'
+  { -- | The name of the attribute to filter on.
+    name :: OptedOutFilterName,
+    -- | An array of values to filter for.
+    values :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OptedOutFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'optedOutFilter_name' - The name of the attribute to filter on.
+--
+-- 'values', 'optedOutFilter_values' - An array of values to filter for.
+newOptedOutFilter ::
+  -- | 'name'
+  OptedOutFilterName ->
+  -- | 'values'
+  Prelude.NonEmpty Prelude.Text ->
+  OptedOutFilter
+newOptedOutFilter pName_ pValues_ =
+  OptedOutFilter'
+    { name = pName_,
+      values = Lens.coerced Lens.# pValues_
+    }
+
+-- | The name of the attribute to filter on.
+optedOutFilter_name :: Lens.Lens' OptedOutFilter OptedOutFilterName
+optedOutFilter_name = Lens.lens (\OptedOutFilter' {name} -> name) (\s@OptedOutFilter' {} a -> s {name = a} :: OptedOutFilter)
+
+-- | An array of values to filter for.
+optedOutFilter_values :: Lens.Lens' OptedOutFilter (Prelude.NonEmpty Prelude.Text)
+optedOutFilter_values = Lens.lens (\OptedOutFilter' {values} -> values) (\s@OptedOutFilter' {} a -> s {values = a} :: OptedOutFilter) Prelude.. Lens.coerced
+
+instance Prelude.Hashable OptedOutFilter where
+  hashWithSalt _salt OptedOutFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` values
+
+instance Prelude.NFData OptedOutFilter where
+  rnf OptedOutFilter' {..} =
+    Prelude.rnf name `Prelude.seq` Prelude.rnf values
+
+instance Data.ToJSON OptedOutFilter where
+  toJSON OptedOutFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("Name" Data..= name),
+            Prelude.Just ("Values" Data..= values)
+          ]
+      )
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/OptedOutFilterName.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/OptedOutFilterName.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/OptedOutFilterName.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.OptedOutFilterName
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.OptedOutFilterName
+  ( OptedOutFilterName
+      ( ..,
+        OptedOutFilterName_End_user_opted_out
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype OptedOutFilterName = OptedOutFilterName'
+  { fromOptedOutFilterName ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern OptedOutFilterName_End_user_opted_out :: OptedOutFilterName
+pattern OptedOutFilterName_End_user_opted_out = OptedOutFilterName' "end-user-opted-out"
+
+{-# COMPLETE
+  OptedOutFilterName_End_user_opted_out,
+  OptedOutFilterName'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/OptedOutNumberInformation.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/OptedOutNumberInformation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/OptedOutNumberInformation.hs
@@ -0,0 +1,111 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.OptedOutNumberInformation
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.OptedOutNumberInformation where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The information for an opted out number in an Amazon Web Services
+-- account.
+--
+-- /See:/ 'newOptedOutNumberInformation' smart constructor.
+data OptedOutNumberInformation = OptedOutNumberInformation'
+  { -- | The phone number that is opted out.
+    optedOutNumber :: Prelude.Text,
+    -- | The time that the op tout occurred, in
+    -- <https://www.epochconverter.com/ UNIX epoch time> format.
+    optedOutTimestamp :: Data.POSIX,
+    -- | This is set to true if it was the end recipient that opted out.
+    endUserOptedOut :: Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OptedOutNumberInformation' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'optedOutNumber', 'optedOutNumberInformation_optedOutNumber' - The phone number that is opted out.
+--
+-- 'optedOutTimestamp', 'optedOutNumberInformation_optedOutTimestamp' - The time that the op tout occurred, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+--
+-- 'endUserOptedOut', 'optedOutNumberInformation_endUserOptedOut' - This is set to true if it was the end recipient that opted out.
+newOptedOutNumberInformation ::
+  -- | 'optedOutNumber'
+  Prelude.Text ->
+  -- | 'optedOutTimestamp'
+  Prelude.UTCTime ->
+  -- | 'endUserOptedOut'
+  Prelude.Bool ->
+  OptedOutNumberInformation
+newOptedOutNumberInformation
+  pOptedOutNumber_
+  pOptedOutTimestamp_
+  pEndUserOptedOut_ =
+    OptedOutNumberInformation'
+      { optedOutNumber =
+          pOptedOutNumber_,
+        optedOutTimestamp =
+          Data._Time Lens.# pOptedOutTimestamp_,
+        endUserOptedOut = pEndUserOptedOut_
+      }
+
+-- | The phone number that is opted out.
+optedOutNumberInformation_optedOutNumber :: Lens.Lens' OptedOutNumberInformation Prelude.Text
+optedOutNumberInformation_optedOutNumber = Lens.lens (\OptedOutNumberInformation' {optedOutNumber} -> optedOutNumber) (\s@OptedOutNumberInformation' {} a -> s {optedOutNumber = a} :: OptedOutNumberInformation)
+
+-- | The time that the op tout occurred, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+optedOutNumberInformation_optedOutTimestamp :: Lens.Lens' OptedOutNumberInformation Prelude.UTCTime
+optedOutNumberInformation_optedOutTimestamp = Lens.lens (\OptedOutNumberInformation' {optedOutTimestamp} -> optedOutTimestamp) (\s@OptedOutNumberInformation' {} a -> s {optedOutTimestamp = a} :: OptedOutNumberInformation) Prelude.. Data._Time
+
+-- | This is set to true if it was the end recipient that opted out.
+optedOutNumberInformation_endUserOptedOut :: Lens.Lens' OptedOutNumberInformation Prelude.Bool
+optedOutNumberInformation_endUserOptedOut = Lens.lens (\OptedOutNumberInformation' {endUserOptedOut} -> endUserOptedOut) (\s@OptedOutNumberInformation' {} a -> s {endUserOptedOut = a} :: OptedOutNumberInformation)
+
+instance Data.FromJSON OptedOutNumberInformation where
+  parseJSON =
+    Data.withObject
+      "OptedOutNumberInformation"
+      ( \x ->
+          OptedOutNumberInformation'
+            Prelude.<$> (x Data..: "OptedOutNumber")
+            Prelude.<*> (x Data..: "OptedOutTimestamp")
+            Prelude.<*> (x Data..: "EndUserOptedOut")
+      )
+
+instance Prelude.Hashable OptedOutNumberInformation where
+  hashWithSalt _salt OptedOutNumberInformation' {..} =
+    _salt
+      `Prelude.hashWithSalt` optedOutNumber
+      `Prelude.hashWithSalt` optedOutTimestamp
+      `Prelude.hashWithSalt` endUserOptedOut
+
+instance Prelude.NFData OptedOutNumberInformation where
+  rnf OptedOutNumberInformation' {..} =
+    Prelude.rnf optedOutNumber
+      `Prelude.seq` Prelude.rnf optedOutTimestamp
+      `Prelude.seq` Prelude.rnf endUserOptedOut
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/OriginationIdentityMetadata.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/OriginationIdentityMetadata.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/OriginationIdentityMetadata.hs
@@ -0,0 +1,129 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.OriginationIdentityMetadata
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.OriginationIdentityMetadata where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types.NumberCapability
+import qualified Amazonka.Prelude as Prelude
+
+-- | The metadata for an origination identity associated with a pool.
+--
+-- /See:/ 'newOriginationIdentityMetadata' smart constructor.
+data OriginationIdentityMetadata = OriginationIdentityMetadata'
+  { -- | The Amazon Resource Name (ARN) associated with the origination identity.
+    originationIdentityArn :: Prelude.Text,
+    -- | The unique identifier of the origination identity.
+    originationIdentity :: Prelude.Text,
+    -- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+    -- region.
+    isoCountryCode :: Prelude.Text,
+    -- | Describes if the origination identity can be used for text messages,
+    -- voice calls or both.
+    numberCapabilities :: Prelude.NonEmpty NumberCapability
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OriginationIdentityMetadata' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'originationIdentityArn', 'originationIdentityMetadata_originationIdentityArn' - The Amazon Resource Name (ARN) associated with the origination identity.
+--
+-- 'originationIdentity', 'originationIdentityMetadata_originationIdentity' - The unique identifier of the origination identity.
+--
+-- 'isoCountryCode', 'originationIdentityMetadata_isoCountryCode' - The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+--
+-- 'numberCapabilities', 'originationIdentityMetadata_numberCapabilities' - Describes if the origination identity can be used for text messages,
+-- voice calls or both.
+newOriginationIdentityMetadata ::
+  -- | 'originationIdentityArn'
+  Prelude.Text ->
+  -- | 'originationIdentity'
+  Prelude.Text ->
+  -- | 'isoCountryCode'
+  Prelude.Text ->
+  -- | 'numberCapabilities'
+  Prelude.NonEmpty NumberCapability ->
+  OriginationIdentityMetadata
+newOriginationIdentityMetadata
+  pOriginationIdentityArn_
+  pOriginationIdentity_
+  pIsoCountryCode_
+  pNumberCapabilities_ =
+    OriginationIdentityMetadata'
+      { originationIdentityArn =
+          pOriginationIdentityArn_,
+        originationIdentity = pOriginationIdentity_,
+        isoCountryCode = pIsoCountryCode_,
+        numberCapabilities =
+          Lens.coerced Lens.# pNumberCapabilities_
+      }
+
+-- | The Amazon Resource Name (ARN) associated with the origination identity.
+originationIdentityMetadata_originationIdentityArn :: Lens.Lens' OriginationIdentityMetadata Prelude.Text
+originationIdentityMetadata_originationIdentityArn = Lens.lens (\OriginationIdentityMetadata' {originationIdentityArn} -> originationIdentityArn) (\s@OriginationIdentityMetadata' {} a -> s {originationIdentityArn = a} :: OriginationIdentityMetadata)
+
+-- | The unique identifier of the origination identity.
+originationIdentityMetadata_originationIdentity :: Lens.Lens' OriginationIdentityMetadata Prelude.Text
+originationIdentityMetadata_originationIdentity = Lens.lens (\OriginationIdentityMetadata' {originationIdentity} -> originationIdentity) (\s@OriginationIdentityMetadata' {} a -> s {originationIdentity = a} :: OriginationIdentityMetadata)
+
+-- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+originationIdentityMetadata_isoCountryCode :: Lens.Lens' OriginationIdentityMetadata Prelude.Text
+originationIdentityMetadata_isoCountryCode = Lens.lens (\OriginationIdentityMetadata' {isoCountryCode} -> isoCountryCode) (\s@OriginationIdentityMetadata' {} a -> s {isoCountryCode = a} :: OriginationIdentityMetadata)
+
+-- | Describes if the origination identity can be used for text messages,
+-- voice calls or both.
+originationIdentityMetadata_numberCapabilities :: Lens.Lens' OriginationIdentityMetadata (Prelude.NonEmpty NumberCapability)
+originationIdentityMetadata_numberCapabilities = Lens.lens (\OriginationIdentityMetadata' {numberCapabilities} -> numberCapabilities) (\s@OriginationIdentityMetadata' {} a -> s {numberCapabilities = a} :: OriginationIdentityMetadata) Prelude.. Lens.coerced
+
+instance Data.FromJSON OriginationIdentityMetadata where
+  parseJSON =
+    Data.withObject
+      "OriginationIdentityMetadata"
+      ( \x ->
+          OriginationIdentityMetadata'
+            Prelude.<$> (x Data..: "OriginationIdentityArn")
+            Prelude.<*> (x Data..: "OriginationIdentity")
+            Prelude.<*> (x Data..: "IsoCountryCode")
+            Prelude.<*> (x Data..: "NumberCapabilities")
+      )
+
+instance Prelude.Hashable OriginationIdentityMetadata where
+  hashWithSalt _salt OriginationIdentityMetadata' {..} =
+    _salt
+      `Prelude.hashWithSalt` originationIdentityArn
+      `Prelude.hashWithSalt` originationIdentity
+      `Prelude.hashWithSalt` isoCountryCode
+      `Prelude.hashWithSalt` numberCapabilities
+
+instance Prelude.NFData OriginationIdentityMetadata where
+  rnf OriginationIdentityMetadata' {..} =
+    Prelude.rnf originationIdentityArn
+      `Prelude.seq` Prelude.rnf originationIdentity
+      `Prelude.seq` Prelude.rnf isoCountryCode
+      `Prelude.seq` Prelude.rnf numberCapabilities
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/PhoneNumberFilter.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/PhoneNumberFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/PhoneNumberFilter.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.PhoneNumberFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.PhoneNumberFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types.PhoneNumberFilterName
+import qualified Amazonka.Prelude as Prelude
+
+-- | The information for a phone number that meets a specified criteria.
+--
+-- /See:/ 'newPhoneNumberFilter' smart constructor.
+data PhoneNumberFilter = PhoneNumberFilter'
+  { -- | The name of the attribute to filter on.
+    name :: PhoneNumberFilterName,
+    -- | An array values to filter for.
+    values :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PhoneNumberFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'phoneNumberFilter_name' - The name of the attribute to filter on.
+--
+-- 'values', 'phoneNumberFilter_values' - An array values to filter for.
+newPhoneNumberFilter ::
+  -- | 'name'
+  PhoneNumberFilterName ->
+  -- | 'values'
+  Prelude.NonEmpty Prelude.Text ->
+  PhoneNumberFilter
+newPhoneNumberFilter pName_ pValues_ =
+  PhoneNumberFilter'
+    { name = pName_,
+      values = Lens.coerced Lens.# pValues_
+    }
+
+-- | The name of the attribute to filter on.
+phoneNumberFilter_name :: Lens.Lens' PhoneNumberFilter PhoneNumberFilterName
+phoneNumberFilter_name = Lens.lens (\PhoneNumberFilter' {name} -> name) (\s@PhoneNumberFilter' {} a -> s {name = a} :: PhoneNumberFilter)
+
+-- | An array values to filter for.
+phoneNumberFilter_values :: Lens.Lens' PhoneNumberFilter (Prelude.NonEmpty Prelude.Text)
+phoneNumberFilter_values = Lens.lens (\PhoneNumberFilter' {values} -> values) (\s@PhoneNumberFilter' {} a -> s {values = a} :: PhoneNumberFilter) Prelude.. Lens.coerced
+
+instance Prelude.Hashable PhoneNumberFilter where
+  hashWithSalt _salt PhoneNumberFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` values
+
+instance Prelude.NFData PhoneNumberFilter where
+  rnf PhoneNumberFilter' {..} =
+    Prelude.rnf name `Prelude.seq` Prelude.rnf values
+
+instance Data.ToJSON PhoneNumberFilter where
+  toJSON PhoneNumberFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("Name" Data..= name),
+            Prelude.Just ("Values" Data..= values)
+          ]
+      )
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/PhoneNumberFilterName.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/PhoneNumberFilterName.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/PhoneNumberFilterName.hs
@@ -0,0 +1,106 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.PhoneNumberFilterName
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.PhoneNumberFilterName
+  ( PhoneNumberFilterName
+      ( ..,
+        PhoneNumberFilterName_Deletion_protection_enabled,
+        PhoneNumberFilterName_Iso_country_code,
+        PhoneNumberFilterName_Message_type,
+        PhoneNumberFilterName_Number_capability,
+        PhoneNumberFilterName_Number_type,
+        PhoneNumberFilterName_Opt_out_list_name,
+        PhoneNumberFilterName_Self_managed_opt_outs_enabled,
+        PhoneNumberFilterName_Status,
+        PhoneNumberFilterName_Two_way_enabled
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PhoneNumberFilterName = PhoneNumberFilterName'
+  { fromPhoneNumberFilterName ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern PhoneNumberFilterName_Deletion_protection_enabled :: PhoneNumberFilterName
+pattern PhoneNumberFilterName_Deletion_protection_enabled = PhoneNumberFilterName' "deletion-protection-enabled"
+
+pattern PhoneNumberFilterName_Iso_country_code :: PhoneNumberFilterName
+pattern PhoneNumberFilterName_Iso_country_code = PhoneNumberFilterName' "iso-country-code"
+
+pattern PhoneNumberFilterName_Message_type :: PhoneNumberFilterName
+pattern PhoneNumberFilterName_Message_type = PhoneNumberFilterName' "message-type"
+
+pattern PhoneNumberFilterName_Number_capability :: PhoneNumberFilterName
+pattern PhoneNumberFilterName_Number_capability = PhoneNumberFilterName' "number-capability"
+
+pattern PhoneNumberFilterName_Number_type :: PhoneNumberFilterName
+pattern PhoneNumberFilterName_Number_type = PhoneNumberFilterName' "number-type"
+
+pattern PhoneNumberFilterName_Opt_out_list_name :: PhoneNumberFilterName
+pattern PhoneNumberFilterName_Opt_out_list_name = PhoneNumberFilterName' "opt-out-list-name"
+
+pattern PhoneNumberFilterName_Self_managed_opt_outs_enabled :: PhoneNumberFilterName
+pattern PhoneNumberFilterName_Self_managed_opt_outs_enabled = PhoneNumberFilterName' "self-managed-opt-outs-enabled"
+
+pattern PhoneNumberFilterName_Status :: PhoneNumberFilterName
+pattern PhoneNumberFilterName_Status = PhoneNumberFilterName' "status"
+
+pattern PhoneNumberFilterName_Two_way_enabled :: PhoneNumberFilterName
+pattern PhoneNumberFilterName_Two_way_enabled = PhoneNumberFilterName' "two-way-enabled"
+
+{-# COMPLETE
+  PhoneNumberFilterName_Deletion_protection_enabled,
+  PhoneNumberFilterName_Iso_country_code,
+  PhoneNumberFilterName_Message_type,
+  PhoneNumberFilterName_Number_capability,
+  PhoneNumberFilterName_Number_type,
+  PhoneNumberFilterName_Opt_out_list_name,
+  PhoneNumberFilterName_Self_managed_opt_outs_enabled,
+  PhoneNumberFilterName_Status,
+  PhoneNumberFilterName_Two_way_enabled,
+  PhoneNumberFilterName'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/PhoneNumberInformation.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/PhoneNumberInformation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/PhoneNumberInformation.hs
@@ -0,0 +1,339 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.PhoneNumberInformation
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.PhoneNumberInformation where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types.MessageType
+import Amazonka.PinpointSmsVoiceV2.Types.NumberCapability
+import Amazonka.PinpointSmsVoiceV2.Types.NumberStatus
+import Amazonka.PinpointSmsVoiceV2.Types.NumberType
+import qualified Amazonka.Prelude as Prelude
+
+-- | The information for a phone number in an Amazon Web Services account.
+--
+-- /See:/ 'newPhoneNumberInformation' smart constructor.
+data PhoneNumberInformation = PhoneNumberInformation'
+  { -- | The unique identifier for the phone number.
+    phoneNumberId :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of the pool associated with the phone number.
+    poolId :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the two way channel.
+    twoWayChannelArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) associated with the phone number.
+    phoneNumberArn :: Prelude.Text,
+    -- | The phone number in E.164 format.
+    phoneNumber :: Prelude.Text,
+    -- | The current status of the phone number.
+    status :: NumberStatus,
+    -- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+    -- region.
+    isoCountryCode :: Prelude.Text,
+    -- | The type of message. Valid values are TRANSACTIONAL for messages that
+    -- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+    -- critical or time-sensitive.
+    messageType :: MessageType,
+    -- | Describes if the origination identity can be used for text messages,
+    -- voice calls or both.
+    numberCapabilities :: Prelude.NonEmpty NumberCapability,
+    -- | The type of phone number.
+    numberType :: NumberType,
+    -- | The price, in US dollars, to lease the phone number.
+    monthlyLeasingPrice :: Prelude.Text,
+    -- | By default this is set to false. When set to true you can receive
+    -- incoming text messages from your end recipients using the
+    -- TwoWayChannelArn.
+    twoWayEnabled :: Prelude.Bool,
+    -- | When set to false an end recipient sends a message that begins with HELP
+    -- or STOP to one of your dedicated numbers, Amazon Pinpoint automatically
+    -- replies with a customizable message and adds the end recipient to the
+    -- OptOutList. When set to true you\'re responsible for responding to HELP
+    -- and STOP requests. You\'re also responsible for tracking and honoring
+    -- opt-out request. For more information see
+    -- <https://docs.aws.amazon.com/pinpoint/latest/userguide/settings-sms-managing.html#settings-account-sms-self-managed-opt-out Self-managed opt-outs>
+    selfManagedOptOutsEnabled :: Prelude.Bool,
+    -- | The name of the OptOutList associated with the phone number.
+    optOutListName :: Prelude.Text,
+    -- | When set to true the phone number can\'t be deleted.
+    deletionProtectionEnabled :: Prelude.Bool,
+    -- | The time when the phone number was created, in
+    -- <https://www.epochconverter.com/ UNIX epoch time> format.
+    createdTimestamp :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PhoneNumberInformation' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'phoneNumberId', 'phoneNumberInformation_phoneNumberId' - The unique identifier for the phone number.
+--
+-- 'poolId', 'phoneNumberInformation_poolId' - The unique identifier of the pool associated with the phone number.
+--
+-- 'twoWayChannelArn', 'phoneNumberInformation_twoWayChannelArn' - The Amazon Resource Name (ARN) of the two way channel.
+--
+-- 'phoneNumberArn', 'phoneNumberInformation_phoneNumberArn' - The Amazon Resource Name (ARN) associated with the phone number.
+--
+-- 'phoneNumber', 'phoneNumberInformation_phoneNumber' - The phone number in E.164 format.
+--
+-- 'status', 'phoneNumberInformation_status' - The current status of the phone number.
+--
+-- 'isoCountryCode', 'phoneNumberInformation_isoCountryCode' - The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+--
+-- 'messageType', 'phoneNumberInformation_messageType' - The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+--
+-- 'numberCapabilities', 'phoneNumberInformation_numberCapabilities' - Describes if the origination identity can be used for text messages,
+-- voice calls or both.
+--
+-- 'numberType', 'phoneNumberInformation_numberType' - The type of phone number.
+--
+-- 'monthlyLeasingPrice', 'phoneNumberInformation_monthlyLeasingPrice' - The price, in US dollars, to lease the phone number.
+--
+-- 'twoWayEnabled', 'phoneNumberInformation_twoWayEnabled' - By default this is set to false. When set to true you can receive
+-- incoming text messages from your end recipients using the
+-- TwoWayChannelArn.
+--
+-- 'selfManagedOptOutsEnabled', 'phoneNumberInformation_selfManagedOptOutsEnabled' - When set to false an end recipient sends a message that begins with HELP
+-- or STOP to one of your dedicated numbers, Amazon Pinpoint automatically
+-- replies with a customizable message and adds the end recipient to the
+-- OptOutList. When set to true you\'re responsible for responding to HELP
+-- and STOP requests. You\'re also responsible for tracking and honoring
+-- opt-out request. For more information see
+-- <https://docs.aws.amazon.com/pinpoint/latest/userguide/settings-sms-managing.html#settings-account-sms-self-managed-opt-out Self-managed opt-outs>
+--
+-- 'optOutListName', 'phoneNumberInformation_optOutListName' - The name of the OptOutList associated with the phone number.
+--
+-- 'deletionProtectionEnabled', 'phoneNumberInformation_deletionProtectionEnabled' - When set to true the phone number can\'t be deleted.
+--
+-- 'createdTimestamp', 'phoneNumberInformation_createdTimestamp' - The time when the phone number was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+newPhoneNumberInformation ::
+  -- | 'phoneNumberArn'
+  Prelude.Text ->
+  -- | 'phoneNumber'
+  Prelude.Text ->
+  -- | 'status'
+  NumberStatus ->
+  -- | 'isoCountryCode'
+  Prelude.Text ->
+  -- | 'messageType'
+  MessageType ->
+  -- | 'numberCapabilities'
+  Prelude.NonEmpty NumberCapability ->
+  -- | 'numberType'
+  NumberType ->
+  -- | 'monthlyLeasingPrice'
+  Prelude.Text ->
+  -- | 'twoWayEnabled'
+  Prelude.Bool ->
+  -- | 'selfManagedOptOutsEnabled'
+  Prelude.Bool ->
+  -- | 'optOutListName'
+  Prelude.Text ->
+  -- | 'deletionProtectionEnabled'
+  Prelude.Bool ->
+  -- | 'createdTimestamp'
+  Prelude.UTCTime ->
+  PhoneNumberInformation
+newPhoneNumberInformation
+  pPhoneNumberArn_
+  pPhoneNumber_
+  pStatus_
+  pIsoCountryCode_
+  pMessageType_
+  pNumberCapabilities_
+  pNumberType_
+  pMonthlyLeasingPrice_
+  pTwoWayEnabled_
+  pSelfManagedOptOutsEnabled_
+  pOptOutListName_
+  pDeletionProtectionEnabled_
+  pCreatedTimestamp_ =
+    PhoneNumberInformation'
+      { phoneNumberId =
+          Prelude.Nothing,
+        poolId = Prelude.Nothing,
+        twoWayChannelArn = Prelude.Nothing,
+        phoneNumberArn = pPhoneNumberArn_,
+        phoneNumber = pPhoneNumber_,
+        status = pStatus_,
+        isoCountryCode = pIsoCountryCode_,
+        messageType = pMessageType_,
+        numberCapabilities =
+          Lens.coerced Lens.# pNumberCapabilities_,
+        numberType = pNumberType_,
+        monthlyLeasingPrice = pMonthlyLeasingPrice_,
+        twoWayEnabled = pTwoWayEnabled_,
+        selfManagedOptOutsEnabled =
+          pSelfManagedOptOutsEnabled_,
+        optOutListName = pOptOutListName_,
+        deletionProtectionEnabled =
+          pDeletionProtectionEnabled_,
+        createdTimestamp =
+          Data._Time Lens.# pCreatedTimestamp_
+      }
+
+-- | The unique identifier for the phone number.
+phoneNumberInformation_phoneNumberId :: Lens.Lens' PhoneNumberInformation (Prelude.Maybe Prelude.Text)
+phoneNumberInformation_phoneNumberId = Lens.lens (\PhoneNumberInformation' {phoneNumberId} -> phoneNumberId) (\s@PhoneNumberInformation' {} a -> s {phoneNumberId = a} :: PhoneNumberInformation)
+
+-- | The unique identifier of the pool associated with the phone number.
+phoneNumberInformation_poolId :: Lens.Lens' PhoneNumberInformation (Prelude.Maybe Prelude.Text)
+phoneNumberInformation_poolId = Lens.lens (\PhoneNumberInformation' {poolId} -> poolId) (\s@PhoneNumberInformation' {} a -> s {poolId = a} :: PhoneNumberInformation)
+
+-- | The Amazon Resource Name (ARN) of the two way channel.
+phoneNumberInformation_twoWayChannelArn :: Lens.Lens' PhoneNumberInformation (Prelude.Maybe Prelude.Text)
+phoneNumberInformation_twoWayChannelArn = Lens.lens (\PhoneNumberInformation' {twoWayChannelArn} -> twoWayChannelArn) (\s@PhoneNumberInformation' {} a -> s {twoWayChannelArn = a} :: PhoneNumberInformation)
+
+-- | The Amazon Resource Name (ARN) associated with the phone number.
+phoneNumberInformation_phoneNumberArn :: Lens.Lens' PhoneNumberInformation Prelude.Text
+phoneNumberInformation_phoneNumberArn = Lens.lens (\PhoneNumberInformation' {phoneNumberArn} -> phoneNumberArn) (\s@PhoneNumberInformation' {} a -> s {phoneNumberArn = a} :: PhoneNumberInformation)
+
+-- | The phone number in E.164 format.
+phoneNumberInformation_phoneNumber :: Lens.Lens' PhoneNumberInformation Prelude.Text
+phoneNumberInformation_phoneNumber = Lens.lens (\PhoneNumberInformation' {phoneNumber} -> phoneNumber) (\s@PhoneNumberInformation' {} a -> s {phoneNumber = a} :: PhoneNumberInformation)
+
+-- | The current status of the phone number.
+phoneNumberInformation_status :: Lens.Lens' PhoneNumberInformation NumberStatus
+phoneNumberInformation_status = Lens.lens (\PhoneNumberInformation' {status} -> status) (\s@PhoneNumberInformation' {} a -> s {status = a} :: PhoneNumberInformation)
+
+-- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+phoneNumberInformation_isoCountryCode :: Lens.Lens' PhoneNumberInformation Prelude.Text
+phoneNumberInformation_isoCountryCode = Lens.lens (\PhoneNumberInformation' {isoCountryCode} -> isoCountryCode) (\s@PhoneNumberInformation' {} a -> s {isoCountryCode = a} :: PhoneNumberInformation)
+
+-- | The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+phoneNumberInformation_messageType :: Lens.Lens' PhoneNumberInformation MessageType
+phoneNumberInformation_messageType = Lens.lens (\PhoneNumberInformation' {messageType} -> messageType) (\s@PhoneNumberInformation' {} a -> s {messageType = a} :: PhoneNumberInformation)
+
+-- | Describes if the origination identity can be used for text messages,
+-- voice calls or both.
+phoneNumberInformation_numberCapabilities :: Lens.Lens' PhoneNumberInformation (Prelude.NonEmpty NumberCapability)
+phoneNumberInformation_numberCapabilities = Lens.lens (\PhoneNumberInformation' {numberCapabilities} -> numberCapabilities) (\s@PhoneNumberInformation' {} a -> s {numberCapabilities = a} :: PhoneNumberInformation) Prelude.. Lens.coerced
+
+-- | The type of phone number.
+phoneNumberInformation_numberType :: Lens.Lens' PhoneNumberInformation NumberType
+phoneNumberInformation_numberType = Lens.lens (\PhoneNumberInformation' {numberType} -> numberType) (\s@PhoneNumberInformation' {} a -> s {numberType = a} :: PhoneNumberInformation)
+
+-- | The price, in US dollars, to lease the phone number.
+phoneNumberInformation_monthlyLeasingPrice :: Lens.Lens' PhoneNumberInformation Prelude.Text
+phoneNumberInformation_monthlyLeasingPrice = Lens.lens (\PhoneNumberInformation' {monthlyLeasingPrice} -> monthlyLeasingPrice) (\s@PhoneNumberInformation' {} a -> s {monthlyLeasingPrice = a} :: PhoneNumberInformation)
+
+-- | By default this is set to false. When set to true you can receive
+-- incoming text messages from your end recipients using the
+-- TwoWayChannelArn.
+phoneNumberInformation_twoWayEnabled :: Lens.Lens' PhoneNumberInformation Prelude.Bool
+phoneNumberInformation_twoWayEnabled = Lens.lens (\PhoneNumberInformation' {twoWayEnabled} -> twoWayEnabled) (\s@PhoneNumberInformation' {} a -> s {twoWayEnabled = a} :: PhoneNumberInformation)
+
+-- | When set to false an end recipient sends a message that begins with HELP
+-- or STOP to one of your dedicated numbers, Amazon Pinpoint automatically
+-- replies with a customizable message and adds the end recipient to the
+-- OptOutList. When set to true you\'re responsible for responding to HELP
+-- and STOP requests. You\'re also responsible for tracking and honoring
+-- opt-out request. For more information see
+-- <https://docs.aws.amazon.com/pinpoint/latest/userguide/settings-sms-managing.html#settings-account-sms-self-managed-opt-out Self-managed opt-outs>
+phoneNumberInformation_selfManagedOptOutsEnabled :: Lens.Lens' PhoneNumberInformation Prelude.Bool
+phoneNumberInformation_selfManagedOptOutsEnabled = Lens.lens (\PhoneNumberInformation' {selfManagedOptOutsEnabled} -> selfManagedOptOutsEnabled) (\s@PhoneNumberInformation' {} a -> s {selfManagedOptOutsEnabled = a} :: PhoneNumberInformation)
+
+-- | The name of the OptOutList associated with the phone number.
+phoneNumberInformation_optOutListName :: Lens.Lens' PhoneNumberInformation Prelude.Text
+phoneNumberInformation_optOutListName = Lens.lens (\PhoneNumberInformation' {optOutListName} -> optOutListName) (\s@PhoneNumberInformation' {} a -> s {optOutListName = a} :: PhoneNumberInformation)
+
+-- | When set to true the phone number can\'t be deleted.
+phoneNumberInformation_deletionProtectionEnabled :: Lens.Lens' PhoneNumberInformation Prelude.Bool
+phoneNumberInformation_deletionProtectionEnabled = Lens.lens (\PhoneNumberInformation' {deletionProtectionEnabled} -> deletionProtectionEnabled) (\s@PhoneNumberInformation' {} a -> s {deletionProtectionEnabled = a} :: PhoneNumberInformation)
+
+-- | The time when the phone number was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+phoneNumberInformation_createdTimestamp :: Lens.Lens' PhoneNumberInformation Prelude.UTCTime
+phoneNumberInformation_createdTimestamp = Lens.lens (\PhoneNumberInformation' {createdTimestamp} -> createdTimestamp) (\s@PhoneNumberInformation' {} a -> s {createdTimestamp = a} :: PhoneNumberInformation) Prelude.. Data._Time
+
+instance Data.FromJSON PhoneNumberInformation where
+  parseJSON =
+    Data.withObject
+      "PhoneNumberInformation"
+      ( \x ->
+          PhoneNumberInformation'
+            Prelude.<$> (x Data..:? "PhoneNumberId")
+            Prelude.<*> (x Data..:? "PoolId")
+            Prelude.<*> (x Data..:? "TwoWayChannelArn")
+            Prelude.<*> (x Data..: "PhoneNumberArn")
+            Prelude.<*> (x Data..: "PhoneNumber")
+            Prelude.<*> (x Data..: "Status")
+            Prelude.<*> (x Data..: "IsoCountryCode")
+            Prelude.<*> (x Data..: "MessageType")
+            Prelude.<*> (x Data..: "NumberCapabilities")
+            Prelude.<*> (x Data..: "NumberType")
+            Prelude.<*> (x Data..: "MonthlyLeasingPrice")
+            Prelude.<*> (x Data..: "TwoWayEnabled")
+            Prelude.<*> (x Data..: "SelfManagedOptOutsEnabled")
+            Prelude.<*> (x Data..: "OptOutListName")
+            Prelude.<*> (x Data..: "DeletionProtectionEnabled")
+            Prelude.<*> (x Data..: "CreatedTimestamp")
+      )
+
+instance Prelude.Hashable PhoneNumberInformation where
+  hashWithSalt _salt PhoneNumberInformation' {..} =
+    _salt
+      `Prelude.hashWithSalt` phoneNumberId
+      `Prelude.hashWithSalt` poolId
+      `Prelude.hashWithSalt` twoWayChannelArn
+      `Prelude.hashWithSalt` phoneNumberArn
+      `Prelude.hashWithSalt` phoneNumber
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` isoCountryCode
+      `Prelude.hashWithSalt` messageType
+      `Prelude.hashWithSalt` numberCapabilities
+      `Prelude.hashWithSalt` numberType
+      `Prelude.hashWithSalt` monthlyLeasingPrice
+      `Prelude.hashWithSalt` twoWayEnabled
+      `Prelude.hashWithSalt` selfManagedOptOutsEnabled
+      `Prelude.hashWithSalt` optOutListName
+      `Prelude.hashWithSalt` deletionProtectionEnabled
+      `Prelude.hashWithSalt` createdTimestamp
+
+instance Prelude.NFData PhoneNumberInformation where
+  rnf PhoneNumberInformation' {..} =
+    Prelude.rnf phoneNumberId
+      `Prelude.seq` Prelude.rnf poolId
+      `Prelude.seq` Prelude.rnf twoWayChannelArn
+      `Prelude.seq` Prelude.rnf phoneNumberArn
+      `Prelude.seq` Prelude.rnf phoneNumber
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf isoCountryCode
+      `Prelude.seq` Prelude.rnf messageType
+      `Prelude.seq` Prelude.rnf numberCapabilities
+      `Prelude.seq` Prelude.rnf numberType
+      `Prelude.seq` Prelude.rnf monthlyLeasingPrice
+      `Prelude.seq` Prelude.rnf twoWayEnabled
+      `Prelude.seq` Prelude.rnf selfManagedOptOutsEnabled
+      `Prelude.seq` Prelude.rnf optOutListName
+      `Prelude.seq` Prelude.rnf deletionProtectionEnabled
+      `Prelude.seq` Prelude.rnf createdTimestamp
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/PoolFilter.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/PoolFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/PoolFilter.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.PoolFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.PoolFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types.PoolFilterName
+import qualified Amazonka.Prelude as Prelude
+
+-- | The information for a pool that meets a specified criteria.
+--
+-- /See:/ 'newPoolFilter' smart constructor.
+data PoolFilter = PoolFilter'
+  { -- | The name of the attribute to filter on.
+    name :: PoolFilterName,
+    -- | An array values to filter for.
+    values :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PoolFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'poolFilter_name' - The name of the attribute to filter on.
+--
+-- 'values', 'poolFilter_values' - An array values to filter for.
+newPoolFilter ::
+  -- | 'name'
+  PoolFilterName ->
+  -- | 'values'
+  Prelude.NonEmpty Prelude.Text ->
+  PoolFilter
+newPoolFilter pName_ pValues_ =
+  PoolFilter'
+    { name = pName_,
+      values = Lens.coerced Lens.# pValues_
+    }
+
+-- | The name of the attribute to filter on.
+poolFilter_name :: Lens.Lens' PoolFilter PoolFilterName
+poolFilter_name = Lens.lens (\PoolFilter' {name} -> name) (\s@PoolFilter' {} a -> s {name = a} :: PoolFilter)
+
+-- | An array values to filter for.
+poolFilter_values :: Lens.Lens' PoolFilter (Prelude.NonEmpty Prelude.Text)
+poolFilter_values = Lens.lens (\PoolFilter' {values} -> values) (\s@PoolFilter' {} a -> s {values = a} :: PoolFilter) Prelude.. Lens.coerced
+
+instance Prelude.Hashable PoolFilter where
+  hashWithSalt _salt PoolFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` values
+
+instance Prelude.NFData PoolFilter where
+  rnf PoolFilter' {..} =
+    Prelude.rnf name `Prelude.seq` Prelude.rnf values
+
+instance Data.ToJSON PoolFilter where
+  toJSON PoolFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("Name" Data..= name),
+            Prelude.Just ("Values" Data..= values)
+          ]
+      )
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/PoolFilterName.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/PoolFilterName.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/PoolFilterName.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.PoolFilterName
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.PoolFilterName
+  ( PoolFilterName
+      ( ..,
+        PoolFilterName_Deletion_protection_enabled,
+        PoolFilterName_Message_type,
+        PoolFilterName_Opt_out_list_name,
+        PoolFilterName_Self_managed_opt_outs_enabled,
+        PoolFilterName_Shared_routes_enabled,
+        PoolFilterName_Status,
+        PoolFilterName_Two_way_enabled
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PoolFilterName = PoolFilterName'
+  { fromPoolFilterName ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern PoolFilterName_Deletion_protection_enabled :: PoolFilterName
+pattern PoolFilterName_Deletion_protection_enabled = PoolFilterName' "deletion-protection-enabled"
+
+pattern PoolFilterName_Message_type :: PoolFilterName
+pattern PoolFilterName_Message_type = PoolFilterName' "message-type"
+
+pattern PoolFilterName_Opt_out_list_name :: PoolFilterName
+pattern PoolFilterName_Opt_out_list_name = PoolFilterName' "opt-out-list-name"
+
+pattern PoolFilterName_Self_managed_opt_outs_enabled :: PoolFilterName
+pattern PoolFilterName_Self_managed_opt_outs_enabled = PoolFilterName' "self-managed-opt-outs-enabled"
+
+pattern PoolFilterName_Shared_routes_enabled :: PoolFilterName
+pattern PoolFilterName_Shared_routes_enabled = PoolFilterName' "shared-routes-enabled"
+
+pattern PoolFilterName_Status :: PoolFilterName
+pattern PoolFilterName_Status = PoolFilterName' "status"
+
+pattern PoolFilterName_Two_way_enabled :: PoolFilterName
+pattern PoolFilterName_Two_way_enabled = PoolFilterName' "two-way-enabled"
+
+{-# COMPLETE
+  PoolFilterName_Deletion_protection_enabled,
+  PoolFilterName_Message_type,
+  PoolFilterName_Opt_out_list_name,
+  PoolFilterName_Self_managed_opt_outs_enabled,
+  PoolFilterName_Shared_routes_enabled,
+  PoolFilterName_Status,
+  PoolFilterName_Two_way_enabled,
+  PoolFilterName'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/PoolInformation.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/PoolInformation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/PoolInformation.hs
@@ -0,0 +1,276 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.PoolInformation
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.PoolInformation where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types.MessageType
+import Amazonka.PinpointSmsVoiceV2.Types.PoolStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The information for a pool in an Amazon Web Services account.
+--
+-- /See:/ 'newPoolInformation' smart constructor.
+data PoolInformation = PoolInformation'
+  { -- | The Amazon Resource Name (ARN) of the two way channel.
+    twoWayChannelArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) for the pool.
+    poolArn :: Prelude.Text,
+    -- | The unique identifier for the pool.
+    poolId :: Prelude.Text,
+    -- | The current status of the pool.
+    status :: PoolStatus,
+    -- | The type of message. Valid values are TRANSACTIONAL for messages that
+    -- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+    -- critical or time-sensitive.
+    messageType :: MessageType,
+    -- | When set to true you can receive incoming text messages from your end
+    -- recipients using the TwoWayChannelArn.
+    twoWayEnabled :: Prelude.Bool,
+    -- | When set to false, an end recipient sends a message that begins with
+    -- HELP or STOP to one of your dedicated numbers, Amazon Pinpoint
+    -- automatically replies with a customizable message and adds the end
+    -- recipient to the OptOutList. When set to true you\'re responsible for
+    -- responding to HELP and STOP requests. You\'re also responsible for
+    -- tracking and honoring opt-out requests. For more information see
+    -- <https://docs.aws.amazon.com/pinpoint/latest/userguide/settings-sms-managing.html#settings-account-sms-self-managed-opt-out Self-managed opt-outs>
+    selfManagedOptOutsEnabled :: Prelude.Bool,
+    -- | The name of the OptOutList associated with the pool.
+    optOutListName :: Prelude.Text,
+    -- | Allows you to enable shared routes on your pool.
+    --
+    -- By default, this is set to @False@. If you set this value to @True@,
+    -- your messages are sent using phone numbers or sender IDs (depending on
+    -- the country) that are shared with other Amazon Pinpoint users. In some
+    -- countries, such as the United States, senders aren\'t allowed to use
+    -- shared routes and must use a dedicated phone number or short code.
+    sharedRoutesEnabled :: Prelude.Bool,
+    -- | When set to true the pool can\'t be deleted.
+    deletionProtectionEnabled :: Prelude.Bool,
+    -- | The time when the pool was created, in
+    -- <https://www.epochconverter.com/ UNIX epoch time> format.
+    createdTimestamp :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PoolInformation' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'twoWayChannelArn', 'poolInformation_twoWayChannelArn' - The Amazon Resource Name (ARN) of the two way channel.
+--
+-- 'poolArn', 'poolInformation_poolArn' - The Amazon Resource Name (ARN) for the pool.
+--
+-- 'poolId', 'poolInformation_poolId' - The unique identifier for the pool.
+--
+-- 'status', 'poolInformation_status' - The current status of the pool.
+--
+-- 'messageType', 'poolInformation_messageType' - The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+--
+-- 'twoWayEnabled', 'poolInformation_twoWayEnabled' - When set to true you can receive incoming text messages from your end
+-- recipients using the TwoWayChannelArn.
+--
+-- 'selfManagedOptOutsEnabled', 'poolInformation_selfManagedOptOutsEnabled' - When set to false, an end recipient sends a message that begins with
+-- HELP or STOP to one of your dedicated numbers, Amazon Pinpoint
+-- automatically replies with a customizable message and adds the end
+-- recipient to the OptOutList. When set to true you\'re responsible for
+-- responding to HELP and STOP requests. You\'re also responsible for
+-- tracking and honoring opt-out requests. For more information see
+-- <https://docs.aws.amazon.com/pinpoint/latest/userguide/settings-sms-managing.html#settings-account-sms-self-managed-opt-out Self-managed opt-outs>
+--
+-- 'optOutListName', 'poolInformation_optOutListName' - The name of the OptOutList associated with the pool.
+--
+-- 'sharedRoutesEnabled', 'poolInformation_sharedRoutesEnabled' - Allows you to enable shared routes on your pool.
+--
+-- By default, this is set to @False@. If you set this value to @True@,
+-- your messages are sent using phone numbers or sender IDs (depending on
+-- the country) that are shared with other Amazon Pinpoint users. In some
+-- countries, such as the United States, senders aren\'t allowed to use
+-- shared routes and must use a dedicated phone number or short code.
+--
+-- 'deletionProtectionEnabled', 'poolInformation_deletionProtectionEnabled' - When set to true the pool can\'t be deleted.
+--
+-- 'createdTimestamp', 'poolInformation_createdTimestamp' - The time when the pool was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+newPoolInformation ::
+  -- | 'poolArn'
+  Prelude.Text ->
+  -- | 'poolId'
+  Prelude.Text ->
+  -- | 'status'
+  PoolStatus ->
+  -- | 'messageType'
+  MessageType ->
+  -- | 'twoWayEnabled'
+  Prelude.Bool ->
+  -- | 'selfManagedOptOutsEnabled'
+  Prelude.Bool ->
+  -- | 'optOutListName'
+  Prelude.Text ->
+  -- | 'sharedRoutesEnabled'
+  Prelude.Bool ->
+  -- | 'deletionProtectionEnabled'
+  Prelude.Bool ->
+  -- | 'createdTimestamp'
+  Prelude.UTCTime ->
+  PoolInformation
+newPoolInformation
+  pPoolArn_
+  pPoolId_
+  pStatus_
+  pMessageType_
+  pTwoWayEnabled_
+  pSelfManagedOptOutsEnabled_
+  pOptOutListName_
+  pSharedRoutesEnabled_
+  pDeletionProtectionEnabled_
+  pCreatedTimestamp_ =
+    PoolInformation'
+      { twoWayChannelArn =
+          Prelude.Nothing,
+        poolArn = pPoolArn_,
+        poolId = pPoolId_,
+        status = pStatus_,
+        messageType = pMessageType_,
+        twoWayEnabled = pTwoWayEnabled_,
+        selfManagedOptOutsEnabled =
+          pSelfManagedOptOutsEnabled_,
+        optOutListName = pOptOutListName_,
+        sharedRoutesEnabled = pSharedRoutesEnabled_,
+        deletionProtectionEnabled =
+          pDeletionProtectionEnabled_,
+        createdTimestamp =
+          Data._Time Lens.# pCreatedTimestamp_
+      }
+
+-- | The Amazon Resource Name (ARN) of the two way channel.
+poolInformation_twoWayChannelArn :: Lens.Lens' PoolInformation (Prelude.Maybe Prelude.Text)
+poolInformation_twoWayChannelArn = Lens.lens (\PoolInformation' {twoWayChannelArn} -> twoWayChannelArn) (\s@PoolInformation' {} a -> s {twoWayChannelArn = a} :: PoolInformation)
+
+-- | The Amazon Resource Name (ARN) for the pool.
+poolInformation_poolArn :: Lens.Lens' PoolInformation Prelude.Text
+poolInformation_poolArn = Lens.lens (\PoolInformation' {poolArn} -> poolArn) (\s@PoolInformation' {} a -> s {poolArn = a} :: PoolInformation)
+
+-- | The unique identifier for the pool.
+poolInformation_poolId :: Lens.Lens' PoolInformation Prelude.Text
+poolInformation_poolId = Lens.lens (\PoolInformation' {poolId} -> poolId) (\s@PoolInformation' {} a -> s {poolId = a} :: PoolInformation)
+
+-- | The current status of the pool.
+poolInformation_status :: Lens.Lens' PoolInformation PoolStatus
+poolInformation_status = Lens.lens (\PoolInformation' {status} -> status) (\s@PoolInformation' {} a -> s {status = a} :: PoolInformation)
+
+-- | The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+poolInformation_messageType :: Lens.Lens' PoolInformation MessageType
+poolInformation_messageType = Lens.lens (\PoolInformation' {messageType} -> messageType) (\s@PoolInformation' {} a -> s {messageType = a} :: PoolInformation)
+
+-- | When set to true you can receive incoming text messages from your end
+-- recipients using the TwoWayChannelArn.
+poolInformation_twoWayEnabled :: Lens.Lens' PoolInformation Prelude.Bool
+poolInformation_twoWayEnabled = Lens.lens (\PoolInformation' {twoWayEnabled} -> twoWayEnabled) (\s@PoolInformation' {} a -> s {twoWayEnabled = a} :: PoolInformation)
+
+-- | When set to false, an end recipient sends a message that begins with
+-- HELP or STOP to one of your dedicated numbers, Amazon Pinpoint
+-- automatically replies with a customizable message and adds the end
+-- recipient to the OptOutList. When set to true you\'re responsible for
+-- responding to HELP and STOP requests. You\'re also responsible for
+-- tracking and honoring opt-out requests. For more information see
+-- <https://docs.aws.amazon.com/pinpoint/latest/userguide/settings-sms-managing.html#settings-account-sms-self-managed-opt-out Self-managed opt-outs>
+poolInformation_selfManagedOptOutsEnabled :: Lens.Lens' PoolInformation Prelude.Bool
+poolInformation_selfManagedOptOutsEnabled = Lens.lens (\PoolInformation' {selfManagedOptOutsEnabled} -> selfManagedOptOutsEnabled) (\s@PoolInformation' {} a -> s {selfManagedOptOutsEnabled = a} :: PoolInformation)
+
+-- | The name of the OptOutList associated with the pool.
+poolInformation_optOutListName :: Lens.Lens' PoolInformation Prelude.Text
+poolInformation_optOutListName = Lens.lens (\PoolInformation' {optOutListName} -> optOutListName) (\s@PoolInformation' {} a -> s {optOutListName = a} :: PoolInformation)
+
+-- | Allows you to enable shared routes on your pool.
+--
+-- By default, this is set to @False@. If you set this value to @True@,
+-- your messages are sent using phone numbers or sender IDs (depending on
+-- the country) that are shared with other Amazon Pinpoint users. In some
+-- countries, such as the United States, senders aren\'t allowed to use
+-- shared routes and must use a dedicated phone number or short code.
+poolInformation_sharedRoutesEnabled :: Lens.Lens' PoolInformation Prelude.Bool
+poolInformation_sharedRoutesEnabled = Lens.lens (\PoolInformation' {sharedRoutesEnabled} -> sharedRoutesEnabled) (\s@PoolInformation' {} a -> s {sharedRoutesEnabled = a} :: PoolInformation)
+
+-- | When set to true the pool can\'t be deleted.
+poolInformation_deletionProtectionEnabled :: Lens.Lens' PoolInformation Prelude.Bool
+poolInformation_deletionProtectionEnabled = Lens.lens (\PoolInformation' {deletionProtectionEnabled} -> deletionProtectionEnabled) (\s@PoolInformation' {} a -> s {deletionProtectionEnabled = a} :: PoolInformation)
+
+-- | The time when the pool was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+poolInformation_createdTimestamp :: Lens.Lens' PoolInformation Prelude.UTCTime
+poolInformation_createdTimestamp = Lens.lens (\PoolInformation' {createdTimestamp} -> createdTimestamp) (\s@PoolInformation' {} a -> s {createdTimestamp = a} :: PoolInformation) Prelude.. Data._Time
+
+instance Data.FromJSON PoolInformation where
+  parseJSON =
+    Data.withObject
+      "PoolInformation"
+      ( \x ->
+          PoolInformation'
+            Prelude.<$> (x Data..:? "TwoWayChannelArn")
+            Prelude.<*> (x Data..: "PoolArn")
+            Prelude.<*> (x Data..: "PoolId")
+            Prelude.<*> (x Data..: "Status")
+            Prelude.<*> (x Data..: "MessageType")
+            Prelude.<*> (x Data..: "TwoWayEnabled")
+            Prelude.<*> (x Data..: "SelfManagedOptOutsEnabled")
+            Prelude.<*> (x Data..: "OptOutListName")
+            Prelude.<*> (x Data..: "SharedRoutesEnabled")
+            Prelude.<*> (x Data..: "DeletionProtectionEnabled")
+            Prelude.<*> (x Data..: "CreatedTimestamp")
+      )
+
+instance Prelude.Hashable PoolInformation where
+  hashWithSalt _salt PoolInformation' {..} =
+    _salt
+      `Prelude.hashWithSalt` twoWayChannelArn
+      `Prelude.hashWithSalt` poolArn
+      `Prelude.hashWithSalt` poolId
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` messageType
+      `Prelude.hashWithSalt` twoWayEnabled
+      `Prelude.hashWithSalt` selfManagedOptOutsEnabled
+      `Prelude.hashWithSalt` optOutListName
+      `Prelude.hashWithSalt` sharedRoutesEnabled
+      `Prelude.hashWithSalt` deletionProtectionEnabled
+      `Prelude.hashWithSalt` createdTimestamp
+
+instance Prelude.NFData PoolInformation where
+  rnf PoolInformation' {..} =
+    Prelude.rnf twoWayChannelArn
+      `Prelude.seq` Prelude.rnf poolArn
+      `Prelude.seq` Prelude.rnf poolId
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf messageType
+      `Prelude.seq` Prelude.rnf twoWayEnabled
+      `Prelude.seq` Prelude.rnf selfManagedOptOutsEnabled
+      `Prelude.seq` Prelude.rnf optOutListName
+      `Prelude.seq` Prelude.rnf sharedRoutesEnabled
+      `Prelude.seq` Prelude.rnf deletionProtectionEnabled
+      `Prelude.seq` Prelude.rnf createdTimestamp
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/PoolOriginationIdentitiesFilter.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/PoolOriginationIdentitiesFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/PoolOriginationIdentitiesFilter.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.PoolOriginationIdentitiesFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.PoolOriginationIdentitiesFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types.PoolOriginationIdentitiesFilterName
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about origination identities associated with a pool that
+-- meets a specified criteria.
+--
+-- /See:/ 'newPoolOriginationIdentitiesFilter' smart constructor.
+data PoolOriginationIdentitiesFilter = PoolOriginationIdentitiesFilter'
+  { -- | The name of the attribute to filter on.
+    name :: PoolOriginationIdentitiesFilterName,
+    -- | An array values to filter for.
+    values :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PoolOriginationIdentitiesFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'poolOriginationIdentitiesFilter_name' - The name of the attribute to filter on.
+--
+-- 'values', 'poolOriginationIdentitiesFilter_values' - An array values to filter for.
+newPoolOriginationIdentitiesFilter ::
+  -- | 'name'
+  PoolOriginationIdentitiesFilterName ->
+  -- | 'values'
+  Prelude.NonEmpty Prelude.Text ->
+  PoolOriginationIdentitiesFilter
+newPoolOriginationIdentitiesFilter pName_ pValues_ =
+  PoolOriginationIdentitiesFilter'
+    { name = pName_,
+      values = Lens.coerced Lens.# pValues_
+    }
+
+-- | The name of the attribute to filter on.
+poolOriginationIdentitiesFilter_name :: Lens.Lens' PoolOriginationIdentitiesFilter PoolOriginationIdentitiesFilterName
+poolOriginationIdentitiesFilter_name = Lens.lens (\PoolOriginationIdentitiesFilter' {name} -> name) (\s@PoolOriginationIdentitiesFilter' {} a -> s {name = a} :: PoolOriginationIdentitiesFilter)
+
+-- | An array values to filter for.
+poolOriginationIdentitiesFilter_values :: Lens.Lens' PoolOriginationIdentitiesFilter (Prelude.NonEmpty Prelude.Text)
+poolOriginationIdentitiesFilter_values = Lens.lens (\PoolOriginationIdentitiesFilter' {values} -> values) (\s@PoolOriginationIdentitiesFilter' {} a -> s {values = a} :: PoolOriginationIdentitiesFilter) Prelude.. Lens.coerced
+
+instance
+  Prelude.Hashable
+    PoolOriginationIdentitiesFilter
+  where
+  hashWithSalt
+    _salt
+    PoolOriginationIdentitiesFilter' {..} =
+      _salt
+        `Prelude.hashWithSalt` name
+        `Prelude.hashWithSalt` values
+
+instance
+  Prelude.NFData
+    PoolOriginationIdentitiesFilter
+  where
+  rnf PoolOriginationIdentitiesFilter' {..} =
+    Prelude.rnf name `Prelude.seq` Prelude.rnf values
+
+instance Data.ToJSON PoolOriginationIdentitiesFilter where
+  toJSON PoolOriginationIdentitiesFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("Name" Data..= name),
+            Prelude.Just ("Values" Data..= values)
+          ]
+      )
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/PoolOriginationIdentitiesFilterName.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/PoolOriginationIdentitiesFilterName.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/PoolOriginationIdentitiesFilterName.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.PoolOriginationIdentitiesFilterName
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.PoolOriginationIdentitiesFilterName
+  ( PoolOriginationIdentitiesFilterName
+      ( ..,
+        PoolOriginationIdentitiesFilterName_Iso_country_code,
+        PoolOriginationIdentitiesFilterName_Number_capability
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PoolOriginationIdentitiesFilterName = PoolOriginationIdentitiesFilterName'
+  { fromPoolOriginationIdentitiesFilterName ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern PoolOriginationIdentitiesFilterName_Iso_country_code :: PoolOriginationIdentitiesFilterName
+pattern PoolOriginationIdentitiesFilterName_Iso_country_code = PoolOriginationIdentitiesFilterName' "iso-country-code"
+
+pattern PoolOriginationIdentitiesFilterName_Number_capability :: PoolOriginationIdentitiesFilterName
+pattern PoolOriginationIdentitiesFilterName_Number_capability = PoolOriginationIdentitiesFilterName' "number-capability"
+
+{-# COMPLETE
+  PoolOriginationIdentitiesFilterName_Iso_country_code,
+  PoolOriginationIdentitiesFilterName_Number_capability,
+  PoolOriginationIdentitiesFilterName'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/PoolStatus.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/PoolStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/PoolStatus.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.PoolStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.PoolStatus
+  ( PoolStatus
+      ( ..,
+        PoolStatus_ACTIVE,
+        PoolStatus_CREATING,
+        PoolStatus_DELETING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PoolStatus = PoolStatus'
+  { fromPoolStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern PoolStatus_ACTIVE :: PoolStatus
+pattern PoolStatus_ACTIVE = PoolStatus' "ACTIVE"
+
+pattern PoolStatus_CREATING :: PoolStatus
+pattern PoolStatus_CREATING = PoolStatus' "CREATING"
+
+pattern PoolStatus_DELETING :: PoolStatus
+pattern PoolStatus_DELETING = PoolStatus' "DELETING"
+
+{-# COMPLETE
+  PoolStatus_ACTIVE,
+  PoolStatus_CREATING,
+  PoolStatus_DELETING,
+  PoolStatus'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/RequestableNumberType.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/RequestableNumberType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/RequestableNumberType.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.RequestableNumberType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.RequestableNumberType
+  ( RequestableNumberType
+      ( ..,
+        RequestableNumberType_LONG_CODE,
+        RequestableNumberType_TEN_DLC,
+        RequestableNumberType_TOLL_FREE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype RequestableNumberType = RequestableNumberType'
+  { fromRequestableNumberType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern RequestableNumberType_LONG_CODE :: RequestableNumberType
+pattern RequestableNumberType_LONG_CODE = RequestableNumberType' "LONG_CODE"
+
+pattern RequestableNumberType_TEN_DLC :: RequestableNumberType
+pattern RequestableNumberType_TEN_DLC = RequestableNumberType' "TEN_DLC"
+
+pattern RequestableNumberType_TOLL_FREE :: RequestableNumberType
+pattern RequestableNumberType_TOLL_FREE = RequestableNumberType' "TOLL_FREE"
+
+{-# COMPLETE
+  RequestableNumberType_LONG_CODE,
+  RequestableNumberType_TEN_DLC,
+  RequestableNumberType_TOLL_FREE,
+  RequestableNumberType'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/SenderIdAndCountry.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/SenderIdAndCountry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/SenderIdAndCountry.hs
@@ -0,0 +1,94 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.SenderIdAndCountry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.SenderIdAndCountry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The alphanumeric sender ID in a specific country that you want to
+-- describe. For more information on sender IDs see
+-- <https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-awssupport-sender-id.html Requesting sender IDs for SMS messaging with Amazon Pinpoint>
+-- in the /Amazon Pinpoint User Guide/.
+--
+-- /See:/ 'newSenderIdAndCountry' smart constructor.
+data SenderIdAndCountry = SenderIdAndCountry'
+  { -- | The unique identifier of the sender.
+    senderId :: Prelude.Text,
+    -- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+    -- region.
+    isoCountryCode :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SenderIdAndCountry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'senderId', 'senderIdAndCountry_senderId' - The unique identifier of the sender.
+--
+-- 'isoCountryCode', 'senderIdAndCountry_isoCountryCode' - The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+newSenderIdAndCountry ::
+  -- | 'senderId'
+  Prelude.Text ->
+  -- | 'isoCountryCode'
+  Prelude.Text ->
+  SenderIdAndCountry
+newSenderIdAndCountry pSenderId_ pIsoCountryCode_ =
+  SenderIdAndCountry'
+    { senderId = pSenderId_,
+      isoCountryCode = pIsoCountryCode_
+    }
+
+-- | The unique identifier of the sender.
+senderIdAndCountry_senderId :: Lens.Lens' SenderIdAndCountry Prelude.Text
+senderIdAndCountry_senderId = Lens.lens (\SenderIdAndCountry' {senderId} -> senderId) (\s@SenderIdAndCountry' {} a -> s {senderId = a} :: SenderIdAndCountry)
+
+-- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+senderIdAndCountry_isoCountryCode :: Lens.Lens' SenderIdAndCountry Prelude.Text
+senderIdAndCountry_isoCountryCode = Lens.lens (\SenderIdAndCountry' {isoCountryCode} -> isoCountryCode) (\s@SenderIdAndCountry' {} a -> s {isoCountryCode = a} :: SenderIdAndCountry)
+
+instance Prelude.Hashable SenderIdAndCountry where
+  hashWithSalt _salt SenderIdAndCountry' {..} =
+    _salt
+      `Prelude.hashWithSalt` senderId
+      `Prelude.hashWithSalt` isoCountryCode
+
+instance Prelude.NFData SenderIdAndCountry where
+  rnf SenderIdAndCountry' {..} =
+    Prelude.rnf senderId
+      `Prelude.seq` Prelude.rnf isoCountryCode
+
+instance Data.ToJSON SenderIdAndCountry where
+  toJSON SenderIdAndCountry' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("SenderId" Data..= senderId),
+            Prelude.Just
+              ("IsoCountryCode" Data..= isoCountryCode)
+          ]
+      )
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/SenderIdFilter.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/SenderIdFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/SenderIdFilter.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.SenderIdFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.SenderIdFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types.SenderIdFilterName
+import qualified Amazonka.Prelude as Prelude
+
+-- | The information for a sender ID that meets a specified criteria.
+--
+-- /See:/ 'newSenderIdFilter' smart constructor.
+data SenderIdFilter = SenderIdFilter'
+  { -- | The name of the attribute to filter on.
+    name :: SenderIdFilterName,
+    -- | An array of values to filter for.
+    values :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SenderIdFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'senderIdFilter_name' - The name of the attribute to filter on.
+--
+-- 'values', 'senderIdFilter_values' - An array of values to filter for.
+newSenderIdFilter ::
+  -- | 'name'
+  SenderIdFilterName ->
+  -- | 'values'
+  Prelude.NonEmpty Prelude.Text ->
+  SenderIdFilter
+newSenderIdFilter pName_ pValues_ =
+  SenderIdFilter'
+    { name = pName_,
+      values = Lens.coerced Lens.# pValues_
+    }
+
+-- | The name of the attribute to filter on.
+senderIdFilter_name :: Lens.Lens' SenderIdFilter SenderIdFilterName
+senderIdFilter_name = Lens.lens (\SenderIdFilter' {name} -> name) (\s@SenderIdFilter' {} a -> s {name = a} :: SenderIdFilter)
+
+-- | An array of values to filter for.
+senderIdFilter_values :: Lens.Lens' SenderIdFilter (Prelude.NonEmpty Prelude.Text)
+senderIdFilter_values = Lens.lens (\SenderIdFilter' {values} -> values) (\s@SenderIdFilter' {} a -> s {values = a} :: SenderIdFilter) Prelude.. Lens.coerced
+
+instance Prelude.Hashable SenderIdFilter where
+  hashWithSalt _salt SenderIdFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` values
+
+instance Prelude.NFData SenderIdFilter where
+  rnf SenderIdFilter' {..} =
+    Prelude.rnf name `Prelude.seq` Prelude.rnf values
+
+instance Data.ToJSON SenderIdFilter where
+  toJSON SenderIdFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("Name" Data..= name),
+            Prelude.Just ("Values" Data..= values)
+          ]
+      )
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/SenderIdFilterName.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/SenderIdFilterName.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/SenderIdFilterName.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.SenderIdFilterName
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.SenderIdFilterName
+  ( SenderIdFilterName
+      ( ..,
+        SenderIdFilterName_Iso_country_code,
+        SenderIdFilterName_Message_type,
+        SenderIdFilterName_Sender_id
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype SenderIdFilterName = SenderIdFilterName'
+  { fromSenderIdFilterName ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern SenderIdFilterName_Iso_country_code :: SenderIdFilterName
+pattern SenderIdFilterName_Iso_country_code = SenderIdFilterName' "iso-country-code"
+
+pattern SenderIdFilterName_Message_type :: SenderIdFilterName
+pattern SenderIdFilterName_Message_type = SenderIdFilterName' "message-type"
+
+pattern SenderIdFilterName_Sender_id :: SenderIdFilterName
+pattern SenderIdFilterName_Sender_id = SenderIdFilterName' "sender-id"
+
+{-# COMPLETE
+  SenderIdFilterName_Iso_country_code,
+  SenderIdFilterName_Message_type,
+  SenderIdFilterName_Sender_id,
+  SenderIdFilterName'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/SenderIdInformation.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/SenderIdInformation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/SenderIdInformation.hs
@@ -0,0 +1,145 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.SenderIdInformation
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.SenderIdInformation where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types.MessageType
+import qualified Amazonka.Prelude as Prelude
+
+-- | The information for all SenderIds in an Amazon Web Services account.
+--
+-- /See:/ 'newSenderIdInformation' smart constructor.
+data SenderIdInformation = SenderIdInformation'
+  { -- | The Amazon Resource Name (ARN) associated with the SenderId.
+    senderIdArn :: Prelude.Text,
+    -- | The alphanumeric sender ID in a specific country that you\'d like to
+    -- describe.
+    senderId :: Prelude.Text,
+    -- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+    -- region.
+    isoCountryCode :: Prelude.Text,
+    -- | The type of message. Valid values are TRANSACTIONAL for messages that
+    -- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+    -- critical or time-sensitive.
+    messageTypes :: [MessageType],
+    -- | The monthly leasing price, in US dollars.
+    monthlyLeasingPrice :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SenderIdInformation' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'senderIdArn', 'senderIdInformation_senderIdArn' - The Amazon Resource Name (ARN) associated with the SenderId.
+--
+-- 'senderId', 'senderIdInformation_senderId' - The alphanumeric sender ID in a specific country that you\'d like to
+-- describe.
+--
+-- 'isoCountryCode', 'senderIdInformation_isoCountryCode' - The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+--
+-- 'messageTypes', 'senderIdInformation_messageTypes' - The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+--
+-- 'monthlyLeasingPrice', 'senderIdInformation_monthlyLeasingPrice' - The monthly leasing price, in US dollars.
+newSenderIdInformation ::
+  -- | 'senderIdArn'
+  Prelude.Text ->
+  -- | 'senderId'
+  Prelude.Text ->
+  -- | 'isoCountryCode'
+  Prelude.Text ->
+  -- | 'monthlyLeasingPrice'
+  Prelude.Text ->
+  SenderIdInformation
+newSenderIdInformation
+  pSenderIdArn_
+  pSenderId_
+  pIsoCountryCode_
+  pMonthlyLeasingPrice_ =
+    SenderIdInformation'
+      { senderIdArn = pSenderIdArn_,
+        senderId = pSenderId_,
+        isoCountryCode = pIsoCountryCode_,
+        messageTypes = Prelude.mempty,
+        monthlyLeasingPrice = pMonthlyLeasingPrice_
+      }
+
+-- | The Amazon Resource Name (ARN) associated with the SenderId.
+senderIdInformation_senderIdArn :: Lens.Lens' SenderIdInformation Prelude.Text
+senderIdInformation_senderIdArn = Lens.lens (\SenderIdInformation' {senderIdArn} -> senderIdArn) (\s@SenderIdInformation' {} a -> s {senderIdArn = a} :: SenderIdInformation)
+
+-- | The alphanumeric sender ID in a specific country that you\'d like to
+-- describe.
+senderIdInformation_senderId :: Lens.Lens' SenderIdInformation Prelude.Text
+senderIdInformation_senderId = Lens.lens (\SenderIdInformation' {senderId} -> senderId) (\s@SenderIdInformation' {} a -> s {senderId = a} :: SenderIdInformation)
+
+-- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+senderIdInformation_isoCountryCode :: Lens.Lens' SenderIdInformation Prelude.Text
+senderIdInformation_isoCountryCode = Lens.lens (\SenderIdInformation' {isoCountryCode} -> isoCountryCode) (\s@SenderIdInformation' {} a -> s {isoCountryCode = a} :: SenderIdInformation)
+
+-- | The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+senderIdInformation_messageTypes :: Lens.Lens' SenderIdInformation [MessageType]
+senderIdInformation_messageTypes = Lens.lens (\SenderIdInformation' {messageTypes} -> messageTypes) (\s@SenderIdInformation' {} a -> s {messageTypes = a} :: SenderIdInformation) Prelude.. Lens.coerced
+
+-- | The monthly leasing price, in US dollars.
+senderIdInformation_monthlyLeasingPrice :: Lens.Lens' SenderIdInformation Prelude.Text
+senderIdInformation_monthlyLeasingPrice = Lens.lens (\SenderIdInformation' {monthlyLeasingPrice} -> monthlyLeasingPrice) (\s@SenderIdInformation' {} a -> s {monthlyLeasingPrice = a} :: SenderIdInformation)
+
+instance Data.FromJSON SenderIdInformation where
+  parseJSON =
+    Data.withObject
+      "SenderIdInformation"
+      ( \x ->
+          SenderIdInformation'
+            Prelude.<$> (x Data..: "SenderIdArn")
+            Prelude.<*> (x Data..: "SenderId")
+            Prelude.<*> (x Data..: "IsoCountryCode")
+            Prelude.<*> (x Data..:? "MessageTypes" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "MonthlyLeasingPrice")
+      )
+
+instance Prelude.Hashable SenderIdInformation where
+  hashWithSalt _salt SenderIdInformation' {..} =
+    _salt
+      `Prelude.hashWithSalt` senderIdArn
+      `Prelude.hashWithSalt` senderId
+      `Prelude.hashWithSalt` isoCountryCode
+      `Prelude.hashWithSalt` messageTypes
+      `Prelude.hashWithSalt` monthlyLeasingPrice
+
+instance Prelude.NFData SenderIdInformation where
+  rnf SenderIdInformation' {..} =
+    Prelude.rnf senderIdArn
+      `Prelude.seq` Prelude.rnf senderId
+      `Prelude.seq` Prelude.rnf isoCountryCode
+      `Prelude.seq` Prelude.rnf messageTypes
+      `Prelude.seq` Prelude.rnf monthlyLeasingPrice
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/SnsDestination.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/SnsDestination.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/SnsDestination.hs
@@ -0,0 +1,80 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.SnsDestination
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.SnsDestination where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that defines an Amazon SNS destination for events. You can use
+-- Amazon SNS to send notification when certain events occur.
+--
+-- /See:/ 'newSnsDestination' smart constructor.
+data SnsDestination = SnsDestination'
+  { -- | The Amazon Resource Name (ARN) of the Amazon SNS topic that you want to
+    -- publish events to.
+    topicArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SnsDestination' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'topicArn', 'snsDestination_topicArn' - The Amazon Resource Name (ARN) of the Amazon SNS topic that you want to
+-- publish events to.
+newSnsDestination ::
+  -- | 'topicArn'
+  Prelude.Text ->
+  SnsDestination
+newSnsDestination pTopicArn_ =
+  SnsDestination' {topicArn = pTopicArn_}
+
+-- | The Amazon Resource Name (ARN) of the Amazon SNS topic that you want to
+-- publish events to.
+snsDestination_topicArn :: Lens.Lens' SnsDestination Prelude.Text
+snsDestination_topicArn = Lens.lens (\SnsDestination' {topicArn} -> topicArn) (\s@SnsDestination' {} a -> s {topicArn = a} :: SnsDestination)
+
+instance Data.FromJSON SnsDestination where
+  parseJSON =
+    Data.withObject
+      "SnsDestination"
+      ( \x ->
+          SnsDestination' Prelude.<$> (x Data..: "TopicArn")
+      )
+
+instance Prelude.Hashable SnsDestination where
+  hashWithSalt _salt SnsDestination' {..} =
+    _salt `Prelude.hashWithSalt` topicArn
+
+instance Prelude.NFData SnsDestination where
+  rnf SnsDestination' {..} = Prelude.rnf topicArn
+
+instance Data.ToJSON SnsDestination where
+  toJSON SnsDestination' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("TopicArn" Data..= topicArn)]
+      )
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/SpendLimit.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/SpendLimit.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/SpendLimit.hs
@@ -0,0 +1,143 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.SpendLimit
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.SpendLimit where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types.SpendLimitName
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the current Amazon Pinpoint monthly spend limits for sending
+-- voice and text messages. For more information on increasing your monthly
+-- spend limit, see
+-- <https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-awssupport-spend-threshold.html Requesting increases to your monthly SMS spending quota for Amazon Pinpoint>
+-- in the /Amazon Pinpoint User Guide/.
+--
+-- /See:/ 'newSpendLimit' smart constructor.
+data SpendLimit = SpendLimit'
+  { -- | The name for the SpendLimit.
+    name :: SpendLimitName,
+    -- | The maximum amount of money, in US dollars, that you want to be able to
+    -- spend sending messages each month. This value has to be less than or
+    -- equal to the amount in @MaxLimit@. To use this custom limit,
+    -- @Overridden@ must be set to true.
+    enforcedLimit :: Prelude.Integer,
+    -- | The maximum amount of money that you are able to spend to send messages
+    -- each month, in US dollars.
+    maxLimit :: Prelude.Integer,
+    -- | When set to @True@, the value that has been specified in the
+    -- @EnforcedLimit@ is used to determine the maximum amount in US dollars
+    -- that can be spent to send messages each month, in US dollars.
+    overridden :: Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SpendLimit' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'spendLimit_name' - The name for the SpendLimit.
+--
+-- 'enforcedLimit', 'spendLimit_enforcedLimit' - The maximum amount of money, in US dollars, that you want to be able to
+-- spend sending messages each month. This value has to be less than or
+-- equal to the amount in @MaxLimit@. To use this custom limit,
+-- @Overridden@ must be set to true.
+--
+-- 'maxLimit', 'spendLimit_maxLimit' - The maximum amount of money that you are able to spend to send messages
+-- each month, in US dollars.
+--
+-- 'overridden', 'spendLimit_overridden' - When set to @True@, the value that has been specified in the
+-- @EnforcedLimit@ is used to determine the maximum amount in US dollars
+-- that can be spent to send messages each month, in US dollars.
+newSpendLimit ::
+  -- | 'name'
+  SpendLimitName ->
+  -- | 'enforcedLimit'
+  Prelude.Integer ->
+  -- | 'maxLimit'
+  Prelude.Integer ->
+  -- | 'overridden'
+  Prelude.Bool ->
+  SpendLimit
+newSpendLimit
+  pName_
+  pEnforcedLimit_
+  pMaxLimit_
+  pOverridden_ =
+    SpendLimit'
+      { name = pName_,
+        enforcedLimit = pEnforcedLimit_,
+        maxLimit = pMaxLimit_,
+        overridden = pOverridden_
+      }
+
+-- | The name for the SpendLimit.
+spendLimit_name :: Lens.Lens' SpendLimit SpendLimitName
+spendLimit_name = Lens.lens (\SpendLimit' {name} -> name) (\s@SpendLimit' {} a -> s {name = a} :: SpendLimit)
+
+-- | The maximum amount of money, in US dollars, that you want to be able to
+-- spend sending messages each month. This value has to be less than or
+-- equal to the amount in @MaxLimit@. To use this custom limit,
+-- @Overridden@ must be set to true.
+spendLimit_enforcedLimit :: Lens.Lens' SpendLimit Prelude.Integer
+spendLimit_enforcedLimit = Lens.lens (\SpendLimit' {enforcedLimit} -> enforcedLimit) (\s@SpendLimit' {} a -> s {enforcedLimit = a} :: SpendLimit)
+
+-- | The maximum amount of money that you are able to spend to send messages
+-- each month, in US dollars.
+spendLimit_maxLimit :: Lens.Lens' SpendLimit Prelude.Integer
+spendLimit_maxLimit = Lens.lens (\SpendLimit' {maxLimit} -> maxLimit) (\s@SpendLimit' {} a -> s {maxLimit = a} :: SpendLimit)
+
+-- | When set to @True@, the value that has been specified in the
+-- @EnforcedLimit@ is used to determine the maximum amount in US dollars
+-- that can be spent to send messages each month, in US dollars.
+spendLimit_overridden :: Lens.Lens' SpendLimit Prelude.Bool
+spendLimit_overridden = Lens.lens (\SpendLimit' {overridden} -> overridden) (\s@SpendLimit' {} a -> s {overridden = a} :: SpendLimit)
+
+instance Data.FromJSON SpendLimit where
+  parseJSON =
+    Data.withObject
+      "SpendLimit"
+      ( \x ->
+          SpendLimit'
+            Prelude.<$> (x Data..: "Name")
+            Prelude.<*> (x Data..: "EnforcedLimit")
+            Prelude.<*> (x Data..: "MaxLimit")
+            Prelude.<*> (x Data..: "Overridden")
+      )
+
+instance Prelude.Hashable SpendLimit where
+  hashWithSalt _salt SpendLimit' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` enforcedLimit
+      `Prelude.hashWithSalt` maxLimit
+      `Prelude.hashWithSalt` overridden
+
+instance Prelude.NFData SpendLimit where
+  rnf SpendLimit' {..} =
+    Prelude.rnf name
+      `Prelude.seq` Prelude.rnf enforcedLimit
+      `Prelude.seq` Prelude.rnf maxLimit
+      `Prelude.seq` Prelude.rnf overridden
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/SpendLimitName.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/SpendLimitName.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/SpendLimitName.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.SpendLimitName
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.SpendLimitName
+  ( SpendLimitName
+      ( ..,
+        SpendLimitName_TEXT_MESSAGE_MONTHLY_SPEND_LIMIT,
+        SpendLimitName_VOICE_MESSAGE_MONTHLY_SPEND_LIMIT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype SpendLimitName = SpendLimitName'
+  { fromSpendLimitName ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern SpendLimitName_TEXT_MESSAGE_MONTHLY_SPEND_LIMIT :: SpendLimitName
+pattern SpendLimitName_TEXT_MESSAGE_MONTHLY_SPEND_LIMIT = SpendLimitName' "TEXT_MESSAGE_MONTHLY_SPEND_LIMIT"
+
+pattern SpendLimitName_VOICE_MESSAGE_MONTHLY_SPEND_LIMIT :: SpendLimitName
+pattern SpendLimitName_VOICE_MESSAGE_MONTHLY_SPEND_LIMIT = SpendLimitName' "VOICE_MESSAGE_MONTHLY_SPEND_LIMIT"
+
+{-# COMPLETE
+  SpendLimitName_TEXT_MESSAGE_MONTHLY_SPEND_LIMIT,
+  SpendLimitName_VOICE_MESSAGE_MONTHLY_SPEND_LIMIT,
+  SpendLimitName'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/Tag.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/Tag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/Tag.hs
@@ -0,0 +1,93 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.Tag
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.Tag where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The list of tags to be added to the specified topic.
+--
+-- /See:/ 'newTag' smart constructor.
+data Tag = Tag'
+  { -- | The key identifier, or name, of the tag.
+    key :: Prelude.Text,
+    -- | The string value associated with the key of the tag.
+    value :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Tag' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'key', 'tag_key' - The key identifier, or name, of the tag.
+--
+-- 'value', 'tag_value' - The string value associated with the key of the tag.
+newTag ::
+  -- | 'key'
+  Prelude.Text ->
+  -- | 'value'
+  Prelude.Text ->
+  Tag
+newTag pKey_ pValue_ =
+  Tag' {key = pKey_, value = pValue_}
+
+-- | The key identifier, or name, of the tag.
+tag_key :: Lens.Lens' Tag Prelude.Text
+tag_key = Lens.lens (\Tag' {key} -> key) (\s@Tag' {} a -> s {key = a} :: Tag)
+
+-- | The string value associated with the key of the tag.
+tag_value :: Lens.Lens' Tag Prelude.Text
+tag_value = Lens.lens (\Tag' {value} -> value) (\s@Tag' {} a -> s {value = a} :: Tag)
+
+instance Data.FromJSON Tag where
+  parseJSON =
+    Data.withObject
+      "Tag"
+      ( \x ->
+          Tag'
+            Prelude.<$> (x Data..: "Key")
+            Prelude.<*> (x Data..: "Value")
+      )
+
+instance Prelude.Hashable Tag where
+  hashWithSalt _salt Tag' {..} =
+    _salt
+      `Prelude.hashWithSalt` key
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData Tag where
+  rnf Tag' {..} =
+    Prelude.rnf key `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON Tag where
+  toJSON Tag' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("Key" Data..= key),
+            Prelude.Just ("Value" Data..= value)
+          ]
+      )
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/VoiceId.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/VoiceId.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/VoiceId.hs
@@ -0,0 +1,353 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.VoiceId
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.VoiceId
+  ( VoiceId
+      ( ..,
+        VoiceId_AMY,
+        VoiceId_ASTRID,
+        VoiceId_BIANCA,
+        VoiceId_BRIAN,
+        VoiceId_CAMILA,
+        VoiceId_CARLA,
+        VoiceId_CARMEN,
+        VoiceId_CELINE,
+        VoiceId_CHANTAL,
+        VoiceId_CONCHITA,
+        VoiceId_CRISTIANO,
+        VoiceId_DORA,
+        VoiceId_EMMA,
+        VoiceId_ENRIQUE,
+        VoiceId_EWA,
+        VoiceId_FILIZ,
+        VoiceId_GERAINT,
+        VoiceId_GIORGIO,
+        VoiceId_GWYNETH,
+        VoiceId_HANS,
+        VoiceId_INES,
+        VoiceId_IVY,
+        VoiceId_JACEK,
+        VoiceId_JAN,
+        VoiceId_JOANNA,
+        VoiceId_JOEY,
+        VoiceId_JUSTIN,
+        VoiceId_KARL,
+        VoiceId_KENDRA,
+        VoiceId_KIMBERLY,
+        VoiceId_LEA,
+        VoiceId_LIV,
+        VoiceId_LOTTE,
+        VoiceId_LUCIA,
+        VoiceId_LUPE,
+        VoiceId_MADS,
+        VoiceId_MAJA,
+        VoiceId_MARLENE,
+        VoiceId_MATHIEU,
+        VoiceId_MATTHEW,
+        VoiceId_MAXIM,
+        VoiceId_MIA,
+        VoiceId_MIGUEL,
+        VoiceId_MIZUKI,
+        VoiceId_NAJA,
+        VoiceId_NICOLE,
+        VoiceId_PENELOPE,
+        VoiceId_RAVEENA,
+        VoiceId_RICARDO,
+        VoiceId_RUBEN,
+        VoiceId_RUSSELL,
+        VoiceId_SALLI,
+        VoiceId_SEOYEON,
+        VoiceId_TAKUMI,
+        VoiceId_TATYANA,
+        VoiceId_VICKI,
+        VoiceId_VITORIA,
+        VoiceId_ZEINA,
+        VoiceId_ZHIYU
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype VoiceId = VoiceId' {fromVoiceId :: Data.Text}
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern VoiceId_AMY :: VoiceId
+pattern VoiceId_AMY = VoiceId' "AMY"
+
+pattern VoiceId_ASTRID :: VoiceId
+pattern VoiceId_ASTRID = VoiceId' "ASTRID"
+
+pattern VoiceId_BIANCA :: VoiceId
+pattern VoiceId_BIANCA = VoiceId' "BIANCA"
+
+pattern VoiceId_BRIAN :: VoiceId
+pattern VoiceId_BRIAN = VoiceId' "BRIAN"
+
+pattern VoiceId_CAMILA :: VoiceId
+pattern VoiceId_CAMILA = VoiceId' "CAMILA"
+
+pattern VoiceId_CARLA :: VoiceId
+pattern VoiceId_CARLA = VoiceId' "CARLA"
+
+pattern VoiceId_CARMEN :: VoiceId
+pattern VoiceId_CARMEN = VoiceId' "CARMEN"
+
+pattern VoiceId_CELINE :: VoiceId
+pattern VoiceId_CELINE = VoiceId' "CELINE"
+
+pattern VoiceId_CHANTAL :: VoiceId
+pattern VoiceId_CHANTAL = VoiceId' "CHANTAL"
+
+pattern VoiceId_CONCHITA :: VoiceId
+pattern VoiceId_CONCHITA = VoiceId' "CONCHITA"
+
+pattern VoiceId_CRISTIANO :: VoiceId
+pattern VoiceId_CRISTIANO = VoiceId' "CRISTIANO"
+
+pattern VoiceId_DORA :: VoiceId
+pattern VoiceId_DORA = VoiceId' "DORA"
+
+pattern VoiceId_EMMA :: VoiceId
+pattern VoiceId_EMMA = VoiceId' "EMMA"
+
+pattern VoiceId_ENRIQUE :: VoiceId
+pattern VoiceId_ENRIQUE = VoiceId' "ENRIQUE"
+
+pattern VoiceId_EWA :: VoiceId
+pattern VoiceId_EWA = VoiceId' "EWA"
+
+pattern VoiceId_FILIZ :: VoiceId
+pattern VoiceId_FILIZ = VoiceId' "FILIZ"
+
+pattern VoiceId_GERAINT :: VoiceId
+pattern VoiceId_GERAINT = VoiceId' "GERAINT"
+
+pattern VoiceId_GIORGIO :: VoiceId
+pattern VoiceId_GIORGIO = VoiceId' "GIORGIO"
+
+pattern VoiceId_GWYNETH :: VoiceId
+pattern VoiceId_GWYNETH = VoiceId' "GWYNETH"
+
+pattern VoiceId_HANS :: VoiceId
+pattern VoiceId_HANS = VoiceId' "HANS"
+
+pattern VoiceId_INES :: VoiceId
+pattern VoiceId_INES = VoiceId' "INES"
+
+pattern VoiceId_IVY :: VoiceId
+pattern VoiceId_IVY = VoiceId' "IVY"
+
+pattern VoiceId_JACEK :: VoiceId
+pattern VoiceId_JACEK = VoiceId' "JACEK"
+
+pattern VoiceId_JAN :: VoiceId
+pattern VoiceId_JAN = VoiceId' "JAN"
+
+pattern VoiceId_JOANNA :: VoiceId
+pattern VoiceId_JOANNA = VoiceId' "JOANNA"
+
+pattern VoiceId_JOEY :: VoiceId
+pattern VoiceId_JOEY = VoiceId' "JOEY"
+
+pattern VoiceId_JUSTIN :: VoiceId
+pattern VoiceId_JUSTIN = VoiceId' "JUSTIN"
+
+pattern VoiceId_KARL :: VoiceId
+pattern VoiceId_KARL = VoiceId' "KARL"
+
+pattern VoiceId_KENDRA :: VoiceId
+pattern VoiceId_KENDRA = VoiceId' "KENDRA"
+
+pattern VoiceId_KIMBERLY :: VoiceId
+pattern VoiceId_KIMBERLY = VoiceId' "KIMBERLY"
+
+pattern VoiceId_LEA :: VoiceId
+pattern VoiceId_LEA = VoiceId' "LEA"
+
+pattern VoiceId_LIV :: VoiceId
+pattern VoiceId_LIV = VoiceId' "LIV"
+
+pattern VoiceId_LOTTE :: VoiceId
+pattern VoiceId_LOTTE = VoiceId' "LOTTE"
+
+pattern VoiceId_LUCIA :: VoiceId
+pattern VoiceId_LUCIA = VoiceId' "LUCIA"
+
+pattern VoiceId_LUPE :: VoiceId
+pattern VoiceId_LUPE = VoiceId' "LUPE"
+
+pattern VoiceId_MADS :: VoiceId
+pattern VoiceId_MADS = VoiceId' "MADS"
+
+pattern VoiceId_MAJA :: VoiceId
+pattern VoiceId_MAJA = VoiceId' "MAJA"
+
+pattern VoiceId_MARLENE :: VoiceId
+pattern VoiceId_MARLENE = VoiceId' "MARLENE"
+
+pattern VoiceId_MATHIEU :: VoiceId
+pattern VoiceId_MATHIEU = VoiceId' "MATHIEU"
+
+pattern VoiceId_MATTHEW :: VoiceId
+pattern VoiceId_MATTHEW = VoiceId' "MATTHEW"
+
+pattern VoiceId_MAXIM :: VoiceId
+pattern VoiceId_MAXIM = VoiceId' "MAXIM"
+
+pattern VoiceId_MIA :: VoiceId
+pattern VoiceId_MIA = VoiceId' "MIA"
+
+pattern VoiceId_MIGUEL :: VoiceId
+pattern VoiceId_MIGUEL = VoiceId' "MIGUEL"
+
+pattern VoiceId_MIZUKI :: VoiceId
+pattern VoiceId_MIZUKI = VoiceId' "MIZUKI"
+
+pattern VoiceId_NAJA :: VoiceId
+pattern VoiceId_NAJA = VoiceId' "NAJA"
+
+pattern VoiceId_NICOLE :: VoiceId
+pattern VoiceId_NICOLE = VoiceId' "NICOLE"
+
+pattern VoiceId_PENELOPE :: VoiceId
+pattern VoiceId_PENELOPE = VoiceId' "PENELOPE"
+
+pattern VoiceId_RAVEENA :: VoiceId
+pattern VoiceId_RAVEENA = VoiceId' "RAVEENA"
+
+pattern VoiceId_RICARDO :: VoiceId
+pattern VoiceId_RICARDO = VoiceId' "RICARDO"
+
+pattern VoiceId_RUBEN :: VoiceId
+pattern VoiceId_RUBEN = VoiceId' "RUBEN"
+
+pattern VoiceId_RUSSELL :: VoiceId
+pattern VoiceId_RUSSELL = VoiceId' "RUSSELL"
+
+pattern VoiceId_SALLI :: VoiceId
+pattern VoiceId_SALLI = VoiceId' "SALLI"
+
+pattern VoiceId_SEOYEON :: VoiceId
+pattern VoiceId_SEOYEON = VoiceId' "SEOYEON"
+
+pattern VoiceId_TAKUMI :: VoiceId
+pattern VoiceId_TAKUMI = VoiceId' "TAKUMI"
+
+pattern VoiceId_TATYANA :: VoiceId
+pattern VoiceId_TATYANA = VoiceId' "TATYANA"
+
+pattern VoiceId_VICKI :: VoiceId
+pattern VoiceId_VICKI = VoiceId' "VICKI"
+
+pattern VoiceId_VITORIA :: VoiceId
+pattern VoiceId_VITORIA = VoiceId' "VITORIA"
+
+pattern VoiceId_ZEINA :: VoiceId
+pattern VoiceId_ZEINA = VoiceId' "ZEINA"
+
+pattern VoiceId_ZHIYU :: VoiceId
+pattern VoiceId_ZHIYU = VoiceId' "ZHIYU"
+
+{-# COMPLETE
+  VoiceId_AMY,
+  VoiceId_ASTRID,
+  VoiceId_BIANCA,
+  VoiceId_BRIAN,
+  VoiceId_CAMILA,
+  VoiceId_CARLA,
+  VoiceId_CARMEN,
+  VoiceId_CELINE,
+  VoiceId_CHANTAL,
+  VoiceId_CONCHITA,
+  VoiceId_CRISTIANO,
+  VoiceId_DORA,
+  VoiceId_EMMA,
+  VoiceId_ENRIQUE,
+  VoiceId_EWA,
+  VoiceId_FILIZ,
+  VoiceId_GERAINT,
+  VoiceId_GIORGIO,
+  VoiceId_GWYNETH,
+  VoiceId_HANS,
+  VoiceId_INES,
+  VoiceId_IVY,
+  VoiceId_JACEK,
+  VoiceId_JAN,
+  VoiceId_JOANNA,
+  VoiceId_JOEY,
+  VoiceId_JUSTIN,
+  VoiceId_KARL,
+  VoiceId_KENDRA,
+  VoiceId_KIMBERLY,
+  VoiceId_LEA,
+  VoiceId_LIV,
+  VoiceId_LOTTE,
+  VoiceId_LUCIA,
+  VoiceId_LUPE,
+  VoiceId_MADS,
+  VoiceId_MAJA,
+  VoiceId_MARLENE,
+  VoiceId_MATHIEU,
+  VoiceId_MATTHEW,
+  VoiceId_MAXIM,
+  VoiceId_MIA,
+  VoiceId_MIGUEL,
+  VoiceId_MIZUKI,
+  VoiceId_NAJA,
+  VoiceId_NICOLE,
+  VoiceId_PENELOPE,
+  VoiceId_RAVEENA,
+  VoiceId_RICARDO,
+  VoiceId_RUBEN,
+  VoiceId_RUSSELL,
+  VoiceId_SALLI,
+  VoiceId_SEOYEON,
+  VoiceId_TAKUMI,
+  VoiceId_TATYANA,
+  VoiceId_VICKI,
+  VoiceId_VITORIA,
+  VoiceId_ZEINA,
+  VoiceId_ZHIYU,
+  VoiceId'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Types/VoiceMessageBodyTextType.hs b/gen/Amazonka/PinpointSmsVoiceV2/Types/VoiceMessageBodyTextType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Types/VoiceMessageBodyTextType.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Types.VoiceMessageBodyTextType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Types.VoiceMessageBodyTextType
+  ( VoiceMessageBodyTextType
+      ( ..,
+        VoiceMessageBodyTextType_SSML,
+        VoiceMessageBodyTextType_TEXT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype VoiceMessageBodyTextType = VoiceMessageBodyTextType'
+  { fromVoiceMessageBodyTextType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern VoiceMessageBodyTextType_SSML :: VoiceMessageBodyTextType
+pattern VoiceMessageBodyTextType_SSML = VoiceMessageBodyTextType' "SSML"
+
+pattern VoiceMessageBodyTextType_TEXT :: VoiceMessageBodyTextType
+pattern VoiceMessageBodyTextType_TEXT = VoiceMessageBodyTextType' "TEXT"
+
+{-# COMPLETE
+  VoiceMessageBodyTextType_SSML,
+  VoiceMessageBodyTextType_TEXT,
+  VoiceMessageBodyTextType'
+  #-}
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/UntagResource.hs b/gen/Amazonka/PinpointSmsVoiceV2/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/UntagResource.hs
@@ -0,0 +1,176 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.UntagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Removes the association of the specified tags from an Amazon Pinpoint
+-- SMS Voice V2 resource. For more information on tags see
+-- <https://docs.aws.amazon.com/pinpoint/latest/developerguide/tagging-resources.html Tagging Amazon Pinpoint resources>
+-- in the /Amazon Pinpoint Developer Guide/.
+module Amazonka.PinpointSmsVoiceV2.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+
+    -- * Destructuring the Response
+    UntagResourceResponse (..),
+    newUntagResourceResponse,
+
+    -- * Response Lenses
+    untagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | The Amazon Resource Name (ARN) of the resource.
+    resourceArn :: Prelude.Text,
+    -- | An array of tag key values to unassociate with the resource.
+    tagKeys :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'untagResource_resourceArn' - The Amazon Resource Name (ARN) of the resource.
+--
+-- 'tagKeys', 'untagResource_tagKeys' - An array of tag key values to unassociate with the resource.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  -- | 'tagKeys'
+  Prelude.NonEmpty Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ pTagKeys_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Lens.coerced Lens.# pTagKeys_
+    }
+
+-- | The Amazon Resource Name (ARN) of the resource.
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | An array of tag key values to unassociate with the resource.
+untagResource_tagKeys :: Lens.Lens' UntagResource (Prelude.NonEmpty Prelude.Text)
+untagResource_tagKeys = Lens.lens (\UntagResource' {tagKeys} -> tagKeys) (\s@UntagResource' {} a -> s {tagKeys = a} :: UntagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UntagResource where
+  type
+    AWSResponse UntagResource =
+      UntagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UntagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UntagResource where
+  hashWithSalt _salt UntagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tagKeys
+
+instance Prelude.NFData UntagResource where
+  rnf UntagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tagKeys
+
+instance Data.ToHeaders UntagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.UntagResource" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UntagResource where
+  toJSON UntagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("ResourceArn" Data..= resourceArn),
+            Prelude.Just ("TagKeys" Data..= tagKeys)
+          ]
+      )
+
+instance Data.ToPath UntagResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UntagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUntagResourceResponse' smart constructor.
+data UntagResourceResponse = UntagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'untagResourceResponse_httpStatus' - The response's http status code.
+newUntagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UntagResourceResponse
+newUntagResourceResponse pHttpStatus_ =
+  UntagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+untagResourceResponse_httpStatus :: Lens.Lens' UntagResourceResponse Prelude.Int
+untagResourceResponse_httpStatus = Lens.lens (\UntagResourceResponse' {httpStatus} -> httpStatus) (\s@UntagResourceResponse' {} a -> s {httpStatus = a} :: UntagResourceResponse)
+
+instance Prelude.NFData UntagResourceResponse where
+  rnf UntagResourceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/UpdateEventDestination.hs b/gen/Amazonka/PinpointSmsVoiceV2/UpdateEventDestination.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/UpdateEventDestination.hs
@@ -0,0 +1,318 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.UpdateEventDestination
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates an existing event destination in a configuration set. You can
+-- update the IAM role ARN for CloudWatch Logs and Kinesis Data Firehose.
+-- You can also enable or disable the event destination.
+--
+-- You may want to update an event destination to change its matching event
+-- types or updating the destination resource ARN. You can\'t change an
+-- event destination\'s type between CloudWatch Logs, Kinesis Data
+-- Firehose, and Amazon SNS.
+module Amazonka.PinpointSmsVoiceV2.UpdateEventDestination
+  ( -- * Creating a Request
+    UpdateEventDestination (..),
+    newUpdateEventDestination,
+
+    -- * Request Lenses
+    updateEventDestination_cloudWatchLogsDestination,
+    updateEventDestination_enabled,
+    updateEventDestination_kinesisFirehoseDestination,
+    updateEventDestination_matchingEventTypes,
+    updateEventDestination_snsDestination,
+    updateEventDestination_configurationSetName,
+    updateEventDestination_eventDestinationName,
+
+    -- * Destructuring the Response
+    UpdateEventDestinationResponse (..),
+    newUpdateEventDestinationResponse,
+
+    -- * Response Lenses
+    updateEventDestinationResponse_configurationSetArn,
+    updateEventDestinationResponse_configurationSetName,
+    updateEventDestinationResponse_eventDestination,
+    updateEventDestinationResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateEventDestination' smart constructor.
+data UpdateEventDestination = UpdateEventDestination'
+  { -- | An object that contains information about an event destination that
+    -- sends data to CloudWatch Logs.
+    cloudWatchLogsDestination :: Prelude.Maybe CloudWatchLogsDestination,
+    -- | When set to true logging is enabled.
+    enabled :: Prelude.Maybe Prelude.Bool,
+    -- | An object that contains information about an event destination for
+    -- logging to Kinesis Data Firehose.
+    kinesisFirehoseDestination :: Prelude.Maybe KinesisFirehoseDestination,
+    -- | An array of event types that determine which events to log.
+    matchingEventTypes :: Prelude.Maybe (Prelude.NonEmpty EventType),
+    -- | An object that contains information about an event destination that
+    -- sends data to Amazon SNS.
+    snsDestination :: Prelude.Maybe SnsDestination,
+    -- | The configuration set to update with the new event destination. Valid
+    -- values for this can be the ConfigurationSetName or ConfigurationSetArn.
+    configurationSetName :: Prelude.Text,
+    -- | The name to use for the event destination.
+    eventDestinationName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateEventDestination' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'cloudWatchLogsDestination', 'updateEventDestination_cloudWatchLogsDestination' - An object that contains information about an event destination that
+-- sends data to CloudWatch Logs.
+--
+-- 'enabled', 'updateEventDestination_enabled' - When set to true logging is enabled.
+--
+-- 'kinesisFirehoseDestination', 'updateEventDestination_kinesisFirehoseDestination' - An object that contains information about an event destination for
+-- logging to Kinesis Data Firehose.
+--
+-- 'matchingEventTypes', 'updateEventDestination_matchingEventTypes' - An array of event types that determine which events to log.
+--
+-- 'snsDestination', 'updateEventDestination_snsDestination' - An object that contains information about an event destination that
+-- sends data to Amazon SNS.
+--
+-- 'configurationSetName', 'updateEventDestination_configurationSetName' - The configuration set to update with the new event destination. Valid
+-- values for this can be the ConfigurationSetName or ConfigurationSetArn.
+--
+-- 'eventDestinationName', 'updateEventDestination_eventDestinationName' - The name to use for the event destination.
+newUpdateEventDestination ::
+  -- | 'configurationSetName'
+  Prelude.Text ->
+  -- | 'eventDestinationName'
+  Prelude.Text ->
+  UpdateEventDestination
+newUpdateEventDestination
+  pConfigurationSetName_
+  pEventDestinationName_ =
+    UpdateEventDestination'
+      { cloudWatchLogsDestination =
+          Prelude.Nothing,
+        enabled = Prelude.Nothing,
+        kinesisFirehoseDestination = Prelude.Nothing,
+        matchingEventTypes = Prelude.Nothing,
+        snsDestination = Prelude.Nothing,
+        configurationSetName = pConfigurationSetName_,
+        eventDestinationName = pEventDestinationName_
+      }
+
+-- | An object that contains information about an event destination that
+-- sends data to CloudWatch Logs.
+updateEventDestination_cloudWatchLogsDestination :: Lens.Lens' UpdateEventDestination (Prelude.Maybe CloudWatchLogsDestination)
+updateEventDestination_cloudWatchLogsDestination = Lens.lens (\UpdateEventDestination' {cloudWatchLogsDestination} -> cloudWatchLogsDestination) (\s@UpdateEventDestination' {} a -> s {cloudWatchLogsDestination = a} :: UpdateEventDestination)
+
+-- | When set to true logging is enabled.
+updateEventDestination_enabled :: Lens.Lens' UpdateEventDestination (Prelude.Maybe Prelude.Bool)
+updateEventDestination_enabled = Lens.lens (\UpdateEventDestination' {enabled} -> enabled) (\s@UpdateEventDestination' {} a -> s {enabled = a} :: UpdateEventDestination)
+
+-- | An object that contains information about an event destination for
+-- logging to Kinesis Data Firehose.
+updateEventDestination_kinesisFirehoseDestination :: Lens.Lens' UpdateEventDestination (Prelude.Maybe KinesisFirehoseDestination)
+updateEventDestination_kinesisFirehoseDestination = Lens.lens (\UpdateEventDestination' {kinesisFirehoseDestination} -> kinesisFirehoseDestination) (\s@UpdateEventDestination' {} a -> s {kinesisFirehoseDestination = a} :: UpdateEventDestination)
+
+-- | An array of event types that determine which events to log.
+updateEventDestination_matchingEventTypes :: Lens.Lens' UpdateEventDestination (Prelude.Maybe (Prelude.NonEmpty EventType))
+updateEventDestination_matchingEventTypes = Lens.lens (\UpdateEventDestination' {matchingEventTypes} -> matchingEventTypes) (\s@UpdateEventDestination' {} a -> s {matchingEventTypes = a} :: UpdateEventDestination) Prelude.. Lens.mapping Lens.coerced
+
+-- | An object that contains information about an event destination that
+-- sends data to Amazon SNS.
+updateEventDestination_snsDestination :: Lens.Lens' UpdateEventDestination (Prelude.Maybe SnsDestination)
+updateEventDestination_snsDestination = Lens.lens (\UpdateEventDestination' {snsDestination} -> snsDestination) (\s@UpdateEventDestination' {} a -> s {snsDestination = a} :: UpdateEventDestination)
+
+-- | The configuration set to update with the new event destination. Valid
+-- values for this can be the ConfigurationSetName or ConfigurationSetArn.
+updateEventDestination_configurationSetName :: Lens.Lens' UpdateEventDestination Prelude.Text
+updateEventDestination_configurationSetName = Lens.lens (\UpdateEventDestination' {configurationSetName} -> configurationSetName) (\s@UpdateEventDestination' {} a -> s {configurationSetName = a} :: UpdateEventDestination)
+
+-- | The name to use for the event destination.
+updateEventDestination_eventDestinationName :: Lens.Lens' UpdateEventDestination Prelude.Text
+updateEventDestination_eventDestinationName = Lens.lens (\UpdateEventDestination' {eventDestinationName} -> eventDestinationName) (\s@UpdateEventDestination' {} a -> s {eventDestinationName = a} :: UpdateEventDestination)
+
+instance Core.AWSRequest UpdateEventDestination where
+  type
+    AWSResponse UpdateEventDestination =
+      UpdateEventDestinationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateEventDestinationResponse'
+            Prelude.<$> (x Data..?> "ConfigurationSetArn")
+            Prelude.<*> (x Data..?> "ConfigurationSetName")
+            Prelude.<*> (x Data..?> "EventDestination")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateEventDestination where
+  hashWithSalt _salt UpdateEventDestination' {..} =
+    _salt
+      `Prelude.hashWithSalt` cloudWatchLogsDestination
+      `Prelude.hashWithSalt` enabled
+      `Prelude.hashWithSalt` kinesisFirehoseDestination
+      `Prelude.hashWithSalt` matchingEventTypes
+      `Prelude.hashWithSalt` snsDestination
+      `Prelude.hashWithSalt` configurationSetName
+      `Prelude.hashWithSalt` eventDestinationName
+
+instance Prelude.NFData UpdateEventDestination where
+  rnf UpdateEventDestination' {..} =
+    Prelude.rnf cloudWatchLogsDestination
+      `Prelude.seq` Prelude.rnf enabled
+      `Prelude.seq` Prelude.rnf kinesisFirehoseDestination
+      `Prelude.seq` Prelude.rnf matchingEventTypes
+      `Prelude.seq` Prelude.rnf snsDestination
+      `Prelude.seq` Prelude.rnf configurationSetName
+      `Prelude.seq` Prelude.rnf eventDestinationName
+
+instance Data.ToHeaders UpdateEventDestination where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.UpdateEventDestination" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateEventDestination where
+  toJSON UpdateEventDestination' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CloudWatchLogsDestination" Data..=)
+              Prelude.<$> cloudWatchLogsDestination,
+            ("Enabled" Data..=) Prelude.<$> enabled,
+            ("KinesisFirehoseDestination" Data..=)
+              Prelude.<$> kinesisFirehoseDestination,
+            ("MatchingEventTypes" Data..=)
+              Prelude.<$> matchingEventTypes,
+            ("SnsDestination" Data..=)
+              Prelude.<$> snsDestination,
+            Prelude.Just
+              ( "ConfigurationSetName"
+                  Data..= configurationSetName
+              ),
+            Prelude.Just
+              ( "EventDestinationName"
+                  Data..= eventDestinationName
+              )
+          ]
+      )
+
+instance Data.ToPath UpdateEventDestination where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateEventDestination where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateEventDestinationResponse' smart constructor.
+data UpdateEventDestinationResponse = UpdateEventDestinationResponse'
+  { -- | The Amazon Resource Name (ARN) for the ConfigurationSet that was
+    -- updated.
+    configurationSetArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the configuration set.
+    configurationSetName :: Prelude.Maybe Prelude.Text,
+    -- | An EventDestination object containing the details of where events will
+    -- be logged.
+    eventDestination :: Prelude.Maybe EventDestination,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateEventDestinationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationSetArn', 'updateEventDestinationResponse_configurationSetArn' - The Amazon Resource Name (ARN) for the ConfigurationSet that was
+-- updated.
+--
+-- 'configurationSetName', 'updateEventDestinationResponse_configurationSetName' - The name of the configuration set.
+--
+-- 'eventDestination', 'updateEventDestinationResponse_eventDestination' - An EventDestination object containing the details of where events will
+-- be logged.
+--
+-- 'httpStatus', 'updateEventDestinationResponse_httpStatus' - The response's http status code.
+newUpdateEventDestinationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateEventDestinationResponse
+newUpdateEventDestinationResponse pHttpStatus_ =
+  UpdateEventDestinationResponse'
+    { configurationSetArn =
+        Prelude.Nothing,
+      configurationSetName = Prelude.Nothing,
+      eventDestination = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) for the ConfigurationSet that was
+-- updated.
+updateEventDestinationResponse_configurationSetArn :: Lens.Lens' UpdateEventDestinationResponse (Prelude.Maybe Prelude.Text)
+updateEventDestinationResponse_configurationSetArn = Lens.lens (\UpdateEventDestinationResponse' {configurationSetArn} -> configurationSetArn) (\s@UpdateEventDestinationResponse' {} a -> s {configurationSetArn = a} :: UpdateEventDestinationResponse)
+
+-- | The name of the configuration set.
+updateEventDestinationResponse_configurationSetName :: Lens.Lens' UpdateEventDestinationResponse (Prelude.Maybe Prelude.Text)
+updateEventDestinationResponse_configurationSetName = Lens.lens (\UpdateEventDestinationResponse' {configurationSetName} -> configurationSetName) (\s@UpdateEventDestinationResponse' {} a -> s {configurationSetName = a} :: UpdateEventDestinationResponse)
+
+-- | An EventDestination object containing the details of where events will
+-- be logged.
+updateEventDestinationResponse_eventDestination :: Lens.Lens' UpdateEventDestinationResponse (Prelude.Maybe EventDestination)
+updateEventDestinationResponse_eventDestination = Lens.lens (\UpdateEventDestinationResponse' {eventDestination} -> eventDestination) (\s@UpdateEventDestinationResponse' {} a -> s {eventDestination = a} :: UpdateEventDestinationResponse)
+
+-- | The response's http status code.
+updateEventDestinationResponse_httpStatus :: Lens.Lens' UpdateEventDestinationResponse Prelude.Int
+updateEventDestinationResponse_httpStatus = Lens.lens (\UpdateEventDestinationResponse' {httpStatus} -> httpStatus) (\s@UpdateEventDestinationResponse' {} a -> s {httpStatus = a} :: UpdateEventDestinationResponse)
+
+instance
+  Prelude.NFData
+    UpdateEventDestinationResponse
+  where
+  rnf UpdateEventDestinationResponse' {..} =
+    Prelude.rnf configurationSetArn
+      `Prelude.seq` Prelude.rnf configurationSetName
+      `Prelude.seq` Prelude.rnf eventDestination
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/UpdatePhoneNumber.hs b/gen/Amazonka/PinpointSmsVoiceV2/UpdatePhoneNumber.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/UpdatePhoneNumber.hs
@@ -0,0 +1,460 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.UpdatePhoneNumber
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the configuration of an existing origination phone number. You
+-- can update the opt-out list, enable or disable two-way messaging, change
+-- the TwoWayChannelArn, enable or disable self-managed opt-outs, and
+-- enable or disable deletion protection.
+--
+-- If the origination phone number is associated with a pool, an Error is
+-- returned.
+module Amazonka.PinpointSmsVoiceV2.UpdatePhoneNumber
+  ( -- * Creating a Request
+    UpdatePhoneNumber (..),
+    newUpdatePhoneNumber,
+
+    -- * Request Lenses
+    updatePhoneNumber_deletionProtectionEnabled,
+    updatePhoneNumber_optOutListName,
+    updatePhoneNumber_selfManagedOptOutsEnabled,
+    updatePhoneNumber_twoWayChannelArn,
+    updatePhoneNumber_twoWayEnabled,
+    updatePhoneNumber_phoneNumberId,
+
+    -- * Destructuring the Response
+    UpdatePhoneNumberResponse (..),
+    newUpdatePhoneNumberResponse,
+
+    -- * Response Lenses
+    updatePhoneNumberResponse_createdTimestamp,
+    updatePhoneNumberResponse_deletionProtectionEnabled,
+    updatePhoneNumberResponse_isoCountryCode,
+    updatePhoneNumberResponse_messageType,
+    updatePhoneNumberResponse_monthlyLeasingPrice,
+    updatePhoneNumberResponse_numberCapabilities,
+    updatePhoneNumberResponse_numberType,
+    updatePhoneNumberResponse_optOutListName,
+    updatePhoneNumberResponse_phoneNumber,
+    updatePhoneNumberResponse_phoneNumberArn,
+    updatePhoneNumberResponse_phoneNumberId,
+    updatePhoneNumberResponse_selfManagedOptOutsEnabled,
+    updatePhoneNumberResponse_status,
+    updatePhoneNumberResponse_twoWayChannelArn,
+    updatePhoneNumberResponse_twoWayEnabled,
+    updatePhoneNumberResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdatePhoneNumber' smart constructor.
+data UpdatePhoneNumber = UpdatePhoneNumber'
+  { -- | By default this is set to false. When set to true the phone number
+    -- can\'t be deleted.
+    deletionProtectionEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The OptOutList to add the phone number to. Valid values for this field
+    -- can be either the OutOutListName or OutOutListArn.
+    optOutListName :: Prelude.Maybe Prelude.Text,
+    -- | By default this is set to false. When an end recipient sends a message
+    -- that begins with HELP or STOP to one of your dedicated numbers, Amazon
+    -- Pinpoint automatically replies with a customizable message and adds the
+    -- end recipient to the OptOutList. When set to true you\'re responsible
+    -- for responding to HELP and STOP requests. You\'re also responsible for
+    -- tracking and honoring opt-out requests.
+    selfManagedOptOutsEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The Amazon Resource Name (ARN) of the two way channel.
+    twoWayChannelArn :: Prelude.Maybe Prelude.Text,
+    -- | By default this is set to false. When set to true you can receive
+    -- incoming text messages from your end recipients.
+    twoWayEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The unique identifier of the phone number. Valid values for this field
+    -- can be either the PhoneNumberId or PhoneNumberArn.
+    phoneNumberId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdatePhoneNumber' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'deletionProtectionEnabled', 'updatePhoneNumber_deletionProtectionEnabled' - By default this is set to false. When set to true the phone number
+-- can\'t be deleted.
+--
+-- 'optOutListName', 'updatePhoneNumber_optOutListName' - The OptOutList to add the phone number to. Valid values for this field
+-- can be either the OutOutListName or OutOutListArn.
+--
+-- 'selfManagedOptOutsEnabled', 'updatePhoneNumber_selfManagedOptOutsEnabled' - By default this is set to false. When an end recipient sends a message
+-- that begins with HELP or STOP to one of your dedicated numbers, Amazon
+-- Pinpoint automatically replies with a customizable message and adds the
+-- end recipient to the OptOutList. When set to true you\'re responsible
+-- for responding to HELP and STOP requests. You\'re also responsible for
+-- tracking and honoring opt-out requests.
+--
+-- 'twoWayChannelArn', 'updatePhoneNumber_twoWayChannelArn' - The Amazon Resource Name (ARN) of the two way channel.
+--
+-- 'twoWayEnabled', 'updatePhoneNumber_twoWayEnabled' - By default this is set to false. When set to true you can receive
+-- incoming text messages from your end recipients.
+--
+-- 'phoneNumberId', 'updatePhoneNumber_phoneNumberId' - The unique identifier of the phone number. Valid values for this field
+-- can be either the PhoneNumberId or PhoneNumberArn.
+newUpdatePhoneNumber ::
+  -- | 'phoneNumberId'
+  Prelude.Text ->
+  UpdatePhoneNumber
+newUpdatePhoneNumber pPhoneNumberId_ =
+  UpdatePhoneNumber'
+    { deletionProtectionEnabled =
+        Prelude.Nothing,
+      optOutListName = Prelude.Nothing,
+      selfManagedOptOutsEnabled = Prelude.Nothing,
+      twoWayChannelArn = Prelude.Nothing,
+      twoWayEnabled = Prelude.Nothing,
+      phoneNumberId = pPhoneNumberId_
+    }
+
+-- | By default this is set to false. When set to true the phone number
+-- can\'t be deleted.
+updatePhoneNumber_deletionProtectionEnabled :: Lens.Lens' UpdatePhoneNumber (Prelude.Maybe Prelude.Bool)
+updatePhoneNumber_deletionProtectionEnabled = Lens.lens (\UpdatePhoneNumber' {deletionProtectionEnabled} -> deletionProtectionEnabled) (\s@UpdatePhoneNumber' {} a -> s {deletionProtectionEnabled = a} :: UpdatePhoneNumber)
+
+-- | The OptOutList to add the phone number to. Valid values for this field
+-- can be either the OutOutListName or OutOutListArn.
+updatePhoneNumber_optOutListName :: Lens.Lens' UpdatePhoneNumber (Prelude.Maybe Prelude.Text)
+updatePhoneNumber_optOutListName = Lens.lens (\UpdatePhoneNumber' {optOutListName} -> optOutListName) (\s@UpdatePhoneNumber' {} a -> s {optOutListName = a} :: UpdatePhoneNumber)
+
+-- | By default this is set to false. When an end recipient sends a message
+-- that begins with HELP or STOP to one of your dedicated numbers, Amazon
+-- Pinpoint automatically replies with a customizable message and adds the
+-- end recipient to the OptOutList. When set to true you\'re responsible
+-- for responding to HELP and STOP requests. You\'re also responsible for
+-- tracking and honoring opt-out requests.
+updatePhoneNumber_selfManagedOptOutsEnabled :: Lens.Lens' UpdatePhoneNumber (Prelude.Maybe Prelude.Bool)
+updatePhoneNumber_selfManagedOptOutsEnabled = Lens.lens (\UpdatePhoneNumber' {selfManagedOptOutsEnabled} -> selfManagedOptOutsEnabled) (\s@UpdatePhoneNumber' {} a -> s {selfManagedOptOutsEnabled = a} :: UpdatePhoneNumber)
+
+-- | The Amazon Resource Name (ARN) of the two way channel.
+updatePhoneNumber_twoWayChannelArn :: Lens.Lens' UpdatePhoneNumber (Prelude.Maybe Prelude.Text)
+updatePhoneNumber_twoWayChannelArn = Lens.lens (\UpdatePhoneNumber' {twoWayChannelArn} -> twoWayChannelArn) (\s@UpdatePhoneNumber' {} a -> s {twoWayChannelArn = a} :: UpdatePhoneNumber)
+
+-- | By default this is set to false. When set to true you can receive
+-- incoming text messages from your end recipients.
+updatePhoneNumber_twoWayEnabled :: Lens.Lens' UpdatePhoneNumber (Prelude.Maybe Prelude.Bool)
+updatePhoneNumber_twoWayEnabled = Lens.lens (\UpdatePhoneNumber' {twoWayEnabled} -> twoWayEnabled) (\s@UpdatePhoneNumber' {} a -> s {twoWayEnabled = a} :: UpdatePhoneNumber)
+
+-- | The unique identifier of the phone number. Valid values for this field
+-- can be either the PhoneNumberId or PhoneNumberArn.
+updatePhoneNumber_phoneNumberId :: Lens.Lens' UpdatePhoneNumber Prelude.Text
+updatePhoneNumber_phoneNumberId = Lens.lens (\UpdatePhoneNumber' {phoneNumberId} -> phoneNumberId) (\s@UpdatePhoneNumber' {} a -> s {phoneNumberId = a} :: UpdatePhoneNumber)
+
+instance Core.AWSRequest UpdatePhoneNumber where
+  type
+    AWSResponse UpdatePhoneNumber =
+      UpdatePhoneNumberResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdatePhoneNumberResponse'
+            Prelude.<$> (x Data..?> "CreatedTimestamp")
+            Prelude.<*> (x Data..?> "DeletionProtectionEnabled")
+            Prelude.<*> (x Data..?> "IsoCountryCode")
+            Prelude.<*> (x Data..?> "MessageType")
+            Prelude.<*> (x Data..?> "MonthlyLeasingPrice")
+            Prelude.<*> (x Data..?> "NumberCapabilities")
+            Prelude.<*> (x Data..?> "NumberType")
+            Prelude.<*> (x Data..?> "OptOutListName")
+            Prelude.<*> (x Data..?> "PhoneNumber")
+            Prelude.<*> (x Data..?> "PhoneNumberArn")
+            Prelude.<*> (x Data..?> "PhoneNumberId")
+            Prelude.<*> (x Data..?> "SelfManagedOptOutsEnabled")
+            Prelude.<*> (x Data..?> "Status")
+            Prelude.<*> (x Data..?> "TwoWayChannelArn")
+            Prelude.<*> (x Data..?> "TwoWayEnabled")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdatePhoneNumber where
+  hashWithSalt _salt UpdatePhoneNumber' {..} =
+    _salt
+      `Prelude.hashWithSalt` deletionProtectionEnabled
+      `Prelude.hashWithSalt` optOutListName
+      `Prelude.hashWithSalt` selfManagedOptOutsEnabled
+      `Prelude.hashWithSalt` twoWayChannelArn
+      `Prelude.hashWithSalt` twoWayEnabled
+      `Prelude.hashWithSalt` phoneNumberId
+
+instance Prelude.NFData UpdatePhoneNumber where
+  rnf UpdatePhoneNumber' {..} =
+    Prelude.rnf deletionProtectionEnabled
+      `Prelude.seq` Prelude.rnf optOutListName
+      `Prelude.seq` Prelude.rnf selfManagedOptOutsEnabled
+      `Prelude.seq` Prelude.rnf twoWayChannelArn
+      `Prelude.seq` Prelude.rnf twoWayEnabled
+      `Prelude.seq` Prelude.rnf phoneNumberId
+
+instance Data.ToHeaders UpdatePhoneNumber where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.UpdatePhoneNumber" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdatePhoneNumber where
+  toJSON UpdatePhoneNumber' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DeletionProtectionEnabled" Data..=)
+              Prelude.<$> deletionProtectionEnabled,
+            ("OptOutListName" Data..=)
+              Prelude.<$> optOutListName,
+            ("SelfManagedOptOutsEnabled" Data..=)
+              Prelude.<$> selfManagedOptOutsEnabled,
+            ("TwoWayChannelArn" Data..=)
+              Prelude.<$> twoWayChannelArn,
+            ("TwoWayEnabled" Data..=) Prelude.<$> twoWayEnabled,
+            Prelude.Just
+              ("PhoneNumberId" Data..= phoneNumberId)
+          ]
+      )
+
+instance Data.ToPath UpdatePhoneNumber where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdatePhoneNumber where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdatePhoneNumberResponse' smart constructor.
+data UpdatePhoneNumberResponse = UpdatePhoneNumberResponse'
+  { -- | The time when the phone number was created, in
+    -- <https://www.epochconverter.com/ UNIX epoch time> format.
+    createdTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | When set to true the phone number can\'t be deleted.
+    deletionProtectionEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+    -- region.
+    isoCountryCode :: Prelude.Maybe Prelude.Text,
+    -- | The type of message. Valid values are TRANSACTIONAL for messages that
+    -- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+    -- critical or time-sensitive.
+    messageType :: Prelude.Maybe MessageType,
+    -- | The monthly leasing price of the phone number, in US dollars.
+    monthlyLeasingPrice :: Prelude.Maybe Prelude.Text,
+    -- | Specifies if the number could be used for text messages, voice or both.
+    numberCapabilities :: Prelude.Maybe (Prelude.NonEmpty NumberCapability),
+    -- | The type of number that was requested.
+    numberType :: Prelude.Maybe NumberType,
+    -- | The name of the OptOutList associated with the phone number.
+    optOutListName :: Prelude.Maybe Prelude.Text,
+    -- | The phone number that was updated.
+    phoneNumber :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the updated phone number.
+    phoneNumberArn :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of the phone number.
+    phoneNumberId :: Prelude.Maybe Prelude.Text,
+    -- | This is true if self managed opt-out are enabled.
+    selfManagedOptOutsEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The current status of the request.
+    status :: Prelude.Maybe NumberStatus,
+    -- | The Amazon Resource Name (ARN) of the two way channel.
+    twoWayChannelArn :: Prelude.Maybe Prelude.Text,
+    -- | By default this is set to false. When set to true you can receive
+    -- incoming text messages from your end recipients.
+    twoWayEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdatePhoneNumberResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdTimestamp', 'updatePhoneNumberResponse_createdTimestamp' - The time when the phone number was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+--
+-- 'deletionProtectionEnabled', 'updatePhoneNumberResponse_deletionProtectionEnabled' - When set to true the phone number can\'t be deleted.
+--
+-- 'isoCountryCode', 'updatePhoneNumberResponse_isoCountryCode' - The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+--
+-- 'messageType', 'updatePhoneNumberResponse_messageType' - The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+--
+-- 'monthlyLeasingPrice', 'updatePhoneNumberResponse_monthlyLeasingPrice' - The monthly leasing price of the phone number, in US dollars.
+--
+-- 'numberCapabilities', 'updatePhoneNumberResponse_numberCapabilities' - Specifies if the number could be used for text messages, voice or both.
+--
+-- 'numberType', 'updatePhoneNumberResponse_numberType' - The type of number that was requested.
+--
+-- 'optOutListName', 'updatePhoneNumberResponse_optOutListName' - The name of the OptOutList associated with the phone number.
+--
+-- 'phoneNumber', 'updatePhoneNumberResponse_phoneNumber' - The phone number that was updated.
+--
+-- 'phoneNumberArn', 'updatePhoneNumberResponse_phoneNumberArn' - The Amazon Resource Name (ARN) of the updated phone number.
+--
+-- 'phoneNumberId', 'updatePhoneNumberResponse_phoneNumberId' - The unique identifier of the phone number.
+--
+-- 'selfManagedOptOutsEnabled', 'updatePhoneNumberResponse_selfManagedOptOutsEnabled' - This is true if self managed opt-out are enabled.
+--
+-- 'status', 'updatePhoneNumberResponse_status' - The current status of the request.
+--
+-- 'twoWayChannelArn', 'updatePhoneNumberResponse_twoWayChannelArn' - The Amazon Resource Name (ARN) of the two way channel.
+--
+-- 'twoWayEnabled', 'updatePhoneNumberResponse_twoWayEnabled' - By default this is set to false. When set to true you can receive
+-- incoming text messages from your end recipients.
+--
+-- 'httpStatus', 'updatePhoneNumberResponse_httpStatus' - The response's http status code.
+newUpdatePhoneNumberResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdatePhoneNumberResponse
+newUpdatePhoneNumberResponse pHttpStatus_ =
+  UpdatePhoneNumberResponse'
+    { createdTimestamp =
+        Prelude.Nothing,
+      deletionProtectionEnabled = Prelude.Nothing,
+      isoCountryCode = Prelude.Nothing,
+      messageType = Prelude.Nothing,
+      monthlyLeasingPrice = Prelude.Nothing,
+      numberCapabilities = Prelude.Nothing,
+      numberType = Prelude.Nothing,
+      optOutListName = Prelude.Nothing,
+      phoneNumber = Prelude.Nothing,
+      phoneNumberArn = Prelude.Nothing,
+      phoneNumberId = Prelude.Nothing,
+      selfManagedOptOutsEnabled = Prelude.Nothing,
+      status = Prelude.Nothing,
+      twoWayChannelArn = Prelude.Nothing,
+      twoWayEnabled = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The time when the phone number was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+updatePhoneNumberResponse_createdTimestamp :: Lens.Lens' UpdatePhoneNumberResponse (Prelude.Maybe Prelude.UTCTime)
+updatePhoneNumberResponse_createdTimestamp = Lens.lens (\UpdatePhoneNumberResponse' {createdTimestamp} -> createdTimestamp) (\s@UpdatePhoneNumberResponse' {} a -> s {createdTimestamp = a} :: UpdatePhoneNumberResponse) Prelude.. Lens.mapping Data._Time
+
+-- | When set to true the phone number can\'t be deleted.
+updatePhoneNumberResponse_deletionProtectionEnabled :: Lens.Lens' UpdatePhoneNumberResponse (Prelude.Maybe Prelude.Bool)
+updatePhoneNumberResponse_deletionProtectionEnabled = Lens.lens (\UpdatePhoneNumberResponse' {deletionProtectionEnabled} -> deletionProtectionEnabled) (\s@UpdatePhoneNumberResponse' {} a -> s {deletionProtectionEnabled = a} :: UpdatePhoneNumberResponse)
+
+-- | The two-character code, in ISO 3166-1 alpha-2 format, for the country or
+-- region.
+updatePhoneNumberResponse_isoCountryCode :: Lens.Lens' UpdatePhoneNumberResponse (Prelude.Maybe Prelude.Text)
+updatePhoneNumberResponse_isoCountryCode = Lens.lens (\UpdatePhoneNumberResponse' {isoCountryCode} -> isoCountryCode) (\s@UpdatePhoneNumberResponse' {} a -> s {isoCountryCode = a} :: UpdatePhoneNumberResponse)
+
+-- | The type of message. Valid values are TRANSACTIONAL for messages that
+-- are critical or time-sensitive and PROMOTIONAL for messages that aren\'t
+-- critical or time-sensitive.
+updatePhoneNumberResponse_messageType :: Lens.Lens' UpdatePhoneNumberResponse (Prelude.Maybe MessageType)
+updatePhoneNumberResponse_messageType = Lens.lens (\UpdatePhoneNumberResponse' {messageType} -> messageType) (\s@UpdatePhoneNumberResponse' {} a -> s {messageType = a} :: UpdatePhoneNumberResponse)
+
+-- | The monthly leasing price of the phone number, in US dollars.
+updatePhoneNumberResponse_monthlyLeasingPrice :: Lens.Lens' UpdatePhoneNumberResponse (Prelude.Maybe Prelude.Text)
+updatePhoneNumberResponse_monthlyLeasingPrice = Lens.lens (\UpdatePhoneNumberResponse' {monthlyLeasingPrice} -> monthlyLeasingPrice) (\s@UpdatePhoneNumberResponse' {} a -> s {monthlyLeasingPrice = a} :: UpdatePhoneNumberResponse)
+
+-- | Specifies if the number could be used for text messages, voice or both.
+updatePhoneNumberResponse_numberCapabilities :: Lens.Lens' UpdatePhoneNumberResponse (Prelude.Maybe (Prelude.NonEmpty NumberCapability))
+updatePhoneNumberResponse_numberCapabilities = Lens.lens (\UpdatePhoneNumberResponse' {numberCapabilities} -> numberCapabilities) (\s@UpdatePhoneNumberResponse' {} a -> s {numberCapabilities = a} :: UpdatePhoneNumberResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The type of number that was requested.
+updatePhoneNumberResponse_numberType :: Lens.Lens' UpdatePhoneNumberResponse (Prelude.Maybe NumberType)
+updatePhoneNumberResponse_numberType = Lens.lens (\UpdatePhoneNumberResponse' {numberType} -> numberType) (\s@UpdatePhoneNumberResponse' {} a -> s {numberType = a} :: UpdatePhoneNumberResponse)
+
+-- | The name of the OptOutList associated with the phone number.
+updatePhoneNumberResponse_optOutListName :: Lens.Lens' UpdatePhoneNumberResponse (Prelude.Maybe Prelude.Text)
+updatePhoneNumberResponse_optOutListName = Lens.lens (\UpdatePhoneNumberResponse' {optOutListName} -> optOutListName) (\s@UpdatePhoneNumberResponse' {} a -> s {optOutListName = a} :: UpdatePhoneNumberResponse)
+
+-- | The phone number that was updated.
+updatePhoneNumberResponse_phoneNumber :: Lens.Lens' UpdatePhoneNumberResponse (Prelude.Maybe Prelude.Text)
+updatePhoneNumberResponse_phoneNumber = Lens.lens (\UpdatePhoneNumberResponse' {phoneNumber} -> phoneNumber) (\s@UpdatePhoneNumberResponse' {} a -> s {phoneNumber = a} :: UpdatePhoneNumberResponse)
+
+-- | The Amazon Resource Name (ARN) of the updated phone number.
+updatePhoneNumberResponse_phoneNumberArn :: Lens.Lens' UpdatePhoneNumberResponse (Prelude.Maybe Prelude.Text)
+updatePhoneNumberResponse_phoneNumberArn = Lens.lens (\UpdatePhoneNumberResponse' {phoneNumberArn} -> phoneNumberArn) (\s@UpdatePhoneNumberResponse' {} a -> s {phoneNumberArn = a} :: UpdatePhoneNumberResponse)
+
+-- | The unique identifier of the phone number.
+updatePhoneNumberResponse_phoneNumberId :: Lens.Lens' UpdatePhoneNumberResponse (Prelude.Maybe Prelude.Text)
+updatePhoneNumberResponse_phoneNumberId = Lens.lens (\UpdatePhoneNumberResponse' {phoneNumberId} -> phoneNumberId) (\s@UpdatePhoneNumberResponse' {} a -> s {phoneNumberId = a} :: UpdatePhoneNumberResponse)
+
+-- | This is true if self managed opt-out are enabled.
+updatePhoneNumberResponse_selfManagedOptOutsEnabled :: Lens.Lens' UpdatePhoneNumberResponse (Prelude.Maybe Prelude.Bool)
+updatePhoneNumberResponse_selfManagedOptOutsEnabled = Lens.lens (\UpdatePhoneNumberResponse' {selfManagedOptOutsEnabled} -> selfManagedOptOutsEnabled) (\s@UpdatePhoneNumberResponse' {} a -> s {selfManagedOptOutsEnabled = a} :: UpdatePhoneNumberResponse)
+
+-- | The current status of the request.
+updatePhoneNumberResponse_status :: Lens.Lens' UpdatePhoneNumberResponse (Prelude.Maybe NumberStatus)
+updatePhoneNumberResponse_status = Lens.lens (\UpdatePhoneNumberResponse' {status} -> status) (\s@UpdatePhoneNumberResponse' {} a -> s {status = a} :: UpdatePhoneNumberResponse)
+
+-- | The Amazon Resource Name (ARN) of the two way channel.
+updatePhoneNumberResponse_twoWayChannelArn :: Lens.Lens' UpdatePhoneNumberResponse (Prelude.Maybe Prelude.Text)
+updatePhoneNumberResponse_twoWayChannelArn = Lens.lens (\UpdatePhoneNumberResponse' {twoWayChannelArn} -> twoWayChannelArn) (\s@UpdatePhoneNumberResponse' {} a -> s {twoWayChannelArn = a} :: UpdatePhoneNumberResponse)
+
+-- | By default this is set to false. When set to true you can receive
+-- incoming text messages from your end recipients.
+updatePhoneNumberResponse_twoWayEnabled :: Lens.Lens' UpdatePhoneNumberResponse (Prelude.Maybe Prelude.Bool)
+updatePhoneNumberResponse_twoWayEnabled = Lens.lens (\UpdatePhoneNumberResponse' {twoWayEnabled} -> twoWayEnabled) (\s@UpdatePhoneNumberResponse' {} a -> s {twoWayEnabled = a} :: UpdatePhoneNumberResponse)
+
+-- | The response's http status code.
+updatePhoneNumberResponse_httpStatus :: Lens.Lens' UpdatePhoneNumberResponse Prelude.Int
+updatePhoneNumberResponse_httpStatus = Lens.lens (\UpdatePhoneNumberResponse' {httpStatus} -> httpStatus) (\s@UpdatePhoneNumberResponse' {} a -> s {httpStatus = a} :: UpdatePhoneNumberResponse)
+
+instance Prelude.NFData UpdatePhoneNumberResponse where
+  rnf UpdatePhoneNumberResponse' {..} =
+    Prelude.rnf createdTimestamp
+      `Prelude.seq` Prelude.rnf deletionProtectionEnabled
+      `Prelude.seq` Prelude.rnf isoCountryCode
+      `Prelude.seq` Prelude.rnf messageType
+      `Prelude.seq` Prelude.rnf monthlyLeasingPrice
+      `Prelude.seq` Prelude.rnf numberCapabilities
+      `Prelude.seq` Prelude.rnf numberType
+      `Prelude.seq` Prelude.rnf optOutListName
+      `Prelude.seq` Prelude.rnf phoneNumber
+      `Prelude.seq` Prelude.rnf phoneNumberArn
+      `Prelude.seq` Prelude.rnf phoneNumberId
+      `Prelude.seq` Prelude.rnf selfManagedOptOutsEnabled
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf twoWayChannelArn
+      `Prelude.seq` Prelude.rnf twoWayEnabled
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/UpdatePool.hs b/gen/Amazonka/PinpointSmsVoiceV2/UpdatePool.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/UpdatePool.hs
@@ -0,0 +1,423 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.UpdatePool
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the configuration of an existing pool. You can update the
+-- opt-out list, enable or disable two-way messaging, change the
+-- @TwoWayChannelArn@, enable or disable self-managed opt-outs, enable or
+-- disable deletion protection, and enable or disable shared routes.
+module Amazonka.PinpointSmsVoiceV2.UpdatePool
+  ( -- * Creating a Request
+    UpdatePool (..),
+    newUpdatePool,
+
+    -- * Request Lenses
+    updatePool_deletionProtectionEnabled,
+    updatePool_optOutListName,
+    updatePool_selfManagedOptOutsEnabled,
+    updatePool_sharedRoutesEnabled,
+    updatePool_twoWayChannelArn,
+    updatePool_twoWayEnabled,
+    updatePool_poolId,
+
+    -- * Destructuring the Response
+    UpdatePoolResponse (..),
+    newUpdatePoolResponse,
+
+    -- * Response Lenses
+    updatePoolResponse_createdTimestamp,
+    updatePoolResponse_deletionProtectionEnabled,
+    updatePoolResponse_messageType,
+    updatePoolResponse_optOutListName,
+    updatePoolResponse_poolArn,
+    updatePoolResponse_poolId,
+    updatePoolResponse_selfManagedOptOutsEnabled,
+    updatePoolResponse_sharedRoutesEnabled,
+    updatePoolResponse_status,
+    updatePoolResponse_twoWayChannelArn,
+    updatePoolResponse_twoWayEnabled,
+    updatePoolResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdatePool' smart constructor.
+data UpdatePool = UpdatePool'
+  { -- | When set to true the pool can\'t be deleted.
+    deletionProtectionEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The OptOutList to associate with the pool. Valid values are either
+    -- OptOutListName or OptOutListArn.
+    optOutListName :: Prelude.Maybe Prelude.Text,
+    -- | By default this is set to false. When an end recipient sends a message
+    -- that begins with HELP or STOP to one of your dedicated numbers, Amazon
+    -- Pinpoint automatically replies with a customizable message and adds the
+    -- end recipient to the OptOutList. When set to true you\'re responsible
+    -- for responding to HELP and STOP requests. You\'re also responsible for
+    -- tracking and honoring opt-out requests.
+    selfManagedOptOutsEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | Indicates whether shared routes are enabled for the pool.
+    sharedRoutesEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The Amazon Resource Name (ARN) of the two way channel.
+    twoWayChannelArn :: Prelude.Maybe Prelude.Text,
+    -- | By default this is set to false. When set to true you can receive
+    -- incoming text messages from your end recipients.
+    twoWayEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The unique identifier of the pool to update. Valid values are either the
+    -- PoolId or PoolArn.
+    poolId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdatePool' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'deletionProtectionEnabled', 'updatePool_deletionProtectionEnabled' - When set to true the pool can\'t be deleted.
+--
+-- 'optOutListName', 'updatePool_optOutListName' - The OptOutList to associate with the pool. Valid values are either
+-- OptOutListName or OptOutListArn.
+--
+-- 'selfManagedOptOutsEnabled', 'updatePool_selfManagedOptOutsEnabled' - By default this is set to false. When an end recipient sends a message
+-- that begins with HELP or STOP to one of your dedicated numbers, Amazon
+-- Pinpoint automatically replies with a customizable message and adds the
+-- end recipient to the OptOutList. When set to true you\'re responsible
+-- for responding to HELP and STOP requests. You\'re also responsible for
+-- tracking and honoring opt-out requests.
+--
+-- 'sharedRoutesEnabled', 'updatePool_sharedRoutesEnabled' - Indicates whether shared routes are enabled for the pool.
+--
+-- 'twoWayChannelArn', 'updatePool_twoWayChannelArn' - The Amazon Resource Name (ARN) of the two way channel.
+--
+-- 'twoWayEnabled', 'updatePool_twoWayEnabled' - By default this is set to false. When set to true you can receive
+-- incoming text messages from your end recipients.
+--
+-- 'poolId', 'updatePool_poolId' - The unique identifier of the pool to update. Valid values are either the
+-- PoolId or PoolArn.
+newUpdatePool ::
+  -- | 'poolId'
+  Prelude.Text ->
+  UpdatePool
+newUpdatePool pPoolId_ =
+  UpdatePool'
+    { deletionProtectionEnabled =
+        Prelude.Nothing,
+      optOutListName = Prelude.Nothing,
+      selfManagedOptOutsEnabled = Prelude.Nothing,
+      sharedRoutesEnabled = Prelude.Nothing,
+      twoWayChannelArn = Prelude.Nothing,
+      twoWayEnabled = Prelude.Nothing,
+      poolId = pPoolId_
+    }
+
+-- | When set to true the pool can\'t be deleted.
+updatePool_deletionProtectionEnabled :: Lens.Lens' UpdatePool (Prelude.Maybe Prelude.Bool)
+updatePool_deletionProtectionEnabled = Lens.lens (\UpdatePool' {deletionProtectionEnabled} -> deletionProtectionEnabled) (\s@UpdatePool' {} a -> s {deletionProtectionEnabled = a} :: UpdatePool)
+
+-- | The OptOutList to associate with the pool. Valid values are either
+-- OptOutListName or OptOutListArn.
+updatePool_optOutListName :: Lens.Lens' UpdatePool (Prelude.Maybe Prelude.Text)
+updatePool_optOutListName = Lens.lens (\UpdatePool' {optOutListName} -> optOutListName) (\s@UpdatePool' {} a -> s {optOutListName = a} :: UpdatePool)
+
+-- | By default this is set to false. When an end recipient sends a message
+-- that begins with HELP or STOP to one of your dedicated numbers, Amazon
+-- Pinpoint automatically replies with a customizable message and adds the
+-- end recipient to the OptOutList. When set to true you\'re responsible
+-- for responding to HELP and STOP requests. You\'re also responsible for
+-- tracking and honoring opt-out requests.
+updatePool_selfManagedOptOutsEnabled :: Lens.Lens' UpdatePool (Prelude.Maybe Prelude.Bool)
+updatePool_selfManagedOptOutsEnabled = Lens.lens (\UpdatePool' {selfManagedOptOutsEnabled} -> selfManagedOptOutsEnabled) (\s@UpdatePool' {} a -> s {selfManagedOptOutsEnabled = a} :: UpdatePool)
+
+-- | Indicates whether shared routes are enabled for the pool.
+updatePool_sharedRoutesEnabled :: Lens.Lens' UpdatePool (Prelude.Maybe Prelude.Bool)
+updatePool_sharedRoutesEnabled = Lens.lens (\UpdatePool' {sharedRoutesEnabled} -> sharedRoutesEnabled) (\s@UpdatePool' {} a -> s {sharedRoutesEnabled = a} :: UpdatePool)
+
+-- | The Amazon Resource Name (ARN) of the two way channel.
+updatePool_twoWayChannelArn :: Lens.Lens' UpdatePool (Prelude.Maybe Prelude.Text)
+updatePool_twoWayChannelArn = Lens.lens (\UpdatePool' {twoWayChannelArn} -> twoWayChannelArn) (\s@UpdatePool' {} a -> s {twoWayChannelArn = a} :: UpdatePool)
+
+-- | By default this is set to false. When set to true you can receive
+-- incoming text messages from your end recipients.
+updatePool_twoWayEnabled :: Lens.Lens' UpdatePool (Prelude.Maybe Prelude.Bool)
+updatePool_twoWayEnabled = Lens.lens (\UpdatePool' {twoWayEnabled} -> twoWayEnabled) (\s@UpdatePool' {} a -> s {twoWayEnabled = a} :: UpdatePool)
+
+-- | The unique identifier of the pool to update. Valid values are either the
+-- PoolId or PoolArn.
+updatePool_poolId :: Lens.Lens' UpdatePool Prelude.Text
+updatePool_poolId = Lens.lens (\UpdatePool' {poolId} -> poolId) (\s@UpdatePool' {} a -> s {poolId = a} :: UpdatePool)
+
+instance Core.AWSRequest UpdatePool where
+  type AWSResponse UpdatePool = UpdatePoolResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdatePoolResponse'
+            Prelude.<$> (x Data..?> "CreatedTimestamp")
+            Prelude.<*> (x Data..?> "DeletionProtectionEnabled")
+            Prelude.<*> (x Data..?> "MessageType")
+            Prelude.<*> (x Data..?> "OptOutListName")
+            Prelude.<*> (x Data..?> "PoolArn")
+            Prelude.<*> (x Data..?> "PoolId")
+            Prelude.<*> (x Data..?> "SelfManagedOptOutsEnabled")
+            Prelude.<*> (x Data..?> "SharedRoutesEnabled")
+            Prelude.<*> (x Data..?> "Status")
+            Prelude.<*> (x Data..?> "TwoWayChannelArn")
+            Prelude.<*> (x Data..?> "TwoWayEnabled")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdatePool where
+  hashWithSalt _salt UpdatePool' {..} =
+    _salt
+      `Prelude.hashWithSalt` deletionProtectionEnabled
+      `Prelude.hashWithSalt` optOutListName
+      `Prelude.hashWithSalt` selfManagedOptOutsEnabled
+      `Prelude.hashWithSalt` sharedRoutesEnabled
+      `Prelude.hashWithSalt` twoWayChannelArn
+      `Prelude.hashWithSalt` twoWayEnabled
+      `Prelude.hashWithSalt` poolId
+
+instance Prelude.NFData UpdatePool where
+  rnf UpdatePool' {..} =
+    Prelude.rnf deletionProtectionEnabled
+      `Prelude.seq` Prelude.rnf optOutListName
+      `Prelude.seq` Prelude.rnf selfManagedOptOutsEnabled
+      `Prelude.seq` Prelude.rnf sharedRoutesEnabled
+      `Prelude.seq` Prelude.rnf twoWayChannelArn
+      `Prelude.seq` Prelude.rnf twoWayEnabled
+      `Prelude.seq` Prelude.rnf poolId
+
+instance Data.ToHeaders UpdatePool where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PinpointSMSVoiceV2.UpdatePool" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdatePool where
+  toJSON UpdatePool' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DeletionProtectionEnabled" Data..=)
+              Prelude.<$> deletionProtectionEnabled,
+            ("OptOutListName" Data..=)
+              Prelude.<$> optOutListName,
+            ("SelfManagedOptOutsEnabled" Data..=)
+              Prelude.<$> selfManagedOptOutsEnabled,
+            ("SharedRoutesEnabled" Data..=)
+              Prelude.<$> sharedRoutesEnabled,
+            ("TwoWayChannelArn" Data..=)
+              Prelude.<$> twoWayChannelArn,
+            ("TwoWayEnabled" Data..=) Prelude.<$> twoWayEnabled,
+            Prelude.Just ("PoolId" Data..= poolId)
+          ]
+      )
+
+instance Data.ToPath UpdatePool where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdatePool where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdatePoolResponse' smart constructor.
+data UpdatePoolResponse = UpdatePoolResponse'
+  { -- | The time when the pool was created, in
+    -- <https://www.epochconverter.com/ UNIX epoch time> format.
+    createdTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | When set to true the pool can\'t be deleted.
+    deletionProtectionEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The type of message for the pool to use.
+    messageType :: Prelude.Maybe MessageType,
+    -- | The name of the OptOutList associated with the pool.
+    optOutListName :: Prelude.Maybe Prelude.Text,
+    -- | The ARN of the pool.
+    poolArn :: Prelude.Maybe Prelude.Text,
+    -- | The unique identifier of the pool.
+    poolId :: Prelude.Maybe Prelude.Text,
+    -- | When an end recipient sends a message that begins with HELP or STOP to
+    -- one of your dedicated numbers, Amazon Pinpoint automatically replies
+    -- with a customizable message and adds the end recipient to the
+    -- OptOutList. When set to true you\'re responsible for responding to HELP
+    -- and STOP requests. You\'re also responsible for tracking and honoring
+    -- opt-out requests.
+    selfManagedOptOutsEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | Indicates whether shared routes are enabled for the pool.
+    sharedRoutesEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The current status of the pool update request.
+    status :: Prelude.Maybe PoolStatus,
+    -- | The Amazon Resource Name (ARN) of the two way channel.
+    twoWayChannelArn :: Prelude.Maybe Prelude.Text,
+    -- | By default this is set to false. When set to true you can receive
+    -- incoming text messages from your end recipients.
+    twoWayEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdatePoolResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdTimestamp', 'updatePoolResponse_createdTimestamp' - The time when the pool was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+--
+-- 'deletionProtectionEnabled', 'updatePoolResponse_deletionProtectionEnabled' - When set to true the pool can\'t be deleted.
+--
+-- 'messageType', 'updatePoolResponse_messageType' - The type of message for the pool to use.
+--
+-- 'optOutListName', 'updatePoolResponse_optOutListName' - The name of the OptOutList associated with the pool.
+--
+-- 'poolArn', 'updatePoolResponse_poolArn' - The ARN of the pool.
+--
+-- 'poolId', 'updatePoolResponse_poolId' - The unique identifier of the pool.
+--
+-- 'selfManagedOptOutsEnabled', 'updatePoolResponse_selfManagedOptOutsEnabled' - When an end recipient sends a message that begins with HELP or STOP to
+-- one of your dedicated numbers, Amazon Pinpoint automatically replies
+-- with a customizable message and adds the end recipient to the
+-- OptOutList. When set to true you\'re responsible for responding to HELP
+-- and STOP requests. You\'re also responsible for tracking and honoring
+-- opt-out requests.
+--
+-- 'sharedRoutesEnabled', 'updatePoolResponse_sharedRoutesEnabled' - Indicates whether shared routes are enabled for the pool.
+--
+-- 'status', 'updatePoolResponse_status' - The current status of the pool update request.
+--
+-- 'twoWayChannelArn', 'updatePoolResponse_twoWayChannelArn' - The Amazon Resource Name (ARN) of the two way channel.
+--
+-- 'twoWayEnabled', 'updatePoolResponse_twoWayEnabled' - By default this is set to false. When set to true you can receive
+-- incoming text messages from your end recipients.
+--
+-- 'httpStatus', 'updatePoolResponse_httpStatus' - The response's http status code.
+newUpdatePoolResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdatePoolResponse
+newUpdatePoolResponse pHttpStatus_ =
+  UpdatePoolResponse'
+    { createdTimestamp =
+        Prelude.Nothing,
+      deletionProtectionEnabled = Prelude.Nothing,
+      messageType = Prelude.Nothing,
+      optOutListName = Prelude.Nothing,
+      poolArn = Prelude.Nothing,
+      poolId = Prelude.Nothing,
+      selfManagedOptOutsEnabled = Prelude.Nothing,
+      sharedRoutesEnabled = Prelude.Nothing,
+      status = Prelude.Nothing,
+      twoWayChannelArn = Prelude.Nothing,
+      twoWayEnabled = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The time when the pool was created, in
+-- <https://www.epochconverter.com/ UNIX epoch time> format.
+updatePoolResponse_createdTimestamp :: Lens.Lens' UpdatePoolResponse (Prelude.Maybe Prelude.UTCTime)
+updatePoolResponse_createdTimestamp = Lens.lens (\UpdatePoolResponse' {createdTimestamp} -> createdTimestamp) (\s@UpdatePoolResponse' {} a -> s {createdTimestamp = a} :: UpdatePoolResponse) Prelude.. Lens.mapping Data._Time
+
+-- | When set to true the pool can\'t be deleted.
+updatePoolResponse_deletionProtectionEnabled :: Lens.Lens' UpdatePoolResponse (Prelude.Maybe Prelude.Bool)
+updatePoolResponse_deletionProtectionEnabled = Lens.lens (\UpdatePoolResponse' {deletionProtectionEnabled} -> deletionProtectionEnabled) (\s@UpdatePoolResponse' {} a -> s {deletionProtectionEnabled = a} :: UpdatePoolResponse)
+
+-- | The type of message for the pool to use.
+updatePoolResponse_messageType :: Lens.Lens' UpdatePoolResponse (Prelude.Maybe MessageType)
+updatePoolResponse_messageType = Lens.lens (\UpdatePoolResponse' {messageType} -> messageType) (\s@UpdatePoolResponse' {} a -> s {messageType = a} :: UpdatePoolResponse)
+
+-- | The name of the OptOutList associated with the pool.
+updatePoolResponse_optOutListName :: Lens.Lens' UpdatePoolResponse (Prelude.Maybe Prelude.Text)
+updatePoolResponse_optOutListName = Lens.lens (\UpdatePoolResponse' {optOutListName} -> optOutListName) (\s@UpdatePoolResponse' {} a -> s {optOutListName = a} :: UpdatePoolResponse)
+
+-- | The ARN of the pool.
+updatePoolResponse_poolArn :: Lens.Lens' UpdatePoolResponse (Prelude.Maybe Prelude.Text)
+updatePoolResponse_poolArn = Lens.lens (\UpdatePoolResponse' {poolArn} -> poolArn) (\s@UpdatePoolResponse' {} a -> s {poolArn = a} :: UpdatePoolResponse)
+
+-- | The unique identifier of the pool.
+updatePoolResponse_poolId :: Lens.Lens' UpdatePoolResponse (Prelude.Maybe Prelude.Text)
+updatePoolResponse_poolId = Lens.lens (\UpdatePoolResponse' {poolId} -> poolId) (\s@UpdatePoolResponse' {} a -> s {poolId = a} :: UpdatePoolResponse)
+
+-- | When an end recipient sends a message that begins with HELP or STOP to
+-- one of your dedicated numbers, Amazon Pinpoint automatically replies
+-- with a customizable message and adds the end recipient to the
+-- OptOutList. When set to true you\'re responsible for responding to HELP
+-- and STOP requests. You\'re also responsible for tracking and honoring
+-- opt-out requests.
+updatePoolResponse_selfManagedOptOutsEnabled :: Lens.Lens' UpdatePoolResponse (Prelude.Maybe Prelude.Bool)
+updatePoolResponse_selfManagedOptOutsEnabled = Lens.lens (\UpdatePoolResponse' {selfManagedOptOutsEnabled} -> selfManagedOptOutsEnabled) (\s@UpdatePoolResponse' {} a -> s {selfManagedOptOutsEnabled = a} :: UpdatePoolResponse)
+
+-- | Indicates whether shared routes are enabled for the pool.
+updatePoolResponse_sharedRoutesEnabled :: Lens.Lens' UpdatePoolResponse (Prelude.Maybe Prelude.Bool)
+updatePoolResponse_sharedRoutesEnabled = Lens.lens (\UpdatePoolResponse' {sharedRoutesEnabled} -> sharedRoutesEnabled) (\s@UpdatePoolResponse' {} a -> s {sharedRoutesEnabled = a} :: UpdatePoolResponse)
+
+-- | The current status of the pool update request.
+updatePoolResponse_status :: Lens.Lens' UpdatePoolResponse (Prelude.Maybe PoolStatus)
+updatePoolResponse_status = Lens.lens (\UpdatePoolResponse' {status} -> status) (\s@UpdatePoolResponse' {} a -> s {status = a} :: UpdatePoolResponse)
+
+-- | The Amazon Resource Name (ARN) of the two way channel.
+updatePoolResponse_twoWayChannelArn :: Lens.Lens' UpdatePoolResponse (Prelude.Maybe Prelude.Text)
+updatePoolResponse_twoWayChannelArn = Lens.lens (\UpdatePoolResponse' {twoWayChannelArn} -> twoWayChannelArn) (\s@UpdatePoolResponse' {} a -> s {twoWayChannelArn = a} :: UpdatePoolResponse)
+
+-- | By default this is set to false. When set to true you can receive
+-- incoming text messages from your end recipients.
+updatePoolResponse_twoWayEnabled :: Lens.Lens' UpdatePoolResponse (Prelude.Maybe Prelude.Bool)
+updatePoolResponse_twoWayEnabled = Lens.lens (\UpdatePoolResponse' {twoWayEnabled} -> twoWayEnabled) (\s@UpdatePoolResponse' {} a -> s {twoWayEnabled = a} :: UpdatePoolResponse)
+
+-- | The response's http status code.
+updatePoolResponse_httpStatus :: Lens.Lens' UpdatePoolResponse Prelude.Int
+updatePoolResponse_httpStatus = Lens.lens (\UpdatePoolResponse' {httpStatus} -> httpStatus) (\s@UpdatePoolResponse' {} a -> s {httpStatus = a} :: UpdatePoolResponse)
+
+instance Prelude.NFData UpdatePoolResponse where
+  rnf UpdatePoolResponse' {..} =
+    Prelude.rnf createdTimestamp
+      `Prelude.seq` Prelude.rnf deletionProtectionEnabled
+      `Prelude.seq` Prelude.rnf messageType
+      `Prelude.seq` Prelude.rnf optOutListName
+      `Prelude.seq` Prelude.rnf poolArn
+      `Prelude.seq` Prelude.rnf poolId
+      `Prelude.seq` Prelude.rnf selfManagedOptOutsEnabled
+      `Prelude.seq` Prelude.rnf sharedRoutesEnabled
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf twoWayChannelArn
+      `Prelude.seq` Prelude.rnf twoWayEnabled
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/PinpointSmsVoiceV2/Waiters.hs b/gen/Amazonka/PinpointSmsVoiceV2/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/PinpointSmsVoiceV2/Waiters.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.PinpointSmsVoiceV2.Waiters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.PinpointSmsVoiceV2.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.PinpointSmsVoiceV2.Lens
+import Amazonka.PinpointSmsVoiceV2.Types
+import qualified Amazonka.Prelude as Prelude
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,23 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Main (main) where
+
+import Test.Amazonka.PinpointSmsVoiceV2
+import Test.Amazonka.PinpointSmsVoiceV2.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "PinpointSmsVoiceV2"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/PinpointSmsVoiceV2.hs b/test/Test/Amazonka/Gen/PinpointSmsVoiceV2.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/PinpointSmsVoiceV2.hs
@@ -0,0 +1,898 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Test.Amazonka.Gen.PinpointSmsVoiceV2
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.Gen.PinpointSmsVoiceV2 where
+
+import Amazonka.PinpointSmsVoiceV2
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.PinpointSmsVoiceV2.Internal
+import Test.Amazonka.Prelude
+import Test.Tasty
+
+-- Auto-generated: the actual test selection needs to be manually placed into
+-- the top-level so that real test data can be incrementally added.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ requestAssociateOriginationIdentity $
+--             newAssociateOriginationIdentity
+--
+--         , requestCreateConfigurationSet $
+--             newCreateConfigurationSet
+--
+--         , requestCreateEventDestination $
+--             newCreateEventDestination
+--
+--         , requestCreateOptOutList $
+--             newCreateOptOutList
+--
+--         , requestCreatePool $
+--             newCreatePool
+--
+--         , requestDeleteConfigurationSet $
+--             newDeleteConfigurationSet
+--
+--         , requestDeleteDefaultMessageType $
+--             newDeleteDefaultMessageType
+--
+--         , requestDeleteDefaultSenderId $
+--             newDeleteDefaultSenderId
+--
+--         , requestDeleteEventDestination $
+--             newDeleteEventDestination
+--
+--         , requestDeleteKeyword $
+--             newDeleteKeyword
+--
+--         , requestDeleteOptOutList $
+--             newDeleteOptOutList
+--
+--         , requestDeleteOptedOutNumber $
+--             newDeleteOptedOutNumber
+--
+--         , requestDeletePool $
+--             newDeletePool
+--
+--         , requestDeleteTextMessageSpendLimitOverride $
+--             newDeleteTextMessageSpendLimitOverride
+--
+--         , requestDeleteVoiceMessageSpendLimitOverride $
+--             newDeleteVoiceMessageSpendLimitOverride
+--
+--         , requestDescribeAccountAttributes $
+--             newDescribeAccountAttributes
+--
+--         , requestDescribeAccountLimits $
+--             newDescribeAccountLimits
+--
+--         , requestDescribeConfigurationSets $
+--             newDescribeConfigurationSets
+--
+--         , requestDescribeKeywords $
+--             newDescribeKeywords
+--
+--         , requestDescribeOptOutLists $
+--             newDescribeOptOutLists
+--
+--         , requestDescribeOptedOutNumbers $
+--             newDescribeOptedOutNumbers
+--
+--         , requestDescribePhoneNumbers $
+--             newDescribePhoneNumbers
+--
+--         , requestDescribePools $
+--             newDescribePools
+--
+--         , requestDescribeSenderIds $
+--             newDescribeSenderIds
+--
+--         , requestDescribeSpendLimits $
+--             newDescribeSpendLimits
+--
+--         , requestDisassociateOriginationIdentity $
+--             newDisassociateOriginationIdentity
+--
+--         , requestListPoolOriginationIdentities $
+--             newListPoolOriginationIdentities
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestPutKeyword $
+--             newPutKeyword
+--
+--         , requestPutOptedOutNumber $
+--             newPutOptedOutNumber
+--
+--         , requestReleasePhoneNumber $
+--             newReleasePhoneNumber
+--
+--         , requestRequestPhoneNumber $
+--             newRequestPhoneNumber
+--
+--         , requestSendTextMessage $
+--             newSendTextMessage
+--
+--         , requestSendVoiceMessage $
+--             newSendVoiceMessage
+--
+--         , requestSetDefaultMessageType $
+--             newSetDefaultMessageType
+--
+--         , requestSetDefaultSenderId $
+--             newSetDefaultSenderId
+--
+--         , requestSetTextMessageSpendLimitOverride $
+--             newSetTextMessageSpendLimitOverride
+--
+--         , requestSetVoiceMessageSpendLimitOverride $
+--             newSetVoiceMessageSpendLimitOverride
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateEventDestination $
+--             newUpdateEventDestination
+--
+--         , requestUpdatePhoneNumber $
+--             newUpdatePhoneNumber
+--
+--         , requestUpdatePool $
+--             newUpdatePool
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseAssociateOriginationIdentity $
+--             newAssociateOriginationIdentityResponse
+--
+--         , responseCreateConfigurationSet $
+--             newCreateConfigurationSetResponse
+--
+--         , responseCreateEventDestination $
+--             newCreateEventDestinationResponse
+--
+--         , responseCreateOptOutList $
+--             newCreateOptOutListResponse
+--
+--         , responseCreatePool $
+--             newCreatePoolResponse
+--
+--         , responseDeleteConfigurationSet $
+--             newDeleteConfigurationSetResponse
+--
+--         , responseDeleteDefaultMessageType $
+--             newDeleteDefaultMessageTypeResponse
+--
+--         , responseDeleteDefaultSenderId $
+--             newDeleteDefaultSenderIdResponse
+--
+--         , responseDeleteEventDestination $
+--             newDeleteEventDestinationResponse
+--
+--         , responseDeleteKeyword $
+--             newDeleteKeywordResponse
+--
+--         , responseDeleteOptOutList $
+--             newDeleteOptOutListResponse
+--
+--         , responseDeleteOptedOutNumber $
+--             newDeleteOptedOutNumberResponse
+--
+--         , responseDeletePool $
+--             newDeletePoolResponse
+--
+--         , responseDeleteTextMessageSpendLimitOverride $
+--             newDeleteTextMessageSpendLimitOverrideResponse
+--
+--         , responseDeleteVoiceMessageSpendLimitOverride $
+--             newDeleteVoiceMessageSpendLimitOverrideResponse
+--
+--         , responseDescribeAccountAttributes $
+--             newDescribeAccountAttributesResponse
+--
+--         , responseDescribeAccountLimits $
+--             newDescribeAccountLimitsResponse
+--
+--         , responseDescribeConfigurationSets $
+--             newDescribeConfigurationSetsResponse
+--
+--         , responseDescribeKeywords $
+--             newDescribeKeywordsResponse
+--
+--         , responseDescribeOptOutLists $
+--             newDescribeOptOutListsResponse
+--
+--         , responseDescribeOptedOutNumbers $
+--             newDescribeOptedOutNumbersResponse
+--
+--         , responseDescribePhoneNumbers $
+--             newDescribePhoneNumbersResponse
+--
+--         , responseDescribePools $
+--             newDescribePoolsResponse
+--
+--         , responseDescribeSenderIds $
+--             newDescribeSenderIdsResponse
+--
+--         , responseDescribeSpendLimits $
+--             newDescribeSpendLimitsResponse
+--
+--         , responseDisassociateOriginationIdentity $
+--             newDisassociateOriginationIdentityResponse
+--
+--         , responseListPoolOriginationIdentities $
+--             newListPoolOriginationIdentitiesResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responsePutKeyword $
+--             newPutKeywordResponse
+--
+--         , responsePutOptedOutNumber $
+--             newPutOptedOutNumberResponse
+--
+--         , responseReleasePhoneNumber $
+--             newReleasePhoneNumberResponse
+--
+--         , responseRequestPhoneNumber $
+--             newRequestPhoneNumberResponse
+--
+--         , responseSendTextMessage $
+--             newSendTextMessageResponse
+--
+--         , responseSendVoiceMessage $
+--             newSendVoiceMessageResponse
+--
+--         , responseSetDefaultMessageType $
+--             newSetDefaultMessageTypeResponse
+--
+--         , responseSetDefaultSenderId $
+--             newSetDefaultSenderIdResponse
+--
+--         , responseSetTextMessageSpendLimitOverride $
+--             newSetTextMessageSpendLimitOverrideResponse
+--
+--         , responseSetVoiceMessageSpendLimitOverride $
+--             newSetVoiceMessageSpendLimitOverrideResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateEventDestination $
+--             newUpdateEventDestinationResponse
+--
+--         , responseUpdatePhoneNumber $
+--             newUpdatePhoneNumberResponse
+--
+--         , responseUpdatePool $
+--             newUpdatePoolResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestAssociateOriginationIdentity :: AssociateOriginationIdentity -> TestTree
+requestAssociateOriginationIdentity =
+  req
+    "AssociateOriginationIdentity"
+    "fixture/AssociateOriginationIdentity.yaml"
+
+requestCreateConfigurationSet :: CreateConfigurationSet -> TestTree
+requestCreateConfigurationSet =
+  req
+    "CreateConfigurationSet"
+    "fixture/CreateConfigurationSet.yaml"
+
+requestCreateEventDestination :: CreateEventDestination -> TestTree
+requestCreateEventDestination =
+  req
+    "CreateEventDestination"
+    "fixture/CreateEventDestination.yaml"
+
+requestCreateOptOutList :: CreateOptOutList -> TestTree
+requestCreateOptOutList =
+  req
+    "CreateOptOutList"
+    "fixture/CreateOptOutList.yaml"
+
+requestCreatePool :: CreatePool -> TestTree
+requestCreatePool =
+  req
+    "CreatePool"
+    "fixture/CreatePool.yaml"
+
+requestDeleteConfigurationSet :: DeleteConfigurationSet -> TestTree
+requestDeleteConfigurationSet =
+  req
+    "DeleteConfigurationSet"
+    "fixture/DeleteConfigurationSet.yaml"
+
+requestDeleteDefaultMessageType :: DeleteDefaultMessageType -> TestTree
+requestDeleteDefaultMessageType =
+  req
+    "DeleteDefaultMessageType"
+    "fixture/DeleteDefaultMessageType.yaml"
+
+requestDeleteDefaultSenderId :: DeleteDefaultSenderId -> TestTree
+requestDeleteDefaultSenderId =
+  req
+    "DeleteDefaultSenderId"
+    "fixture/DeleteDefaultSenderId.yaml"
+
+requestDeleteEventDestination :: DeleteEventDestination -> TestTree
+requestDeleteEventDestination =
+  req
+    "DeleteEventDestination"
+    "fixture/DeleteEventDestination.yaml"
+
+requestDeleteKeyword :: DeleteKeyword -> TestTree
+requestDeleteKeyword =
+  req
+    "DeleteKeyword"
+    "fixture/DeleteKeyword.yaml"
+
+requestDeleteOptOutList :: DeleteOptOutList -> TestTree
+requestDeleteOptOutList =
+  req
+    "DeleteOptOutList"
+    "fixture/DeleteOptOutList.yaml"
+
+requestDeleteOptedOutNumber :: DeleteOptedOutNumber -> TestTree
+requestDeleteOptedOutNumber =
+  req
+    "DeleteOptedOutNumber"
+    "fixture/DeleteOptedOutNumber.yaml"
+
+requestDeletePool :: DeletePool -> TestTree
+requestDeletePool =
+  req
+    "DeletePool"
+    "fixture/DeletePool.yaml"
+
+requestDeleteTextMessageSpendLimitOverride :: DeleteTextMessageSpendLimitOverride -> TestTree
+requestDeleteTextMessageSpendLimitOverride =
+  req
+    "DeleteTextMessageSpendLimitOverride"
+    "fixture/DeleteTextMessageSpendLimitOverride.yaml"
+
+requestDeleteVoiceMessageSpendLimitOverride :: DeleteVoiceMessageSpendLimitOverride -> TestTree
+requestDeleteVoiceMessageSpendLimitOverride =
+  req
+    "DeleteVoiceMessageSpendLimitOverride"
+    "fixture/DeleteVoiceMessageSpendLimitOverride.yaml"
+
+requestDescribeAccountAttributes :: DescribeAccountAttributes -> TestTree
+requestDescribeAccountAttributes =
+  req
+    "DescribeAccountAttributes"
+    "fixture/DescribeAccountAttributes.yaml"
+
+requestDescribeAccountLimits :: DescribeAccountLimits -> TestTree
+requestDescribeAccountLimits =
+  req
+    "DescribeAccountLimits"
+    "fixture/DescribeAccountLimits.yaml"
+
+requestDescribeConfigurationSets :: DescribeConfigurationSets -> TestTree
+requestDescribeConfigurationSets =
+  req
+    "DescribeConfigurationSets"
+    "fixture/DescribeConfigurationSets.yaml"
+
+requestDescribeKeywords :: DescribeKeywords -> TestTree
+requestDescribeKeywords =
+  req
+    "DescribeKeywords"
+    "fixture/DescribeKeywords.yaml"
+
+requestDescribeOptOutLists :: DescribeOptOutLists -> TestTree
+requestDescribeOptOutLists =
+  req
+    "DescribeOptOutLists"
+    "fixture/DescribeOptOutLists.yaml"
+
+requestDescribeOptedOutNumbers :: DescribeOptedOutNumbers -> TestTree
+requestDescribeOptedOutNumbers =
+  req
+    "DescribeOptedOutNumbers"
+    "fixture/DescribeOptedOutNumbers.yaml"
+
+requestDescribePhoneNumbers :: DescribePhoneNumbers -> TestTree
+requestDescribePhoneNumbers =
+  req
+    "DescribePhoneNumbers"
+    "fixture/DescribePhoneNumbers.yaml"
+
+requestDescribePools :: DescribePools -> TestTree
+requestDescribePools =
+  req
+    "DescribePools"
+    "fixture/DescribePools.yaml"
+
+requestDescribeSenderIds :: DescribeSenderIds -> TestTree
+requestDescribeSenderIds =
+  req
+    "DescribeSenderIds"
+    "fixture/DescribeSenderIds.yaml"
+
+requestDescribeSpendLimits :: DescribeSpendLimits -> TestTree
+requestDescribeSpendLimits =
+  req
+    "DescribeSpendLimits"
+    "fixture/DescribeSpendLimits.yaml"
+
+requestDisassociateOriginationIdentity :: DisassociateOriginationIdentity -> TestTree
+requestDisassociateOriginationIdentity =
+  req
+    "DisassociateOriginationIdentity"
+    "fixture/DisassociateOriginationIdentity.yaml"
+
+requestListPoolOriginationIdentities :: ListPoolOriginationIdentities -> TestTree
+requestListPoolOriginationIdentities =
+  req
+    "ListPoolOriginationIdentities"
+    "fixture/ListPoolOriginationIdentities.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestPutKeyword :: PutKeyword -> TestTree
+requestPutKeyword =
+  req
+    "PutKeyword"
+    "fixture/PutKeyword.yaml"
+
+requestPutOptedOutNumber :: PutOptedOutNumber -> TestTree
+requestPutOptedOutNumber =
+  req
+    "PutOptedOutNumber"
+    "fixture/PutOptedOutNumber.yaml"
+
+requestReleasePhoneNumber :: ReleasePhoneNumber -> TestTree
+requestReleasePhoneNumber =
+  req
+    "ReleasePhoneNumber"
+    "fixture/ReleasePhoneNumber.yaml"
+
+requestRequestPhoneNumber :: RequestPhoneNumber -> TestTree
+requestRequestPhoneNumber =
+  req
+    "RequestPhoneNumber"
+    "fixture/RequestPhoneNumber.yaml"
+
+requestSendTextMessage :: SendTextMessage -> TestTree
+requestSendTextMessage =
+  req
+    "SendTextMessage"
+    "fixture/SendTextMessage.yaml"
+
+requestSendVoiceMessage :: SendVoiceMessage -> TestTree
+requestSendVoiceMessage =
+  req
+    "SendVoiceMessage"
+    "fixture/SendVoiceMessage.yaml"
+
+requestSetDefaultMessageType :: SetDefaultMessageType -> TestTree
+requestSetDefaultMessageType =
+  req
+    "SetDefaultMessageType"
+    "fixture/SetDefaultMessageType.yaml"
+
+requestSetDefaultSenderId :: SetDefaultSenderId -> TestTree
+requestSetDefaultSenderId =
+  req
+    "SetDefaultSenderId"
+    "fixture/SetDefaultSenderId.yaml"
+
+requestSetTextMessageSpendLimitOverride :: SetTextMessageSpendLimitOverride -> TestTree
+requestSetTextMessageSpendLimitOverride =
+  req
+    "SetTextMessageSpendLimitOverride"
+    "fixture/SetTextMessageSpendLimitOverride.yaml"
+
+requestSetVoiceMessageSpendLimitOverride :: SetVoiceMessageSpendLimitOverride -> TestTree
+requestSetVoiceMessageSpendLimitOverride =
+  req
+    "SetVoiceMessageSpendLimitOverride"
+    "fixture/SetVoiceMessageSpendLimitOverride.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateEventDestination :: UpdateEventDestination -> TestTree
+requestUpdateEventDestination =
+  req
+    "UpdateEventDestination"
+    "fixture/UpdateEventDestination.yaml"
+
+requestUpdatePhoneNumber :: UpdatePhoneNumber -> TestTree
+requestUpdatePhoneNumber =
+  req
+    "UpdatePhoneNumber"
+    "fixture/UpdatePhoneNumber.yaml"
+
+requestUpdatePool :: UpdatePool -> TestTree
+requestUpdatePool =
+  req
+    "UpdatePool"
+    "fixture/UpdatePool.yaml"
+
+-- Responses
+
+responseAssociateOriginationIdentity :: AssociateOriginationIdentityResponse -> TestTree
+responseAssociateOriginationIdentity =
+  res
+    "AssociateOriginationIdentityResponse"
+    "fixture/AssociateOriginationIdentityResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy AssociateOriginationIdentity)
+
+responseCreateConfigurationSet :: CreateConfigurationSetResponse -> TestTree
+responseCreateConfigurationSet =
+  res
+    "CreateConfigurationSetResponse"
+    "fixture/CreateConfigurationSetResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateConfigurationSet)
+
+responseCreateEventDestination :: CreateEventDestinationResponse -> TestTree
+responseCreateEventDestination =
+  res
+    "CreateEventDestinationResponse"
+    "fixture/CreateEventDestinationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateEventDestination)
+
+responseCreateOptOutList :: CreateOptOutListResponse -> TestTree
+responseCreateOptOutList =
+  res
+    "CreateOptOutListResponse"
+    "fixture/CreateOptOutListResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateOptOutList)
+
+responseCreatePool :: CreatePoolResponse -> TestTree
+responseCreatePool =
+  res
+    "CreatePoolResponse"
+    "fixture/CreatePoolResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreatePool)
+
+responseDeleteConfigurationSet :: DeleteConfigurationSetResponse -> TestTree
+responseDeleteConfigurationSet =
+  res
+    "DeleteConfigurationSetResponse"
+    "fixture/DeleteConfigurationSetResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteConfigurationSet)
+
+responseDeleteDefaultMessageType :: DeleteDefaultMessageTypeResponse -> TestTree
+responseDeleteDefaultMessageType =
+  res
+    "DeleteDefaultMessageTypeResponse"
+    "fixture/DeleteDefaultMessageTypeResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteDefaultMessageType)
+
+responseDeleteDefaultSenderId :: DeleteDefaultSenderIdResponse -> TestTree
+responseDeleteDefaultSenderId =
+  res
+    "DeleteDefaultSenderIdResponse"
+    "fixture/DeleteDefaultSenderIdResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteDefaultSenderId)
+
+responseDeleteEventDestination :: DeleteEventDestinationResponse -> TestTree
+responseDeleteEventDestination =
+  res
+    "DeleteEventDestinationResponse"
+    "fixture/DeleteEventDestinationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteEventDestination)
+
+responseDeleteKeyword :: DeleteKeywordResponse -> TestTree
+responseDeleteKeyword =
+  res
+    "DeleteKeywordResponse"
+    "fixture/DeleteKeywordResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteKeyword)
+
+responseDeleteOptOutList :: DeleteOptOutListResponse -> TestTree
+responseDeleteOptOutList =
+  res
+    "DeleteOptOutListResponse"
+    "fixture/DeleteOptOutListResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteOptOutList)
+
+responseDeleteOptedOutNumber :: DeleteOptedOutNumberResponse -> TestTree
+responseDeleteOptedOutNumber =
+  res
+    "DeleteOptedOutNumberResponse"
+    "fixture/DeleteOptedOutNumberResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteOptedOutNumber)
+
+responseDeletePool :: DeletePoolResponse -> TestTree
+responseDeletePool =
+  res
+    "DeletePoolResponse"
+    "fixture/DeletePoolResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeletePool)
+
+responseDeleteTextMessageSpendLimitOverride :: DeleteTextMessageSpendLimitOverrideResponse -> TestTree
+responseDeleteTextMessageSpendLimitOverride =
+  res
+    "DeleteTextMessageSpendLimitOverrideResponse"
+    "fixture/DeleteTextMessageSpendLimitOverrideResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteTextMessageSpendLimitOverride)
+
+responseDeleteVoiceMessageSpendLimitOverride :: DeleteVoiceMessageSpendLimitOverrideResponse -> TestTree
+responseDeleteVoiceMessageSpendLimitOverride =
+  res
+    "DeleteVoiceMessageSpendLimitOverrideResponse"
+    "fixture/DeleteVoiceMessageSpendLimitOverrideResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteVoiceMessageSpendLimitOverride)
+
+responseDescribeAccountAttributes :: DescribeAccountAttributesResponse -> TestTree
+responseDescribeAccountAttributes =
+  res
+    "DescribeAccountAttributesResponse"
+    "fixture/DescribeAccountAttributesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeAccountAttributes)
+
+responseDescribeAccountLimits :: DescribeAccountLimitsResponse -> TestTree
+responseDescribeAccountLimits =
+  res
+    "DescribeAccountLimitsResponse"
+    "fixture/DescribeAccountLimitsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeAccountLimits)
+
+responseDescribeConfigurationSets :: DescribeConfigurationSetsResponse -> TestTree
+responseDescribeConfigurationSets =
+  res
+    "DescribeConfigurationSetsResponse"
+    "fixture/DescribeConfigurationSetsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeConfigurationSets)
+
+responseDescribeKeywords :: DescribeKeywordsResponse -> TestTree
+responseDescribeKeywords =
+  res
+    "DescribeKeywordsResponse"
+    "fixture/DescribeKeywordsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeKeywords)
+
+responseDescribeOptOutLists :: DescribeOptOutListsResponse -> TestTree
+responseDescribeOptOutLists =
+  res
+    "DescribeOptOutListsResponse"
+    "fixture/DescribeOptOutListsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeOptOutLists)
+
+responseDescribeOptedOutNumbers :: DescribeOptedOutNumbersResponse -> TestTree
+responseDescribeOptedOutNumbers =
+  res
+    "DescribeOptedOutNumbersResponse"
+    "fixture/DescribeOptedOutNumbersResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeOptedOutNumbers)
+
+responseDescribePhoneNumbers :: DescribePhoneNumbersResponse -> TestTree
+responseDescribePhoneNumbers =
+  res
+    "DescribePhoneNumbersResponse"
+    "fixture/DescribePhoneNumbersResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribePhoneNumbers)
+
+responseDescribePools :: DescribePoolsResponse -> TestTree
+responseDescribePools =
+  res
+    "DescribePoolsResponse"
+    "fixture/DescribePoolsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribePools)
+
+responseDescribeSenderIds :: DescribeSenderIdsResponse -> TestTree
+responseDescribeSenderIds =
+  res
+    "DescribeSenderIdsResponse"
+    "fixture/DescribeSenderIdsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeSenderIds)
+
+responseDescribeSpendLimits :: DescribeSpendLimitsResponse -> TestTree
+responseDescribeSpendLimits =
+  res
+    "DescribeSpendLimitsResponse"
+    "fixture/DescribeSpendLimitsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeSpendLimits)
+
+responseDisassociateOriginationIdentity :: DisassociateOriginationIdentityResponse -> TestTree
+responseDisassociateOriginationIdentity =
+  res
+    "DisassociateOriginationIdentityResponse"
+    "fixture/DisassociateOriginationIdentityResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DisassociateOriginationIdentity)
+
+responseListPoolOriginationIdentities :: ListPoolOriginationIdentitiesResponse -> TestTree
+responseListPoolOriginationIdentities =
+  res
+    "ListPoolOriginationIdentitiesResponse"
+    "fixture/ListPoolOriginationIdentitiesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListPoolOriginationIdentities)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responsePutKeyword :: PutKeywordResponse -> TestTree
+responsePutKeyword =
+  res
+    "PutKeywordResponse"
+    "fixture/PutKeywordResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutKeyword)
+
+responsePutOptedOutNumber :: PutOptedOutNumberResponse -> TestTree
+responsePutOptedOutNumber =
+  res
+    "PutOptedOutNumberResponse"
+    "fixture/PutOptedOutNumberResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutOptedOutNumber)
+
+responseReleasePhoneNumber :: ReleasePhoneNumberResponse -> TestTree
+responseReleasePhoneNumber =
+  res
+    "ReleasePhoneNumberResponse"
+    "fixture/ReleasePhoneNumberResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ReleasePhoneNumber)
+
+responseRequestPhoneNumber :: RequestPhoneNumberResponse -> TestTree
+responseRequestPhoneNumber =
+  res
+    "RequestPhoneNumberResponse"
+    "fixture/RequestPhoneNumberResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy RequestPhoneNumber)
+
+responseSendTextMessage :: SendTextMessageResponse -> TestTree
+responseSendTextMessage =
+  res
+    "SendTextMessageResponse"
+    "fixture/SendTextMessageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy SendTextMessage)
+
+responseSendVoiceMessage :: SendVoiceMessageResponse -> TestTree
+responseSendVoiceMessage =
+  res
+    "SendVoiceMessageResponse"
+    "fixture/SendVoiceMessageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy SendVoiceMessage)
+
+responseSetDefaultMessageType :: SetDefaultMessageTypeResponse -> TestTree
+responseSetDefaultMessageType =
+  res
+    "SetDefaultMessageTypeResponse"
+    "fixture/SetDefaultMessageTypeResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy SetDefaultMessageType)
+
+responseSetDefaultSenderId :: SetDefaultSenderIdResponse -> TestTree
+responseSetDefaultSenderId =
+  res
+    "SetDefaultSenderIdResponse"
+    "fixture/SetDefaultSenderIdResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy SetDefaultSenderId)
+
+responseSetTextMessageSpendLimitOverride :: SetTextMessageSpendLimitOverrideResponse -> TestTree
+responseSetTextMessageSpendLimitOverride =
+  res
+    "SetTextMessageSpendLimitOverrideResponse"
+    "fixture/SetTextMessageSpendLimitOverrideResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy SetTextMessageSpendLimitOverride)
+
+responseSetVoiceMessageSpendLimitOverride :: SetVoiceMessageSpendLimitOverrideResponse -> TestTree
+responseSetVoiceMessageSpendLimitOverride =
+  res
+    "SetVoiceMessageSpendLimitOverrideResponse"
+    "fixture/SetVoiceMessageSpendLimitOverrideResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy SetVoiceMessageSpendLimitOverride)
+
+responseTagResource :: TagResourceResponse -> TestTree
+responseTagResource =
+  res
+    "TagResourceResponse"
+    "fixture/TagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy TagResource)
+
+responseUntagResource :: UntagResourceResponse -> TestTree
+responseUntagResource =
+  res
+    "UntagResourceResponse"
+    "fixture/UntagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UntagResource)
+
+responseUpdateEventDestination :: UpdateEventDestinationResponse -> TestTree
+responseUpdateEventDestination =
+  res
+    "UpdateEventDestinationResponse"
+    "fixture/UpdateEventDestinationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateEventDestination)
+
+responseUpdatePhoneNumber :: UpdatePhoneNumberResponse -> TestTree
+responseUpdatePhoneNumber =
+  res
+    "UpdatePhoneNumberResponse"
+    "fixture/UpdatePhoneNumberResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdatePhoneNumber)
+
+responseUpdatePool :: UpdatePoolResponse -> TestTree
+responseUpdatePool =
+  res
+    "UpdatePoolResponse"
+    "fixture/UpdatePoolResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdatePool)
diff --git a/test/Test/Amazonka/PinpointSmsVoiceV2.hs b/test/Test/Amazonka/PinpointSmsVoiceV2.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/PinpointSmsVoiceV2.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.PinpointSmsVoiceV2
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.PinpointSmsVoiceV2
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/PinpointSmsVoiceV2/Internal.hs b/test/Test/Amazonka/PinpointSmsVoiceV2/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/PinpointSmsVoiceV2/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.PinpointSmsVoiceV2.Internal
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.PinpointSmsVoiceV2.Internal where
