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 Interactive Video Service SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2020-07-14@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-ivs)
+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.IVS](http://hackage.haskell.org/package/amazonka-ivs/docs/Amazonka-IVS.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-ivs` 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-ivs.cabal b/amazonka-ivs.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-ivs.cabal
@@ -0,0 +1,138 @@
+cabal-version:      2.2
+name:               amazonka-ivs
+version:            2.0
+synopsis:           Amazon Interactive Video Service 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 @2020-07-14@ 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.IVS.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.IVS" 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-ivs
+
+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.IVS
+    Amazonka.IVS.BatchGetChannel
+    Amazonka.IVS.BatchGetStreamKey
+    Amazonka.IVS.CreateChannel
+    Amazonka.IVS.CreateRecordingConfiguration
+    Amazonka.IVS.CreateStreamKey
+    Amazonka.IVS.DeleteChannel
+    Amazonka.IVS.DeletePlaybackKeyPair
+    Amazonka.IVS.DeleteRecordingConfiguration
+    Amazonka.IVS.DeleteStreamKey
+    Amazonka.IVS.GetChannel
+    Amazonka.IVS.GetPlaybackKeyPair
+    Amazonka.IVS.GetRecordingConfiguration
+    Amazonka.IVS.GetStream
+    Amazonka.IVS.GetStreamKey
+    Amazonka.IVS.GetStreamSession
+    Amazonka.IVS.ImportPlaybackKeyPair
+    Amazonka.IVS.Lens
+    Amazonka.IVS.ListChannels
+    Amazonka.IVS.ListPlaybackKeyPairs
+    Amazonka.IVS.ListRecordingConfigurations
+    Amazonka.IVS.ListStreamKeys
+    Amazonka.IVS.ListStreams
+    Amazonka.IVS.ListStreamSessions
+    Amazonka.IVS.ListTagsForResource
+    Amazonka.IVS.PutMetadata
+    Amazonka.IVS.StopStream
+    Amazonka.IVS.TagResource
+    Amazonka.IVS.Types
+    Amazonka.IVS.Types.AudioConfiguration
+    Amazonka.IVS.Types.BatchError
+    Amazonka.IVS.Types.Channel
+    Amazonka.IVS.Types.ChannelLatencyMode
+    Amazonka.IVS.Types.ChannelSummary
+    Amazonka.IVS.Types.ChannelType
+    Amazonka.IVS.Types.DestinationConfiguration
+    Amazonka.IVS.Types.IngestConfiguration
+    Amazonka.IVS.Types.PlaybackKeyPair
+    Amazonka.IVS.Types.PlaybackKeyPairSummary
+    Amazonka.IVS.Types.RecordingConfiguration
+    Amazonka.IVS.Types.RecordingConfigurationState
+    Amazonka.IVS.Types.RecordingConfigurationSummary
+    Amazonka.IVS.Types.RecordingMode
+    Amazonka.IVS.Types.S3DestinationConfiguration
+    Amazonka.IVS.Types.Stream
+    Amazonka.IVS.Types.StreamEvent
+    Amazonka.IVS.Types.StreamFilters
+    Amazonka.IVS.Types.StreamHealth
+    Amazonka.IVS.Types.StreamKey
+    Amazonka.IVS.Types.StreamKeySummary
+    Amazonka.IVS.Types.StreamSession
+    Amazonka.IVS.Types.StreamSessionSummary
+    Amazonka.IVS.Types.StreamState
+    Amazonka.IVS.Types.StreamSummary
+    Amazonka.IVS.Types.ThumbnailConfiguration
+    Amazonka.IVS.Types.VideoConfiguration
+    Amazonka.IVS.UntagResource
+    Amazonka.IVS.UpdateChannel
+    Amazonka.IVS.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-ivs-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.IVS
+    Test.Amazonka.IVS
+    Test.Amazonka.IVS.Internal
+
+  build-depends:
+    , amazonka-core         >=2.0 && <2.1
+    , amazonka-ivs
+    , amazonka-test         >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/BatchGetChannel.yaml b/fixture/BatchGetChannel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchGetChannel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/BatchGetChannelResponse.proto b/fixture/BatchGetChannelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchGetChannelResponse.proto
diff --git a/fixture/BatchGetStreamKey.yaml b/fixture/BatchGetStreamKey.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchGetStreamKey.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/BatchGetStreamKeyResponse.proto b/fixture/BatchGetStreamKeyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchGetStreamKeyResponse.proto
diff --git a/fixture/CreateChannel.yaml b/fixture/CreateChannel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateChannel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/CreateChannelResponse.proto b/fixture/CreateChannelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateChannelResponse.proto
diff --git a/fixture/CreateRecordingConfiguration.yaml b/fixture/CreateRecordingConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateRecordingConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/CreateRecordingConfigurationResponse.proto b/fixture/CreateRecordingConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateRecordingConfigurationResponse.proto
diff --git a/fixture/CreateStreamKey.yaml b/fixture/CreateStreamKey.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateStreamKey.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/CreateStreamKeyResponse.proto b/fixture/CreateStreamKeyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateStreamKeyResponse.proto
diff --git a/fixture/DeleteChannel.yaml b/fixture/DeleteChannel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteChannel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/DeleteChannelResponse.proto b/fixture/DeleteChannelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteChannelResponse.proto
diff --git a/fixture/DeletePlaybackKeyPair.yaml b/fixture/DeletePlaybackKeyPair.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeletePlaybackKeyPair.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/DeletePlaybackKeyPairResponse.proto b/fixture/DeletePlaybackKeyPairResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeletePlaybackKeyPairResponse.proto
diff --git a/fixture/DeleteRecordingConfiguration.yaml b/fixture/DeleteRecordingConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRecordingConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/DeleteRecordingConfigurationResponse.proto b/fixture/DeleteRecordingConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRecordingConfigurationResponse.proto
diff --git a/fixture/DeleteStreamKey.yaml b/fixture/DeleteStreamKey.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteStreamKey.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/DeleteStreamKeyResponse.proto b/fixture/DeleteStreamKeyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteStreamKeyResponse.proto
diff --git a/fixture/GetChannel.yaml b/fixture/GetChannel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetChannel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/GetChannelResponse.proto b/fixture/GetChannelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetChannelResponse.proto
diff --git a/fixture/GetPlaybackKeyPair.yaml b/fixture/GetPlaybackKeyPair.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetPlaybackKeyPair.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/GetPlaybackKeyPairResponse.proto b/fixture/GetPlaybackKeyPairResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetPlaybackKeyPairResponse.proto
diff --git a/fixture/GetRecordingConfiguration.yaml b/fixture/GetRecordingConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetRecordingConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/GetRecordingConfigurationResponse.proto b/fixture/GetRecordingConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetRecordingConfigurationResponse.proto
diff --git a/fixture/GetStream.yaml b/fixture/GetStream.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetStream.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/GetStreamKey.yaml b/fixture/GetStreamKey.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetStreamKey.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/GetStreamKeyResponse.proto b/fixture/GetStreamKeyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetStreamKeyResponse.proto
diff --git a/fixture/GetStreamResponse.proto b/fixture/GetStreamResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetStreamResponse.proto
diff --git a/fixture/GetStreamSession.yaml b/fixture/GetStreamSession.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetStreamSession.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/GetStreamSessionResponse.proto b/fixture/GetStreamSessionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetStreamSessionResponse.proto
diff --git a/fixture/ImportPlaybackKeyPair.yaml b/fixture/ImportPlaybackKeyPair.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ImportPlaybackKeyPair.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/ImportPlaybackKeyPairResponse.proto b/fixture/ImportPlaybackKeyPairResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ImportPlaybackKeyPairResponse.proto
diff --git a/fixture/ListChannels.yaml b/fixture/ListChannels.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListChannels.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/ListChannelsResponse.proto b/fixture/ListChannelsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListChannelsResponse.proto
diff --git a/fixture/ListPlaybackKeyPairs.yaml b/fixture/ListPlaybackKeyPairs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListPlaybackKeyPairs.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/ListPlaybackKeyPairsResponse.proto b/fixture/ListPlaybackKeyPairsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListPlaybackKeyPairsResponse.proto
diff --git a/fixture/ListRecordingConfigurations.yaml b/fixture/ListRecordingConfigurations.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListRecordingConfigurations.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/ListRecordingConfigurationsResponse.proto b/fixture/ListRecordingConfigurationsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListRecordingConfigurationsResponse.proto
diff --git a/fixture/ListStreamKeys.yaml b/fixture/ListStreamKeys.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListStreamKeys.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/ListStreamKeysResponse.proto b/fixture/ListStreamKeysResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListStreamKeysResponse.proto
diff --git a/fixture/ListStreamSessions.yaml b/fixture/ListStreamSessions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListStreamSessions.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/ListStreamSessionsResponse.proto b/fixture/ListStreamSessionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListStreamSessionsResponse.proto
diff --git a/fixture/ListStreams.yaml b/fixture/ListStreams.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListStreams.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/ListStreamsResponse.proto b/fixture/ListStreamsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListStreamsResponse.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: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/PutMetadata.yaml b/fixture/PutMetadata.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutMetadata.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/PutMetadataResponse.proto b/fixture/PutMetadataResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutMetadataResponse.proto
diff --git a/fixture/StopStream.yaml b/fixture/StopStream.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StopStream.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/StopStreamResponse.proto b/fixture/StopStreamResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StopStreamResponse.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/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/UpdateChannel.yaml b/fixture/UpdateChannel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateChannel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ivs/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ivs.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/UpdateChannelResponse.proto b/fixture/UpdateChannelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateChannelResponse.proto
diff --git a/gen/Amazonka/IVS.hs b/gen/Amazonka/IVS.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS.hs
@@ -0,0 +1,624 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.IVS
+-- 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 @2020-07-14@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- __Introduction__
+--
+-- The Amazon Interactive Video Service (IVS) API is REST compatible, using
+-- a standard HTTP API and an Amazon Web Services EventBridge event stream
+-- for responses. JSON is used for both requests and responses, including
+-- errors.
+--
+-- The API is an Amazon Web Services regional service. For a list of
+-- supported regions and Amazon IVS HTTPS service endpoints, see the
+-- <https://docs.aws.amazon.com/general/latest/gr/ivs.html Amazon IVS page>
+-- in the /Amazon Web Services General Reference/.
+--
+-- /__All API request parameters and URLs are case sensitive.__/
+--
+-- For a summary of notable documentation changes in each release, see
+-- <https://docs.aws.amazon.com/ivs/latest/userguide/doc-history.html Document History>.
+--
+-- __Allowed Header Values__
+--
+-- -   @ @__@Accept:@__@ @ application\/json
+--
+-- -   @ @__@Accept-Encoding:@__@ @ gzip, deflate
+--
+-- -   @ @__@Content-Type:@__@ @application\/json
+--
+-- __Resources__
+--
+-- The following resources contain information about your IVS live stream
+-- (see
+-- <https://docs.aws.amazon.com/ivs/latest/userguide/getting-started.html Getting Started with Amazon IVS>):
+--
+-- -   Channel — Stores configuration data related to your live stream. You
+--     first create a channel and then use the channel’s stream key to
+--     start your live stream. See the Channel endpoints for more
+--     information.
+--
+-- -   Stream key — An identifier assigned by Amazon IVS when you create a
+--     channel, which is then used to authorize streaming. See the
+--     StreamKey endpoints for more information. /__Treat the stream key
+--     like a secret, since it allows anyone to stream to the channel.__/
+--
+-- -   Playback key pair — Video playback may be restricted using
+--     playback-authorization tokens, which use public-key encryption. A
+--     playback key pair is the public-private pair of keys used to sign
+--     and validate the playback-authorization token. See the
+--     PlaybackKeyPair endpoints for more information.
+--
+-- -   Recording configuration — Stores configuration related to recording
+--     a live stream and where to store the recorded content. Multiple
+--     channels can reference the same recording configuration. See the
+--     Recording Configuration endpoints for more information.
+--
+-- __Tagging__
+--
+-- A /tag/ is a metadata label that you assign to an Amazon Web Services
+-- resource. A tag comprises a /key/ and a /value/, both set by you. For
+-- example, you might set a tag as @topic:nature@ to label a particular
+-- video category. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+--
+-- Tags can help you identify and organize your Amazon Web Services
+-- resources. For example, you can use the same tag for different resources
+-- to indicate that they are related. You can also use tags to manage
+-- access (see
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html Access Tags>).
+--
+-- The Amazon IVS API has these tag-related endpoints: TagResource,
+-- UntagResource, and ListTagsForResource. The following resources support
+-- tagging: Channels, Stream Keys, Playback Key Pairs, and Recording
+-- Configurations.
+--
+-- At most 50 tags can be applied to a resource.
+--
+-- __Authentication versus Authorization__
+--
+-- Note the differences between these concepts:
+--
+-- -   /Authentication/ is about verifying identity. You need to be
+--     authenticated to sign Amazon IVS API requests.
+--
+-- -   /Authorization/ is about granting permissions. Your IAM roles need
+--     to have permissions for Amazon IVS API requests. In addition,
+--     authorization is needed to view
+--     <https://docs.aws.amazon.com/ivs/latest/userguide/private-channels.html Amazon IVS private channels>.
+--     (Private channels are channels that are enabled for \"playback
+--     authorization.\")
+--
+-- __Authentication__
+--
+-- All Amazon IVS API requests must be authenticated with a signature. The
+-- Amazon Web Services Command-Line Interface (CLI) and Amazon IVS Player
+-- SDKs take care of signing the underlying API calls for you. However, if
+-- your application calls the Amazon IVS API directly, it’s your
+-- responsibility to sign the requests.
+--
+-- You generate a signature using valid Amazon Web Services credentials
+-- that have permission to perform the requested action. For example, you
+-- must sign PutMetadata requests with a signature generated from an IAM
+-- user account that has the @ivs:PutMetadata@ permission.
+--
+-- For more information:
+--
+-- -   Authentication and generating signatures — See
+--     <https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html Authenticating Requests (Amazon Web Services Signature Version 4)>
+--     in the /Amazon Web Services General Reference/.
+--
+-- -   Managing Amazon IVS permissions — See
+--     <https://docs.aws.amazon.com/ivs/latest/userguide/security-iam.html Identity and Access Management>
+--     on the Security page of the /Amazon IVS User Guide/.
+--
+-- __Amazon Resource Names (ARNs)__
+--
+-- ARNs uniquely identify AWS resources. An ARN is required when you need
+-- to specify a resource unambiguously across all of AWS, such as in IAM
+-- policies and API calls. For more information, see
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html Amazon Resource Names>
+-- in the /AWS General Reference/.
+--
+-- __Channel Endpoints__
+--
+-- -   CreateChannel — Creates a new channel and an associated stream key
+--     to start streaming.
+--
+-- -   GetChannel — Gets the channel configuration for the specified
+--     channel ARN.
+--
+-- -   BatchGetChannel — Performs GetChannel on multiple ARNs
+--     simultaneously.
+--
+-- -   ListChannels — Gets summary information about all channels in your
+--     account, in the Amazon Web Services region where the API request is
+--     processed. This list can be filtered to match a specified name or
+--     recording-configuration ARN. Filters are mutually exclusive and
+--     cannot be used together. If you try to use both filters, you will
+--     get an error (409 Conflict Exception).
+--
+-- -   UpdateChannel — Updates a channel\'s configuration. This does not
+--     affect an ongoing stream of this channel. You must stop and restart
+--     the stream for the changes to take effect.
+--
+-- -   DeleteChannel — Deletes the specified channel.
+--
+-- __StreamKey Endpoints__
+--
+-- -   CreateStreamKey — Creates a stream key, used to initiate a stream,
+--     for the specified channel ARN.
+--
+-- -   GetStreamKey — Gets stream key information for the specified ARN.
+--
+-- -   BatchGetStreamKey — Performs GetStreamKey on multiple ARNs
+--     simultaneously.
+--
+-- -   ListStreamKeys — Gets summary information about stream keys for the
+--     specified channel.
+--
+-- -   DeleteStreamKey — Deletes the stream key for the specified ARN, so
+--     it can no longer be used to stream.
+--
+-- __Stream Endpoints__
+--
+-- -   GetStream — Gets information about the active (live) stream on a
+--     specified channel.
+--
+-- -   GetStreamSession — Gets metadata on a specified stream.
+--
+-- -   ListStreams — Gets summary information about live streams in your
+--     account, in the Amazon Web Services region where the API request is
+--     processed.
+--
+-- -   ListStreamSessions — Gets a summary of current and previous streams
+--     for a specified channel in your account, in the AWS region where the
+--     API request is processed.
+--
+-- -   StopStream — Disconnects the incoming RTMPS stream for the specified
+--     channel. Can be used in conjunction with DeleteStreamKey to prevent
+--     further streaming to a channel.
+--
+-- -   PutMetadata — Inserts metadata into the active stream of the
+--     specified channel. At most 5 requests per second per channel are
+--     allowed, each with a maximum 1 KB payload. (If 5 TPS is not
+--     sufficient for your needs, we recommend batching your data into a
+--     single PutMetadata call.) At most 155 requests per second per
+--     account are allowed.
+--
+-- __PlaybackKeyPair Endpoints__
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/ivs/latest/userguide/private-channels.html Setting Up Private Channels>
+-- in the /Amazon IVS User Guide/.
+--
+-- -   ImportPlaybackKeyPair — Imports the public portion of a new key pair
+--     and returns its @arn@ and @fingerprint@. The @privateKey@ can then
+--     be used to generate viewer authorization tokens, to grant viewers
+--     access to private channels (channels enabled for playback
+--     authorization).
+--
+-- -   GetPlaybackKeyPair — Gets a specified playback authorization key
+--     pair and returns the @arn@ and @fingerprint@. The @privateKey@ held
+--     by the caller can be used to generate viewer authorization tokens,
+--     to grant viewers access to private channels.
+--
+-- -   ListPlaybackKeyPairs — Gets summary information about playback key
+--     pairs.
+--
+-- -   DeletePlaybackKeyPair — Deletes a specified authorization key pair.
+--     This invalidates future viewer tokens generated using the key pair’s
+--     @privateKey@.
+--
+-- __RecordingConfiguration Endpoints__
+--
+-- -   CreateRecordingConfiguration — Creates a new recording
+--     configuration, used to enable recording to Amazon S3.
+--
+-- -   GetRecordingConfiguration — Gets the recording-configuration
+--     metadata for the specified ARN.
+--
+-- -   ListRecordingConfigurations — Gets summary information about all
+--     recording configurations in your account, in the Amazon Web Services
+--     region where the API request is processed.
+--
+-- -   DeleteRecordingConfiguration — Deletes the recording configuration
+--     for the specified ARN.
+--
+-- __Amazon Web Services Tags Endpoints__
+--
+-- -   TagResource — Adds or updates tags for the Amazon Web Services
+--     resource with the specified ARN.
+--
+-- -   UntagResource — Removes tags from the resource with the specified
+--     ARN.
+--
+-- -   ListTagsForResource — Gets information about Amazon Web Services
+--     tags for the specified ARN.
+module Amazonka.IVS
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** AccessDeniedException
+    _AccessDeniedException,
+
+    -- ** ChannelNotBroadcasting
+    _ChannelNotBroadcasting,
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** InternalServerException
+    _InternalServerException,
+
+    -- ** PendingVerification
+    _PendingVerification,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ServiceQuotaExceededException
+    _ServiceQuotaExceededException,
+
+    -- ** StreamUnavailable
+    _StreamUnavailable,
+
+    -- ** ThrottlingException
+    _ThrottlingException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** BatchGetChannel
+    BatchGetChannel (BatchGetChannel'),
+    newBatchGetChannel,
+    BatchGetChannelResponse (BatchGetChannelResponse'),
+    newBatchGetChannelResponse,
+
+    -- ** BatchGetStreamKey
+    BatchGetStreamKey (BatchGetStreamKey'),
+    newBatchGetStreamKey,
+    BatchGetStreamKeyResponse (BatchGetStreamKeyResponse'),
+    newBatchGetStreamKeyResponse,
+
+    -- ** CreateChannel
+    CreateChannel (CreateChannel'),
+    newCreateChannel,
+    CreateChannelResponse (CreateChannelResponse'),
+    newCreateChannelResponse,
+
+    -- ** CreateRecordingConfiguration
+    CreateRecordingConfiguration (CreateRecordingConfiguration'),
+    newCreateRecordingConfiguration,
+    CreateRecordingConfigurationResponse (CreateRecordingConfigurationResponse'),
+    newCreateRecordingConfigurationResponse,
+
+    -- ** CreateStreamKey
+    CreateStreamKey (CreateStreamKey'),
+    newCreateStreamKey,
+    CreateStreamKeyResponse (CreateStreamKeyResponse'),
+    newCreateStreamKeyResponse,
+
+    -- ** DeleteChannel
+    DeleteChannel (DeleteChannel'),
+    newDeleteChannel,
+    DeleteChannelResponse (DeleteChannelResponse'),
+    newDeleteChannelResponse,
+
+    -- ** DeletePlaybackKeyPair
+    DeletePlaybackKeyPair (DeletePlaybackKeyPair'),
+    newDeletePlaybackKeyPair,
+    DeletePlaybackKeyPairResponse (DeletePlaybackKeyPairResponse'),
+    newDeletePlaybackKeyPairResponse,
+
+    -- ** DeleteRecordingConfiguration
+    DeleteRecordingConfiguration (DeleteRecordingConfiguration'),
+    newDeleteRecordingConfiguration,
+    DeleteRecordingConfigurationResponse (DeleteRecordingConfigurationResponse'),
+    newDeleteRecordingConfigurationResponse,
+
+    -- ** DeleteStreamKey
+    DeleteStreamKey (DeleteStreamKey'),
+    newDeleteStreamKey,
+    DeleteStreamKeyResponse (DeleteStreamKeyResponse'),
+    newDeleteStreamKeyResponse,
+
+    -- ** GetChannel
+    GetChannel (GetChannel'),
+    newGetChannel,
+    GetChannelResponse (GetChannelResponse'),
+    newGetChannelResponse,
+
+    -- ** GetPlaybackKeyPair
+    GetPlaybackKeyPair (GetPlaybackKeyPair'),
+    newGetPlaybackKeyPair,
+    GetPlaybackKeyPairResponse (GetPlaybackKeyPairResponse'),
+    newGetPlaybackKeyPairResponse,
+
+    -- ** GetRecordingConfiguration
+    GetRecordingConfiguration (GetRecordingConfiguration'),
+    newGetRecordingConfiguration,
+    GetRecordingConfigurationResponse (GetRecordingConfigurationResponse'),
+    newGetRecordingConfigurationResponse,
+
+    -- ** GetStream
+    GetStream (GetStream'),
+    newGetStream,
+    GetStreamResponse (GetStreamResponse'),
+    newGetStreamResponse,
+
+    -- ** GetStreamKey
+    GetStreamKey (GetStreamKey'),
+    newGetStreamKey,
+    GetStreamKeyResponse (GetStreamKeyResponse'),
+    newGetStreamKeyResponse,
+
+    -- ** GetStreamSession
+    GetStreamSession (GetStreamSession'),
+    newGetStreamSession,
+    GetStreamSessionResponse (GetStreamSessionResponse'),
+    newGetStreamSessionResponse,
+
+    -- ** ImportPlaybackKeyPair
+    ImportPlaybackKeyPair (ImportPlaybackKeyPair'),
+    newImportPlaybackKeyPair,
+    ImportPlaybackKeyPairResponse (ImportPlaybackKeyPairResponse'),
+    newImportPlaybackKeyPairResponse,
+
+    -- ** ListChannels (Paginated)
+    ListChannels (ListChannels'),
+    newListChannels,
+    ListChannelsResponse (ListChannelsResponse'),
+    newListChannelsResponse,
+
+    -- ** ListPlaybackKeyPairs (Paginated)
+    ListPlaybackKeyPairs (ListPlaybackKeyPairs'),
+    newListPlaybackKeyPairs,
+    ListPlaybackKeyPairsResponse (ListPlaybackKeyPairsResponse'),
+    newListPlaybackKeyPairsResponse,
+
+    -- ** ListRecordingConfigurations (Paginated)
+    ListRecordingConfigurations (ListRecordingConfigurations'),
+    newListRecordingConfigurations,
+    ListRecordingConfigurationsResponse (ListRecordingConfigurationsResponse'),
+    newListRecordingConfigurationsResponse,
+
+    -- ** ListStreamKeys (Paginated)
+    ListStreamKeys (ListStreamKeys'),
+    newListStreamKeys,
+    ListStreamKeysResponse (ListStreamKeysResponse'),
+    newListStreamKeysResponse,
+
+    -- ** ListStreamSessions
+    ListStreamSessions (ListStreamSessions'),
+    newListStreamSessions,
+    ListStreamSessionsResponse (ListStreamSessionsResponse'),
+    newListStreamSessionsResponse,
+
+    -- ** ListStreams (Paginated)
+    ListStreams (ListStreams'),
+    newListStreams,
+    ListStreamsResponse (ListStreamsResponse'),
+    newListStreamsResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** PutMetadata
+    PutMetadata (PutMetadata'),
+    newPutMetadata,
+    PutMetadataResponse (PutMetadataResponse'),
+    newPutMetadataResponse,
+
+    -- ** StopStream
+    StopStream (StopStream'),
+    newStopStream,
+    StopStreamResponse (StopStreamResponse'),
+    newStopStreamResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateChannel
+    UpdateChannel (UpdateChannel'),
+    newUpdateChannel,
+    UpdateChannelResponse (UpdateChannelResponse'),
+    newUpdateChannelResponse,
+
+    -- * Types
+
+    -- ** ChannelLatencyMode
+    ChannelLatencyMode (..),
+
+    -- ** ChannelType
+    ChannelType (..),
+
+    -- ** RecordingConfigurationState
+    RecordingConfigurationState (..),
+
+    -- ** RecordingMode
+    RecordingMode (..),
+
+    -- ** StreamHealth
+    StreamHealth (..),
+
+    -- ** StreamState
+    StreamState (..),
+
+    -- ** AudioConfiguration
+    AudioConfiguration (AudioConfiguration'),
+    newAudioConfiguration,
+
+    -- ** BatchError
+    BatchError (BatchError'),
+    newBatchError,
+
+    -- ** Channel
+    Channel (Channel'),
+    newChannel,
+
+    -- ** ChannelSummary
+    ChannelSummary (ChannelSummary'),
+    newChannelSummary,
+
+    -- ** DestinationConfiguration
+    DestinationConfiguration (DestinationConfiguration'),
+    newDestinationConfiguration,
+
+    -- ** IngestConfiguration
+    IngestConfiguration (IngestConfiguration'),
+    newIngestConfiguration,
+
+    -- ** PlaybackKeyPair
+    PlaybackKeyPair (PlaybackKeyPair'),
+    newPlaybackKeyPair,
+
+    -- ** PlaybackKeyPairSummary
+    PlaybackKeyPairSummary (PlaybackKeyPairSummary'),
+    newPlaybackKeyPairSummary,
+
+    -- ** RecordingConfiguration
+    RecordingConfiguration (RecordingConfiguration'),
+    newRecordingConfiguration,
+
+    -- ** RecordingConfigurationSummary
+    RecordingConfigurationSummary (RecordingConfigurationSummary'),
+    newRecordingConfigurationSummary,
+
+    -- ** S3DestinationConfiguration
+    S3DestinationConfiguration (S3DestinationConfiguration'),
+    newS3DestinationConfiguration,
+
+    -- ** Stream
+    Stream (Stream'),
+    newStream,
+
+    -- ** StreamEvent
+    StreamEvent (StreamEvent'),
+    newStreamEvent,
+
+    -- ** StreamFilters
+    StreamFilters (StreamFilters'),
+    newStreamFilters,
+
+    -- ** StreamKey
+    StreamKey (StreamKey'),
+    newStreamKey,
+
+    -- ** StreamKeySummary
+    StreamKeySummary (StreamKeySummary'),
+    newStreamKeySummary,
+
+    -- ** StreamSession
+    StreamSession (StreamSession'),
+    newStreamSession,
+
+    -- ** StreamSessionSummary
+    StreamSessionSummary (StreamSessionSummary'),
+    newStreamSessionSummary,
+
+    -- ** StreamSummary
+    StreamSummary (StreamSummary'),
+    newStreamSummary,
+
+    -- ** ThumbnailConfiguration
+    ThumbnailConfiguration (ThumbnailConfiguration'),
+    newThumbnailConfiguration,
+
+    -- ** VideoConfiguration
+    VideoConfiguration (VideoConfiguration'),
+    newVideoConfiguration,
+  )
+where
+
+import Amazonka.IVS.BatchGetChannel
+import Amazonka.IVS.BatchGetStreamKey
+import Amazonka.IVS.CreateChannel
+import Amazonka.IVS.CreateRecordingConfiguration
+import Amazonka.IVS.CreateStreamKey
+import Amazonka.IVS.DeleteChannel
+import Amazonka.IVS.DeletePlaybackKeyPair
+import Amazonka.IVS.DeleteRecordingConfiguration
+import Amazonka.IVS.DeleteStreamKey
+import Amazonka.IVS.GetChannel
+import Amazonka.IVS.GetPlaybackKeyPair
+import Amazonka.IVS.GetRecordingConfiguration
+import Amazonka.IVS.GetStream
+import Amazonka.IVS.GetStreamKey
+import Amazonka.IVS.GetStreamSession
+import Amazonka.IVS.ImportPlaybackKeyPair
+import Amazonka.IVS.Lens
+import Amazonka.IVS.ListChannels
+import Amazonka.IVS.ListPlaybackKeyPairs
+import Amazonka.IVS.ListRecordingConfigurations
+import Amazonka.IVS.ListStreamKeys
+import Amazonka.IVS.ListStreamSessions
+import Amazonka.IVS.ListStreams
+import Amazonka.IVS.ListTagsForResource
+import Amazonka.IVS.PutMetadata
+import Amazonka.IVS.StopStream
+import Amazonka.IVS.TagResource
+import Amazonka.IVS.Types
+import Amazonka.IVS.UntagResource
+import Amazonka.IVS.UpdateChannel
+import Amazonka.IVS.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 'IVS'.
+
+-- $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/IVS/BatchGetChannel.hs b/gen/Amazonka/IVS/BatchGetChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/BatchGetChannel.hs
@@ -0,0 +1,174 @@
+{-# 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.IVS.BatchGetChannel
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Performs GetChannel on multiple ARNs simultaneously.
+module Amazonka.IVS.BatchGetChannel
+  ( -- * Creating a Request
+    BatchGetChannel (..),
+    newBatchGetChannel,
+
+    -- * Request Lenses
+    batchGetChannel_arns,
+
+    -- * Destructuring the Response
+    BatchGetChannelResponse (..),
+    newBatchGetChannelResponse,
+
+    -- * Response Lenses
+    batchGetChannelResponse_channels,
+    batchGetChannelResponse_errors,
+    batchGetChannelResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchGetChannel' smart constructor.
+data BatchGetChannel = BatchGetChannel'
+  { -- | Array of ARNs, one per channel.
+    arns :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetChannel' 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:
+--
+-- 'arns', 'batchGetChannel_arns' - Array of ARNs, one per channel.
+newBatchGetChannel ::
+  -- | 'arns'
+  Prelude.NonEmpty Prelude.Text ->
+  BatchGetChannel
+newBatchGetChannel pArns_ =
+  BatchGetChannel' {arns = Lens.coerced Lens.# pArns_}
+
+-- | Array of ARNs, one per channel.
+batchGetChannel_arns :: Lens.Lens' BatchGetChannel (Prelude.NonEmpty Prelude.Text)
+batchGetChannel_arns = Lens.lens (\BatchGetChannel' {arns} -> arns) (\s@BatchGetChannel' {} a -> s {arns = a} :: BatchGetChannel) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchGetChannel where
+  type
+    AWSResponse BatchGetChannel =
+      BatchGetChannelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchGetChannelResponse'
+            Prelude.<$> (x Data..?> "channels" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "errors" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable BatchGetChannel where
+  hashWithSalt _salt BatchGetChannel' {..} =
+    _salt `Prelude.hashWithSalt` arns
+
+instance Prelude.NFData BatchGetChannel where
+  rnf BatchGetChannel' {..} = Prelude.rnf arns
+
+instance Data.ToHeaders BatchGetChannel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchGetChannel where
+  toJSON BatchGetChannel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("arns" Data..= arns)]
+      )
+
+instance Data.ToPath BatchGetChannel where
+  toPath = Prelude.const "/BatchGetChannel"
+
+instance Data.ToQuery BatchGetChannel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchGetChannelResponse' smart constructor.
+data BatchGetChannelResponse = BatchGetChannelResponse'
+  { channels :: Prelude.Maybe [Channel],
+    -- | Each error object is related to a specific ARN in the request.
+    errors :: Prelude.Maybe [BatchError],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetChannelResponse' 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:
+--
+-- 'channels', 'batchGetChannelResponse_channels' -
+--
+-- 'errors', 'batchGetChannelResponse_errors' - Each error object is related to a specific ARN in the request.
+--
+-- 'httpStatus', 'batchGetChannelResponse_httpStatus' - The response's http status code.
+newBatchGetChannelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchGetChannelResponse
+newBatchGetChannelResponse pHttpStatus_ =
+  BatchGetChannelResponse'
+    { channels =
+        Prelude.Nothing,
+      errors = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+batchGetChannelResponse_channels :: Lens.Lens' BatchGetChannelResponse (Prelude.Maybe [Channel])
+batchGetChannelResponse_channels = Lens.lens (\BatchGetChannelResponse' {channels} -> channels) (\s@BatchGetChannelResponse' {} a -> s {channels = a} :: BatchGetChannelResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Each error object is related to a specific ARN in the request.
+batchGetChannelResponse_errors :: Lens.Lens' BatchGetChannelResponse (Prelude.Maybe [BatchError])
+batchGetChannelResponse_errors = Lens.lens (\BatchGetChannelResponse' {errors} -> errors) (\s@BatchGetChannelResponse' {} a -> s {errors = a} :: BatchGetChannelResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchGetChannelResponse_httpStatus :: Lens.Lens' BatchGetChannelResponse Prelude.Int
+batchGetChannelResponse_httpStatus = Lens.lens (\BatchGetChannelResponse' {httpStatus} -> httpStatus) (\s@BatchGetChannelResponse' {} a -> s {httpStatus = a} :: BatchGetChannelResponse)
+
+instance Prelude.NFData BatchGetChannelResponse where
+  rnf BatchGetChannelResponse' {..} =
+    Prelude.rnf channels
+      `Prelude.seq` Prelude.rnf errors
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IVS/BatchGetStreamKey.hs b/gen/Amazonka/IVS/BatchGetStreamKey.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/BatchGetStreamKey.hs
@@ -0,0 +1,175 @@
+{-# 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.IVS.BatchGetStreamKey
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Performs GetStreamKey on multiple ARNs simultaneously.
+module Amazonka.IVS.BatchGetStreamKey
+  ( -- * Creating a Request
+    BatchGetStreamKey (..),
+    newBatchGetStreamKey,
+
+    -- * Request Lenses
+    batchGetStreamKey_arns,
+
+    -- * Destructuring the Response
+    BatchGetStreamKeyResponse (..),
+    newBatchGetStreamKeyResponse,
+
+    -- * Response Lenses
+    batchGetStreamKeyResponse_errors,
+    batchGetStreamKeyResponse_streamKeys,
+    batchGetStreamKeyResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchGetStreamKey' smart constructor.
+data BatchGetStreamKey = BatchGetStreamKey'
+  { -- | Array of ARNs, one per channel.
+    arns :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetStreamKey' 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:
+--
+-- 'arns', 'batchGetStreamKey_arns' - Array of ARNs, one per channel.
+newBatchGetStreamKey ::
+  -- | 'arns'
+  Prelude.NonEmpty Prelude.Text ->
+  BatchGetStreamKey
+newBatchGetStreamKey pArns_ =
+  BatchGetStreamKey'
+    { arns =
+        Lens.coerced Lens.# pArns_
+    }
+
+-- | Array of ARNs, one per channel.
+batchGetStreamKey_arns :: Lens.Lens' BatchGetStreamKey (Prelude.NonEmpty Prelude.Text)
+batchGetStreamKey_arns = Lens.lens (\BatchGetStreamKey' {arns} -> arns) (\s@BatchGetStreamKey' {} a -> s {arns = a} :: BatchGetStreamKey) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchGetStreamKey where
+  type
+    AWSResponse BatchGetStreamKey =
+      BatchGetStreamKeyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchGetStreamKeyResponse'
+            Prelude.<$> (x Data..?> "errors" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "streamKeys" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable BatchGetStreamKey where
+  hashWithSalt _salt BatchGetStreamKey' {..} =
+    _salt `Prelude.hashWithSalt` arns
+
+instance Prelude.NFData BatchGetStreamKey where
+  rnf BatchGetStreamKey' {..} = Prelude.rnf arns
+
+instance Data.ToHeaders BatchGetStreamKey where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchGetStreamKey where
+  toJSON BatchGetStreamKey' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("arns" Data..= arns)]
+      )
+
+instance Data.ToPath BatchGetStreamKey where
+  toPath = Prelude.const "/BatchGetStreamKey"
+
+instance Data.ToQuery BatchGetStreamKey where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchGetStreamKeyResponse' smart constructor.
+data BatchGetStreamKeyResponse = BatchGetStreamKeyResponse'
+  { errors :: Prelude.Maybe [BatchError],
+    streamKeys :: Prelude.Maybe [StreamKey],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetStreamKeyResponse' 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:
+--
+-- 'errors', 'batchGetStreamKeyResponse_errors' -
+--
+-- 'streamKeys', 'batchGetStreamKeyResponse_streamKeys' -
+--
+-- 'httpStatus', 'batchGetStreamKeyResponse_httpStatus' - The response's http status code.
+newBatchGetStreamKeyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchGetStreamKeyResponse
+newBatchGetStreamKeyResponse pHttpStatus_ =
+  BatchGetStreamKeyResponse'
+    { errors =
+        Prelude.Nothing,
+      streamKeys = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+batchGetStreamKeyResponse_errors :: Lens.Lens' BatchGetStreamKeyResponse (Prelude.Maybe [BatchError])
+batchGetStreamKeyResponse_errors = Lens.lens (\BatchGetStreamKeyResponse' {errors} -> errors) (\s@BatchGetStreamKeyResponse' {} a -> s {errors = a} :: BatchGetStreamKeyResponse) Prelude.. Lens.mapping Lens.coerced
+
+batchGetStreamKeyResponse_streamKeys :: Lens.Lens' BatchGetStreamKeyResponse (Prelude.Maybe [StreamKey])
+batchGetStreamKeyResponse_streamKeys = Lens.lens (\BatchGetStreamKeyResponse' {streamKeys} -> streamKeys) (\s@BatchGetStreamKeyResponse' {} a -> s {streamKeys = a} :: BatchGetStreamKeyResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchGetStreamKeyResponse_httpStatus :: Lens.Lens' BatchGetStreamKeyResponse Prelude.Int
+batchGetStreamKeyResponse_httpStatus = Lens.lens (\BatchGetStreamKeyResponse' {httpStatus} -> httpStatus) (\s@BatchGetStreamKeyResponse' {} a -> s {httpStatus = a} :: BatchGetStreamKeyResponse)
+
+instance Prelude.NFData BatchGetStreamKeyResponse where
+  rnf BatchGetStreamKeyResponse' {..} =
+    Prelude.rnf errors
+      `Prelude.seq` Prelude.rnf streamKeys
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IVS/CreateChannel.hs b/gen/Amazonka/IVS/CreateChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/CreateChannel.hs
@@ -0,0 +1,315 @@
+{-# 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.IVS.CreateChannel
+-- 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 channel and an associated stream key to start streaming.
+module Amazonka.IVS.CreateChannel
+  ( -- * Creating a Request
+    CreateChannel (..),
+    newCreateChannel,
+
+    -- * Request Lenses
+    createChannel_authorized,
+    createChannel_latencyMode,
+    createChannel_name,
+    createChannel_recordingConfigurationArn,
+    createChannel_tags,
+    createChannel_type,
+
+    -- * Destructuring the Response
+    CreateChannelResponse (..),
+    newCreateChannelResponse,
+
+    -- * Response Lenses
+    createChannelResponse_channel,
+    createChannelResponse_streamKey,
+    createChannelResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateChannel' smart constructor.
+data CreateChannel = CreateChannel'
+  { -- | Whether the channel is private (enabled for playback authorization).
+    -- Default: @false@.
+    authorized :: Prelude.Maybe Prelude.Bool,
+    -- | Channel latency mode. Use @NORMAL@ to broadcast and deliver live video
+    -- up to Full HD. Use @LOW@ for near-real-time interaction with viewers.
+    -- (Note: In the Amazon IVS console, @LOW@ and @NORMAL@ correspond to
+    -- Ultra-low and Standard, respectively.) Default: @LOW@.
+    latencyMode :: Prelude.Maybe ChannelLatencyMode,
+    -- | Channel name.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Recording-configuration ARN. Default: \"\" (empty string, recording is
+    -- disabled).
+    recordingConfigurationArn :: Prelude.Maybe Prelude.Text,
+    -- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+    -- for more information, including restrictions that apply to tags and
+    -- \"Tag naming limits and requirements\"; Amazon IVS has no
+    -- service-specific constraints beyond what is documented there.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Channel type, which determines the allowable resolution and bitrate. /If
+    -- you exceed the allowable resolution or bitrate, the stream probably will
+    -- disconnect immediately./ Default: @STANDARD@. Valid values:
+    --
+    -- -   @STANDARD@: Video is transcoded: multiple qualities are generated
+    --     from the original input, to automatically give viewers the best
+    --     experience for their devices and network conditions. Transcoding
+    --     allows higher playback quality across a range of download speeds.
+    --     Resolution can be up to 1080p and bitrate can be up to 8.5 Mbps.
+    --     Audio is transcoded only for renditions 360p and below; above that,
+    --     audio is passed through. This is the default.
+    --
+    -- -   @BASIC@: Video is transmuxed: Amazon IVS delivers the original input
+    --     to viewers. The viewer’s video-quality choice is limited to the
+    --     original input. Resolution can be up to 1080p and bitrate can be up
+    --     to 1.5 Mbps for 480p and up to 3.5 Mbps for resolutions between 480p
+    --     and 1080p.
+    type' :: Prelude.Maybe ChannelType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateChannel' 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:
+--
+-- 'authorized', 'createChannel_authorized' - Whether the channel is private (enabled for playback authorization).
+-- Default: @false@.
+--
+-- 'latencyMode', 'createChannel_latencyMode' - Channel latency mode. Use @NORMAL@ to broadcast and deliver live video
+-- up to Full HD. Use @LOW@ for near-real-time interaction with viewers.
+-- (Note: In the Amazon IVS console, @LOW@ and @NORMAL@ correspond to
+-- Ultra-low and Standard, respectively.) Default: @LOW@.
+--
+-- 'name', 'createChannel_name' - Channel name.
+--
+-- 'recordingConfigurationArn', 'createChannel_recordingConfigurationArn' - Recording-configuration ARN. Default: \"\" (empty string, recording is
+-- disabled).
+--
+-- 'tags', 'createChannel_tags' - Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+--
+-- 'type'', 'createChannel_type' - Channel type, which determines the allowable resolution and bitrate. /If
+-- you exceed the allowable resolution or bitrate, the stream probably will
+-- disconnect immediately./ Default: @STANDARD@. Valid values:
+--
+-- -   @STANDARD@: Video is transcoded: multiple qualities are generated
+--     from the original input, to automatically give viewers the best
+--     experience for their devices and network conditions. Transcoding
+--     allows higher playback quality across a range of download speeds.
+--     Resolution can be up to 1080p and bitrate can be up to 8.5 Mbps.
+--     Audio is transcoded only for renditions 360p and below; above that,
+--     audio is passed through. This is the default.
+--
+-- -   @BASIC@: Video is transmuxed: Amazon IVS delivers the original input
+--     to viewers. The viewer’s video-quality choice is limited to the
+--     original input. Resolution can be up to 1080p and bitrate can be up
+--     to 1.5 Mbps for 480p and up to 3.5 Mbps for resolutions between 480p
+--     and 1080p.
+newCreateChannel ::
+  CreateChannel
+newCreateChannel =
+  CreateChannel'
+    { authorized = Prelude.Nothing,
+      latencyMode = Prelude.Nothing,
+      name = Prelude.Nothing,
+      recordingConfigurationArn = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      type' = Prelude.Nothing
+    }
+
+-- | Whether the channel is private (enabled for playback authorization).
+-- Default: @false@.
+createChannel_authorized :: Lens.Lens' CreateChannel (Prelude.Maybe Prelude.Bool)
+createChannel_authorized = Lens.lens (\CreateChannel' {authorized} -> authorized) (\s@CreateChannel' {} a -> s {authorized = a} :: CreateChannel)
+
+-- | Channel latency mode. Use @NORMAL@ to broadcast and deliver live video
+-- up to Full HD. Use @LOW@ for near-real-time interaction with viewers.
+-- (Note: In the Amazon IVS console, @LOW@ and @NORMAL@ correspond to
+-- Ultra-low and Standard, respectively.) Default: @LOW@.
+createChannel_latencyMode :: Lens.Lens' CreateChannel (Prelude.Maybe ChannelLatencyMode)
+createChannel_latencyMode = Lens.lens (\CreateChannel' {latencyMode} -> latencyMode) (\s@CreateChannel' {} a -> s {latencyMode = a} :: CreateChannel)
+
+-- | Channel name.
+createChannel_name :: Lens.Lens' CreateChannel (Prelude.Maybe Prelude.Text)
+createChannel_name = Lens.lens (\CreateChannel' {name} -> name) (\s@CreateChannel' {} a -> s {name = a} :: CreateChannel)
+
+-- | Recording-configuration ARN. Default: \"\" (empty string, recording is
+-- disabled).
+createChannel_recordingConfigurationArn :: Lens.Lens' CreateChannel (Prelude.Maybe Prelude.Text)
+createChannel_recordingConfigurationArn = Lens.lens (\CreateChannel' {recordingConfigurationArn} -> recordingConfigurationArn) (\s@CreateChannel' {} a -> s {recordingConfigurationArn = a} :: CreateChannel)
+
+-- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+createChannel_tags :: Lens.Lens' CreateChannel (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createChannel_tags = Lens.lens (\CreateChannel' {tags} -> tags) (\s@CreateChannel' {} a -> s {tags = a} :: CreateChannel) Prelude.. Lens.mapping Lens.coerced
+
+-- | Channel type, which determines the allowable resolution and bitrate. /If
+-- you exceed the allowable resolution or bitrate, the stream probably will
+-- disconnect immediately./ Default: @STANDARD@. Valid values:
+--
+-- -   @STANDARD@: Video is transcoded: multiple qualities are generated
+--     from the original input, to automatically give viewers the best
+--     experience for their devices and network conditions. Transcoding
+--     allows higher playback quality across a range of download speeds.
+--     Resolution can be up to 1080p and bitrate can be up to 8.5 Mbps.
+--     Audio is transcoded only for renditions 360p and below; above that,
+--     audio is passed through. This is the default.
+--
+-- -   @BASIC@: Video is transmuxed: Amazon IVS delivers the original input
+--     to viewers. The viewer’s video-quality choice is limited to the
+--     original input. Resolution can be up to 1080p and bitrate can be up
+--     to 1.5 Mbps for 480p and up to 3.5 Mbps for resolutions between 480p
+--     and 1080p.
+createChannel_type :: Lens.Lens' CreateChannel (Prelude.Maybe ChannelType)
+createChannel_type = Lens.lens (\CreateChannel' {type'} -> type') (\s@CreateChannel' {} a -> s {type' = a} :: CreateChannel)
+
+instance Core.AWSRequest CreateChannel where
+  type
+    AWSResponse CreateChannel =
+      CreateChannelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateChannelResponse'
+            Prelude.<$> (x Data..?> "channel")
+            Prelude.<*> (x Data..?> "streamKey")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateChannel where
+  hashWithSalt _salt CreateChannel' {..} =
+    _salt
+      `Prelude.hashWithSalt` authorized
+      `Prelude.hashWithSalt` latencyMode
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` recordingConfigurationArn
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData CreateChannel where
+  rnf CreateChannel' {..} =
+    Prelude.rnf authorized
+      `Prelude.seq` Prelude.rnf latencyMode
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf recordingConfigurationArn
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToHeaders CreateChannel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateChannel where
+  toJSON CreateChannel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("authorized" Data..=) Prelude.<$> authorized,
+            ("latencyMode" Data..=) Prelude.<$> latencyMode,
+            ("name" Data..=) Prelude.<$> name,
+            ("recordingConfigurationArn" Data..=)
+              Prelude.<$> recordingConfigurationArn,
+            ("tags" Data..=) Prelude.<$> tags,
+            ("type" Data..=) Prelude.<$> type'
+          ]
+      )
+
+instance Data.ToPath CreateChannel where
+  toPath = Prelude.const "/CreateChannel"
+
+instance Data.ToQuery CreateChannel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateChannelResponse' smart constructor.
+data CreateChannelResponse = CreateChannelResponse'
+  { channel :: Prelude.Maybe Channel,
+    streamKey :: Prelude.Maybe StreamKey,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateChannelResponse' 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:
+--
+-- 'channel', 'createChannelResponse_channel' -
+--
+-- 'streamKey', 'createChannelResponse_streamKey' -
+--
+-- 'httpStatus', 'createChannelResponse_httpStatus' - The response's http status code.
+newCreateChannelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateChannelResponse
+newCreateChannelResponse pHttpStatus_ =
+  CreateChannelResponse'
+    { channel = Prelude.Nothing,
+      streamKey = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+createChannelResponse_channel :: Lens.Lens' CreateChannelResponse (Prelude.Maybe Channel)
+createChannelResponse_channel = Lens.lens (\CreateChannelResponse' {channel} -> channel) (\s@CreateChannelResponse' {} a -> s {channel = a} :: CreateChannelResponse)
+
+createChannelResponse_streamKey :: Lens.Lens' CreateChannelResponse (Prelude.Maybe StreamKey)
+createChannelResponse_streamKey = Lens.lens (\CreateChannelResponse' {streamKey} -> streamKey) (\s@CreateChannelResponse' {} a -> s {streamKey = a} :: CreateChannelResponse)
+
+-- | The response's http status code.
+createChannelResponse_httpStatus :: Lens.Lens' CreateChannelResponse Prelude.Int
+createChannelResponse_httpStatus = Lens.lens (\CreateChannelResponse' {httpStatus} -> httpStatus) (\s@CreateChannelResponse' {} a -> s {httpStatus = a} :: CreateChannelResponse)
+
+instance Prelude.NFData CreateChannelResponse where
+  rnf CreateChannelResponse' {..} =
+    Prelude.rnf channel
+      `Prelude.seq` Prelude.rnf streamKey
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IVS/CreateRecordingConfiguration.hs b/gen/Amazonka/IVS/CreateRecordingConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/CreateRecordingConfiguration.hs
@@ -0,0 +1,275 @@
+{-# 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.IVS.CreateRecordingConfiguration
+-- 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 recording configuration, used to enable recording to
+-- Amazon S3.
+--
+-- __Known issue:__ In the us-east-1 region, if you use the Amazon Web
+-- Services CLI to create a recording configuration, it returns success
+-- even if the S3 bucket is in a different region. In this case, the
+-- @state@ of the recording configuration is @CREATE_FAILED@ (instead of
+-- @ACTIVE@). (In other regions, the CLI correctly returns failure if the
+-- bucket is in a different region.)
+--
+-- __Workaround:__ Ensure that your S3 bucket is in the same region as the
+-- recording configuration. If you create a recording configuration in a
+-- different region as your S3 bucket, delete that recording configuration
+-- and create a new one with an S3 bucket from the correct region.
+module Amazonka.IVS.CreateRecordingConfiguration
+  ( -- * Creating a Request
+    CreateRecordingConfiguration (..),
+    newCreateRecordingConfiguration,
+
+    -- * Request Lenses
+    createRecordingConfiguration_name,
+    createRecordingConfiguration_recordingReconnectWindowSeconds,
+    createRecordingConfiguration_tags,
+    createRecordingConfiguration_thumbnailConfiguration,
+    createRecordingConfiguration_destinationConfiguration,
+
+    -- * Destructuring the Response
+    CreateRecordingConfigurationResponse (..),
+    newCreateRecordingConfigurationResponse,
+
+    -- * Response Lenses
+    createRecordingConfigurationResponse_recordingConfiguration,
+    createRecordingConfigurationResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateRecordingConfiguration' smart constructor.
+data CreateRecordingConfiguration = CreateRecordingConfiguration'
+  { -- | Recording-configuration name. The value does not need to be unique.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | If a broadcast disconnects and then reconnects within the specified
+    -- interval, the multiple streams will be considered a single broadcast and
+    -- merged together. Default: 0.
+    recordingReconnectWindowSeconds :: Prelude.Maybe Prelude.Natural,
+    -- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+    -- for more information, including restrictions that apply to tags and
+    -- \"Tag naming limits and requirements\"; Amazon IVS has no
+    -- service-specific constraints beyond what is documented there.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | A complex type that allows you to enable\/disable the recording of
+    -- thumbnails for a live session and modify the interval at which
+    -- thumbnails are generated for the live session.
+    thumbnailConfiguration :: Prelude.Maybe ThumbnailConfiguration,
+    -- | A complex type that contains a destination configuration for where
+    -- recorded video will be stored.
+    destinationConfiguration :: DestinationConfiguration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateRecordingConfiguration' 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', 'createRecordingConfiguration_name' - Recording-configuration name. The value does not need to be unique.
+--
+-- 'recordingReconnectWindowSeconds', 'createRecordingConfiguration_recordingReconnectWindowSeconds' - If a broadcast disconnects and then reconnects within the specified
+-- interval, the multiple streams will be considered a single broadcast and
+-- merged together. Default: 0.
+--
+-- 'tags', 'createRecordingConfiguration_tags' - Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+--
+-- 'thumbnailConfiguration', 'createRecordingConfiguration_thumbnailConfiguration' - A complex type that allows you to enable\/disable the recording of
+-- thumbnails for a live session and modify the interval at which
+-- thumbnails are generated for the live session.
+--
+-- 'destinationConfiguration', 'createRecordingConfiguration_destinationConfiguration' - A complex type that contains a destination configuration for where
+-- recorded video will be stored.
+newCreateRecordingConfiguration ::
+  -- | 'destinationConfiguration'
+  DestinationConfiguration ->
+  CreateRecordingConfiguration
+newCreateRecordingConfiguration
+  pDestinationConfiguration_ =
+    CreateRecordingConfiguration'
+      { name =
+          Prelude.Nothing,
+        recordingReconnectWindowSeconds =
+          Prelude.Nothing,
+        tags = Prelude.Nothing,
+        thumbnailConfiguration = Prelude.Nothing,
+        destinationConfiguration =
+          pDestinationConfiguration_
+      }
+
+-- | Recording-configuration name. The value does not need to be unique.
+createRecordingConfiguration_name :: Lens.Lens' CreateRecordingConfiguration (Prelude.Maybe Prelude.Text)
+createRecordingConfiguration_name = Lens.lens (\CreateRecordingConfiguration' {name} -> name) (\s@CreateRecordingConfiguration' {} a -> s {name = a} :: CreateRecordingConfiguration)
+
+-- | If a broadcast disconnects and then reconnects within the specified
+-- interval, the multiple streams will be considered a single broadcast and
+-- merged together. Default: 0.
+createRecordingConfiguration_recordingReconnectWindowSeconds :: Lens.Lens' CreateRecordingConfiguration (Prelude.Maybe Prelude.Natural)
+createRecordingConfiguration_recordingReconnectWindowSeconds = Lens.lens (\CreateRecordingConfiguration' {recordingReconnectWindowSeconds} -> recordingReconnectWindowSeconds) (\s@CreateRecordingConfiguration' {} a -> s {recordingReconnectWindowSeconds = a} :: CreateRecordingConfiguration)
+
+-- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+createRecordingConfiguration_tags :: Lens.Lens' CreateRecordingConfiguration (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createRecordingConfiguration_tags = Lens.lens (\CreateRecordingConfiguration' {tags} -> tags) (\s@CreateRecordingConfiguration' {} a -> s {tags = a} :: CreateRecordingConfiguration) Prelude.. Lens.mapping Lens.coerced
+
+-- | A complex type that allows you to enable\/disable the recording of
+-- thumbnails for a live session and modify the interval at which
+-- thumbnails are generated for the live session.
+createRecordingConfiguration_thumbnailConfiguration :: Lens.Lens' CreateRecordingConfiguration (Prelude.Maybe ThumbnailConfiguration)
+createRecordingConfiguration_thumbnailConfiguration = Lens.lens (\CreateRecordingConfiguration' {thumbnailConfiguration} -> thumbnailConfiguration) (\s@CreateRecordingConfiguration' {} a -> s {thumbnailConfiguration = a} :: CreateRecordingConfiguration)
+
+-- | A complex type that contains a destination configuration for where
+-- recorded video will be stored.
+createRecordingConfiguration_destinationConfiguration :: Lens.Lens' CreateRecordingConfiguration DestinationConfiguration
+createRecordingConfiguration_destinationConfiguration = Lens.lens (\CreateRecordingConfiguration' {destinationConfiguration} -> destinationConfiguration) (\s@CreateRecordingConfiguration' {} a -> s {destinationConfiguration = a} :: CreateRecordingConfiguration)
+
+instance Core.AWSRequest CreateRecordingConfiguration where
+  type
+    AWSResponse CreateRecordingConfiguration =
+      CreateRecordingConfigurationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateRecordingConfigurationResponse'
+            Prelude.<$> (x Data..?> "recordingConfiguration")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    CreateRecordingConfiguration
+  where
+  hashWithSalt _salt CreateRecordingConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` recordingReconnectWindowSeconds
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` thumbnailConfiguration
+      `Prelude.hashWithSalt` destinationConfiguration
+
+instance Prelude.NFData CreateRecordingConfiguration where
+  rnf CreateRecordingConfiguration' {..} =
+    Prelude.rnf name
+      `Prelude.seq` Prelude.rnf recordingReconnectWindowSeconds
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf thumbnailConfiguration
+      `Prelude.seq` Prelude.rnf destinationConfiguration
+
+instance Data.ToHeaders CreateRecordingConfiguration where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateRecordingConfiguration where
+  toJSON CreateRecordingConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("name" Data..=) Prelude.<$> name,
+            ("recordingReconnectWindowSeconds" Data..=)
+              Prelude.<$> recordingReconnectWindowSeconds,
+            ("tags" Data..=) Prelude.<$> tags,
+            ("thumbnailConfiguration" Data..=)
+              Prelude.<$> thumbnailConfiguration,
+            Prelude.Just
+              ( "destinationConfiguration"
+                  Data..= destinationConfiguration
+              )
+          ]
+      )
+
+instance Data.ToPath CreateRecordingConfiguration where
+  toPath =
+    Prelude.const "/CreateRecordingConfiguration"
+
+instance Data.ToQuery CreateRecordingConfiguration where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateRecordingConfigurationResponse' smart constructor.
+data CreateRecordingConfigurationResponse = CreateRecordingConfigurationResponse'
+  { recordingConfiguration :: Prelude.Maybe RecordingConfiguration,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateRecordingConfigurationResponse' 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:
+--
+-- 'recordingConfiguration', 'createRecordingConfigurationResponse_recordingConfiguration' -
+--
+-- 'httpStatus', 'createRecordingConfigurationResponse_httpStatus' - The response's http status code.
+newCreateRecordingConfigurationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateRecordingConfigurationResponse
+newCreateRecordingConfigurationResponse pHttpStatus_ =
+  CreateRecordingConfigurationResponse'
+    { recordingConfiguration =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+createRecordingConfigurationResponse_recordingConfiguration :: Lens.Lens' CreateRecordingConfigurationResponse (Prelude.Maybe RecordingConfiguration)
+createRecordingConfigurationResponse_recordingConfiguration = Lens.lens (\CreateRecordingConfigurationResponse' {recordingConfiguration} -> recordingConfiguration) (\s@CreateRecordingConfigurationResponse' {} a -> s {recordingConfiguration = a} :: CreateRecordingConfigurationResponse)
+
+-- | The response's http status code.
+createRecordingConfigurationResponse_httpStatus :: Lens.Lens' CreateRecordingConfigurationResponse Prelude.Int
+createRecordingConfigurationResponse_httpStatus = Lens.lens (\CreateRecordingConfigurationResponse' {httpStatus} -> httpStatus) (\s@CreateRecordingConfigurationResponse' {} a -> s {httpStatus = a} :: CreateRecordingConfigurationResponse)
+
+instance
+  Prelude.NFData
+    CreateRecordingConfigurationResponse
+  where
+  rnf CreateRecordingConfigurationResponse' {..} =
+    Prelude.rnf recordingConfiguration
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IVS/CreateStreamKey.hs b/gen/Amazonka/IVS/CreateStreamKey.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/CreateStreamKey.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.IVS.CreateStreamKey
+-- 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 stream key, used to initiate a stream, for the specified
+-- channel ARN.
+--
+-- Note that CreateChannel creates a stream key. If you subsequently use
+-- CreateStreamKey on the same channel, it will fail because a stream key
+-- already exists and there is a limit of 1 stream key per channel. To
+-- reset the stream key on a channel, use DeleteStreamKey and then
+-- CreateStreamKey.
+module Amazonka.IVS.CreateStreamKey
+  ( -- * Creating a Request
+    CreateStreamKey (..),
+    newCreateStreamKey,
+
+    -- * Request Lenses
+    createStreamKey_tags,
+    createStreamKey_channelArn,
+
+    -- * Destructuring the Response
+    CreateStreamKeyResponse (..),
+    newCreateStreamKeyResponse,
+
+    -- * Response Lenses
+    createStreamKeyResponse_streamKey,
+    createStreamKeyResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateStreamKey' smart constructor.
+data CreateStreamKey = CreateStreamKey'
+  { -- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+    -- for more information, including restrictions that apply to tags and
+    -- \"Tag naming limits and requirements\"; Amazon IVS has no
+    -- service-specific constraints beyond what is documented there.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | ARN of the channel for which to create the stream key.
+    channelArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateStreamKey' 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:
+--
+-- 'tags', 'createStreamKey_tags' - Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+--
+-- 'channelArn', 'createStreamKey_channelArn' - ARN of the channel for which to create the stream key.
+newCreateStreamKey ::
+  -- | 'channelArn'
+  Prelude.Text ->
+  CreateStreamKey
+newCreateStreamKey pChannelArn_ =
+  CreateStreamKey'
+    { tags = Prelude.Nothing,
+      channelArn = pChannelArn_
+    }
+
+-- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+createStreamKey_tags :: Lens.Lens' CreateStreamKey (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createStreamKey_tags = Lens.lens (\CreateStreamKey' {tags} -> tags) (\s@CreateStreamKey' {} a -> s {tags = a} :: CreateStreamKey) Prelude.. Lens.mapping Lens.coerced
+
+-- | ARN of the channel for which to create the stream key.
+createStreamKey_channelArn :: Lens.Lens' CreateStreamKey Prelude.Text
+createStreamKey_channelArn = Lens.lens (\CreateStreamKey' {channelArn} -> channelArn) (\s@CreateStreamKey' {} a -> s {channelArn = a} :: CreateStreamKey)
+
+instance Core.AWSRequest CreateStreamKey where
+  type
+    AWSResponse CreateStreamKey =
+      CreateStreamKeyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateStreamKeyResponse'
+            Prelude.<$> (x Data..?> "streamKey")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateStreamKey where
+  hashWithSalt _salt CreateStreamKey' {..} =
+    _salt
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` channelArn
+
+instance Prelude.NFData CreateStreamKey where
+  rnf CreateStreamKey' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf channelArn
+
+instance Data.ToHeaders CreateStreamKey where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateStreamKey where
+  toJSON CreateStreamKey' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("channelArn" Data..= channelArn)
+          ]
+      )
+
+instance Data.ToPath CreateStreamKey where
+  toPath = Prelude.const "/CreateStreamKey"
+
+instance Data.ToQuery CreateStreamKey where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateStreamKeyResponse' smart constructor.
+data CreateStreamKeyResponse = CreateStreamKeyResponse'
+  { -- | Stream key used to authenticate an RTMPS stream for ingestion.
+    streamKey :: Prelude.Maybe StreamKey,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateStreamKeyResponse' 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:
+--
+-- 'streamKey', 'createStreamKeyResponse_streamKey' - Stream key used to authenticate an RTMPS stream for ingestion.
+--
+-- 'httpStatus', 'createStreamKeyResponse_httpStatus' - The response's http status code.
+newCreateStreamKeyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateStreamKeyResponse
+newCreateStreamKeyResponse pHttpStatus_ =
+  CreateStreamKeyResponse'
+    { streamKey =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Stream key used to authenticate an RTMPS stream for ingestion.
+createStreamKeyResponse_streamKey :: Lens.Lens' CreateStreamKeyResponse (Prelude.Maybe StreamKey)
+createStreamKeyResponse_streamKey = Lens.lens (\CreateStreamKeyResponse' {streamKey} -> streamKey) (\s@CreateStreamKeyResponse' {} a -> s {streamKey = a} :: CreateStreamKeyResponse)
+
+-- | The response's http status code.
+createStreamKeyResponse_httpStatus :: Lens.Lens' CreateStreamKeyResponse Prelude.Int
+createStreamKeyResponse_httpStatus = Lens.lens (\CreateStreamKeyResponse' {httpStatus} -> httpStatus) (\s@CreateStreamKeyResponse' {} a -> s {httpStatus = a} :: CreateStreamKeyResponse)
+
+instance Prelude.NFData CreateStreamKeyResponse where
+  rnf CreateStreamKeyResponse' {..} =
+    Prelude.rnf streamKey
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IVS/DeleteChannel.hs b/gen/Amazonka/IVS/DeleteChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/DeleteChannel.hs
@@ -0,0 +1,134 @@
+{-# 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.IVS.DeleteChannel
+-- 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 the specified channel and its associated stream keys.
+--
+-- If you try to delete a live channel, you will get an error (409
+-- ConflictException). To delete a channel that is live, call StopStream,
+-- wait for the Amazon EventBridge \"Stream End\" event (to verify that the
+-- stream\'s state was changed from Live to Offline), then call
+-- DeleteChannel. (See
+-- <https://docs.aws.amazon.com/ivs/latest/userguide/eventbridge.html Using EventBridge with Amazon IVS>.)
+module Amazonka.IVS.DeleteChannel
+  ( -- * Creating a Request
+    DeleteChannel (..),
+    newDeleteChannel,
+
+    -- * Request Lenses
+    deleteChannel_arn,
+
+    -- * Destructuring the Response
+    DeleteChannelResponse (..),
+    newDeleteChannelResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteChannel' smart constructor.
+data DeleteChannel = DeleteChannel'
+  { -- | ARN of the channel to be deleted.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteChannel' 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:
+--
+-- 'arn', 'deleteChannel_arn' - ARN of the channel to be deleted.
+newDeleteChannel ::
+  -- | 'arn'
+  Prelude.Text ->
+  DeleteChannel
+newDeleteChannel pArn_ = DeleteChannel' {arn = pArn_}
+
+-- | ARN of the channel to be deleted.
+deleteChannel_arn :: Lens.Lens' DeleteChannel Prelude.Text
+deleteChannel_arn = Lens.lens (\DeleteChannel' {arn} -> arn) (\s@DeleteChannel' {} a -> s {arn = a} :: DeleteChannel)
+
+instance Core.AWSRequest DeleteChannel where
+  type
+    AWSResponse DeleteChannel =
+      DeleteChannelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull DeleteChannelResponse'
+
+instance Prelude.Hashable DeleteChannel where
+  hashWithSalt _salt DeleteChannel' {..} =
+    _salt `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData DeleteChannel where
+  rnf DeleteChannel' {..} = Prelude.rnf arn
+
+instance Data.ToHeaders DeleteChannel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteChannel where
+  toJSON DeleteChannel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("arn" Data..= arn)]
+      )
+
+instance Data.ToPath DeleteChannel where
+  toPath = Prelude.const "/DeleteChannel"
+
+instance Data.ToQuery DeleteChannel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteChannelResponse' smart constructor.
+data DeleteChannelResponse = DeleteChannelResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteChannelResponse' 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.
+newDeleteChannelResponse ::
+  DeleteChannelResponse
+newDeleteChannelResponse = DeleteChannelResponse'
+
+instance Prelude.NFData DeleteChannelResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/IVS/DeletePlaybackKeyPair.hs b/gen/Amazonka/IVS/DeletePlaybackKeyPair.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/DeletePlaybackKeyPair.hs
@@ -0,0 +1,156 @@
+{-# 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.IVS.DeletePlaybackKeyPair
+-- 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 a specified authorization key pair. This invalidates future
+-- viewer tokens generated using the key pair’s @privateKey@. For more
+-- information, see
+-- <https://docs.aws.amazon.com/ivs/latest/userguide/private-channels.html Setting Up Private Channels>
+-- in the /Amazon IVS User Guide/.
+module Amazonka.IVS.DeletePlaybackKeyPair
+  ( -- * Creating a Request
+    DeletePlaybackKeyPair (..),
+    newDeletePlaybackKeyPair,
+
+    -- * Request Lenses
+    deletePlaybackKeyPair_arn,
+
+    -- * Destructuring the Response
+    DeletePlaybackKeyPairResponse (..),
+    newDeletePlaybackKeyPairResponse,
+
+    -- * Response Lenses
+    deletePlaybackKeyPairResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeletePlaybackKeyPair' smart constructor.
+data DeletePlaybackKeyPair = DeletePlaybackKeyPair'
+  { -- | ARN of the key pair to be deleted.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeletePlaybackKeyPair' 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:
+--
+-- 'arn', 'deletePlaybackKeyPair_arn' - ARN of the key pair to be deleted.
+newDeletePlaybackKeyPair ::
+  -- | 'arn'
+  Prelude.Text ->
+  DeletePlaybackKeyPair
+newDeletePlaybackKeyPair pArn_ =
+  DeletePlaybackKeyPair' {arn = pArn_}
+
+-- | ARN of the key pair to be deleted.
+deletePlaybackKeyPair_arn :: Lens.Lens' DeletePlaybackKeyPair Prelude.Text
+deletePlaybackKeyPair_arn = Lens.lens (\DeletePlaybackKeyPair' {arn} -> arn) (\s@DeletePlaybackKeyPair' {} a -> s {arn = a} :: DeletePlaybackKeyPair)
+
+instance Core.AWSRequest DeletePlaybackKeyPair where
+  type
+    AWSResponse DeletePlaybackKeyPair =
+      DeletePlaybackKeyPairResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeletePlaybackKeyPairResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeletePlaybackKeyPair where
+  hashWithSalt _salt DeletePlaybackKeyPair' {..} =
+    _salt `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData DeletePlaybackKeyPair where
+  rnf DeletePlaybackKeyPair' {..} = Prelude.rnf arn
+
+instance Data.ToHeaders DeletePlaybackKeyPair where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeletePlaybackKeyPair where
+  toJSON DeletePlaybackKeyPair' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("arn" Data..= arn)]
+      )
+
+instance Data.ToPath DeletePlaybackKeyPair where
+  toPath = Prelude.const "/DeletePlaybackKeyPair"
+
+instance Data.ToQuery DeletePlaybackKeyPair where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeletePlaybackKeyPairResponse' smart constructor.
+data DeletePlaybackKeyPairResponse = DeletePlaybackKeyPairResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeletePlaybackKeyPairResponse' 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', 'deletePlaybackKeyPairResponse_httpStatus' - The response's http status code.
+newDeletePlaybackKeyPairResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeletePlaybackKeyPairResponse
+newDeletePlaybackKeyPairResponse pHttpStatus_ =
+  DeletePlaybackKeyPairResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+deletePlaybackKeyPairResponse_httpStatus :: Lens.Lens' DeletePlaybackKeyPairResponse Prelude.Int
+deletePlaybackKeyPairResponse_httpStatus = Lens.lens (\DeletePlaybackKeyPairResponse' {httpStatus} -> httpStatus) (\s@DeletePlaybackKeyPairResponse' {} a -> s {httpStatus = a} :: DeletePlaybackKeyPairResponse)
+
+instance Prelude.NFData DeletePlaybackKeyPairResponse where
+  rnf DeletePlaybackKeyPairResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IVS/DeleteRecordingConfiguration.hs b/gen/Amazonka/IVS/DeleteRecordingConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/DeleteRecordingConfiguration.hs
@@ -0,0 +1,144 @@
+{-# 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.IVS.DeleteRecordingConfiguration
+-- 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 the recording configuration for the specified ARN.
+--
+-- If you try to delete a recording configuration that is associated with a
+-- channel, you will get an error (409 ConflictException). To avoid this,
+-- for all channels that reference the recording configuration, first use
+-- UpdateChannel to set the @recordingConfigurationArn@ field to an empty
+-- string, then use DeleteRecordingConfiguration.
+module Amazonka.IVS.DeleteRecordingConfiguration
+  ( -- * Creating a Request
+    DeleteRecordingConfiguration (..),
+    newDeleteRecordingConfiguration,
+
+    -- * Request Lenses
+    deleteRecordingConfiguration_arn,
+
+    -- * Destructuring the Response
+    DeleteRecordingConfigurationResponse (..),
+    newDeleteRecordingConfigurationResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteRecordingConfiguration' smart constructor.
+data DeleteRecordingConfiguration = DeleteRecordingConfiguration'
+  { -- | ARN of the recording configuration to be deleted.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteRecordingConfiguration' 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:
+--
+-- 'arn', 'deleteRecordingConfiguration_arn' - ARN of the recording configuration to be deleted.
+newDeleteRecordingConfiguration ::
+  -- | 'arn'
+  Prelude.Text ->
+  DeleteRecordingConfiguration
+newDeleteRecordingConfiguration pArn_ =
+  DeleteRecordingConfiguration' {arn = pArn_}
+
+-- | ARN of the recording configuration to be deleted.
+deleteRecordingConfiguration_arn :: Lens.Lens' DeleteRecordingConfiguration Prelude.Text
+deleteRecordingConfiguration_arn = Lens.lens (\DeleteRecordingConfiguration' {arn} -> arn) (\s@DeleteRecordingConfiguration' {} a -> s {arn = a} :: DeleteRecordingConfiguration)
+
+instance Core.AWSRequest DeleteRecordingConfiguration where
+  type
+    AWSResponse DeleteRecordingConfiguration =
+      DeleteRecordingConfigurationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull
+      DeleteRecordingConfigurationResponse'
+
+instance
+  Prelude.Hashable
+    DeleteRecordingConfiguration
+  where
+  hashWithSalt _salt DeleteRecordingConfiguration' {..} =
+    _salt `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData DeleteRecordingConfiguration where
+  rnf DeleteRecordingConfiguration' {..} =
+    Prelude.rnf arn
+
+instance Data.ToHeaders DeleteRecordingConfiguration where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteRecordingConfiguration where
+  toJSON DeleteRecordingConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("arn" Data..= arn)]
+      )
+
+instance Data.ToPath DeleteRecordingConfiguration where
+  toPath =
+    Prelude.const "/DeleteRecordingConfiguration"
+
+instance Data.ToQuery DeleteRecordingConfiguration where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteRecordingConfigurationResponse' smart constructor.
+data DeleteRecordingConfigurationResponse = DeleteRecordingConfigurationResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteRecordingConfigurationResponse' 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.
+newDeleteRecordingConfigurationResponse ::
+  DeleteRecordingConfigurationResponse
+newDeleteRecordingConfigurationResponse =
+  DeleteRecordingConfigurationResponse'
+
+instance
+  Prelude.NFData
+    DeleteRecordingConfigurationResponse
+  where
+  rnf _ = ()
diff --git a/gen/Amazonka/IVS/DeleteStreamKey.hs b/gen/Amazonka/IVS/DeleteStreamKey.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/DeleteStreamKey.hs
@@ -0,0 +1,129 @@
+{-# 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.IVS.DeleteStreamKey
+-- 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 the stream key for the specified ARN, so it can no longer be
+-- used to stream.
+module Amazonka.IVS.DeleteStreamKey
+  ( -- * Creating a Request
+    DeleteStreamKey (..),
+    newDeleteStreamKey,
+
+    -- * Request Lenses
+    deleteStreamKey_arn,
+
+    -- * Destructuring the Response
+    DeleteStreamKeyResponse (..),
+    newDeleteStreamKeyResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteStreamKey' smart constructor.
+data DeleteStreamKey = DeleteStreamKey'
+  { -- | ARN of the stream key to be deleted.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteStreamKey' 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:
+--
+-- 'arn', 'deleteStreamKey_arn' - ARN of the stream key to be deleted.
+newDeleteStreamKey ::
+  -- | 'arn'
+  Prelude.Text ->
+  DeleteStreamKey
+newDeleteStreamKey pArn_ =
+  DeleteStreamKey' {arn = pArn_}
+
+-- | ARN of the stream key to be deleted.
+deleteStreamKey_arn :: Lens.Lens' DeleteStreamKey Prelude.Text
+deleteStreamKey_arn = Lens.lens (\DeleteStreamKey' {arn} -> arn) (\s@DeleteStreamKey' {} a -> s {arn = a} :: DeleteStreamKey)
+
+instance Core.AWSRequest DeleteStreamKey where
+  type
+    AWSResponse DeleteStreamKey =
+      DeleteStreamKeyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull DeleteStreamKeyResponse'
+
+instance Prelude.Hashable DeleteStreamKey where
+  hashWithSalt _salt DeleteStreamKey' {..} =
+    _salt `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData DeleteStreamKey where
+  rnf DeleteStreamKey' {..} = Prelude.rnf arn
+
+instance Data.ToHeaders DeleteStreamKey where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteStreamKey where
+  toJSON DeleteStreamKey' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("arn" Data..= arn)]
+      )
+
+instance Data.ToPath DeleteStreamKey where
+  toPath = Prelude.const "/DeleteStreamKey"
+
+instance Data.ToQuery DeleteStreamKey where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteStreamKeyResponse' smart constructor.
+data DeleteStreamKeyResponse = DeleteStreamKeyResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteStreamKeyResponse' 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.
+newDeleteStreamKeyResponse ::
+  DeleteStreamKeyResponse
+newDeleteStreamKeyResponse = DeleteStreamKeyResponse'
+
+instance Prelude.NFData DeleteStreamKeyResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/IVS/GetChannel.hs b/gen/Amazonka/IVS/GetChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/GetChannel.hs
@@ -0,0 +1,159 @@
+{-# 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.IVS.GetChannel
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the channel configuration for the specified channel ARN. See also
+-- BatchGetChannel.
+module Amazonka.IVS.GetChannel
+  ( -- * Creating a Request
+    GetChannel (..),
+    newGetChannel,
+
+    -- * Request Lenses
+    getChannel_arn,
+
+    -- * Destructuring the Response
+    GetChannelResponse (..),
+    newGetChannelResponse,
+
+    -- * Response Lenses
+    getChannelResponse_channel,
+    getChannelResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetChannel' smart constructor.
+data GetChannel = GetChannel'
+  { -- | ARN of the channel for which the configuration is to be retrieved.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetChannel' 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:
+--
+-- 'arn', 'getChannel_arn' - ARN of the channel for which the configuration is to be retrieved.
+newGetChannel ::
+  -- | 'arn'
+  Prelude.Text ->
+  GetChannel
+newGetChannel pArn_ = GetChannel' {arn = pArn_}
+
+-- | ARN of the channel for which the configuration is to be retrieved.
+getChannel_arn :: Lens.Lens' GetChannel Prelude.Text
+getChannel_arn = Lens.lens (\GetChannel' {arn} -> arn) (\s@GetChannel' {} a -> s {arn = a} :: GetChannel)
+
+instance Core.AWSRequest GetChannel where
+  type AWSResponse GetChannel = GetChannelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetChannelResponse'
+            Prelude.<$> (x Data..?> "channel")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetChannel where
+  hashWithSalt _salt GetChannel' {..} =
+    _salt `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData GetChannel where
+  rnf GetChannel' {..} = Prelude.rnf arn
+
+instance Data.ToHeaders GetChannel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetChannel where
+  toJSON GetChannel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("arn" Data..= arn)]
+      )
+
+instance Data.ToPath GetChannel where
+  toPath = Prelude.const "/GetChannel"
+
+instance Data.ToQuery GetChannel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetChannelResponse' smart constructor.
+data GetChannelResponse = GetChannelResponse'
+  { channel :: Prelude.Maybe Channel,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetChannelResponse' 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:
+--
+-- 'channel', 'getChannelResponse_channel' -
+--
+-- 'httpStatus', 'getChannelResponse_httpStatus' - The response's http status code.
+newGetChannelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetChannelResponse
+newGetChannelResponse pHttpStatus_ =
+  GetChannelResponse'
+    { channel = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+getChannelResponse_channel :: Lens.Lens' GetChannelResponse (Prelude.Maybe Channel)
+getChannelResponse_channel = Lens.lens (\GetChannelResponse' {channel} -> channel) (\s@GetChannelResponse' {} a -> s {channel = a} :: GetChannelResponse)
+
+-- | The response's http status code.
+getChannelResponse_httpStatus :: Lens.Lens' GetChannelResponse Prelude.Int
+getChannelResponse_httpStatus = Lens.lens (\GetChannelResponse' {httpStatus} -> httpStatus) (\s@GetChannelResponse' {} a -> s {httpStatus = a} :: GetChannelResponse)
+
+instance Prelude.NFData GetChannelResponse where
+  rnf GetChannelResponse' {..} =
+    Prelude.rnf channel
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IVS/GetPlaybackKeyPair.hs b/gen/Amazonka/IVS/GetPlaybackKeyPair.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/GetPlaybackKeyPair.hs
@@ -0,0 +1,167 @@
+{-# 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.IVS.GetPlaybackKeyPair
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets a specified playback authorization key pair and returns the @arn@
+-- and @fingerprint@. The @privateKey@ held by the caller can be used to
+-- generate viewer authorization tokens, to grant viewers access to private
+-- channels. For more information, see
+-- <https://docs.aws.amazon.com/ivs/latest/userguide/private-channels.html Setting Up Private Channels>
+-- in the /Amazon IVS User Guide/.
+module Amazonka.IVS.GetPlaybackKeyPair
+  ( -- * Creating a Request
+    GetPlaybackKeyPair (..),
+    newGetPlaybackKeyPair,
+
+    -- * Request Lenses
+    getPlaybackKeyPair_arn,
+
+    -- * Destructuring the Response
+    GetPlaybackKeyPairResponse (..),
+    newGetPlaybackKeyPairResponse,
+
+    -- * Response Lenses
+    getPlaybackKeyPairResponse_keyPair,
+    getPlaybackKeyPairResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetPlaybackKeyPair' smart constructor.
+data GetPlaybackKeyPair = GetPlaybackKeyPair'
+  { -- | ARN of the key pair to be returned.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetPlaybackKeyPair' 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:
+--
+-- 'arn', 'getPlaybackKeyPair_arn' - ARN of the key pair to be returned.
+newGetPlaybackKeyPair ::
+  -- | 'arn'
+  Prelude.Text ->
+  GetPlaybackKeyPair
+newGetPlaybackKeyPair pArn_ =
+  GetPlaybackKeyPair' {arn = pArn_}
+
+-- | ARN of the key pair to be returned.
+getPlaybackKeyPair_arn :: Lens.Lens' GetPlaybackKeyPair Prelude.Text
+getPlaybackKeyPair_arn = Lens.lens (\GetPlaybackKeyPair' {arn} -> arn) (\s@GetPlaybackKeyPair' {} a -> s {arn = a} :: GetPlaybackKeyPair)
+
+instance Core.AWSRequest GetPlaybackKeyPair where
+  type
+    AWSResponse GetPlaybackKeyPair =
+      GetPlaybackKeyPairResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetPlaybackKeyPairResponse'
+            Prelude.<$> (x Data..?> "keyPair")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetPlaybackKeyPair where
+  hashWithSalt _salt GetPlaybackKeyPair' {..} =
+    _salt `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData GetPlaybackKeyPair where
+  rnf GetPlaybackKeyPair' {..} = Prelude.rnf arn
+
+instance Data.ToHeaders GetPlaybackKeyPair where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetPlaybackKeyPair where
+  toJSON GetPlaybackKeyPair' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("arn" Data..= arn)]
+      )
+
+instance Data.ToPath GetPlaybackKeyPair where
+  toPath = Prelude.const "/GetPlaybackKeyPair"
+
+instance Data.ToQuery GetPlaybackKeyPair where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetPlaybackKeyPairResponse' smart constructor.
+data GetPlaybackKeyPairResponse = GetPlaybackKeyPairResponse'
+  { keyPair :: Prelude.Maybe PlaybackKeyPair,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetPlaybackKeyPairResponse' 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:
+--
+-- 'keyPair', 'getPlaybackKeyPairResponse_keyPair' -
+--
+-- 'httpStatus', 'getPlaybackKeyPairResponse_httpStatus' - The response's http status code.
+newGetPlaybackKeyPairResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetPlaybackKeyPairResponse
+newGetPlaybackKeyPairResponse pHttpStatus_ =
+  GetPlaybackKeyPairResponse'
+    { keyPair =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+getPlaybackKeyPairResponse_keyPair :: Lens.Lens' GetPlaybackKeyPairResponse (Prelude.Maybe PlaybackKeyPair)
+getPlaybackKeyPairResponse_keyPair = Lens.lens (\GetPlaybackKeyPairResponse' {keyPair} -> keyPair) (\s@GetPlaybackKeyPairResponse' {} a -> s {keyPair = a} :: GetPlaybackKeyPairResponse)
+
+-- | The response's http status code.
+getPlaybackKeyPairResponse_httpStatus :: Lens.Lens' GetPlaybackKeyPairResponse Prelude.Int
+getPlaybackKeyPairResponse_httpStatus = Lens.lens (\GetPlaybackKeyPairResponse' {httpStatus} -> httpStatus) (\s@GetPlaybackKeyPairResponse' {} a -> s {httpStatus = a} :: GetPlaybackKeyPairResponse)
+
+instance Prelude.NFData GetPlaybackKeyPairResponse where
+  rnf GetPlaybackKeyPairResponse' {..} =
+    Prelude.rnf keyPair
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IVS/GetRecordingConfiguration.hs b/gen/Amazonka/IVS/GetRecordingConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/GetRecordingConfiguration.hs
@@ -0,0 +1,165 @@
+{-# 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.IVS.GetRecordingConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the recording configuration for the specified ARN.
+module Amazonka.IVS.GetRecordingConfiguration
+  ( -- * Creating a Request
+    GetRecordingConfiguration (..),
+    newGetRecordingConfiguration,
+
+    -- * Request Lenses
+    getRecordingConfiguration_arn,
+
+    -- * Destructuring the Response
+    GetRecordingConfigurationResponse (..),
+    newGetRecordingConfigurationResponse,
+
+    -- * Response Lenses
+    getRecordingConfigurationResponse_recordingConfiguration,
+    getRecordingConfigurationResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetRecordingConfiguration' smart constructor.
+data GetRecordingConfiguration = GetRecordingConfiguration'
+  { -- | ARN of the recording configuration to be retrieved.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetRecordingConfiguration' 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:
+--
+-- 'arn', 'getRecordingConfiguration_arn' - ARN of the recording configuration to be retrieved.
+newGetRecordingConfiguration ::
+  -- | 'arn'
+  Prelude.Text ->
+  GetRecordingConfiguration
+newGetRecordingConfiguration pArn_ =
+  GetRecordingConfiguration' {arn = pArn_}
+
+-- | ARN of the recording configuration to be retrieved.
+getRecordingConfiguration_arn :: Lens.Lens' GetRecordingConfiguration Prelude.Text
+getRecordingConfiguration_arn = Lens.lens (\GetRecordingConfiguration' {arn} -> arn) (\s@GetRecordingConfiguration' {} a -> s {arn = a} :: GetRecordingConfiguration)
+
+instance Core.AWSRequest GetRecordingConfiguration where
+  type
+    AWSResponse GetRecordingConfiguration =
+      GetRecordingConfigurationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetRecordingConfigurationResponse'
+            Prelude.<$> (x Data..?> "recordingConfiguration")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetRecordingConfiguration where
+  hashWithSalt _salt GetRecordingConfiguration' {..} =
+    _salt `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData GetRecordingConfiguration where
+  rnf GetRecordingConfiguration' {..} = Prelude.rnf arn
+
+instance Data.ToHeaders GetRecordingConfiguration where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetRecordingConfiguration where
+  toJSON GetRecordingConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("arn" Data..= arn)]
+      )
+
+instance Data.ToPath GetRecordingConfiguration where
+  toPath = Prelude.const "/GetRecordingConfiguration"
+
+instance Data.ToQuery GetRecordingConfiguration where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetRecordingConfigurationResponse' smart constructor.
+data GetRecordingConfigurationResponse = GetRecordingConfigurationResponse'
+  { recordingConfiguration :: Prelude.Maybe RecordingConfiguration,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetRecordingConfigurationResponse' 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:
+--
+-- 'recordingConfiguration', 'getRecordingConfigurationResponse_recordingConfiguration' -
+--
+-- 'httpStatus', 'getRecordingConfigurationResponse_httpStatus' - The response's http status code.
+newGetRecordingConfigurationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetRecordingConfigurationResponse
+newGetRecordingConfigurationResponse pHttpStatus_ =
+  GetRecordingConfigurationResponse'
+    { recordingConfiguration =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+getRecordingConfigurationResponse_recordingConfiguration :: Lens.Lens' GetRecordingConfigurationResponse (Prelude.Maybe RecordingConfiguration)
+getRecordingConfigurationResponse_recordingConfiguration = Lens.lens (\GetRecordingConfigurationResponse' {recordingConfiguration} -> recordingConfiguration) (\s@GetRecordingConfigurationResponse' {} a -> s {recordingConfiguration = a} :: GetRecordingConfigurationResponse)
+
+-- | The response's http status code.
+getRecordingConfigurationResponse_httpStatus :: Lens.Lens' GetRecordingConfigurationResponse Prelude.Int
+getRecordingConfigurationResponse_httpStatus = Lens.lens (\GetRecordingConfigurationResponse' {httpStatus} -> httpStatus) (\s@GetRecordingConfigurationResponse' {} a -> s {httpStatus = a} :: GetRecordingConfigurationResponse)
+
+instance
+  Prelude.NFData
+    GetRecordingConfigurationResponse
+  where
+  rnf GetRecordingConfigurationResponse' {..} =
+    Prelude.rnf recordingConfiguration
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IVS/GetStream.hs b/gen/Amazonka/IVS/GetStream.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/GetStream.hs
@@ -0,0 +1,159 @@
+{-# 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.IVS.GetStream
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets information about the active (live) stream on a specified channel.
+module Amazonka.IVS.GetStream
+  ( -- * Creating a Request
+    GetStream (..),
+    newGetStream,
+
+    -- * Request Lenses
+    getStream_channelArn,
+
+    -- * Destructuring the Response
+    GetStreamResponse (..),
+    newGetStreamResponse,
+
+    -- * Response Lenses
+    getStreamResponse_stream,
+    getStreamResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetStream' smart constructor.
+data GetStream = GetStream'
+  { -- | Channel ARN for stream to be accessed.
+    channelArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetStream' 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:
+--
+-- 'channelArn', 'getStream_channelArn' - Channel ARN for stream to be accessed.
+newGetStream ::
+  -- | 'channelArn'
+  Prelude.Text ->
+  GetStream
+newGetStream pChannelArn_ =
+  GetStream' {channelArn = pChannelArn_}
+
+-- | Channel ARN for stream to be accessed.
+getStream_channelArn :: Lens.Lens' GetStream Prelude.Text
+getStream_channelArn = Lens.lens (\GetStream' {channelArn} -> channelArn) (\s@GetStream' {} a -> s {channelArn = a} :: GetStream)
+
+instance Core.AWSRequest GetStream where
+  type AWSResponse GetStream = GetStreamResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetStreamResponse'
+            Prelude.<$> (x Data..?> "stream")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetStream where
+  hashWithSalt _salt GetStream' {..} =
+    _salt `Prelude.hashWithSalt` channelArn
+
+instance Prelude.NFData GetStream where
+  rnf GetStream' {..} = Prelude.rnf channelArn
+
+instance Data.ToHeaders GetStream where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetStream where
+  toJSON GetStream' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("channelArn" Data..= channelArn)]
+      )
+
+instance Data.ToPath GetStream where
+  toPath = Prelude.const "/GetStream"
+
+instance Data.ToQuery GetStream where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetStreamResponse' smart constructor.
+data GetStreamResponse = GetStreamResponse'
+  { stream :: Prelude.Maybe Stream,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetStreamResponse' 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:
+--
+-- 'stream', 'getStreamResponse_stream' -
+--
+-- 'httpStatus', 'getStreamResponse_httpStatus' - The response's http status code.
+newGetStreamResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetStreamResponse
+newGetStreamResponse pHttpStatus_ =
+  GetStreamResponse'
+    { stream = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+getStreamResponse_stream :: Lens.Lens' GetStreamResponse (Prelude.Maybe Stream)
+getStreamResponse_stream = Lens.lens (\GetStreamResponse' {stream} -> stream) (\s@GetStreamResponse' {} a -> s {stream = a} :: GetStreamResponse)
+
+-- | The response's http status code.
+getStreamResponse_httpStatus :: Lens.Lens' GetStreamResponse Prelude.Int
+getStreamResponse_httpStatus = Lens.lens (\GetStreamResponse' {httpStatus} -> httpStatus) (\s@GetStreamResponse' {} a -> s {httpStatus = a} :: GetStreamResponse)
+
+instance Prelude.NFData GetStreamResponse where
+  rnf GetStreamResponse' {..} =
+    Prelude.rnf stream
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IVS/GetStreamKey.hs b/gen/Amazonka/IVS/GetStreamKey.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/GetStreamKey.hs
@@ -0,0 +1,158 @@
+{-# 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.IVS.GetStreamKey
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets stream-key information for a specified ARN.
+module Amazonka.IVS.GetStreamKey
+  ( -- * Creating a Request
+    GetStreamKey (..),
+    newGetStreamKey,
+
+    -- * Request Lenses
+    getStreamKey_arn,
+
+    -- * Destructuring the Response
+    GetStreamKeyResponse (..),
+    newGetStreamKeyResponse,
+
+    -- * Response Lenses
+    getStreamKeyResponse_streamKey,
+    getStreamKeyResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetStreamKey' smart constructor.
+data GetStreamKey = GetStreamKey'
+  { -- | ARN for the stream key to be retrieved.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetStreamKey' 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:
+--
+-- 'arn', 'getStreamKey_arn' - ARN for the stream key to be retrieved.
+newGetStreamKey ::
+  -- | 'arn'
+  Prelude.Text ->
+  GetStreamKey
+newGetStreamKey pArn_ = GetStreamKey' {arn = pArn_}
+
+-- | ARN for the stream key to be retrieved.
+getStreamKey_arn :: Lens.Lens' GetStreamKey Prelude.Text
+getStreamKey_arn = Lens.lens (\GetStreamKey' {arn} -> arn) (\s@GetStreamKey' {} a -> s {arn = a} :: GetStreamKey)
+
+instance Core.AWSRequest GetStreamKey where
+  type AWSResponse GetStreamKey = GetStreamKeyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetStreamKeyResponse'
+            Prelude.<$> (x Data..?> "streamKey")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetStreamKey where
+  hashWithSalt _salt GetStreamKey' {..} =
+    _salt `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData GetStreamKey where
+  rnf GetStreamKey' {..} = Prelude.rnf arn
+
+instance Data.ToHeaders GetStreamKey where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetStreamKey where
+  toJSON GetStreamKey' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("arn" Data..= arn)]
+      )
+
+instance Data.ToPath GetStreamKey where
+  toPath = Prelude.const "/GetStreamKey"
+
+instance Data.ToQuery GetStreamKey where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetStreamKeyResponse' smart constructor.
+data GetStreamKeyResponse = GetStreamKeyResponse'
+  { streamKey :: Prelude.Maybe StreamKey,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetStreamKeyResponse' 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:
+--
+-- 'streamKey', 'getStreamKeyResponse_streamKey' -
+--
+-- 'httpStatus', 'getStreamKeyResponse_httpStatus' - The response's http status code.
+newGetStreamKeyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetStreamKeyResponse
+newGetStreamKeyResponse pHttpStatus_ =
+  GetStreamKeyResponse'
+    { streamKey = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+getStreamKeyResponse_streamKey :: Lens.Lens' GetStreamKeyResponse (Prelude.Maybe StreamKey)
+getStreamKeyResponse_streamKey = Lens.lens (\GetStreamKeyResponse' {streamKey} -> streamKey) (\s@GetStreamKeyResponse' {} a -> s {streamKey = a} :: GetStreamKeyResponse)
+
+-- | The response's http status code.
+getStreamKeyResponse_httpStatus :: Lens.Lens' GetStreamKeyResponse Prelude.Int
+getStreamKeyResponse_httpStatus = Lens.lens (\GetStreamKeyResponse' {httpStatus} -> httpStatus) (\s@GetStreamKeyResponse' {} a -> s {httpStatus = a} :: GetStreamKeyResponse)
+
+instance Prelude.NFData GetStreamKeyResponse where
+  rnf GetStreamKeyResponse' {..} =
+    Prelude.rnf streamKey
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IVS/GetStreamSession.hs b/gen/Amazonka/IVS/GetStreamSession.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/GetStreamSession.hs
@@ -0,0 +1,188 @@
+{-# 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.IVS.GetStreamSession
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets metadata on a specified stream.
+module Amazonka.IVS.GetStreamSession
+  ( -- * Creating a Request
+    GetStreamSession (..),
+    newGetStreamSession,
+
+    -- * Request Lenses
+    getStreamSession_streamId,
+    getStreamSession_channelArn,
+
+    -- * Destructuring the Response
+    GetStreamSessionResponse (..),
+    newGetStreamSessionResponse,
+
+    -- * Response Lenses
+    getStreamSessionResponse_streamSession,
+    getStreamSessionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetStreamSession' smart constructor.
+data GetStreamSession = GetStreamSession'
+  { -- | Unique identifier for a live or previously live stream in the specified
+    -- channel. If no @streamId@ is provided, this returns the most recent
+    -- stream session for the channel, if it exists.
+    streamId :: Prelude.Maybe Prelude.Text,
+    -- | ARN of the channel resource
+    channelArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetStreamSession' 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:
+--
+-- 'streamId', 'getStreamSession_streamId' - Unique identifier for a live or previously live stream in the specified
+-- channel. If no @streamId@ is provided, this returns the most recent
+-- stream session for the channel, if it exists.
+--
+-- 'channelArn', 'getStreamSession_channelArn' - ARN of the channel resource
+newGetStreamSession ::
+  -- | 'channelArn'
+  Prelude.Text ->
+  GetStreamSession
+newGetStreamSession pChannelArn_ =
+  GetStreamSession'
+    { streamId = Prelude.Nothing,
+      channelArn = pChannelArn_
+    }
+
+-- | Unique identifier for a live or previously live stream in the specified
+-- channel. If no @streamId@ is provided, this returns the most recent
+-- stream session for the channel, if it exists.
+getStreamSession_streamId :: Lens.Lens' GetStreamSession (Prelude.Maybe Prelude.Text)
+getStreamSession_streamId = Lens.lens (\GetStreamSession' {streamId} -> streamId) (\s@GetStreamSession' {} a -> s {streamId = a} :: GetStreamSession)
+
+-- | ARN of the channel resource
+getStreamSession_channelArn :: Lens.Lens' GetStreamSession Prelude.Text
+getStreamSession_channelArn = Lens.lens (\GetStreamSession' {channelArn} -> channelArn) (\s@GetStreamSession' {} a -> s {channelArn = a} :: GetStreamSession)
+
+instance Core.AWSRequest GetStreamSession where
+  type
+    AWSResponse GetStreamSession =
+      GetStreamSessionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetStreamSessionResponse'
+            Prelude.<$> (x Data..?> "streamSession")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetStreamSession where
+  hashWithSalt _salt GetStreamSession' {..} =
+    _salt
+      `Prelude.hashWithSalt` streamId
+      `Prelude.hashWithSalt` channelArn
+
+instance Prelude.NFData GetStreamSession where
+  rnf GetStreamSession' {..} =
+    Prelude.rnf streamId
+      `Prelude.seq` Prelude.rnf channelArn
+
+instance Data.ToHeaders GetStreamSession where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetStreamSession where
+  toJSON GetStreamSession' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("streamId" Data..=) Prelude.<$> streamId,
+            Prelude.Just ("channelArn" Data..= channelArn)
+          ]
+      )
+
+instance Data.ToPath GetStreamSession where
+  toPath = Prelude.const "/GetStreamSession"
+
+instance Data.ToQuery GetStreamSession where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetStreamSessionResponse' smart constructor.
+data GetStreamSessionResponse = GetStreamSessionResponse'
+  { -- | List of stream details.
+    streamSession :: Prelude.Maybe StreamSession,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetStreamSessionResponse' 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:
+--
+-- 'streamSession', 'getStreamSessionResponse_streamSession' - List of stream details.
+--
+-- 'httpStatus', 'getStreamSessionResponse_httpStatus' - The response's http status code.
+newGetStreamSessionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetStreamSessionResponse
+newGetStreamSessionResponse pHttpStatus_ =
+  GetStreamSessionResponse'
+    { streamSession =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | List of stream details.
+getStreamSessionResponse_streamSession :: Lens.Lens' GetStreamSessionResponse (Prelude.Maybe StreamSession)
+getStreamSessionResponse_streamSession = Lens.lens (\GetStreamSessionResponse' {streamSession} -> streamSession) (\s@GetStreamSessionResponse' {} a -> s {streamSession = a} :: GetStreamSessionResponse)
+
+-- | The response's http status code.
+getStreamSessionResponse_httpStatus :: Lens.Lens' GetStreamSessionResponse Prelude.Int
+getStreamSessionResponse_httpStatus = Lens.lens (\GetStreamSessionResponse' {httpStatus} -> httpStatus) (\s@GetStreamSessionResponse' {} a -> s {httpStatus = a} :: GetStreamSessionResponse)
+
+instance Prelude.NFData GetStreamSessionResponse where
+  rnf GetStreamSessionResponse' {..} =
+    Prelude.rnf streamSession
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IVS/ImportPlaybackKeyPair.hs b/gen/Amazonka/IVS/ImportPlaybackKeyPair.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/ImportPlaybackKeyPair.hs
@@ -0,0 +1,214 @@
+{-# 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.IVS.ImportPlaybackKeyPair
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Imports the public portion of a new key pair and returns its @arn@ and
+-- @fingerprint@. The @privateKey@ can then be used to generate viewer
+-- authorization tokens, to grant viewers access to private channels. For
+-- more information, see
+-- <https://docs.aws.amazon.com/ivs/latest/userguide/private-channels.html Setting Up Private Channels>
+-- in the /Amazon IVS User Guide/.
+module Amazonka.IVS.ImportPlaybackKeyPair
+  ( -- * Creating a Request
+    ImportPlaybackKeyPair (..),
+    newImportPlaybackKeyPair,
+
+    -- * Request Lenses
+    importPlaybackKeyPair_name,
+    importPlaybackKeyPair_tags,
+    importPlaybackKeyPair_publicKeyMaterial,
+
+    -- * Destructuring the Response
+    ImportPlaybackKeyPairResponse (..),
+    newImportPlaybackKeyPairResponse,
+
+    -- * Response Lenses
+    importPlaybackKeyPairResponse_keyPair,
+    importPlaybackKeyPairResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newImportPlaybackKeyPair' smart constructor.
+data ImportPlaybackKeyPair = ImportPlaybackKeyPair'
+  { -- | Playback-key-pair name. The value does not need to be unique.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Any tags provided with the request are added to the playback key pair
+    -- tags. See
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+    -- for more information, including restrictions that apply to tags and
+    -- \"Tag naming limits and requirements\"; Amazon IVS has no
+    -- service-specific constraints beyond what is documented there.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The public portion of a customer-generated key pair.
+    publicKeyMaterial :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImportPlaybackKeyPair' 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', 'importPlaybackKeyPair_name' - Playback-key-pair name. The value does not need to be unique.
+--
+-- 'tags', 'importPlaybackKeyPair_tags' - Any tags provided with the request are added to the playback key pair
+-- tags. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+--
+-- 'publicKeyMaterial', 'importPlaybackKeyPair_publicKeyMaterial' - The public portion of a customer-generated key pair.
+newImportPlaybackKeyPair ::
+  -- | 'publicKeyMaterial'
+  Prelude.Text ->
+  ImportPlaybackKeyPair
+newImportPlaybackKeyPair pPublicKeyMaterial_ =
+  ImportPlaybackKeyPair'
+    { name = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      publicKeyMaterial = pPublicKeyMaterial_
+    }
+
+-- | Playback-key-pair name. The value does not need to be unique.
+importPlaybackKeyPair_name :: Lens.Lens' ImportPlaybackKeyPair (Prelude.Maybe Prelude.Text)
+importPlaybackKeyPair_name = Lens.lens (\ImportPlaybackKeyPair' {name} -> name) (\s@ImportPlaybackKeyPair' {} a -> s {name = a} :: ImportPlaybackKeyPair)
+
+-- | Any tags provided with the request are added to the playback key pair
+-- tags. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+importPlaybackKeyPair_tags :: Lens.Lens' ImportPlaybackKeyPair (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+importPlaybackKeyPair_tags = Lens.lens (\ImportPlaybackKeyPair' {tags} -> tags) (\s@ImportPlaybackKeyPair' {} a -> s {tags = a} :: ImportPlaybackKeyPair) Prelude.. Lens.mapping Lens.coerced
+
+-- | The public portion of a customer-generated key pair.
+importPlaybackKeyPair_publicKeyMaterial :: Lens.Lens' ImportPlaybackKeyPair Prelude.Text
+importPlaybackKeyPair_publicKeyMaterial = Lens.lens (\ImportPlaybackKeyPair' {publicKeyMaterial} -> publicKeyMaterial) (\s@ImportPlaybackKeyPair' {} a -> s {publicKeyMaterial = a} :: ImportPlaybackKeyPair)
+
+instance Core.AWSRequest ImportPlaybackKeyPair where
+  type
+    AWSResponse ImportPlaybackKeyPair =
+      ImportPlaybackKeyPairResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ImportPlaybackKeyPairResponse'
+            Prelude.<$> (x Data..?> "keyPair")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ImportPlaybackKeyPair where
+  hashWithSalt _salt ImportPlaybackKeyPair' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` publicKeyMaterial
+
+instance Prelude.NFData ImportPlaybackKeyPair where
+  rnf ImportPlaybackKeyPair' {..} =
+    Prelude.rnf name
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf publicKeyMaterial
+
+instance Data.ToHeaders ImportPlaybackKeyPair where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ImportPlaybackKeyPair where
+  toJSON ImportPlaybackKeyPair' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("name" Data..=) Prelude.<$> name,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ("publicKeyMaterial" Data..= publicKeyMaterial)
+          ]
+      )
+
+instance Data.ToPath ImportPlaybackKeyPair where
+  toPath = Prelude.const "/ImportPlaybackKeyPair"
+
+instance Data.ToQuery ImportPlaybackKeyPair where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newImportPlaybackKeyPairResponse' smart constructor.
+data ImportPlaybackKeyPairResponse = ImportPlaybackKeyPairResponse'
+  { keyPair :: Prelude.Maybe PlaybackKeyPair,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImportPlaybackKeyPairResponse' 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:
+--
+-- 'keyPair', 'importPlaybackKeyPairResponse_keyPair' -
+--
+-- 'httpStatus', 'importPlaybackKeyPairResponse_httpStatus' - The response's http status code.
+newImportPlaybackKeyPairResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ImportPlaybackKeyPairResponse
+newImportPlaybackKeyPairResponse pHttpStatus_ =
+  ImportPlaybackKeyPairResponse'
+    { keyPair =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+importPlaybackKeyPairResponse_keyPair :: Lens.Lens' ImportPlaybackKeyPairResponse (Prelude.Maybe PlaybackKeyPair)
+importPlaybackKeyPairResponse_keyPair = Lens.lens (\ImportPlaybackKeyPairResponse' {keyPair} -> keyPair) (\s@ImportPlaybackKeyPairResponse' {} a -> s {keyPair = a} :: ImportPlaybackKeyPairResponse)
+
+-- | The response's http status code.
+importPlaybackKeyPairResponse_httpStatus :: Lens.Lens' ImportPlaybackKeyPairResponse Prelude.Int
+importPlaybackKeyPairResponse_httpStatus = Lens.lens (\ImportPlaybackKeyPairResponse' {httpStatus} -> httpStatus) (\s@ImportPlaybackKeyPairResponse' {} a -> s {httpStatus = a} :: ImportPlaybackKeyPairResponse)
+
+instance Prelude.NFData ImportPlaybackKeyPairResponse where
+  rnf ImportPlaybackKeyPairResponse' {..} =
+    Prelude.rnf keyPair
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IVS/Lens.hs b/gen/Amazonka/IVS/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Lens.hs
@@ -0,0 +1,370 @@
+{-# 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.IVS.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.IVS.Lens
+  ( -- * Operations
+
+    -- ** BatchGetChannel
+    batchGetChannel_arns,
+    batchGetChannelResponse_channels,
+    batchGetChannelResponse_errors,
+    batchGetChannelResponse_httpStatus,
+
+    -- ** BatchGetStreamKey
+    batchGetStreamKey_arns,
+    batchGetStreamKeyResponse_errors,
+    batchGetStreamKeyResponse_streamKeys,
+    batchGetStreamKeyResponse_httpStatus,
+
+    -- ** CreateChannel
+    createChannel_authorized,
+    createChannel_latencyMode,
+    createChannel_name,
+    createChannel_recordingConfigurationArn,
+    createChannel_tags,
+    createChannel_type,
+    createChannelResponse_channel,
+    createChannelResponse_streamKey,
+    createChannelResponse_httpStatus,
+
+    -- ** CreateRecordingConfiguration
+    createRecordingConfiguration_name,
+    createRecordingConfiguration_recordingReconnectWindowSeconds,
+    createRecordingConfiguration_tags,
+    createRecordingConfiguration_thumbnailConfiguration,
+    createRecordingConfiguration_destinationConfiguration,
+    createRecordingConfigurationResponse_recordingConfiguration,
+    createRecordingConfigurationResponse_httpStatus,
+
+    -- ** CreateStreamKey
+    createStreamKey_tags,
+    createStreamKey_channelArn,
+    createStreamKeyResponse_streamKey,
+    createStreamKeyResponse_httpStatus,
+
+    -- ** DeleteChannel
+    deleteChannel_arn,
+
+    -- ** DeletePlaybackKeyPair
+    deletePlaybackKeyPair_arn,
+    deletePlaybackKeyPairResponse_httpStatus,
+
+    -- ** DeleteRecordingConfiguration
+    deleteRecordingConfiguration_arn,
+
+    -- ** DeleteStreamKey
+    deleteStreamKey_arn,
+
+    -- ** GetChannel
+    getChannel_arn,
+    getChannelResponse_channel,
+    getChannelResponse_httpStatus,
+
+    -- ** GetPlaybackKeyPair
+    getPlaybackKeyPair_arn,
+    getPlaybackKeyPairResponse_keyPair,
+    getPlaybackKeyPairResponse_httpStatus,
+
+    -- ** GetRecordingConfiguration
+    getRecordingConfiguration_arn,
+    getRecordingConfigurationResponse_recordingConfiguration,
+    getRecordingConfigurationResponse_httpStatus,
+
+    -- ** GetStream
+    getStream_channelArn,
+    getStreamResponse_stream,
+    getStreamResponse_httpStatus,
+
+    -- ** GetStreamKey
+    getStreamKey_arn,
+    getStreamKeyResponse_streamKey,
+    getStreamKeyResponse_httpStatus,
+
+    -- ** GetStreamSession
+    getStreamSession_streamId,
+    getStreamSession_channelArn,
+    getStreamSessionResponse_streamSession,
+    getStreamSessionResponse_httpStatus,
+
+    -- ** ImportPlaybackKeyPair
+    importPlaybackKeyPair_name,
+    importPlaybackKeyPair_tags,
+    importPlaybackKeyPair_publicKeyMaterial,
+    importPlaybackKeyPairResponse_keyPair,
+    importPlaybackKeyPairResponse_httpStatus,
+
+    -- ** ListChannels
+    listChannels_filterByName,
+    listChannels_filterByRecordingConfigurationArn,
+    listChannels_maxResults,
+    listChannels_nextToken,
+    listChannelsResponse_nextToken,
+    listChannelsResponse_httpStatus,
+    listChannelsResponse_channels,
+
+    -- ** ListPlaybackKeyPairs
+    listPlaybackKeyPairs_maxResults,
+    listPlaybackKeyPairs_nextToken,
+    listPlaybackKeyPairsResponse_nextToken,
+    listPlaybackKeyPairsResponse_httpStatus,
+    listPlaybackKeyPairsResponse_keyPairs,
+
+    -- ** ListRecordingConfigurations
+    listRecordingConfigurations_maxResults,
+    listRecordingConfigurations_nextToken,
+    listRecordingConfigurationsResponse_nextToken,
+    listRecordingConfigurationsResponse_httpStatus,
+    listRecordingConfigurationsResponse_recordingConfigurations,
+
+    -- ** ListStreamKeys
+    listStreamKeys_maxResults,
+    listStreamKeys_nextToken,
+    listStreamKeys_channelArn,
+    listStreamKeysResponse_nextToken,
+    listStreamKeysResponse_httpStatus,
+    listStreamKeysResponse_streamKeys,
+
+    -- ** ListStreamSessions
+    listStreamSessions_maxResults,
+    listStreamSessions_nextToken,
+    listStreamSessions_channelArn,
+    listStreamSessionsResponse_nextToken,
+    listStreamSessionsResponse_httpStatus,
+    listStreamSessionsResponse_streamSessions,
+
+    -- ** ListStreams
+    listStreams_filterBy,
+    listStreams_maxResults,
+    listStreams_nextToken,
+    listStreamsResponse_nextToken,
+    listStreamsResponse_httpStatus,
+    listStreamsResponse_streams,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_httpStatus,
+    listTagsForResourceResponse_tags,
+
+    -- ** PutMetadata
+    putMetadata_channelArn,
+    putMetadata_metadata,
+
+    -- ** StopStream
+    stopStream_channelArn,
+    stopStreamResponse_httpStatus,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateChannel
+    updateChannel_authorized,
+    updateChannel_latencyMode,
+    updateChannel_name,
+    updateChannel_recordingConfigurationArn,
+    updateChannel_type,
+    updateChannel_arn,
+    updateChannelResponse_channel,
+    updateChannelResponse_httpStatus,
+
+    -- * Types
+
+    -- ** AudioConfiguration
+    audioConfiguration_channels,
+    audioConfiguration_codec,
+    audioConfiguration_sampleRate,
+    audioConfiguration_targetBitrate,
+
+    -- ** BatchError
+    batchError_arn,
+    batchError_code,
+    batchError_message,
+
+    -- ** Channel
+    channel_arn,
+    channel_authorized,
+    channel_ingestEndpoint,
+    channel_latencyMode,
+    channel_name,
+    channel_playbackUrl,
+    channel_recordingConfigurationArn,
+    channel_tags,
+    channel_type,
+
+    -- ** ChannelSummary
+    channelSummary_arn,
+    channelSummary_authorized,
+    channelSummary_latencyMode,
+    channelSummary_name,
+    channelSummary_recordingConfigurationArn,
+    channelSummary_tags,
+
+    -- ** DestinationConfiguration
+    destinationConfiguration_s3,
+
+    -- ** IngestConfiguration
+    ingestConfiguration_audio,
+    ingestConfiguration_video,
+
+    -- ** PlaybackKeyPair
+    playbackKeyPair_arn,
+    playbackKeyPair_fingerprint,
+    playbackKeyPair_name,
+    playbackKeyPair_tags,
+
+    -- ** PlaybackKeyPairSummary
+    playbackKeyPairSummary_arn,
+    playbackKeyPairSummary_name,
+    playbackKeyPairSummary_tags,
+
+    -- ** RecordingConfiguration
+    recordingConfiguration_name,
+    recordingConfiguration_recordingReconnectWindowSeconds,
+    recordingConfiguration_tags,
+    recordingConfiguration_thumbnailConfiguration,
+    recordingConfiguration_arn,
+    recordingConfiguration_destinationConfiguration,
+    recordingConfiguration_state,
+
+    -- ** RecordingConfigurationSummary
+    recordingConfigurationSummary_name,
+    recordingConfigurationSummary_tags,
+    recordingConfigurationSummary_arn,
+    recordingConfigurationSummary_destinationConfiguration,
+    recordingConfigurationSummary_state,
+
+    -- ** S3DestinationConfiguration
+    s3DestinationConfiguration_bucketName,
+
+    -- ** Stream
+    stream_channelArn,
+    stream_health,
+    stream_playbackUrl,
+    stream_startTime,
+    stream_state,
+    stream_streamId,
+    stream_viewerCount,
+
+    -- ** StreamEvent
+    streamEvent_eventTime,
+    streamEvent_name,
+    streamEvent_type,
+
+    -- ** StreamFilters
+    streamFilters_health,
+
+    -- ** StreamKey
+    streamKey_arn,
+    streamKey_channelArn,
+    streamKey_tags,
+    streamKey_value,
+
+    -- ** StreamKeySummary
+    streamKeySummary_arn,
+    streamKeySummary_channelArn,
+    streamKeySummary_tags,
+
+    -- ** StreamSession
+    streamSession_channel,
+    streamSession_endTime,
+    streamSession_ingestConfiguration,
+    streamSession_recordingConfiguration,
+    streamSession_startTime,
+    streamSession_streamId,
+    streamSession_truncatedEvents,
+
+    -- ** StreamSessionSummary
+    streamSessionSummary_endTime,
+    streamSessionSummary_hasErrorEvent,
+    streamSessionSummary_startTime,
+    streamSessionSummary_streamId,
+
+    -- ** StreamSummary
+    streamSummary_channelArn,
+    streamSummary_health,
+    streamSummary_startTime,
+    streamSummary_state,
+    streamSummary_streamId,
+    streamSummary_viewerCount,
+
+    -- ** ThumbnailConfiguration
+    thumbnailConfiguration_recordingMode,
+    thumbnailConfiguration_targetIntervalSeconds,
+
+    -- ** VideoConfiguration
+    videoConfiguration_avcLevel,
+    videoConfiguration_avcProfile,
+    videoConfiguration_codec,
+    videoConfiguration_encoder,
+    videoConfiguration_targetBitrate,
+    videoConfiguration_targetFramerate,
+    videoConfiguration_videoHeight,
+    videoConfiguration_videoWidth,
+  )
+where
+
+import Amazonka.IVS.BatchGetChannel
+import Amazonka.IVS.BatchGetStreamKey
+import Amazonka.IVS.CreateChannel
+import Amazonka.IVS.CreateRecordingConfiguration
+import Amazonka.IVS.CreateStreamKey
+import Amazonka.IVS.DeleteChannel
+import Amazonka.IVS.DeletePlaybackKeyPair
+import Amazonka.IVS.DeleteRecordingConfiguration
+import Amazonka.IVS.DeleteStreamKey
+import Amazonka.IVS.GetChannel
+import Amazonka.IVS.GetPlaybackKeyPair
+import Amazonka.IVS.GetRecordingConfiguration
+import Amazonka.IVS.GetStream
+import Amazonka.IVS.GetStreamKey
+import Amazonka.IVS.GetStreamSession
+import Amazonka.IVS.ImportPlaybackKeyPair
+import Amazonka.IVS.ListChannels
+import Amazonka.IVS.ListPlaybackKeyPairs
+import Amazonka.IVS.ListRecordingConfigurations
+import Amazonka.IVS.ListStreamKeys
+import Amazonka.IVS.ListStreamSessions
+import Amazonka.IVS.ListStreams
+import Amazonka.IVS.ListTagsForResource
+import Amazonka.IVS.PutMetadata
+import Amazonka.IVS.StopStream
+import Amazonka.IVS.TagResource
+import Amazonka.IVS.Types.AudioConfiguration
+import Amazonka.IVS.Types.BatchError
+import Amazonka.IVS.Types.Channel
+import Amazonka.IVS.Types.ChannelSummary
+import Amazonka.IVS.Types.DestinationConfiguration
+import Amazonka.IVS.Types.IngestConfiguration
+import Amazonka.IVS.Types.PlaybackKeyPair
+import Amazonka.IVS.Types.PlaybackKeyPairSummary
+import Amazonka.IVS.Types.RecordingConfiguration
+import Amazonka.IVS.Types.RecordingConfigurationSummary
+import Amazonka.IVS.Types.S3DestinationConfiguration
+import Amazonka.IVS.Types.Stream
+import Amazonka.IVS.Types.StreamEvent
+import Amazonka.IVS.Types.StreamFilters
+import Amazonka.IVS.Types.StreamKey
+import Amazonka.IVS.Types.StreamKeySummary
+import Amazonka.IVS.Types.StreamSession
+import Amazonka.IVS.Types.StreamSessionSummary
+import Amazonka.IVS.Types.StreamSummary
+import Amazonka.IVS.Types.ThumbnailConfiguration
+import Amazonka.IVS.Types.VideoConfiguration
+import Amazonka.IVS.UntagResource
+import Amazonka.IVS.UpdateChannel
diff --git a/gen/Amazonka/IVS/ListChannels.hs b/gen/Amazonka/IVS/ListChannels.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/ListChannels.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.IVS.ListChannels
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets summary information about all channels in your account, in the
+-- Amazon Web Services region where the API request is processed. This list
+-- can be filtered to match a specified name or recording-configuration
+-- ARN. Filters are mutually exclusive and cannot be used together. If you
+-- try to use both filters, you will get an error (409 ConflictException).
+--
+-- This operation returns paginated results.
+module Amazonka.IVS.ListChannels
+  ( -- * Creating a Request
+    ListChannels (..),
+    newListChannels,
+
+    -- * Request Lenses
+    listChannels_filterByName,
+    listChannels_filterByRecordingConfigurationArn,
+    listChannels_maxResults,
+    listChannels_nextToken,
+
+    -- * Destructuring the Response
+    ListChannelsResponse (..),
+    newListChannelsResponse,
+
+    -- * Response Lenses
+    listChannelsResponse_nextToken,
+    listChannelsResponse_httpStatus,
+    listChannelsResponse_channels,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListChannels' smart constructor.
+data ListChannels = ListChannels'
+  { -- | Filters the channel list to match the specified name.
+    filterByName :: Prelude.Maybe Prelude.Text,
+    -- | Filters the channel list to match the specified recording-configuration
+    -- ARN.
+    filterByRecordingConfigurationArn :: Prelude.Maybe Prelude.Text,
+    -- | Maximum number of channels to return. Default: 100.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The first channel to retrieve. This is used for pagination; see the
+    -- @nextToken@ response field.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListChannels' 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:
+--
+-- 'filterByName', 'listChannels_filterByName' - Filters the channel list to match the specified name.
+--
+-- 'filterByRecordingConfigurationArn', 'listChannels_filterByRecordingConfigurationArn' - Filters the channel list to match the specified recording-configuration
+-- ARN.
+--
+-- 'maxResults', 'listChannels_maxResults' - Maximum number of channels to return. Default: 100.
+--
+-- 'nextToken', 'listChannels_nextToken' - The first channel to retrieve. This is used for pagination; see the
+-- @nextToken@ response field.
+newListChannels ::
+  ListChannels
+newListChannels =
+  ListChannels'
+    { filterByName = Prelude.Nothing,
+      filterByRecordingConfigurationArn = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | Filters the channel list to match the specified name.
+listChannels_filterByName :: Lens.Lens' ListChannels (Prelude.Maybe Prelude.Text)
+listChannels_filterByName = Lens.lens (\ListChannels' {filterByName} -> filterByName) (\s@ListChannels' {} a -> s {filterByName = a} :: ListChannels)
+
+-- | Filters the channel list to match the specified recording-configuration
+-- ARN.
+listChannels_filterByRecordingConfigurationArn :: Lens.Lens' ListChannels (Prelude.Maybe Prelude.Text)
+listChannels_filterByRecordingConfigurationArn = Lens.lens (\ListChannels' {filterByRecordingConfigurationArn} -> filterByRecordingConfigurationArn) (\s@ListChannels' {} a -> s {filterByRecordingConfigurationArn = a} :: ListChannels)
+
+-- | Maximum number of channels to return. Default: 100.
+listChannels_maxResults :: Lens.Lens' ListChannels (Prelude.Maybe Prelude.Natural)
+listChannels_maxResults = Lens.lens (\ListChannels' {maxResults} -> maxResults) (\s@ListChannels' {} a -> s {maxResults = a} :: ListChannels)
+
+-- | The first channel to retrieve. This is used for pagination; see the
+-- @nextToken@ response field.
+listChannels_nextToken :: Lens.Lens' ListChannels (Prelude.Maybe Prelude.Text)
+listChannels_nextToken = Lens.lens (\ListChannels' {nextToken} -> nextToken) (\s@ListChannels' {} a -> s {nextToken = a} :: ListChannels)
+
+instance Core.AWSPager ListChannels where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listChannelsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        (rs Lens.^. listChannelsResponse_channels) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listChannels_nextToken
+          Lens..~ rs
+          Lens.^? listChannelsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListChannels where
+  type AWSResponse ListChannels = ListChannelsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListChannelsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "channels" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListChannels where
+  hashWithSalt _salt ListChannels' {..} =
+    _salt
+      `Prelude.hashWithSalt` filterByName
+      `Prelude.hashWithSalt` filterByRecordingConfigurationArn
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListChannels where
+  rnf ListChannels' {..} =
+    Prelude.rnf filterByName
+      `Prelude.seq` Prelude.rnf filterByRecordingConfigurationArn
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListChannels where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListChannels where
+  toJSON ListChannels' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("filterByName" Data..=) Prelude.<$> filterByName,
+            ("filterByRecordingConfigurationArn" Data..=)
+              Prelude.<$> filterByRecordingConfigurationArn,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListChannels where
+  toPath = Prelude.const "/ListChannels"
+
+instance Data.ToQuery ListChannels where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListChannelsResponse' smart constructor.
+data ListChannelsResponse = ListChannelsResponse'
+  { -- | If there are more channels than @maxResults@, use @nextToken@ in the
+    -- request to get the next set.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | List of the matching channels.
+    channels :: [ChannelSummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListChannelsResponse' 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', 'listChannelsResponse_nextToken' - If there are more channels than @maxResults@, use @nextToken@ in the
+-- request to get the next set.
+--
+-- 'httpStatus', 'listChannelsResponse_httpStatus' - The response's http status code.
+--
+-- 'channels', 'listChannelsResponse_channels' - List of the matching channels.
+newListChannelsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListChannelsResponse
+newListChannelsResponse pHttpStatus_ =
+  ListChannelsResponse'
+    { nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      channels = Prelude.mempty
+    }
+
+-- | If there are more channels than @maxResults@, use @nextToken@ in the
+-- request to get the next set.
+listChannelsResponse_nextToken :: Lens.Lens' ListChannelsResponse (Prelude.Maybe Prelude.Text)
+listChannelsResponse_nextToken = Lens.lens (\ListChannelsResponse' {nextToken} -> nextToken) (\s@ListChannelsResponse' {} a -> s {nextToken = a} :: ListChannelsResponse)
+
+-- | The response's http status code.
+listChannelsResponse_httpStatus :: Lens.Lens' ListChannelsResponse Prelude.Int
+listChannelsResponse_httpStatus = Lens.lens (\ListChannelsResponse' {httpStatus} -> httpStatus) (\s@ListChannelsResponse' {} a -> s {httpStatus = a} :: ListChannelsResponse)
+
+-- | List of the matching channels.
+listChannelsResponse_channels :: Lens.Lens' ListChannelsResponse [ChannelSummary]
+listChannelsResponse_channels = Lens.lens (\ListChannelsResponse' {channels} -> channels) (\s@ListChannelsResponse' {} a -> s {channels = a} :: ListChannelsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListChannelsResponse where
+  rnf ListChannelsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf channels
diff --git a/gen/Amazonka/IVS/ListPlaybackKeyPairs.hs b/gen/Amazonka/IVS/ListPlaybackKeyPairs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/ListPlaybackKeyPairs.hs
@@ -0,0 +1,225 @@
+{-# 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.IVS.ListPlaybackKeyPairs
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets summary information about playback key pairs. For more information,
+-- see
+-- <https://docs.aws.amazon.com/ivs/latest/userguide/private-channels.html Setting Up Private Channels>
+-- in the /Amazon IVS User Guide/.
+--
+-- This operation returns paginated results.
+module Amazonka.IVS.ListPlaybackKeyPairs
+  ( -- * Creating a Request
+    ListPlaybackKeyPairs (..),
+    newListPlaybackKeyPairs,
+
+    -- * Request Lenses
+    listPlaybackKeyPairs_maxResults,
+    listPlaybackKeyPairs_nextToken,
+
+    -- * Destructuring the Response
+    ListPlaybackKeyPairsResponse (..),
+    newListPlaybackKeyPairsResponse,
+
+    -- * Response Lenses
+    listPlaybackKeyPairsResponse_nextToken,
+    listPlaybackKeyPairsResponse_httpStatus,
+    listPlaybackKeyPairsResponse_keyPairs,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListPlaybackKeyPairs' smart constructor.
+data ListPlaybackKeyPairs = ListPlaybackKeyPairs'
+  { -- | Maximum number of key pairs to return. Default: your service quota or
+    -- 100, whichever is smaller.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The first key pair to retrieve. This is used for pagination; see the
+    -- @nextToken@ response field.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPlaybackKeyPairs' 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', 'listPlaybackKeyPairs_maxResults' - Maximum number of key pairs to return. Default: your service quota or
+-- 100, whichever is smaller.
+--
+-- 'nextToken', 'listPlaybackKeyPairs_nextToken' - The first key pair to retrieve. This is used for pagination; see the
+-- @nextToken@ response field.
+newListPlaybackKeyPairs ::
+  ListPlaybackKeyPairs
+newListPlaybackKeyPairs =
+  ListPlaybackKeyPairs'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | Maximum number of key pairs to return. Default: your service quota or
+-- 100, whichever is smaller.
+listPlaybackKeyPairs_maxResults :: Lens.Lens' ListPlaybackKeyPairs (Prelude.Maybe Prelude.Natural)
+listPlaybackKeyPairs_maxResults = Lens.lens (\ListPlaybackKeyPairs' {maxResults} -> maxResults) (\s@ListPlaybackKeyPairs' {} a -> s {maxResults = a} :: ListPlaybackKeyPairs)
+
+-- | The first key pair to retrieve. This is used for pagination; see the
+-- @nextToken@ response field.
+listPlaybackKeyPairs_nextToken :: Lens.Lens' ListPlaybackKeyPairs (Prelude.Maybe Prelude.Text)
+listPlaybackKeyPairs_nextToken = Lens.lens (\ListPlaybackKeyPairs' {nextToken} -> nextToken) (\s@ListPlaybackKeyPairs' {} a -> s {nextToken = a} :: ListPlaybackKeyPairs)
+
+instance Core.AWSPager ListPlaybackKeyPairs where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listPlaybackKeyPairsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        (rs Lens.^. listPlaybackKeyPairsResponse_keyPairs) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listPlaybackKeyPairs_nextToken
+          Lens..~ rs
+          Lens.^? listPlaybackKeyPairsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListPlaybackKeyPairs where
+  type
+    AWSResponse ListPlaybackKeyPairs =
+      ListPlaybackKeyPairsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListPlaybackKeyPairsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "keyPairs" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListPlaybackKeyPairs where
+  hashWithSalt _salt ListPlaybackKeyPairs' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListPlaybackKeyPairs where
+  rnf ListPlaybackKeyPairs' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListPlaybackKeyPairs where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListPlaybackKeyPairs where
+  toJSON ListPlaybackKeyPairs' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListPlaybackKeyPairs where
+  toPath = Prelude.const "/ListPlaybackKeyPairs"
+
+instance Data.ToQuery ListPlaybackKeyPairs where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListPlaybackKeyPairsResponse' smart constructor.
+data ListPlaybackKeyPairsResponse = ListPlaybackKeyPairsResponse'
+  { -- | If there are more key pairs than @maxResults@, use @nextToken@ in the
+    -- request to get the next set.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | List of key pairs.
+    keyPairs :: [PlaybackKeyPairSummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPlaybackKeyPairsResponse' 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', 'listPlaybackKeyPairsResponse_nextToken' - If there are more key pairs than @maxResults@, use @nextToken@ in the
+-- request to get the next set.
+--
+-- 'httpStatus', 'listPlaybackKeyPairsResponse_httpStatus' - The response's http status code.
+--
+-- 'keyPairs', 'listPlaybackKeyPairsResponse_keyPairs' - List of key pairs.
+newListPlaybackKeyPairsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListPlaybackKeyPairsResponse
+newListPlaybackKeyPairsResponse pHttpStatus_ =
+  ListPlaybackKeyPairsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      keyPairs = Prelude.mempty
+    }
+
+-- | If there are more key pairs than @maxResults@, use @nextToken@ in the
+-- request to get the next set.
+listPlaybackKeyPairsResponse_nextToken :: Lens.Lens' ListPlaybackKeyPairsResponse (Prelude.Maybe Prelude.Text)
+listPlaybackKeyPairsResponse_nextToken = Lens.lens (\ListPlaybackKeyPairsResponse' {nextToken} -> nextToken) (\s@ListPlaybackKeyPairsResponse' {} a -> s {nextToken = a} :: ListPlaybackKeyPairsResponse)
+
+-- | The response's http status code.
+listPlaybackKeyPairsResponse_httpStatus :: Lens.Lens' ListPlaybackKeyPairsResponse Prelude.Int
+listPlaybackKeyPairsResponse_httpStatus = Lens.lens (\ListPlaybackKeyPairsResponse' {httpStatus} -> httpStatus) (\s@ListPlaybackKeyPairsResponse' {} a -> s {httpStatus = a} :: ListPlaybackKeyPairsResponse)
+
+-- | List of key pairs.
+listPlaybackKeyPairsResponse_keyPairs :: Lens.Lens' ListPlaybackKeyPairsResponse [PlaybackKeyPairSummary]
+listPlaybackKeyPairsResponse_keyPairs = Lens.lens (\ListPlaybackKeyPairsResponse' {keyPairs} -> keyPairs) (\s@ListPlaybackKeyPairsResponse' {} a -> s {keyPairs = a} :: ListPlaybackKeyPairsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListPlaybackKeyPairsResponse where
+  rnf ListPlaybackKeyPairsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf keyPairs
diff --git a/gen/Amazonka/IVS/ListRecordingConfigurations.hs b/gen/Amazonka/IVS/ListRecordingConfigurations.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/ListRecordingConfigurations.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.IVS.ListRecordingConfigurations
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets summary information about all recording configurations in your
+-- account, in the Amazon Web Services region where the API request is
+-- processed.
+--
+-- This operation returns paginated results.
+module Amazonka.IVS.ListRecordingConfigurations
+  ( -- * Creating a Request
+    ListRecordingConfigurations (..),
+    newListRecordingConfigurations,
+
+    -- * Request Lenses
+    listRecordingConfigurations_maxResults,
+    listRecordingConfigurations_nextToken,
+
+    -- * Destructuring the Response
+    ListRecordingConfigurationsResponse (..),
+    newListRecordingConfigurationsResponse,
+
+    -- * Response Lenses
+    listRecordingConfigurationsResponse_nextToken,
+    listRecordingConfigurationsResponse_httpStatus,
+    listRecordingConfigurationsResponse_recordingConfigurations,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListRecordingConfigurations' smart constructor.
+data ListRecordingConfigurations = ListRecordingConfigurations'
+  { -- | Maximum number of recording configurations to return. Default: your
+    -- service quota or 100, whichever is smaller.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The first recording configuration to retrieve. This is used for
+    -- pagination; see the @nextToken@ response field.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListRecordingConfigurations' 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', 'listRecordingConfigurations_maxResults' - Maximum number of recording configurations to return. Default: your
+-- service quota or 100, whichever is smaller.
+--
+-- 'nextToken', 'listRecordingConfigurations_nextToken' - The first recording configuration to retrieve. This is used for
+-- pagination; see the @nextToken@ response field.
+newListRecordingConfigurations ::
+  ListRecordingConfigurations
+newListRecordingConfigurations =
+  ListRecordingConfigurations'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | Maximum number of recording configurations to return. Default: your
+-- service quota or 100, whichever is smaller.
+listRecordingConfigurations_maxResults :: Lens.Lens' ListRecordingConfigurations (Prelude.Maybe Prelude.Natural)
+listRecordingConfigurations_maxResults = Lens.lens (\ListRecordingConfigurations' {maxResults} -> maxResults) (\s@ListRecordingConfigurations' {} a -> s {maxResults = a} :: ListRecordingConfigurations)
+
+-- | The first recording configuration to retrieve. This is used for
+-- pagination; see the @nextToken@ response field.
+listRecordingConfigurations_nextToken :: Lens.Lens' ListRecordingConfigurations (Prelude.Maybe Prelude.Text)
+listRecordingConfigurations_nextToken = Lens.lens (\ListRecordingConfigurations' {nextToken} -> nextToken) (\s@ListRecordingConfigurations' {} a -> s {nextToken = a} :: ListRecordingConfigurations)
+
+instance Core.AWSPager ListRecordingConfigurations where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listRecordingConfigurationsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^. listRecordingConfigurationsResponse_recordingConfigurations
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listRecordingConfigurations_nextToken
+          Lens..~ rs
+          Lens.^? listRecordingConfigurationsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListRecordingConfigurations where
+  type
+    AWSResponse ListRecordingConfigurations =
+      ListRecordingConfigurationsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListRecordingConfigurationsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "recordingConfigurations"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListRecordingConfigurations where
+  hashWithSalt _salt ListRecordingConfigurations' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListRecordingConfigurations where
+  rnf ListRecordingConfigurations' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListRecordingConfigurations where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListRecordingConfigurations where
+  toJSON ListRecordingConfigurations' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListRecordingConfigurations where
+  toPath = Prelude.const "/ListRecordingConfigurations"
+
+instance Data.ToQuery ListRecordingConfigurations where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListRecordingConfigurationsResponse' smart constructor.
+data ListRecordingConfigurationsResponse = ListRecordingConfigurationsResponse'
+  { -- | If there are more recording configurations than @maxResults@, use
+    -- @nextToken@ in the request to get the next set.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | List of the matching recording configurations.
+    recordingConfigurations :: [RecordingConfigurationSummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListRecordingConfigurationsResponse' 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', 'listRecordingConfigurationsResponse_nextToken' - If there are more recording configurations than @maxResults@, use
+-- @nextToken@ in the request to get the next set.
+--
+-- 'httpStatus', 'listRecordingConfigurationsResponse_httpStatus' - The response's http status code.
+--
+-- 'recordingConfigurations', 'listRecordingConfigurationsResponse_recordingConfigurations' - List of the matching recording configurations.
+newListRecordingConfigurationsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListRecordingConfigurationsResponse
+newListRecordingConfigurationsResponse pHttpStatus_ =
+  ListRecordingConfigurationsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      recordingConfigurations =
+        Prelude.mempty
+    }
+
+-- | If there are more recording configurations than @maxResults@, use
+-- @nextToken@ in the request to get the next set.
+listRecordingConfigurationsResponse_nextToken :: Lens.Lens' ListRecordingConfigurationsResponse (Prelude.Maybe Prelude.Text)
+listRecordingConfigurationsResponse_nextToken = Lens.lens (\ListRecordingConfigurationsResponse' {nextToken} -> nextToken) (\s@ListRecordingConfigurationsResponse' {} a -> s {nextToken = a} :: ListRecordingConfigurationsResponse)
+
+-- | The response's http status code.
+listRecordingConfigurationsResponse_httpStatus :: Lens.Lens' ListRecordingConfigurationsResponse Prelude.Int
+listRecordingConfigurationsResponse_httpStatus = Lens.lens (\ListRecordingConfigurationsResponse' {httpStatus} -> httpStatus) (\s@ListRecordingConfigurationsResponse' {} a -> s {httpStatus = a} :: ListRecordingConfigurationsResponse)
+
+-- | List of the matching recording configurations.
+listRecordingConfigurationsResponse_recordingConfigurations :: Lens.Lens' ListRecordingConfigurationsResponse [RecordingConfigurationSummary]
+listRecordingConfigurationsResponse_recordingConfigurations = Lens.lens (\ListRecordingConfigurationsResponse' {recordingConfigurations} -> recordingConfigurations) (\s@ListRecordingConfigurationsResponse' {} a -> s {recordingConfigurations = a} :: ListRecordingConfigurationsResponse) Prelude.. Lens.coerced
+
+instance
+  Prelude.NFData
+    ListRecordingConfigurationsResponse
+  where
+  rnf ListRecordingConfigurationsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf recordingConfigurations
diff --git a/gen/Amazonka/IVS/ListStreamKeys.hs b/gen/Amazonka/IVS/ListStreamKeys.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/ListStreamKeys.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.IVS.ListStreamKeys
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets summary information about stream keys for the specified channel.
+--
+-- This operation returns paginated results.
+module Amazonka.IVS.ListStreamKeys
+  ( -- * Creating a Request
+    ListStreamKeys (..),
+    newListStreamKeys,
+
+    -- * Request Lenses
+    listStreamKeys_maxResults,
+    listStreamKeys_nextToken,
+    listStreamKeys_channelArn,
+
+    -- * Destructuring the Response
+    ListStreamKeysResponse (..),
+    newListStreamKeysResponse,
+
+    -- * Response Lenses
+    listStreamKeysResponse_nextToken,
+    listStreamKeysResponse_httpStatus,
+    listStreamKeysResponse_streamKeys,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListStreamKeys' smart constructor.
+data ListStreamKeys = ListStreamKeys'
+  { -- | Maximum number of streamKeys to return. Default: 1.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The first stream key to retrieve. This is used for pagination; see the
+    -- @nextToken@ response field.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Channel ARN used to filter the list.
+    channelArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListStreamKeys' 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', 'listStreamKeys_maxResults' - Maximum number of streamKeys to return. Default: 1.
+--
+-- 'nextToken', 'listStreamKeys_nextToken' - The first stream key to retrieve. This is used for pagination; see the
+-- @nextToken@ response field.
+--
+-- 'channelArn', 'listStreamKeys_channelArn' - Channel ARN used to filter the list.
+newListStreamKeys ::
+  -- | 'channelArn'
+  Prelude.Text ->
+  ListStreamKeys
+newListStreamKeys pChannelArn_ =
+  ListStreamKeys'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      channelArn = pChannelArn_
+    }
+
+-- | Maximum number of streamKeys to return. Default: 1.
+listStreamKeys_maxResults :: Lens.Lens' ListStreamKeys (Prelude.Maybe Prelude.Natural)
+listStreamKeys_maxResults = Lens.lens (\ListStreamKeys' {maxResults} -> maxResults) (\s@ListStreamKeys' {} a -> s {maxResults = a} :: ListStreamKeys)
+
+-- | The first stream key to retrieve. This is used for pagination; see the
+-- @nextToken@ response field.
+listStreamKeys_nextToken :: Lens.Lens' ListStreamKeys (Prelude.Maybe Prelude.Text)
+listStreamKeys_nextToken = Lens.lens (\ListStreamKeys' {nextToken} -> nextToken) (\s@ListStreamKeys' {} a -> s {nextToken = a} :: ListStreamKeys)
+
+-- | Channel ARN used to filter the list.
+listStreamKeys_channelArn :: Lens.Lens' ListStreamKeys Prelude.Text
+listStreamKeys_channelArn = Lens.lens (\ListStreamKeys' {channelArn} -> channelArn) (\s@ListStreamKeys' {} a -> s {channelArn = a} :: ListStreamKeys)
+
+instance Core.AWSPager ListStreamKeys where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listStreamKeysResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        (rs Lens.^. listStreamKeysResponse_streamKeys) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listStreamKeys_nextToken
+          Lens..~ rs
+          Lens.^? listStreamKeysResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListStreamKeys where
+  type
+    AWSResponse ListStreamKeys =
+      ListStreamKeysResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListStreamKeysResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "streamKeys" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListStreamKeys where
+  hashWithSalt _salt ListStreamKeys' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` channelArn
+
+instance Prelude.NFData ListStreamKeys where
+  rnf ListStreamKeys' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf channelArn
+
+instance Data.ToHeaders ListStreamKeys where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListStreamKeys where
+  toJSON ListStreamKeys' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("channelArn" Data..= channelArn)
+          ]
+      )
+
+instance Data.ToPath ListStreamKeys where
+  toPath = Prelude.const "/ListStreamKeys"
+
+instance Data.ToQuery ListStreamKeys where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListStreamKeysResponse' smart constructor.
+data ListStreamKeysResponse = ListStreamKeysResponse'
+  { -- | If there are more stream keys than @maxResults@, use @nextToken@ in the
+    -- request to get the next set.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | List of stream keys.
+    streamKeys :: [StreamKeySummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListStreamKeysResponse' 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', 'listStreamKeysResponse_nextToken' - If there are more stream keys than @maxResults@, use @nextToken@ in the
+-- request to get the next set.
+--
+-- 'httpStatus', 'listStreamKeysResponse_httpStatus' - The response's http status code.
+--
+-- 'streamKeys', 'listStreamKeysResponse_streamKeys' - List of stream keys.
+newListStreamKeysResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListStreamKeysResponse
+newListStreamKeysResponse pHttpStatus_ =
+  ListStreamKeysResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      streamKeys = Prelude.mempty
+    }
+
+-- | If there are more stream keys than @maxResults@, use @nextToken@ in the
+-- request to get the next set.
+listStreamKeysResponse_nextToken :: Lens.Lens' ListStreamKeysResponse (Prelude.Maybe Prelude.Text)
+listStreamKeysResponse_nextToken = Lens.lens (\ListStreamKeysResponse' {nextToken} -> nextToken) (\s@ListStreamKeysResponse' {} a -> s {nextToken = a} :: ListStreamKeysResponse)
+
+-- | The response's http status code.
+listStreamKeysResponse_httpStatus :: Lens.Lens' ListStreamKeysResponse Prelude.Int
+listStreamKeysResponse_httpStatus = Lens.lens (\ListStreamKeysResponse' {httpStatus} -> httpStatus) (\s@ListStreamKeysResponse' {} a -> s {httpStatus = a} :: ListStreamKeysResponse)
+
+-- | List of stream keys.
+listStreamKeysResponse_streamKeys :: Lens.Lens' ListStreamKeysResponse [StreamKeySummary]
+listStreamKeysResponse_streamKeys = Lens.lens (\ListStreamKeysResponse' {streamKeys} -> streamKeys) (\s@ListStreamKeysResponse' {} a -> s {streamKeys = a} :: ListStreamKeysResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListStreamKeysResponse where
+  rnf ListStreamKeysResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf streamKeys
diff --git a/gen/Amazonka/IVS/ListStreamSessions.hs b/gen/Amazonka/IVS/ListStreamSessions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/ListStreamSessions.hs
@@ -0,0 +1,217 @@
+{-# 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.IVS.ListStreamSessions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets a summary of current and previous streams for a specified channel
+-- in your account, in the AWS region where the API request is processed.
+module Amazonka.IVS.ListStreamSessions
+  ( -- * Creating a Request
+    ListStreamSessions (..),
+    newListStreamSessions,
+
+    -- * Request Lenses
+    listStreamSessions_maxResults,
+    listStreamSessions_nextToken,
+    listStreamSessions_channelArn,
+
+    -- * Destructuring the Response
+    ListStreamSessionsResponse (..),
+    newListStreamSessionsResponse,
+
+    -- * Response Lenses
+    listStreamSessionsResponse_nextToken,
+    listStreamSessionsResponse_httpStatus,
+    listStreamSessionsResponse_streamSessions,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListStreamSessions' smart constructor.
+data ListStreamSessions = ListStreamSessions'
+  { -- | Maximum number of streams to return. Default: 100.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The first stream to retrieve. This is used for pagination; see the
+    -- @nextToken@ response field.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Channel ARN used to filter the list.
+    channelArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListStreamSessions' 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', 'listStreamSessions_maxResults' - Maximum number of streams to return. Default: 100.
+--
+-- 'nextToken', 'listStreamSessions_nextToken' - The first stream to retrieve. This is used for pagination; see the
+-- @nextToken@ response field.
+--
+-- 'channelArn', 'listStreamSessions_channelArn' - Channel ARN used to filter the list.
+newListStreamSessions ::
+  -- | 'channelArn'
+  Prelude.Text ->
+  ListStreamSessions
+newListStreamSessions pChannelArn_ =
+  ListStreamSessions'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      channelArn = pChannelArn_
+    }
+
+-- | Maximum number of streams to return. Default: 100.
+listStreamSessions_maxResults :: Lens.Lens' ListStreamSessions (Prelude.Maybe Prelude.Natural)
+listStreamSessions_maxResults = Lens.lens (\ListStreamSessions' {maxResults} -> maxResults) (\s@ListStreamSessions' {} a -> s {maxResults = a} :: ListStreamSessions)
+
+-- | The first stream to retrieve. This is used for pagination; see the
+-- @nextToken@ response field.
+listStreamSessions_nextToken :: Lens.Lens' ListStreamSessions (Prelude.Maybe Prelude.Text)
+listStreamSessions_nextToken = Lens.lens (\ListStreamSessions' {nextToken} -> nextToken) (\s@ListStreamSessions' {} a -> s {nextToken = a} :: ListStreamSessions)
+
+-- | Channel ARN used to filter the list.
+listStreamSessions_channelArn :: Lens.Lens' ListStreamSessions Prelude.Text
+listStreamSessions_channelArn = Lens.lens (\ListStreamSessions' {channelArn} -> channelArn) (\s@ListStreamSessions' {} a -> s {channelArn = a} :: ListStreamSessions)
+
+instance Core.AWSRequest ListStreamSessions where
+  type
+    AWSResponse ListStreamSessions =
+      ListStreamSessionsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListStreamSessionsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "streamSessions"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListStreamSessions where
+  hashWithSalt _salt ListStreamSessions' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` channelArn
+
+instance Prelude.NFData ListStreamSessions where
+  rnf ListStreamSessions' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf channelArn
+
+instance Data.ToHeaders ListStreamSessions where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListStreamSessions where
+  toJSON ListStreamSessions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("channelArn" Data..= channelArn)
+          ]
+      )
+
+instance Data.ToPath ListStreamSessions where
+  toPath = Prelude.const "/ListStreamSessions"
+
+instance Data.ToQuery ListStreamSessions where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListStreamSessionsResponse' smart constructor.
+data ListStreamSessionsResponse = ListStreamSessionsResponse'
+  { -- | If there are more streams than @maxResults@, use @nextToken@ in the
+    -- request to get the next set.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | List of stream sessions.
+    streamSessions :: [StreamSessionSummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListStreamSessionsResponse' 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', 'listStreamSessionsResponse_nextToken' - If there are more streams than @maxResults@, use @nextToken@ in the
+-- request to get the next set.
+--
+-- 'httpStatus', 'listStreamSessionsResponse_httpStatus' - The response's http status code.
+--
+-- 'streamSessions', 'listStreamSessionsResponse_streamSessions' - List of stream sessions.
+newListStreamSessionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListStreamSessionsResponse
+newListStreamSessionsResponse pHttpStatus_ =
+  ListStreamSessionsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      streamSessions = Prelude.mempty
+    }
+
+-- | If there are more streams than @maxResults@, use @nextToken@ in the
+-- request to get the next set.
+listStreamSessionsResponse_nextToken :: Lens.Lens' ListStreamSessionsResponse (Prelude.Maybe Prelude.Text)
+listStreamSessionsResponse_nextToken = Lens.lens (\ListStreamSessionsResponse' {nextToken} -> nextToken) (\s@ListStreamSessionsResponse' {} a -> s {nextToken = a} :: ListStreamSessionsResponse)
+
+-- | The response's http status code.
+listStreamSessionsResponse_httpStatus :: Lens.Lens' ListStreamSessionsResponse Prelude.Int
+listStreamSessionsResponse_httpStatus = Lens.lens (\ListStreamSessionsResponse' {httpStatus} -> httpStatus) (\s@ListStreamSessionsResponse' {} a -> s {httpStatus = a} :: ListStreamSessionsResponse)
+
+-- | List of stream sessions.
+listStreamSessionsResponse_streamSessions :: Lens.Lens' ListStreamSessionsResponse [StreamSessionSummary]
+listStreamSessionsResponse_streamSessions = Lens.lens (\ListStreamSessionsResponse' {streamSessions} -> streamSessions) (\s@ListStreamSessionsResponse' {} a -> s {streamSessions = a} :: ListStreamSessionsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListStreamSessionsResponse where
+  rnf ListStreamSessionsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf streamSessions
diff --git a/gen/Amazonka/IVS/ListStreams.hs b/gen/Amazonka/IVS/ListStreams.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/ListStreams.hs
@@ -0,0 +1,229 @@
+{-# 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.IVS.ListStreams
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets summary information about live streams in your account, in the
+-- Amazon Web Services region where the API request is processed.
+--
+-- This operation returns paginated results.
+module Amazonka.IVS.ListStreams
+  ( -- * Creating a Request
+    ListStreams (..),
+    newListStreams,
+
+    -- * Request Lenses
+    listStreams_filterBy,
+    listStreams_maxResults,
+    listStreams_nextToken,
+
+    -- * Destructuring the Response
+    ListStreamsResponse (..),
+    newListStreamsResponse,
+
+    -- * Response Lenses
+    listStreamsResponse_nextToken,
+    listStreamsResponse_httpStatus,
+    listStreamsResponse_streams,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListStreams' smart constructor.
+data ListStreams = ListStreams'
+  { -- | Filters the stream list to match the specified criterion.
+    filterBy :: Prelude.Maybe StreamFilters,
+    -- | Maximum number of streams to return. Default: 100.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The first stream to retrieve. This is used for pagination; see the
+    -- @nextToken@ response field.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListStreams' 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:
+--
+-- 'filterBy', 'listStreams_filterBy' - Filters the stream list to match the specified criterion.
+--
+-- 'maxResults', 'listStreams_maxResults' - Maximum number of streams to return. Default: 100.
+--
+-- 'nextToken', 'listStreams_nextToken' - The first stream to retrieve. This is used for pagination; see the
+-- @nextToken@ response field.
+newListStreams ::
+  ListStreams
+newListStreams =
+  ListStreams'
+    { filterBy = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | Filters the stream list to match the specified criterion.
+listStreams_filterBy :: Lens.Lens' ListStreams (Prelude.Maybe StreamFilters)
+listStreams_filterBy = Lens.lens (\ListStreams' {filterBy} -> filterBy) (\s@ListStreams' {} a -> s {filterBy = a} :: ListStreams)
+
+-- | Maximum number of streams to return. Default: 100.
+listStreams_maxResults :: Lens.Lens' ListStreams (Prelude.Maybe Prelude.Natural)
+listStreams_maxResults = Lens.lens (\ListStreams' {maxResults} -> maxResults) (\s@ListStreams' {} a -> s {maxResults = a} :: ListStreams)
+
+-- | The first stream to retrieve. This is used for pagination; see the
+-- @nextToken@ response field.
+listStreams_nextToken :: Lens.Lens' ListStreams (Prelude.Maybe Prelude.Text)
+listStreams_nextToken = Lens.lens (\ListStreams' {nextToken} -> nextToken) (\s@ListStreams' {} a -> s {nextToken = a} :: ListStreams)
+
+instance Core.AWSPager ListStreams where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listStreamsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop (rs Lens.^. listStreamsResponse_streams) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listStreams_nextToken
+          Lens..~ rs
+          Lens.^? listStreamsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListStreams where
+  type AWSResponse ListStreams = ListStreamsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListStreamsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "streams" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListStreams where
+  hashWithSalt _salt ListStreams' {..} =
+    _salt
+      `Prelude.hashWithSalt` filterBy
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListStreams where
+  rnf ListStreams' {..} =
+    Prelude.rnf filterBy
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListStreams where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListStreams where
+  toJSON ListStreams' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("filterBy" Data..=) Prelude.<$> filterBy,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListStreams where
+  toPath = Prelude.const "/ListStreams"
+
+instance Data.ToQuery ListStreams where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListStreamsResponse' smart constructor.
+data ListStreamsResponse = ListStreamsResponse'
+  { -- | If there are more streams than @maxResults@, use @nextToken@ in the
+    -- request to get the next set.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | List of streams.
+    streams :: [StreamSummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListStreamsResponse' 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', 'listStreamsResponse_nextToken' - If there are more streams than @maxResults@, use @nextToken@ in the
+-- request to get the next set.
+--
+-- 'httpStatus', 'listStreamsResponse_httpStatus' - The response's http status code.
+--
+-- 'streams', 'listStreamsResponse_streams' - List of streams.
+newListStreamsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListStreamsResponse
+newListStreamsResponse pHttpStatus_ =
+  ListStreamsResponse'
+    { nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      streams = Prelude.mempty
+    }
+
+-- | If there are more streams than @maxResults@, use @nextToken@ in the
+-- request to get the next set.
+listStreamsResponse_nextToken :: Lens.Lens' ListStreamsResponse (Prelude.Maybe Prelude.Text)
+listStreamsResponse_nextToken = Lens.lens (\ListStreamsResponse' {nextToken} -> nextToken) (\s@ListStreamsResponse' {} a -> s {nextToken = a} :: ListStreamsResponse)
+
+-- | The response's http status code.
+listStreamsResponse_httpStatus :: Lens.Lens' ListStreamsResponse Prelude.Int
+listStreamsResponse_httpStatus = Lens.lens (\ListStreamsResponse' {httpStatus} -> httpStatus) (\s@ListStreamsResponse' {} a -> s {httpStatus = a} :: ListStreamsResponse)
+
+-- | List of streams.
+listStreamsResponse_streams :: Lens.Lens' ListStreamsResponse [StreamSummary]
+listStreamsResponse_streams = Lens.lens (\ListStreamsResponse' {streams} -> streams) (\s@ListStreamsResponse' {} a -> s {streams = a} :: ListStreamsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListStreamsResponse where
+  rnf ListStreamsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf streams
diff --git a/gen/Amazonka/IVS/ListTagsForResource.hs b/gen/Amazonka/IVS/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/ListTagsForResource.hs
@@ -0,0 +1,157 @@
+{-# 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.IVS.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)
+--
+-- Gets information about Amazon Web Services tags for the specified ARN.
+module Amazonka.IVS.ListTagsForResource
+  ( -- * Creating a Request
+    ListTagsForResource (..),
+    newListTagsForResource,
+
+    -- * Request Lenses
+    listTagsForResource_resourceArn,
+
+    -- * Destructuring the Response
+    ListTagsForResourceResponse (..),
+    newListTagsForResourceResponse,
+
+    -- * Response Lenses
+    listTagsForResourceResponse_httpStatus,
+    listTagsForResourceResponse_tags,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.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 ARN of the resource to be retrieved. The ARN must be URL-encoded.
+    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 ARN of the resource to be retrieved. The ARN must be URL-encoded.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | The ARN of the resource to be retrieved. The ARN must be URL-encoded.
+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.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTagsForResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "tags" Core..!@ Prelude.mempty)
+      )
+
+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
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListTagsForResource where
+  toPath ListTagsForResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    tags :: Prelude.HashMap Prelude.Text Prelude.Text
+  }
+  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:
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+--
+-- 'tags', 'listTagsForResourceResponse_tags' -
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { httpStatus =
+        pHttpStatus_,
+      tags = Prelude.mempty
+    }
+
+-- | 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)
+
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.HashMap Prelude.Text Prelude.Text)
+listTagsForResourceResponse_tags = Lens.lens (\ListTagsForResourceResponse' {tags} -> tags) (\s@ListTagsForResourceResponse' {} a -> s {tags = a} :: ListTagsForResourceResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListTagsForResourceResponse where
+  rnf ListTagsForResourceResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf tags
diff --git a/gen/Amazonka/IVS/PutMetadata.hs b/gen/Amazonka/IVS/PutMetadata.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/PutMetadata.hs
@@ -0,0 +1,154 @@
+{-# 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.IVS.PutMetadata
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Inserts metadata into the active stream of the specified channel. At
+-- most 5 requests per second per channel are allowed, each with a maximum
+-- 1 KB payload. (If 5 TPS is not sufficient for your needs, we recommend
+-- batching your data into a single PutMetadata call.) At most 155 requests
+-- per second per account are allowed. Also see
+-- <https://docs.aws.amazon.com/ivs/latest/userguide/metadata.html Embedding Metadata within a Video Stream>
+-- in the /Amazon IVS User Guide/.
+module Amazonka.IVS.PutMetadata
+  ( -- * Creating a Request
+    PutMetadata (..),
+    newPutMetadata,
+
+    -- * Request Lenses
+    putMetadata_channelArn,
+    putMetadata_metadata,
+
+    -- * Destructuring the Response
+    PutMetadataResponse (..),
+    newPutMetadataResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newPutMetadata' smart constructor.
+data PutMetadata = PutMetadata'
+  { -- | ARN of the channel into which metadata is inserted. This channel must
+    -- have an active stream.
+    channelArn :: Prelude.Text,
+    -- | Metadata to insert into the stream. Maximum: 1 KB per request.
+    metadata :: Data.Sensitive Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutMetadata' 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:
+--
+-- 'channelArn', 'putMetadata_channelArn' - ARN of the channel into which metadata is inserted. This channel must
+-- have an active stream.
+--
+-- 'metadata', 'putMetadata_metadata' - Metadata to insert into the stream. Maximum: 1 KB per request.
+newPutMetadata ::
+  -- | 'channelArn'
+  Prelude.Text ->
+  -- | 'metadata'
+  Prelude.Text ->
+  PutMetadata
+newPutMetadata pChannelArn_ pMetadata_ =
+  PutMetadata'
+    { channelArn = pChannelArn_,
+      metadata = Data._Sensitive Lens.# pMetadata_
+    }
+
+-- | ARN of the channel into which metadata is inserted. This channel must
+-- have an active stream.
+putMetadata_channelArn :: Lens.Lens' PutMetadata Prelude.Text
+putMetadata_channelArn = Lens.lens (\PutMetadata' {channelArn} -> channelArn) (\s@PutMetadata' {} a -> s {channelArn = a} :: PutMetadata)
+
+-- | Metadata to insert into the stream. Maximum: 1 KB per request.
+putMetadata_metadata :: Lens.Lens' PutMetadata Prelude.Text
+putMetadata_metadata = Lens.lens (\PutMetadata' {metadata} -> metadata) (\s@PutMetadata' {} a -> s {metadata = a} :: PutMetadata) Prelude.. Data._Sensitive
+
+instance Core.AWSRequest PutMetadata where
+  type AWSResponse PutMetadata = PutMetadataResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response = Response.receiveNull PutMetadataResponse'
+
+instance Prelude.Hashable PutMetadata where
+  hashWithSalt _salt PutMetadata' {..} =
+    _salt
+      `Prelude.hashWithSalt` channelArn
+      `Prelude.hashWithSalt` metadata
+
+instance Prelude.NFData PutMetadata where
+  rnf PutMetadata' {..} =
+    Prelude.rnf channelArn
+      `Prelude.seq` Prelude.rnf metadata
+
+instance Data.ToHeaders PutMetadata where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutMetadata where
+  toJSON PutMetadata' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("channelArn" Data..= channelArn),
+            Prelude.Just ("metadata" Data..= metadata)
+          ]
+      )
+
+instance Data.ToPath PutMetadata where
+  toPath = Prelude.const "/PutMetadata"
+
+instance Data.ToQuery PutMetadata where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutMetadataResponse' smart constructor.
+data PutMetadataResponse = PutMetadataResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutMetadataResponse' 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.
+newPutMetadataResponse ::
+  PutMetadataResponse
+newPutMetadataResponse = PutMetadataResponse'
+
+instance Prelude.NFData PutMetadataResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/IVS/StopStream.hs b/gen/Amazonka/IVS/StopStream.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/StopStream.hs
@@ -0,0 +1,152 @@
+{-# 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.IVS.StopStream
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Disconnects the incoming RTMPS stream for the specified channel. Can be
+-- used in conjunction with DeleteStreamKey to prevent further streaming to
+-- a channel.
+--
+-- Many streaming client-software libraries automatically reconnect a
+-- dropped RTMPS session, so to stop the stream permanently, you may want
+-- to first revoke the @streamKey@ attached to the channel.
+module Amazonka.IVS.StopStream
+  ( -- * Creating a Request
+    StopStream (..),
+    newStopStream,
+
+    -- * Request Lenses
+    stopStream_channelArn,
+
+    -- * Destructuring the Response
+    StopStreamResponse (..),
+    newStopStreamResponse,
+
+    -- * Response Lenses
+    stopStreamResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newStopStream' smart constructor.
+data StopStream = StopStream'
+  { -- | ARN of the channel for which the stream is to be stopped.
+    channelArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StopStream' 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:
+--
+-- 'channelArn', 'stopStream_channelArn' - ARN of the channel for which the stream is to be stopped.
+newStopStream ::
+  -- | 'channelArn'
+  Prelude.Text ->
+  StopStream
+newStopStream pChannelArn_ =
+  StopStream' {channelArn = pChannelArn_}
+
+-- | ARN of the channel for which the stream is to be stopped.
+stopStream_channelArn :: Lens.Lens' StopStream Prelude.Text
+stopStream_channelArn = Lens.lens (\StopStream' {channelArn} -> channelArn) (\s@StopStream' {} a -> s {channelArn = a} :: StopStream)
+
+instance Core.AWSRequest StopStream where
+  type AWSResponse StopStream = StopStreamResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          StopStreamResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StopStream where
+  hashWithSalt _salt StopStream' {..} =
+    _salt `Prelude.hashWithSalt` channelArn
+
+instance Prelude.NFData StopStream where
+  rnf StopStream' {..} = Prelude.rnf channelArn
+
+instance Data.ToHeaders StopStream where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StopStream where
+  toJSON StopStream' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("channelArn" Data..= channelArn)]
+      )
+
+instance Data.ToPath StopStream where
+  toPath = Prelude.const "/StopStream"
+
+instance Data.ToQuery StopStream where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStopStreamResponse' smart constructor.
+data StopStreamResponse = StopStreamResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StopStreamResponse' 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', 'stopStreamResponse_httpStatus' - The response's http status code.
+newStopStreamResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StopStreamResponse
+newStopStreamResponse pHttpStatus_ =
+  StopStreamResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+stopStreamResponse_httpStatus :: Lens.Lens' StopStreamResponse Prelude.Int
+stopStreamResponse_httpStatus = Lens.lens (\StopStreamResponse' {httpStatus} -> httpStatus) (\s@StopStreamResponse' {} a -> s {httpStatus = a} :: StopStreamResponse)
+
+instance Prelude.NFData StopStreamResponse where
+  rnf StopStreamResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IVS/TagResource.hs b/gen/Amazonka/IVS/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/TagResource.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.IVS.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 updates tags for the Amazon Web Services resource with the
+-- specified ARN.
+module Amazonka.IVS.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.IVS.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'
+  { -- | ARN of the resource for which tags are to be added or updated. The ARN
+    -- must be URL-encoded.
+    resourceArn :: Prelude.Text,
+    -- | Array of tags to be added or updated. See
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+    -- for more information, including restrictions that apply to tags and
+    -- \"Tag naming limits and requirements\"; Amazon IVS has no
+    -- service-specific constraints beyond what is documented there.
+    tags :: Prelude.HashMap Prelude.Text Prelude.Text
+  }
+  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' - ARN of the resource for which tags are to be added or updated. The ARN
+-- must be URL-encoded.
+--
+-- 'tags', 'tagResource_tags' - Array of tags to be added or updated. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | ARN of the resource for which tags are to be added or updated. The ARN
+-- must be URL-encoded.
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | Array of tags to be added or updated. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+tagResource_tags :: Lens.Lens' TagResource (Prelude.HashMap Prelude.Text Prelude.Text)
+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
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON TagResource where
+  toJSON TagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("tags" Data..= tags)]
+      )
+
+instance Data.ToPath TagResource where
+  toPath TagResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+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/IVS/Types.hs b/gen/Amazonka/IVS/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types.hs
@@ -0,0 +1,396 @@
+{-# 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.IVS.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.IVS.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _AccessDeniedException,
+    _ChannelNotBroadcasting,
+    _ConflictException,
+    _InternalServerException,
+    _PendingVerification,
+    _ResourceNotFoundException,
+    _ServiceQuotaExceededException,
+    _StreamUnavailable,
+    _ThrottlingException,
+    _ValidationException,
+
+    -- * ChannelLatencyMode
+    ChannelLatencyMode (..),
+
+    -- * ChannelType
+    ChannelType (..),
+
+    -- * RecordingConfigurationState
+    RecordingConfigurationState (..),
+
+    -- * RecordingMode
+    RecordingMode (..),
+
+    -- * StreamHealth
+    StreamHealth (..),
+
+    -- * StreamState
+    StreamState (..),
+
+    -- * AudioConfiguration
+    AudioConfiguration (..),
+    newAudioConfiguration,
+    audioConfiguration_channels,
+    audioConfiguration_codec,
+    audioConfiguration_sampleRate,
+    audioConfiguration_targetBitrate,
+
+    -- * BatchError
+    BatchError (..),
+    newBatchError,
+    batchError_arn,
+    batchError_code,
+    batchError_message,
+
+    -- * Channel
+    Channel (..),
+    newChannel,
+    channel_arn,
+    channel_authorized,
+    channel_ingestEndpoint,
+    channel_latencyMode,
+    channel_name,
+    channel_playbackUrl,
+    channel_recordingConfigurationArn,
+    channel_tags,
+    channel_type,
+
+    -- * ChannelSummary
+    ChannelSummary (..),
+    newChannelSummary,
+    channelSummary_arn,
+    channelSummary_authorized,
+    channelSummary_latencyMode,
+    channelSummary_name,
+    channelSummary_recordingConfigurationArn,
+    channelSummary_tags,
+
+    -- * DestinationConfiguration
+    DestinationConfiguration (..),
+    newDestinationConfiguration,
+    destinationConfiguration_s3,
+
+    -- * IngestConfiguration
+    IngestConfiguration (..),
+    newIngestConfiguration,
+    ingestConfiguration_audio,
+    ingestConfiguration_video,
+
+    -- * PlaybackKeyPair
+    PlaybackKeyPair (..),
+    newPlaybackKeyPair,
+    playbackKeyPair_arn,
+    playbackKeyPair_fingerprint,
+    playbackKeyPair_name,
+    playbackKeyPair_tags,
+
+    -- * PlaybackKeyPairSummary
+    PlaybackKeyPairSummary (..),
+    newPlaybackKeyPairSummary,
+    playbackKeyPairSummary_arn,
+    playbackKeyPairSummary_name,
+    playbackKeyPairSummary_tags,
+
+    -- * RecordingConfiguration
+    RecordingConfiguration (..),
+    newRecordingConfiguration,
+    recordingConfiguration_name,
+    recordingConfiguration_recordingReconnectWindowSeconds,
+    recordingConfiguration_tags,
+    recordingConfiguration_thumbnailConfiguration,
+    recordingConfiguration_arn,
+    recordingConfiguration_destinationConfiguration,
+    recordingConfiguration_state,
+
+    -- * RecordingConfigurationSummary
+    RecordingConfigurationSummary (..),
+    newRecordingConfigurationSummary,
+    recordingConfigurationSummary_name,
+    recordingConfigurationSummary_tags,
+    recordingConfigurationSummary_arn,
+    recordingConfigurationSummary_destinationConfiguration,
+    recordingConfigurationSummary_state,
+
+    -- * S3DestinationConfiguration
+    S3DestinationConfiguration (..),
+    newS3DestinationConfiguration,
+    s3DestinationConfiguration_bucketName,
+
+    -- * Stream
+    Stream (..),
+    newStream,
+    stream_channelArn,
+    stream_health,
+    stream_playbackUrl,
+    stream_startTime,
+    stream_state,
+    stream_streamId,
+    stream_viewerCount,
+
+    -- * StreamEvent
+    StreamEvent (..),
+    newStreamEvent,
+    streamEvent_eventTime,
+    streamEvent_name,
+    streamEvent_type,
+
+    -- * StreamFilters
+    StreamFilters (..),
+    newStreamFilters,
+    streamFilters_health,
+
+    -- * StreamKey
+    StreamKey (..),
+    newStreamKey,
+    streamKey_arn,
+    streamKey_channelArn,
+    streamKey_tags,
+    streamKey_value,
+
+    -- * StreamKeySummary
+    StreamKeySummary (..),
+    newStreamKeySummary,
+    streamKeySummary_arn,
+    streamKeySummary_channelArn,
+    streamKeySummary_tags,
+
+    -- * StreamSession
+    StreamSession (..),
+    newStreamSession,
+    streamSession_channel,
+    streamSession_endTime,
+    streamSession_ingestConfiguration,
+    streamSession_recordingConfiguration,
+    streamSession_startTime,
+    streamSession_streamId,
+    streamSession_truncatedEvents,
+
+    -- * StreamSessionSummary
+    StreamSessionSummary (..),
+    newStreamSessionSummary,
+    streamSessionSummary_endTime,
+    streamSessionSummary_hasErrorEvent,
+    streamSessionSummary_startTime,
+    streamSessionSummary_streamId,
+
+    -- * StreamSummary
+    StreamSummary (..),
+    newStreamSummary,
+    streamSummary_channelArn,
+    streamSummary_health,
+    streamSummary_startTime,
+    streamSummary_state,
+    streamSummary_streamId,
+    streamSummary_viewerCount,
+
+    -- * ThumbnailConfiguration
+    ThumbnailConfiguration (..),
+    newThumbnailConfiguration,
+    thumbnailConfiguration_recordingMode,
+    thumbnailConfiguration_targetIntervalSeconds,
+
+    -- * VideoConfiguration
+    VideoConfiguration (..),
+    newVideoConfiguration,
+    videoConfiguration_avcLevel,
+    videoConfiguration_avcProfile,
+    videoConfiguration_codec,
+    videoConfiguration_encoder,
+    videoConfiguration_targetBitrate,
+    videoConfiguration_targetFramerate,
+    videoConfiguration_videoHeight,
+    videoConfiguration_videoWidth,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.IVS.Types.AudioConfiguration
+import Amazonka.IVS.Types.BatchError
+import Amazonka.IVS.Types.Channel
+import Amazonka.IVS.Types.ChannelLatencyMode
+import Amazonka.IVS.Types.ChannelSummary
+import Amazonka.IVS.Types.ChannelType
+import Amazonka.IVS.Types.DestinationConfiguration
+import Amazonka.IVS.Types.IngestConfiguration
+import Amazonka.IVS.Types.PlaybackKeyPair
+import Amazonka.IVS.Types.PlaybackKeyPairSummary
+import Amazonka.IVS.Types.RecordingConfiguration
+import Amazonka.IVS.Types.RecordingConfigurationState
+import Amazonka.IVS.Types.RecordingConfigurationSummary
+import Amazonka.IVS.Types.RecordingMode
+import Amazonka.IVS.Types.S3DestinationConfiguration
+import Amazonka.IVS.Types.Stream
+import Amazonka.IVS.Types.StreamEvent
+import Amazonka.IVS.Types.StreamFilters
+import Amazonka.IVS.Types.StreamHealth
+import Amazonka.IVS.Types.StreamKey
+import Amazonka.IVS.Types.StreamKeySummary
+import Amazonka.IVS.Types.StreamSession
+import Amazonka.IVS.Types.StreamSessionSummary
+import Amazonka.IVS.Types.StreamState
+import Amazonka.IVS.Types.StreamSummary
+import Amazonka.IVS.Types.ThumbnailConfiguration
+import Amazonka.IVS.Types.VideoConfiguration
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2020-07-14@ of the Amazon Interactive Video Service SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "IVS",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "ivs",
+      Core.signingName = "ivs",
+      Core.version = "2020-07-14",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "IVS",
+      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
+
+_AccessDeniedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AccessDeniedException =
+  Core._MatchServiceError
+    defaultService
+    "AccessDeniedException"
+    Prelude.. Core.hasStatus 403
+
+_ChannelNotBroadcasting :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ChannelNotBroadcasting =
+  Core._MatchServiceError
+    defaultService
+    "ChannelNotBroadcasting"
+    Prelude.. Core.hasStatus 404
+
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+    Prelude.. Core.hasStatus 409
+
+_InternalServerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerException"
+    Prelude.. Core.hasStatus 500
+
+_PendingVerification :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_PendingVerification =
+  Core._MatchServiceError
+    defaultService
+    "PendingVerification"
+    Prelude.. Core.hasStatus 403
+
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+    Prelude.. Core.hasStatus 404
+
+_ServiceQuotaExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceQuotaExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceQuotaExceededException"
+    Prelude.. Core.hasStatus 402
+
+_StreamUnavailable :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_StreamUnavailable =
+  Core._MatchServiceError
+    defaultService
+    "StreamUnavailable"
+    Prelude.. Core.hasStatus 503
+
+_ThrottlingException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ThrottlingException =
+  Core._MatchServiceError
+    defaultService
+    "ThrottlingException"
+    Prelude.. Core.hasStatus 429
+
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
+    Prelude.. Core.hasStatus 400
diff --git a/gen/Amazonka/IVS/Types/AudioConfiguration.hs b/gen/Amazonka/IVS/Types/AudioConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/AudioConfiguration.hs
@@ -0,0 +1,113 @@
+{-# 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.IVS.Types.AudioConfiguration
+-- 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.IVS.Types.AudioConfiguration 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
+
+-- | Object specifying a stream’s audio configuration, as set up by the
+-- broadcaster (usually in an encoder). This is part of the
+-- IngestConfiguration object and used for monitoring stream health.
+--
+-- /See:/ 'newAudioConfiguration' smart constructor.
+data AudioConfiguration = AudioConfiguration'
+  { -- | Number of audio channels.
+    channels :: Prelude.Maybe Prelude.Integer,
+    -- | Codec used for the audio encoding.
+    codec :: Prelude.Maybe Prelude.Text,
+    -- | Number of audio samples recorded per second.
+    sampleRate :: Prelude.Maybe Prelude.Integer,
+    -- | The expected ingest bitrate (bits per second). This is configured in the
+    -- encoder.
+    targetBitrate :: Prelude.Maybe Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AudioConfiguration' 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:
+--
+-- 'channels', 'audioConfiguration_channels' - Number of audio channels.
+--
+-- 'codec', 'audioConfiguration_codec' - Codec used for the audio encoding.
+--
+-- 'sampleRate', 'audioConfiguration_sampleRate' - Number of audio samples recorded per second.
+--
+-- 'targetBitrate', 'audioConfiguration_targetBitrate' - The expected ingest bitrate (bits per second). This is configured in the
+-- encoder.
+newAudioConfiguration ::
+  AudioConfiguration
+newAudioConfiguration =
+  AudioConfiguration'
+    { channels = Prelude.Nothing,
+      codec = Prelude.Nothing,
+      sampleRate = Prelude.Nothing,
+      targetBitrate = Prelude.Nothing
+    }
+
+-- | Number of audio channels.
+audioConfiguration_channels :: Lens.Lens' AudioConfiguration (Prelude.Maybe Prelude.Integer)
+audioConfiguration_channels = Lens.lens (\AudioConfiguration' {channels} -> channels) (\s@AudioConfiguration' {} a -> s {channels = a} :: AudioConfiguration)
+
+-- | Codec used for the audio encoding.
+audioConfiguration_codec :: Lens.Lens' AudioConfiguration (Prelude.Maybe Prelude.Text)
+audioConfiguration_codec = Lens.lens (\AudioConfiguration' {codec} -> codec) (\s@AudioConfiguration' {} a -> s {codec = a} :: AudioConfiguration)
+
+-- | Number of audio samples recorded per second.
+audioConfiguration_sampleRate :: Lens.Lens' AudioConfiguration (Prelude.Maybe Prelude.Integer)
+audioConfiguration_sampleRate = Lens.lens (\AudioConfiguration' {sampleRate} -> sampleRate) (\s@AudioConfiguration' {} a -> s {sampleRate = a} :: AudioConfiguration)
+
+-- | The expected ingest bitrate (bits per second). This is configured in the
+-- encoder.
+audioConfiguration_targetBitrate :: Lens.Lens' AudioConfiguration (Prelude.Maybe Prelude.Integer)
+audioConfiguration_targetBitrate = Lens.lens (\AudioConfiguration' {targetBitrate} -> targetBitrate) (\s@AudioConfiguration' {} a -> s {targetBitrate = a} :: AudioConfiguration)
+
+instance Data.FromJSON AudioConfiguration where
+  parseJSON =
+    Data.withObject
+      "AudioConfiguration"
+      ( \x ->
+          AudioConfiguration'
+            Prelude.<$> (x Data..:? "channels")
+            Prelude.<*> (x Data..:? "codec")
+            Prelude.<*> (x Data..:? "sampleRate")
+            Prelude.<*> (x Data..:? "targetBitrate")
+      )
+
+instance Prelude.Hashable AudioConfiguration where
+  hashWithSalt _salt AudioConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` channels
+      `Prelude.hashWithSalt` codec
+      `Prelude.hashWithSalt` sampleRate
+      `Prelude.hashWithSalt` targetBitrate
+
+instance Prelude.NFData AudioConfiguration where
+  rnf AudioConfiguration' {..} =
+    Prelude.rnf channels
+      `Prelude.seq` Prelude.rnf codec
+      `Prelude.seq` Prelude.rnf sampleRate
+      `Prelude.seq` Prelude.rnf targetBitrate
diff --git a/gen/Amazonka/IVS/Types/BatchError.hs b/gen/Amazonka/IVS/Types/BatchError.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/BatchError.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.IVS.Types.BatchError
+-- 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.IVS.Types.BatchError 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
+
+-- | Error related to a specific channel, specified by its ARN.
+--
+-- /See:/ 'newBatchError' smart constructor.
+data BatchError = BatchError'
+  { -- | Channel ARN.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | Error code.
+    code :: Prelude.Maybe Prelude.Text,
+    -- | Error message, determined by the application.
+    message :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchError' 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:
+--
+-- 'arn', 'batchError_arn' - Channel ARN.
+--
+-- 'code', 'batchError_code' - Error code.
+--
+-- 'message', 'batchError_message' - Error message, determined by the application.
+newBatchError ::
+  BatchError
+newBatchError =
+  BatchError'
+    { arn = Prelude.Nothing,
+      code = Prelude.Nothing,
+      message = Prelude.Nothing
+    }
+
+-- | Channel ARN.
+batchError_arn :: Lens.Lens' BatchError (Prelude.Maybe Prelude.Text)
+batchError_arn = Lens.lens (\BatchError' {arn} -> arn) (\s@BatchError' {} a -> s {arn = a} :: BatchError)
+
+-- | Error code.
+batchError_code :: Lens.Lens' BatchError (Prelude.Maybe Prelude.Text)
+batchError_code = Lens.lens (\BatchError' {code} -> code) (\s@BatchError' {} a -> s {code = a} :: BatchError)
+
+-- | Error message, determined by the application.
+batchError_message :: Lens.Lens' BatchError (Prelude.Maybe Prelude.Text)
+batchError_message = Lens.lens (\BatchError' {message} -> message) (\s@BatchError' {} a -> s {message = a} :: BatchError)
+
+instance Data.FromJSON BatchError where
+  parseJSON =
+    Data.withObject
+      "BatchError"
+      ( \x ->
+          BatchError'
+            Prelude.<$> (x Data..:? "arn")
+            Prelude.<*> (x Data..:? "code")
+            Prelude.<*> (x Data..:? "message")
+      )
+
+instance Prelude.Hashable BatchError where
+  hashWithSalt _salt BatchError' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` code
+      `Prelude.hashWithSalt` message
+
+instance Prelude.NFData BatchError where
+  rnf BatchError' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf code
+      `Prelude.seq` Prelude.rnf message
diff --git a/gen/Amazonka/IVS/Types/Channel.hs b/gen/Amazonka/IVS/Types/Channel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/Channel.hs
@@ -0,0 +1,251 @@
+{-# 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.IVS.Types.Channel
+-- 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.IVS.Types.Channel where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types.ChannelLatencyMode
+import Amazonka.IVS.Types.ChannelType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Object specifying a channel.
+--
+-- /See:/ 'newChannel' smart constructor.
+data Channel = Channel'
+  { -- | Channel ARN.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | Whether the channel is private (enabled for playback authorization).
+    -- Default: @false@.
+    authorized :: Prelude.Maybe Prelude.Bool,
+    -- | Channel ingest endpoint, part of the definition of an ingest server,
+    -- used when you set up streaming software.
+    ingestEndpoint :: Prelude.Maybe Prelude.Text,
+    -- | Channel latency mode. Use @NORMAL@ to broadcast and deliver live video
+    -- up to Full HD. Use @LOW@ for near-real-time interaction with viewers.
+    -- Default: @LOW@. (Note: In the Amazon IVS console, @LOW@ and @NORMAL@
+    -- correspond to Ultra-low and Standard, respectively.)
+    latencyMode :: Prelude.Maybe ChannelLatencyMode,
+    -- | Channel name.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Channel playback URL.
+    playbackUrl :: Prelude.Maybe Prelude.Text,
+    -- | Recording-configuration ARN. A value other than an empty string
+    -- indicates that recording is enabled. Default: \"\" (empty string,
+    -- recording is disabled).
+    recordingConfigurationArn :: Prelude.Maybe Prelude.Text,
+    -- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+    -- for more information, including restrictions that apply to tags and
+    -- \"Tag naming limits and requirements\"; Amazon IVS has no
+    -- service-specific constraints beyond what is documented there.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Channel type, which determines the allowable resolution and bitrate. /If
+    -- you exceed the allowable resolution or bitrate, the stream probably will
+    -- disconnect immediately./ Default: @STANDARD@. Valid values:
+    --
+    -- -   @STANDARD@: Video is transcoded: multiple qualities are generated
+    --     from the original input, to automatically give viewers the best
+    --     experience for their devices and network conditions. Transcoding
+    --     allows higher playback quality across a range of download speeds.
+    --     Resolution can be up to 1080p and bitrate can be up to 8.5 Mbps.
+    --     Audio is transcoded only for renditions 360p and below; above that,
+    --     audio is passed through. This is the default.
+    --
+    -- -   @BASIC@: Video is transmuxed: Amazon IVS delivers the original input
+    --     to viewers. The viewer’s video-quality choice is limited to the
+    --     original input. Resolution can be up to 1080p and bitrate can be up
+    --     to 1.5 Mbps for 480p and up to 3.5 Mbps for resolutions between 480p
+    --     and 1080p.
+    type' :: Prelude.Maybe ChannelType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Channel' 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:
+--
+-- 'arn', 'channel_arn' - Channel ARN.
+--
+-- 'authorized', 'channel_authorized' - Whether the channel is private (enabled for playback authorization).
+-- Default: @false@.
+--
+-- 'ingestEndpoint', 'channel_ingestEndpoint' - Channel ingest endpoint, part of the definition of an ingest server,
+-- used when you set up streaming software.
+--
+-- 'latencyMode', 'channel_latencyMode' - Channel latency mode. Use @NORMAL@ to broadcast and deliver live video
+-- up to Full HD. Use @LOW@ for near-real-time interaction with viewers.
+-- Default: @LOW@. (Note: In the Amazon IVS console, @LOW@ and @NORMAL@
+-- correspond to Ultra-low and Standard, respectively.)
+--
+-- 'name', 'channel_name' - Channel name.
+--
+-- 'playbackUrl', 'channel_playbackUrl' - Channel playback URL.
+--
+-- 'recordingConfigurationArn', 'channel_recordingConfigurationArn' - Recording-configuration ARN. A value other than an empty string
+-- indicates that recording is enabled. Default: \"\" (empty string,
+-- recording is disabled).
+--
+-- 'tags', 'channel_tags' - Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+--
+-- 'type'', 'channel_type' - Channel type, which determines the allowable resolution and bitrate. /If
+-- you exceed the allowable resolution or bitrate, the stream probably will
+-- disconnect immediately./ Default: @STANDARD@. Valid values:
+--
+-- -   @STANDARD@: Video is transcoded: multiple qualities are generated
+--     from the original input, to automatically give viewers the best
+--     experience for their devices and network conditions. Transcoding
+--     allows higher playback quality across a range of download speeds.
+--     Resolution can be up to 1080p and bitrate can be up to 8.5 Mbps.
+--     Audio is transcoded only for renditions 360p and below; above that,
+--     audio is passed through. This is the default.
+--
+-- -   @BASIC@: Video is transmuxed: Amazon IVS delivers the original input
+--     to viewers. The viewer’s video-quality choice is limited to the
+--     original input. Resolution can be up to 1080p and bitrate can be up
+--     to 1.5 Mbps for 480p and up to 3.5 Mbps for resolutions between 480p
+--     and 1080p.
+newChannel ::
+  Channel
+newChannel =
+  Channel'
+    { arn = Prelude.Nothing,
+      authorized = Prelude.Nothing,
+      ingestEndpoint = Prelude.Nothing,
+      latencyMode = Prelude.Nothing,
+      name = Prelude.Nothing,
+      playbackUrl = Prelude.Nothing,
+      recordingConfigurationArn = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      type' = Prelude.Nothing
+    }
+
+-- | Channel ARN.
+channel_arn :: Lens.Lens' Channel (Prelude.Maybe Prelude.Text)
+channel_arn = Lens.lens (\Channel' {arn} -> arn) (\s@Channel' {} a -> s {arn = a} :: Channel)
+
+-- | Whether the channel is private (enabled for playback authorization).
+-- Default: @false@.
+channel_authorized :: Lens.Lens' Channel (Prelude.Maybe Prelude.Bool)
+channel_authorized = Lens.lens (\Channel' {authorized} -> authorized) (\s@Channel' {} a -> s {authorized = a} :: Channel)
+
+-- | Channel ingest endpoint, part of the definition of an ingest server,
+-- used when you set up streaming software.
+channel_ingestEndpoint :: Lens.Lens' Channel (Prelude.Maybe Prelude.Text)
+channel_ingestEndpoint = Lens.lens (\Channel' {ingestEndpoint} -> ingestEndpoint) (\s@Channel' {} a -> s {ingestEndpoint = a} :: Channel)
+
+-- | Channel latency mode. Use @NORMAL@ to broadcast and deliver live video
+-- up to Full HD. Use @LOW@ for near-real-time interaction with viewers.
+-- Default: @LOW@. (Note: In the Amazon IVS console, @LOW@ and @NORMAL@
+-- correspond to Ultra-low and Standard, respectively.)
+channel_latencyMode :: Lens.Lens' Channel (Prelude.Maybe ChannelLatencyMode)
+channel_latencyMode = Lens.lens (\Channel' {latencyMode} -> latencyMode) (\s@Channel' {} a -> s {latencyMode = a} :: Channel)
+
+-- | Channel name.
+channel_name :: Lens.Lens' Channel (Prelude.Maybe Prelude.Text)
+channel_name = Lens.lens (\Channel' {name} -> name) (\s@Channel' {} a -> s {name = a} :: Channel)
+
+-- | Channel playback URL.
+channel_playbackUrl :: Lens.Lens' Channel (Prelude.Maybe Prelude.Text)
+channel_playbackUrl = Lens.lens (\Channel' {playbackUrl} -> playbackUrl) (\s@Channel' {} a -> s {playbackUrl = a} :: Channel)
+
+-- | Recording-configuration ARN. A value other than an empty string
+-- indicates that recording is enabled. Default: \"\" (empty string,
+-- recording is disabled).
+channel_recordingConfigurationArn :: Lens.Lens' Channel (Prelude.Maybe Prelude.Text)
+channel_recordingConfigurationArn = Lens.lens (\Channel' {recordingConfigurationArn} -> recordingConfigurationArn) (\s@Channel' {} a -> s {recordingConfigurationArn = a} :: Channel)
+
+-- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+channel_tags :: Lens.Lens' Channel (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+channel_tags = Lens.lens (\Channel' {tags} -> tags) (\s@Channel' {} a -> s {tags = a} :: Channel) Prelude.. Lens.mapping Lens.coerced
+
+-- | Channel type, which determines the allowable resolution and bitrate. /If
+-- you exceed the allowable resolution or bitrate, the stream probably will
+-- disconnect immediately./ Default: @STANDARD@. Valid values:
+--
+-- -   @STANDARD@: Video is transcoded: multiple qualities are generated
+--     from the original input, to automatically give viewers the best
+--     experience for their devices and network conditions. Transcoding
+--     allows higher playback quality across a range of download speeds.
+--     Resolution can be up to 1080p and bitrate can be up to 8.5 Mbps.
+--     Audio is transcoded only for renditions 360p and below; above that,
+--     audio is passed through. This is the default.
+--
+-- -   @BASIC@: Video is transmuxed: Amazon IVS delivers the original input
+--     to viewers. The viewer’s video-quality choice is limited to the
+--     original input. Resolution can be up to 1080p and bitrate can be up
+--     to 1.5 Mbps for 480p and up to 3.5 Mbps for resolutions between 480p
+--     and 1080p.
+channel_type :: Lens.Lens' Channel (Prelude.Maybe ChannelType)
+channel_type = Lens.lens (\Channel' {type'} -> type') (\s@Channel' {} a -> s {type' = a} :: Channel)
+
+instance Data.FromJSON Channel where
+  parseJSON =
+    Data.withObject
+      "Channel"
+      ( \x ->
+          Channel'
+            Prelude.<$> (x Data..:? "arn")
+            Prelude.<*> (x Data..:? "authorized")
+            Prelude.<*> (x Data..:? "ingestEndpoint")
+            Prelude.<*> (x Data..:? "latencyMode")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "playbackUrl")
+            Prelude.<*> (x Data..:? "recordingConfigurationArn")
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "type")
+      )
+
+instance Prelude.Hashable Channel where
+  hashWithSalt _salt Channel' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` authorized
+      `Prelude.hashWithSalt` ingestEndpoint
+      `Prelude.hashWithSalt` latencyMode
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` playbackUrl
+      `Prelude.hashWithSalt` recordingConfigurationArn
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData Channel where
+  rnf Channel' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf authorized
+      `Prelude.seq` Prelude.rnf ingestEndpoint
+      `Prelude.seq` Prelude.rnf latencyMode
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf playbackUrl
+      `Prelude.seq` Prelude.rnf recordingConfigurationArn
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf type'
diff --git a/gen/Amazonka/IVS/Types/ChannelLatencyMode.hs b/gen/Amazonka/IVS/Types/ChannelLatencyMode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/ChannelLatencyMode.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.IVS.Types.ChannelLatencyMode
+-- 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.IVS.Types.ChannelLatencyMode
+  ( ChannelLatencyMode
+      ( ..,
+        ChannelLatencyMode_LOW,
+        ChannelLatencyMode_NORMAL
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ChannelLatencyMode = ChannelLatencyMode'
+  { fromChannelLatencyMode ::
+      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 ChannelLatencyMode_LOW :: ChannelLatencyMode
+pattern ChannelLatencyMode_LOW = ChannelLatencyMode' "LOW"
+
+pattern ChannelLatencyMode_NORMAL :: ChannelLatencyMode
+pattern ChannelLatencyMode_NORMAL = ChannelLatencyMode' "NORMAL"
+
+{-# COMPLETE
+  ChannelLatencyMode_LOW,
+  ChannelLatencyMode_NORMAL,
+  ChannelLatencyMode'
+  #-}
diff --git a/gen/Amazonka/IVS/Types/ChannelSummary.hs b/gen/Amazonka/IVS/Types/ChannelSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/ChannelSummary.hs
@@ -0,0 +1,163 @@
+{-# 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.IVS.Types.ChannelSummary
+-- 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.IVS.Types.ChannelSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types.ChannelLatencyMode
+import qualified Amazonka.Prelude as Prelude
+
+-- | Summary information about a channel.
+--
+-- /See:/ 'newChannelSummary' smart constructor.
+data ChannelSummary = ChannelSummary'
+  { -- | Channel ARN.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | Whether the channel is private (enabled for playback authorization).
+    -- Default: @false@.
+    authorized :: Prelude.Maybe Prelude.Bool,
+    -- | Channel latency mode. Use @NORMAL@ to broadcast and deliver live video
+    -- up to Full HD. Use @LOW@ for near-real-time interaction with viewers.
+    -- Default: @LOW@. (Note: In the Amazon IVS console, @LOW@ and @NORMAL@
+    -- correspond to Ultra-low and Standard, respectively.)
+    latencyMode :: Prelude.Maybe ChannelLatencyMode,
+    -- | Channel name.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Recording-configuration ARN. A value other than an empty string
+    -- indicates that recording is enabled. Default: \"\" (empty string,
+    -- recording is disabled).
+    recordingConfigurationArn :: Prelude.Maybe Prelude.Text,
+    -- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+    -- for more information, including restrictions that apply to tags and
+    -- \"Tag naming limits and requirements\"; Amazon IVS has no
+    -- service-specific constraints beyond what is documented there.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ChannelSummary' 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:
+--
+-- 'arn', 'channelSummary_arn' - Channel ARN.
+--
+-- 'authorized', 'channelSummary_authorized' - Whether the channel is private (enabled for playback authorization).
+-- Default: @false@.
+--
+-- 'latencyMode', 'channelSummary_latencyMode' - Channel latency mode. Use @NORMAL@ to broadcast and deliver live video
+-- up to Full HD. Use @LOW@ for near-real-time interaction with viewers.
+-- Default: @LOW@. (Note: In the Amazon IVS console, @LOW@ and @NORMAL@
+-- correspond to Ultra-low and Standard, respectively.)
+--
+-- 'name', 'channelSummary_name' - Channel name.
+--
+-- 'recordingConfigurationArn', 'channelSummary_recordingConfigurationArn' - Recording-configuration ARN. A value other than an empty string
+-- indicates that recording is enabled. Default: \"\" (empty string,
+-- recording is disabled).
+--
+-- 'tags', 'channelSummary_tags' - Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+newChannelSummary ::
+  ChannelSummary
+newChannelSummary =
+  ChannelSummary'
+    { arn = Prelude.Nothing,
+      authorized = Prelude.Nothing,
+      latencyMode = Prelude.Nothing,
+      name = Prelude.Nothing,
+      recordingConfigurationArn = Prelude.Nothing,
+      tags = Prelude.Nothing
+    }
+
+-- | Channel ARN.
+channelSummary_arn :: Lens.Lens' ChannelSummary (Prelude.Maybe Prelude.Text)
+channelSummary_arn = Lens.lens (\ChannelSummary' {arn} -> arn) (\s@ChannelSummary' {} a -> s {arn = a} :: ChannelSummary)
+
+-- | Whether the channel is private (enabled for playback authorization).
+-- Default: @false@.
+channelSummary_authorized :: Lens.Lens' ChannelSummary (Prelude.Maybe Prelude.Bool)
+channelSummary_authorized = Lens.lens (\ChannelSummary' {authorized} -> authorized) (\s@ChannelSummary' {} a -> s {authorized = a} :: ChannelSummary)
+
+-- | Channel latency mode. Use @NORMAL@ to broadcast and deliver live video
+-- up to Full HD. Use @LOW@ for near-real-time interaction with viewers.
+-- Default: @LOW@. (Note: In the Amazon IVS console, @LOW@ and @NORMAL@
+-- correspond to Ultra-low and Standard, respectively.)
+channelSummary_latencyMode :: Lens.Lens' ChannelSummary (Prelude.Maybe ChannelLatencyMode)
+channelSummary_latencyMode = Lens.lens (\ChannelSummary' {latencyMode} -> latencyMode) (\s@ChannelSummary' {} a -> s {latencyMode = a} :: ChannelSummary)
+
+-- | Channel name.
+channelSummary_name :: Lens.Lens' ChannelSummary (Prelude.Maybe Prelude.Text)
+channelSummary_name = Lens.lens (\ChannelSummary' {name} -> name) (\s@ChannelSummary' {} a -> s {name = a} :: ChannelSummary)
+
+-- | Recording-configuration ARN. A value other than an empty string
+-- indicates that recording is enabled. Default: \"\" (empty string,
+-- recording is disabled).
+channelSummary_recordingConfigurationArn :: Lens.Lens' ChannelSummary (Prelude.Maybe Prelude.Text)
+channelSummary_recordingConfigurationArn = Lens.lens (\ChannelSummary' {recordingConfigurationArn} -> recordingConfigurationArn) (\s@ChannelSummary' {} a -> s {recordingConfigurationArn = a} :: ChannelSummary)
+
+-- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+channelSummary_tags :: Lens.Lens' ChannelSummary (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+channelSummary_tags = Lens.lens (\ChannelSummary' {tags} -> tags) (\s@ChannelSummary' {} a -> s {tags = a} :: ChannelSummary) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON ChannelSummary where
+  parseJSON =
+    Data.withObject
+      "ChannelSummary"
+      ( \x ->
+          ChannelSummary'
+            Prelude.<$> (x Data..:? "arn")
+            Prelude.<*> (x Data..:? "authorized")
+            Prelude.<*> (x Data..:? "latencyMode")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "recordingConfigurationArn")
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable ChannelSummary where
+  hashWithSalt _salt ChannelSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` authorized
+      `Prelude.hashWithSalt` latencyMode
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` recordingConfigurationArn
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData ChannelSummary where
+  rnf ChannelSummary' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf authorized
+      `Prelude.seq` Prelude.rnf latencyMode
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf recordingConfigurationArn
+      `Prelude.seq` Prelude.rnf tags
diff --git a/gen/Amazonka/IVS/Types/ChannelType.hs b/gen/Amazonka/IVS/Types/ChannelType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/ChannelType.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.IVS.Types.ChannelType
+-- 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.IVS.Types.ChannelType
+  ( ChannelType
+      ( ..,
+        ChannelType_BASIC,
+        ChannelType_STANDARD
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ChannelType = ChannelType'
+  { fromChannelType ::
+      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 ChannelType_BASIC :: ChannelType
+pattern ChannelType_BASIC = ChannelType' "BASIC"
+
+pattern ChannelType_STANDARD :: ChannelType
+pattern ChannelType_STANDARD = ChannelType' "STANDARD"
+
+{-# COMPLETE
+  ChannelType_BASIC,
+  ChannelType_STANDARD,
+  ChannelType'
+  #-}
diff --git a/gen/Amazonka/IVS/Types/DestinationConfiguration.hs b/gen/Amazonka/IVS/Types/DestinationConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/DestinationConfiguration.hs
@@ -0,0 +1,77 @@
+{-# 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.IVS.Types.DestinationConfiguration
+-- 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.IVS.Types.DestinationConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types.S3DestinationConfiguration
+import qualified Amazonka.Prelude as Prelude
+
+-- | A complex type that describes a location where recorded videos will be
+-- stored. Each member represents a type of destination configuration. For
+-- recording, you define one and only one type of destination
+-- configuration.
+--
+-- /See:/ 'newDestinationConfiguration' smart constructor.
+data DestinationConfiguration = DestinationConfiguration'
+  { -- | An S3 destination configuration where recorded videos will be stored.
+    s3 :: Prelude.Maybe S3DestinationConfiguration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DestinationConfiguration' 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:
+--
+-- 's3', 'destinationConfiguration_s3' - An S3 destination configuration where recorded videos will be stored.
+newDestinationConfiguration ::
+  DestinationConfiguration
+newDestinationConfiguration =
+  DestinationConfiguration' {s3 = Prelude.Nothing}
+
+-- | An S3 destination configuration where recorded videos will be stored.
+destinationConfiguration_s3 :: Lens.Lens' DestinationConfiguration (Prelude.Maybe S3DestinationConfiguration)
+destinationConfiguration_s3 = Lens.lens (\DestinationConfiguration' {s3} -> s3) (\s@DestinationConfiguration' {} a -> s {s3 = a} :: DestinationConfiguration)
+
+instance Data.FromJSON DestinationConfiguration where
+  parseJSON =
+    Data.withObject
+      "DestinationConfiguration"
+      ( \x ->
+          DestinationConfiguration'
+            Prelude.<$> (x Data..:? "s3")
+      )
+
+instance Prelude.Hashable DestinationConfiguration where
+  hashWithSalt _salt DestinationConfiguration' {..} =
+    _salt `Prelude.hashWithSalt` s3
+
+instance Prelude.NFData DestinationConfiguration where
+  rnf DestinationConfiguration' {..} = Prelude.rnf s3
+
+instance Data.ToJSON DestinationConfiguration where
+  toJSON DestinationConfiguration' {..} =
+    Data.object
+      (Prelude.catMaybes [("s3" Data..=) Prelude.<$> s3])
diff --git a/gen/Amazonka/IVS/Types/IngestConfiguration.hs b/gen/Amazonka/IVS/Types/IngestConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/IngestConfiguration.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.IVS.Types.IngestConfiguration
+-- 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.IVS.Types.IngestConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types.AudioConfiguration
+import Amazonka.IVS.Types.VideoConfiguration
+import qualified Amazonka.Prelude as Prelude
+
+-- | Object specifying the ingest configuration set up by the broadcaster,
+-- usually in an encoder.
+--
+-- /See:/ 'newIngestConfiguration' smart constructor.
+data IngestConfiguration = IngestConfiguration'
+  { -- | Encoder settings for audio.
+    audio :: Prelude.Maybe AudioConfiguration,
+    -- | Encoder settings for video.
+    video :: Prelude.Maybe VideoConfiguration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'IngestConfiguration' 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:
+--
+-- 'audio', 'ingestConfiguration_audio' - Encoder settings for audio.
+--
+-- 'video', 'ingestConfiguration_video' - Encoder settings for video.
+newIngestConfiguration ::
+  IngestConfiguration
+newIngestConfiguration =
+  IngestConfiguration'
+    { audio = Prelude.Nothing,
+      video = Prelude.Nothing
+    }
+
+-- | Encoder settings for audio.
+ingestConfiguration_audio :: Lens.Lens' IngestConfiguration (Prelude.Maybe AudioConfiguration)
+ingestConfiguration_audio = Lens.lens (\IngestConfiguration' {audio} -> audio) (\s@IngestConfiguration' {} a -> s {audio = a} :: IngestConfiguration)
+
+-- | Encoder settings for video.
+ingestConfiguration_video :: Lens.Lens' IngestConfiguration (Prelude.Maybe VideoConfiguration)
+ingestConfiguration_video = Lens.lens (\IngestConfiguration' {video} -> video) (\s@IngestConfiguration' {} a -> s {video = a} :: IngestConfiguration)
+
+instance Data.FromJSON IngestConfiguration where
+  parseJSON =
+    Data.withObject
+      "IngestConfiguration"
+      ( \x ->
+          IngestConfiguration'
+            Prelude.<$> (x Data..:? "audio")
+            Prelude.<*> (x Data..:? "video")
+      )
+
+instance Prelude.Hashable IngestConfiguration where
+  hashWithSalt _salt IngestConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` audio
+      `Prelude.hashWithSalt` video
+
+instance Prelude.NFData IngestConfiguration where
+  rnf IngestConfiguration' {..} =
+    Prelude.rnf audio `Prelude.seq` Prelude.rnf video
diff --git a/gen/Amazonka/IVS/Types/PlaybackKeyPair.hs b/gen/Amazonka/IVS/Types/PlaybackKeyPair.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/PlaybackKeyPair.hs
@@ -0,0 +1,120 @@
+{-# 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.IVS.Types.PlaybackKeyPair
+-- 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.IVS.Types.PlaybackKeyPair 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
+
+-- | A key pair used to sign and validate a playback authorization token.
+--
+-- /See:/ 'newPlaybackKeyPair' smart constructor.
+data PlaybackKeyPair = PlaybackKeyPair'
+  { -- | Key-pair ARN.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | Key-pair identifier.
+    fingerprint :: Prelude.Maybe Prelude.Text,
+    -- | Playback-key-pair name. The value does not need to be unique.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+    -- for more information, including restrictions that apply to tags and
+    -- \"Tag naming limits and requirements\"; Amazon IVS has no
+    -- service-specific constraints beyond what is documented there.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PlaybackKeyPair' 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:
+--
+-- 'arn', 'playbackKeyPair_arn' - Key-pair ARN.
+--
+-- 'fingerprint', 'playbackKeyPair_fingerprint' - Key-pair identifier.
+--
+-- 'name', 'playbackKeyPair_name' - Playback-key-pair name. The value does not need to be unique.
+--
+-- 'tags', 'playbackKeyPair_tags' - Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+newPlaybackKeyPair ::
+  PlaybackKeyPair
+newPlaybackKeyPair =
+  PlaybackKeyPair'
+    { arn = Prelude.Nothing,
+      fingerprint = Prelude.Nothing,
+      name = Prelude.Nothing,
+      tags = Prelude.Nothing
+    }
+
+-- | Key-pair ARN.
+playbackKeyPair_arn :: Lens.Lens' PlaybackKeyPair (Prelude.Maybe Prelude.Text)
+playbackKeyPair_arn = Lens.lens (\PlaybackKeyPair' {arn} -> arn) (\s@PlaybackKeyPair' {} a -> s {arn = a} :: PlaybackKeyPair)
+
+-- | Key-pair identifier.
+playbackKeyPair_fingerprint :: Lens.Lens' PlaybackKeyPair (Prelude.Maybe Prelude.Text)
+playbackKeyPair_fingerprint = Lens.lens (\PlaybackKeyPair' {fingerprint} -> fingerprint) (\s@PlaybackKeyPair' {} a -> s {fingerprint = a} :: PlaybackKeyPair)
+
+-- | Playback-key-pair name. The value does not need to be unique.
+playbackKeyPair_name :: Lens.Lens' PlaybackKeyPair (Prelude.Maybe Prelude.Text)
+playbackKeyPair_name = Lens.lens (\PlaybackKeyPair' {name} -> name) (\s@PlaybackKeyPair' {} a -> s {name = a} :: PlaybackKeyPair)
+
+-- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+playbackKeyPair_tags :: Lens.Lens' PlaybackKeyPair (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+playbackKeyPair_tags = Lens.lens (\PlaybackKeyPair' {tags} -> tags) (\s@PlaybackKeyPair' {} a -> s {tags = a} :: PlaybackKeyPair) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON PlaybackKeyPair where
+  parseJSON =
+    Data.withObject
+      "PlaybackKeyPair"
+      ( \x ->
+          PlaybackKeyPair'
+            Prelude.<$> (x Data..:? "arn")
+            Prelude.<*> (x Data..:? "fingerprint")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable PlaybackKeyPair where
+  hashWithSalt _salt PlaybackKeyPair' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` fingerprint
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData PlaybackKeyPair where
+  rnf PlaybackKeyPair' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf fingerprint
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf tags
diff --git a/gen/Amazonka/IVS/Types/PlaybackKeyPairSummary.hs b/gen/Amazonka/IVS/Types/PlaybackKeyPairSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/PlaybackKeyPairSummary.hs
@@ -0,0 +1,108 @@
+{-# 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.IVS.Types.PlaybackKeyPairSummary
+-- 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.IVS.Types.PlaybackKeyPairSummary 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
+
+-- | Summary information about a playback key pair.
+--
+-- /See:/ 'newPlaybackKeyPairSummary' smart constructor.
+data PlaybackKeyPairSummary = PlaybackKeyPairSummary'
+  { -- | Key-pair ARN.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | Playback-key-pair name. The value does not need to be unique.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+    -- for more information, including restrictions that apply to tags and
+    -- \"Tag naming limits and requirements\"; Amazon IVS has no
+    -- service-specific constraints beyond what is documented there.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PlaybackKeyPairSummary' 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:
+--
+-- 'arn', 'playbackKeyPairSummary_arn' - Key-pair ARN.
+--
+-- 'name', 'playbackKeyPairSummary_name' - Playback-key-pair name. The value does not need to be unique.
+--
+-- 'tags', 'playbackKeyPairSummary_tags' - Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+newPlaybackKeyPairSummary ::
+  PlaybackKeyPairSummary
+newPlaybackKeyPairSummary =
+  PlaybackKeyPairSummary'
+    { arn = Prelude.Nothing,
+      name = Prelude.Nothing,
+      tags = Prelude.Nothing
+    }
+
+-- | Key-pair ARN.
+playbackKeyPairSummary_arn :: Lens.Lens' PlaybackKeyPairSummary (Prelude.Maybe Prelude.Text)
+playbackKeyPairSummary_arn = Lens.lens (\PlaybackKeyPairSummary' {arn} -> arn) (\s@PlaybackKeyPairSummary' {} a -> s {arn = a} :: PlaybackKeyPairSummary)
+
+-- | Playback-key-pair name. The value does not need to be unique.
+playbackKeyPairSummary_name :: Lens.Lens' PlaybackKeyPairSummary (Prelude.Maybe Prelude.Text)
+playbackKeyPairSummary_name = Lens.lens (\PlaybackKeyPairSummary' {name} -> name) (\s@PlaybackKeyPairSummary' {} a -> s {name = a} :: PlaybackKeyPairSummary)
+
+-- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+playbackKeyPairSummary_tags :: Lens.Lens' PlaybackKeyPairSummary (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+playbackKeyPairSummary_tags = Lens.lens (\PlaybackKeyPairSummary' {tags} -> tags) (\s@PlaybackKeyPairSummary' {} a -> s {tags = a} :: PlaybackKeyPairSummary) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON PlaybackKeyPairSummary where
+  parseJSON =
+    Data.withObject
+      "PlaybackKeyPairSummary"
+      ( \x ->
+          PlaybackKeyPairSummary'
+            Prelude.<$> (x Data..:? "arn")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable PlaybackKeyPairSummary where
+  hashWithSalt _salt PlaybackKeyPairSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData PlaybackKeyPairSummary where
+  rnf PlaybackKeyPairSummary' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf tags
diff --git a/gen/Amazonka/IVS/Types/RecordingConfiguration.hs b/gen/Amazonka/IVS/Types/RecordingConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/RecordingConfiguration.hs
@@ -0,0 +1,190 @@
+{-# 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.IVS.Types.RecordingConfiguration
+-- 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.IVS.Types.RecordingConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types.DestinationConfiguration
+import Amazonka.IVS.Types.RecordingConfigurationState
+import Amazonka.IVS.Types.ThumbnailConfiguration
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing a configuration to record a channel stream.
+--
+-- /See:/ 'newRecordingConfiguration' smart constructor.
+data RecordingConfiguration = RecordingConfiguration'
+  { -- | Recording-configuration name. The value does not need to be unique.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | If a broadcast disconnects and then reconnects within the specified
+    -- interval, the multiple streams will be considered a single broadcast and
+    -- merged together. Default: 0.
+    recordingReconnectWindowSeconds :: Prelude.Maybe Prelude.Natural,
+    -- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+    -- for more information, including restrictions that apply to tags and
+    -- \"Tag naming limits and requirements\"; Amazon IVS has no
+    -- service-specific constraints beyond what is documented there.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | A complex type that allows you to enable\/disable the recording of
+    -- thumbnails for a live session and modify the interval at which
+    -- thumbnails are generated for the live session.
+    thumbnailConfiguration :: Prelude.Maybe ThumbnailConfiguration,
+    -- | Recording-configuration ARN.
+    arn :: Prelude.Text,
+    -- | A complex type that contains information about where recorded video will
+    -- be stored.
+    destinationConfiguration :: DestinationConfiguration,
+    -- | Indicates the current state of the recording configuration. When the
+    -- state is @ACTIVE@, the configuration is ready for recording a channel
+    -- stream.
+    state :: RecordingConfigurationState
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RecordingConfiguration' 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', 'recordingConfiguration_name' - Recording-configuration name. The value does not need to be unique.
+--
+-- 'recordingReconnectWindowSeconds', 'recordingConfiguration_recordingReconnectWindowSeconds' - If a broadcast disconnects and then reconnects within the specified
+-- interval, the multiple streams will be considered a single broadcast and
+-- merged together. Default: 0.
+--
+-- 'tags', 'recordingConfiguration_tags' - Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+--
+-- 'thumbnailConfiguration', 'recordingConfiguration_thumbnailConfiguration' - A complex type that allows you to enable\/disable the recording of
+-- thumbnails for a live session and modify the interval at which
+-- thumbnails are generated for the live session.
+--
+-- 'arn', 'recordingConfiguration_arn' - Recording-configuration ARN.
+--
+-- 'destinationConfiguration', 'recordingConfiguration_destinationConfiguration' - A complex type that contains information about where recorded video will
+-- be stored.
+--
+-- 'state', 'recordingConfiguration_state' - Indicates the current state of the recording configuration. When the
+-- state is @ACTIVE@, the configuration is ready for recording a channel
+-- stream.
+newRecordingConfiguration ::
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'destinationConfiguration'
+  DestinationConfiguration ->
+  -- | 'state'
+  RecordingConfigurationState ->
+  RecordingConfiguration
+newRecordingConfiguration
+  pArn_
+  pDestinationConfiguration_
+  pState_ =
+    RecordingConfiguration'
+      { name = Prelude.Nothing,
+        recordingReconnectWindowSeconds = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        thumbnailConfiguration = Prelude.Nothing,
+        arn = pArn_,
+        destinationConfiguration =
+          pDestinationConfiguration_,
+        state = pState_
+      }
+
+-- | Recording-configuration name. The value does not need to be unique.
+recordingConfiguration_name :: Lens.Lens' RecordingConfiguration (Prelude.Maybe Prelude.Text)
+recordingConfiguration_name = Lens.lens (\RecordingConfiguration' {name} -> name) (\s@RecordingConfiguration' {} a -> s {name = a} :: RecordingConfiguration)
+
+-- | If a broadcast disconnects and then reconnects within the specified
+-- interval, the multiple streams will be considered a single broadcast and
+-- merged together. Default: 0.
+recordingConfiguration_recordingReconnectWindowSeconds :: Lens.Lens' RecordingConfiguration (Prelude.Maybe Prelude.Natural)
+recordingConfiguration_recordingReconnectWindowSeconds = Lens.lens (\RecordingConfiguration' {recordingReconnectWindowSeconds} -> recordingReconnectWindowSeconds) (\s@RecordingConfiguration' {} a -> s {recordingReconnectWindowSeconds = a} :: RecordingConfiguration)
+
+-- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+recordingConfiguration_tags :: Lens.Lens' RecordingConfiguration (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+recordingConfiguration_tags = Lens.lens (\RecordingConfiguration' {tags} -> tags) (\s@RecordingConfiguration' {} a -> s {tags = a} :: RecordingConfiguration) Prelude.. Lens.mapping Lens.coerced
+
+-- | A complex type that allows you to enable\/disable the recording of
+-- thumbnails for a live session and modify the interval at which
+-- thumbnails are generated for the live session.
+recordingConfiguration_thumbnailConfiguration :: Lens.Lens' RecordingConfiguration (Prelude.Maybe ThumbnailConfiguration)
+recordingConfiguration_thumbnailConfiguration = Lens.lens (\RecordingConfiguration' {thumbnailConfiguration} -> thumbnailConfiguration) (\s@RecordingConfiguration' {} a -> s {thumbnailConfiguration = a} :: RecordingConfiguration)
+
+-- | Recording-configuration ARN.
+recordingConfiguration_arn :: Lens.Lens' RecordingConfiguration Prelude.Text
+recordingConfiguration_arn = Lens.lens (\RecordingConfiguration' {arn} -> arn) (\s@RecordingConfiguration' {} a -> s {arn = a} :: RecordingConfiguration)
+
+-- | A complex type that contains information about where recorded video will
+-- be stored.
+recordingConfiguration_destinationConfiguration :: Lens.Lens' RecordingConfiguration DestinationConfiguration
+recordingConfiguration_destinationConfiguration = Lens.lens (\RecordingConfiguration' {destinationConfiguration} -> destinationConfiguration) (\s@RecordingConfiguration' {} a -> s {destinationConfiguration = a} :: RecordingConfiguration)
+
+-- | Indicates the current state of the recording configuration. When the
+-- state is @ACTIVE@, the configuration is ready for recording a channel
+-- stream.
+recordingConfiguration_state :: Lens.Lens' RecordingConfiguration RecordingConfigurationState
+recordingConfiguration_state = Lens.lens (\RecordingConfiguration' {state} -> state) (\s@RecordingConfiguration' {} a -> s {state = a} :: RecordingConfiguration)
+
+instance Data.FromJSON RecordingConfiguration where
+  parseJSON =
+    Data.withObject
+      "RecordingConfiguration"
+      ( \x ->
+          RecordingConfiguration'
+            Prelude.<$> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "recordingReconnectWindowSeconds")
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "thumbnailConfiguration")
+            Prelude.<*> (x Data..: "arn")
+            Prelude.<*> (x Data..: "destinationConfiguration")
+            Prelude.<*> (x Data..: "state")
+      )
+
+instance Prelude.Hashable RecordingConfiguration where
+  hashWithSalt _salt RecordingConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` recordingReconnectWindowSeconds
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` thumbnailConfiguration
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` destinationConfiguration
+      `Prelude.hashWithSalt` state
+
+instance Prelude.NFData RecordingConfiguration where
+  rnf RecordingConfiguration' {..} =
+    Prelude.rnf name
+      `Prelude.seq` Prelude.rnf recordingReconnectWindowSeconds
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf thumbnailConfiguration
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf destinationConfiguration
+      `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/IVS/Types/RecordingConfigurationState.hs b/gen/Amazonka/IVS/Types/RecordingConfigurationState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/RecordingConfigurationState.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.IVS.Types.RecordingConfigurationState
+-- 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.IVS.Types.RecordingConfigurationState
+  ( RecordingConfigurationState
+      ( ..,
+        RecordingConfigurationState_ACTIVE,
+        RecordingConfigurationState_CREATE_FAILED,
+        RecordingConfigurationState_CREATING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype RecordingConfigurationState = RecordingConfigurationState'
+  { fromRecordingConfigurationState ::
+      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 RecordingConfigurationState_ACTIVE :: RecordingConfigurationState
+pattern RecordingConfigurationState_ACTIVE = RecordingConfigurationState' "ACTIVE"
+
+pattern RecordingConfigurationState_CREATE_FAILED :: RecordingConfigurationState
+pattern RecordingConfigurationState_CREATE_FAILED = RecordingConfigurationState' "CREATE_FAILED"
+
+pattern RecordingConfigurationState_CREATING :: RecordingConfigurationState
+pattern RecordingConfigurationState_CREATING = RecordingConfigurationState' "CREATING"
+
+{-# COMPLETE
+  RecordingConfigurationState_ACTIVE,
+  RecordingConfigurationState_CREATE_FAILED,
+  RecordingConfigurationState_CREATING,
+  RecordingConfigurationState'
+  #-}
diff --git a/gen/Amazonka/IVS/Types/RecordingConfigurationSummary.hs b/gen/Amazonka/IVS/Types/RecordingConfigurationSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/RecordingConfigurationSummary.hs
@@ -0,0 +1,157 @@
+{-# 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.IVS.Types.RecordingConfigurationSummary
+-- 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.IVS.Types.RecordingConfigurationSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types.DestinationConfiguration
+import Amazonka.IVS.Types.RecordingConfigurationState
+import qualified Amazonka.Prelude as Prelude
+
+-- | Summary information about a RecordingConfiguration.
+--
+-- /See:/ 'newRecordingConfigurationSummary' smart constructor.
+data RecordingConfigurationSummary = RecordingConfigurationSummary'
+  { -- | Recording-configuration name. The value does not need to be unique.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+    -- for more information, including restrictions that apply to tags and
+    -- \"Tag naming limits and requirements\"; Amazon IVS has no
+    -- service-specific constraints beyond what is documented there.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Recording-configuration ARN.
+    arn :: Prelude.Text,
+    -- | A complex type that contains information about where recorded video will
+    -- be stored.
+    destinationConfiguration :: DestinationConfiguration,
+    -- | Indicates the current state of the recording configuration. When the
+    -- state is @ACTIVE@, the configuration is ready for recording a channel
+    -- stream.
+    state :: RecordingConfigurationState
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RecordingConfigurationSummary' 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', 'recordingConfigurationSummary_name' - Recording-configuration name. The value does not need to be unique.
+--
+-- 'tags', 'recordingConfigurationSummary_tags' - Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+--
+-- 'arn', 'recordingConfigurationSummary_arn' - Recording-configuration ARN.
+--
+-- 'destinationConfiguration', 'recordingConfigurationSummary_destinationConfiguration' - A complex type that contains information about where recorded video will
+-- be stored.
+--
+-- 'state', 'recordingConfigurationSummary_state' - Indicates the current state of the recording configuration. When the
+-- state is @ACTIVE@, the configuration is ready for recording a channel
+-- stream.
+newRecordingConfigurationSummary ::
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'destinationConfiguration'
+  DestinationConfiguration ->
+  -- | 'state'
+  RecordingConfigurationState ->
+  RecordingConfigurationSummary
+newRecordingConfigurationSummary
+  pArn_
+  pDestinationConfiguration_
+  pState_ =
+    RecordingConfigurationSummary'
+      { name =
+          Prelude.Nothing,
+        tags = Prelude.Nothing,
+        arn = pArn_,
+        destinationConfiguration =
+          pDestinationConfiguration_,
+        state = pState_
+      }
+
+-- | Recording-configuration name. The value does not need to be unique.
+recordingConfigurationSummary_name :: Lens.Lens' RecordingConfigurationSummary (Prelude.Maybe Prelude.Text)
+recordingConfigurationSummary_name = Lens.lens (\RecordingConfigurationSummary' {name} -> name) (\s@RecordingConfigurationSummary' {} a -> s {name = a} :: RecordingConfigurationSummary)
+
+-- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+recordingConfigurationSummary_tags :: Lens.Lens' RecordingConfigurationSummary (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+recordingConfigurationSummary_tags = Lens.lens (\RecordingConfigurationSummary' {tags} -> tags) (\s@RecordingConfigurationSummary' {} a -> s {tags = a} :: RecordingConfigurationSummary) Prelude.. Lens.mapping Lens.coerced
+
+-- | Recording-configuration ARN.
+recordingConfigurationSummary_arn :: Lens.Lens' RecordingConfigurationSummary Prelude.Text
+recordingConfigurationSummary_arn = Lens.lens (\RecordingConfigurationSummary' {arn} -> arn) (\s@RecordingConfigurationSummary' {} a -> s {arn = a} :: RecordingConfigurationSummary)
+
+-- | A complex type that contains information about where recorded video will
+-- be stored.
+recordingConfigurationSummary_destinationConfiguration :: Lens.Lens' RecordingConfigurationSummary DestinationConfiguration
+recordingConfigurationSummary_destinationConfiguration = Lens.lens (\RecordingConfigurationSummary' {destinationConfiguration} -> destinationConfiguration) (\s@RecordingConfigurationSummary' {} a -> s {destinationConfiguration = a} :: RecordingConfigurationSummary)
+
+-- | Indicates the current state of the recording configuration. When the
+-- state is @ACTIVE@, the configuration is ready for recording a channel
+-- stream.
+recordingConfigurationSummary_state :: Lens.Lens' RecordingConfigurationSummary RecordingConfigurationState
+recordingConfigurationSummary_state = Lens.lens (\RecordingConfigurationSummary' {state} -> state) (\s@RecordingConfigurationSummary' {} a -> s {state = a} :: RecordingConfigurationSummary)
+
+instance Data.FromJSON RecordingConfigurationSummary where
+  parseJSON =
+    Data.withObject
+      "RecordingConfigurationSummary"
+      ( \x ->
+          RecordingConfigurationSummary'
+            Prelude.<$> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "arn")
+            Prelude.<*> (x Data..: "destinationConfiguration")
+            Prelude.<*> (x Data..: "state")
+      )
+
+instance
+  Prelude.Hashable
+    RecordingConfigurationSummary
+  where
+  hashWithSalt _salt RecordingConfigurationSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` destinationConfiguration
+      `Prelude.hashWithSalt` state
+
+instance Prelude.NFData RecordingConfigurationSummary where
+  rnf RecordingConfigurationSummary' {..} =
+    Prelude.rnf name
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf destinationConfiguration
+      `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/IVS/Types/RecordingMode.hs b/gen/Amazonka/IVS/Types/RecordingMode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/RecordingMode.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.IVS.Types.RecordingMode
+-- 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.IVS.Types.RecordingMode
+  ( RecordingMode
+      ( ..,
+        RecordingMode_DISABLED,
+        RecordingMode_INTERVAL
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype RecordingMode = RecordingMode'
+  { fromRecordingMode ::
+      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 RecordingMode_DISABLED :: RecordingMode
+pattern RecordingMode_DISABLED = RecordingMode' "DISABLED"
+
+pattern RecordingMode_INTERVAL :: RecordingMode
+pattern RecordingMode_INTERVAL = RecordingMode' "INTERVAL"
+
+{-# COMPLETE
+  RecordingMode_DISABLED,
+  RecordingMode_INTERVAL,
+  RecordingMode'
+  #-}
diff --git a/gen/Amazonka/IVS/Types/S3DestinationConfiguration.hs b/gen/Amazonka/IVS/Types/S3DestinationConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/S3DestinationConfiguration.hs
@@ -0,0 +1,82 @@
+{-# 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.IVS.Types.S3DestinationConfiguration
+-- 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.IVS.Types.S3DestinationConfiguration 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
+
+-- | A complex type that describes an S3 location where recorded videos will
+-- be stored.
+--
+-- /See:/ 'newS3DestinationConfiguration' smart constructor.
+data S3DestinationConfiguration = S3DestinationConfiguration'
+  { -- | Location (S3 bucket name) where recorded videos will be stored.
+    bucketName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'S3DestinationConfiguration' 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:
+--
+-- 'bucketName', 's3DestinationConfiguration_bucketName' - Location (S3 bucket name) where recorded videos will be stored.
+newS3DestinationConfiguration ::
+  -- | 'bucketName'
+  Prelude.Text ->
+  S3DestinationConfiguration
+newS3DestinationConfiguration pBucketName_ =
+  S3DestinationConfiguration'
+    { bucketName =
+        pBucketName_
+    }
+
+-- | Location (S3 bucket name) where recorded videos will be stored.
+s3DestinationConfiguration_bucketName :: Lens.Lens' S3DestinationConfiguration Prelude.Text
+s3DestinationConfiguration_bucketName = Lens.lens (\S3DestinationConfiguration' {bucketName} -> bucketName) (\s@S3DestinationConfiguration' {} a -> s {bucketName = a} :: S3DestinationConfiguration)
+
+instance Data.FromJSON S3DestinationConfiguration where
+  parseJSON =
+    Data.withObject
+      "S3DestinationConfiguration"
+      ( \x ->
+          S3DestinationConfiguration'
+            Prelude.<$> (x Data..: "bucketName")
+      )
+
+instance Prelude.Hashable S3DestinationConfiguration where
+  hashWithSalt _salt S3DestinationConfiguration' {..} =
+    _salt `Prelude.hashWithSalt` bucketName
+
+instance Prelude.NFData S3DestinationConfiguration where
+  rnf S3DestinationConfiguration' {..} =
+    Prelude.rnf bucketName
+
+instance Data.ToJSON S3DestinationConfiguration where
+  toJSON S3DestinationConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("bucketName" Data..= bucketName)]
+      )
diff --git a/gen/Amazonka/IVS/Types/Stream.hs b/gen/Amazonka/IVS/Types/Stream.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/Stream.hs
@@ -0,0 +1,167 @@
+{-# 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.IVS.Types.Stream
+-- 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.IVS.Types.Stream where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types.StreamHealth
+import Amazonka.IVS.Types.StreamState
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies a live video stream that has been ingested and distributed.
+--
+-- /See:/ 'newStream' smart constructor.
+data Stream = Stream'
+  { -- | Channel ARN for the stream.
+    channelArn :: Prelude.Maybe Prelude.Text,
+    -- | The stream’s health.
+    health :: Prelude.Maybe StreamHealth,
+    -- | URL of the master playlist, required by the video player to play the HLS
+    -- stream.
+    playbackUrl :: Prelude.Maybe Prelude.Text,
+    -- | Time of the stream’s start. This is an ISO 8601 timestamp; /note that
+    -- this is returned as a string/.
+    startTime :: Prelude.Maybe Data.ISO8601,
+    -- | The stream’s state.
+    state :: Prelude.Maybe StreamState,
+    -- | Unique identifier for a live or previously live stream in the specified
+    -- channel.
+    streamId :: Prelude.Maybe Prelude.Text,
+    -- | A count of concurrent views of the stream. Typically, a new view appears
+    -- in @viewerCount@ within 15 seconds of when video playback starts and a
+    -- view is removed from @viewerCount@ within 1 minute of when video
+    -- playback ends. A value of -1 indicates that the request timed out; in
+    -- this case, retry.
+    viewerCount :: Prelude.Maybe Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Stream' 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:
+--
+-- 'channelArn', 'stream_channelArn' - Channel ARN for the stream.
+--
+-- 'health', 'stream_health' - The stream’s health.
+--
+-- 'playbackUrl', 'stream_playbackUrl' - URL of the master playlist, required by the video player to play the HLS
+-- stream.
+--
+-- 'startTime', 'stream_startTime' - Time of the stream’s start. This is an ISO 8601 timestamp; /note that
+-- this is returned as a string/.
+--
+-- 'state', 'stream_state' - The stream’s state.
+--
+-- 'streamId', 'stream_streamId' - Unique identifier for a live or previously live stream in the specified
+-- channel.
+--
+-- 'viewerCount', 'stream_viewerCount' - A count of concurrent views of the stream. Typically, a new view appears
+-- in @viewerCount@ within 15 seconds of when video playback starts and a
+-- view is removed from @viewerCount@ within 1 minute of when video
+-- playback ends. A value of -1 indicates that the request timed out; in
+-- this case, retry.
+newStream ::
+  Stream
+newStream =
+  Stream'
+    { channelArn = Prelude.Nothing,
+      health = Prelude.Nothing,
+      playbackUrl = Prelude.Nothing,
+      startTime = Prelude.Nothing,
+      state = Prelude.Nothing,
+      streamId = Prelude.Nothing,
+      viewerCount = Prelude.Nothing
+    }
+
+-- | Channel ARN for the stream.
+stream_channelArn :: Lens.Lens' Stream (Prelude.Maybe Prelude.Text)
+stream_channelArn = Lens.lens (\Stream' {channelArn} -> channelArn) (\s@Stream' {} a -> s {channelArn = a} :: Stream)
+
+-- | The stream’s health.
+stream_health :: Lens.Lens' Stream (Prelude.Maybe StreamHealth)
+stream_health = Lens.lens (\Stream' {health} -> health) (\s@Stream' {} a -> s {health = a} :: Stream)
+
+-- | URL of the master playlist, required by the video player to play the HLS
+-- stream.
+stream_playbackUrl :: Lens.Lens' Stream (Prelude.Maybe Prelude.Text)
+stream_playbackUrl = Lens.lens (\Stream' {playbackUrl} -> playbackUrl) (\s@Stream' {} a -> s {playbackUrl = a} :: Stream)
+
+-- | Time of the stream’s start. This is an ISO 8601 timestamp; /note that
+-- this is returned as a string/.
+stream_startTime :: Lens.Lens' Stream (Prelude.Maybe Prelude.UTCTime)
+stream_startTime = Lens.lens (\Stream' {startTime} -> startTime) (\s@Stream' {} a -> s {startTime = a} :: Stream) Prelude.. Lens.mapping Data._Time
+
+-- | The stream’s state.
+stream_state :: Lens.Lens' Stream (Prelude.Maybe StreamState)
+stream_state = Lens.lens (\Stream' {state} -> state) (\s@Stream' {} a -> s {state = a} :: Stream)
+
+-- | Unique identifier for a live or previously live stream in the specified
+-- channel.
+stream_streamId :: Lens.Lens' Stream (Prelude.Maybe Prelude.Text)
+stream_streamId = Lens.lens (\Stream' {streamId} -> streamId) (\s@Stream' {} a -> s {streamId = a} :: Stream)
+
+-- | A count of concurrent views of the stream. Typically, a new view appears
+-- in @viewerCount@ within 15 seconds of when video playback starts and a
+-- view is removed from @viewerCount@ within 1 minute of when video
+-- playback ends. A value of -1 indicates that the request timed out; in
+-- this case, retry.
+stream_viewerCount :: Lens.Lens' Stream (Prelude.Maybe Prelude.Integer)
+stream_viewerCount = Lens.lens (\Stream' {viewerCount} -> viewerCount) (\s@Stream' {} a -> s {viewerCount = a} :: Stream)
+
+instance Data.FromJSON Stream where
+  parseJSON =
+    Data.withObject
+      "Stream"
+      ( \x ->
+          Stream'
+            Prelude.<$> (x Data..:? "channelArn")
+            Prelude.<*> (x Data..:? "health")
+            Prelude.<*> (x Data..:? "playbackUrl")
+            Prelude.<*> (x Data..:? "startTime")
+            Prelude.<*> (x Data..:? "state")
+            Prelude.<*> (x Data..:? "streamId")
+            Prelude.<*> (x Data..:? "viewerCount")
+      )
+
+instance Prelude.Hashable Stream where
+  hashWithSalt _salt Stream' {..} =
+    _salt
+      `Prelude.hashWithSalt` channelArn
+      `Prelude.hashWithSalt` health
+      `Prelude.hashWithSalt` playbackUrl
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` state
+      `Prelude.hashWithSalt` streamId
+      `Prelude.hashWithSalt` viewerCount
+
+instance Prelude.NFData Stream where
+  rnf Stream' {..} =
+    Prelude.rnf channelArn
+      `Prelude.seq` Prelude.rnf health
+      `Prelude.seq` Prelude.rnf playbackUrl
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf state
+      `Prelude.seq` Prelude.rnf streamId
+      `Prelude.seq` Prelude.rnf viewerCount
diff --git a/gen/Amazonka/IVS/Types/StreamEvent.hs b/gen/Amazonka/IVS/Types/StreamEvent.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/StreamEvent.hs
@@ -0,0 +1,100 @@
+{-# 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.IVS.Types.StreamEvent
+-- 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.IVS.Types.StreamEvent 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
+
+-- | Object specifying a stream’s events. For a list of events, see
+-- <https://docs.aws.amazon.com/ivs/latest/userguide/eventbridge.html Using Amazon EventBridge with Amazon IVS>.
+--
+-- /See:/ 'newStreamEvent' smart constructor.
+data StreamEvent = StreamEvent'
+  { -- | Time when the event occurred. This is an ISO 8601 timestamp; /note that
+    -- this is returned as a string/.
+    eventTime :: Prelude.Maybe Data.ISO8601,
+    -- | Name that identifies the stream event within a @type@.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Logical group for certain events.
+    type' :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StreamEvent' 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:
+--
+-- 'eventTime', 'streamEvent_eventTime' - Time when the event occurred. This is an ISO 8601 timestamp; /note that
+-- this is returned as a string/.
+--
+-- 'name', 'streamEvent_name' - Name that identifies the stream event within a @type@.
+--
+-- 'type'', 'streamEvent_type' - Logical group for certain events.
+newStreamEvent ::
+  StreamEvent
+newStreamEvent =
+  StreamEvent'
+    { eventTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      type' = Prelude.Nothing
+    }
+
+-- | Time when the event occurred. This is an ISO 8601 timestamp; /note that
+-- this is returned as a string/.
+streamEvent_eventTime :: Lens.Lens' StreamEvent (Prelude.Maybe Prelude.UTCTime)
+streamEvent_eventTime = Lens.lens (\StreamEvent' {eventTime} -> eventTime) (\s@StreamEvent' {} a -> s {eventTime = a} :: StreamEvent) Prelude.. Lens.mapping Data._Time
+
+-- | Name that identifies the stream event within a @type@.
+streamEvent_name :: Lens.Lens' StreamEvent (Prelude.Maybe Prelude.Text)
+streamEvent_name = Lens.lens (\StreamEvent' {name} -> name) (\s@StreamEvent' {} a -> s {name = a} :: StreamEvent)
+
+-- | Logical group for certain events.
+streamEvent_type :: Lens.Lens' StreamEvent (Prelude.Maybe Prelude.Text)
+streamEvent_type = Lens.lens (\StreamEvent' {type'} -> type') (\s@StreamEvent' {} a -> s {type' = a} :: StreamEvent)
+
+instance Data.FromJSON StreamEvent where
+  parseJSON =
+    Data.withObject
+      "StreamEvent"
+      ( \x ->
+          StreamEvent'
+            Prelude.<$> (x Data..:? "eventTime")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "type")
+      )
+
+instance Prelude.Hashable StreamEvent where
+  hashWithSalt _salt StreamEvent' {..} =
+    _salt
+      `Prelude.hashWithSalt` eventTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData StreamEvent where
+  rnf StreamEvent' {..} =
+    Prelude.rnf eventTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf type'
diff --git a/gen/Amazonka/IVS/Types/StreamFilters.hs b/gen/Amazonka/IVS/Types/StreamFilters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/StreamFilters.hs
@@ -0,0 +1,67 @@
+{-# 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.IVS.Types.StreamFilters
+-- 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.IVS.Types.StreamFilters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types.StreamHealth
+import qualified Amazonka.Prelude as Prelude
+
+-- | Object specifying the stream attribute on which to filter.
+--
+-- /See:/ 'newStreamFilters' smart constructor.
+data StreamFilters = StreamFilters'
+  { -- | The stream’s health.
+    health :: Prelude.Maybe StreamHealth
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StreamFilters' 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:
+--
+-- 'health', 'streamFilters_health' - The stream’s health.
+newStreamFilters ::
+  StreamFilters
+newStreamFilters =
+  StreamFilters' {health = Prelude.Nothing}
+
+-- | The stream’s health.
+streamFilters_health :: Lens.Lens' StreamFilters (Prelude.Maybe StreamHealth)
+streamFilters_health = Lens.lens (\StreamFilters' {health} -> health) (\s@StreamFilters' {} a -> s {health = a} :: StreamFilters)
+
+instance Prelude.Hashable StreamFilters where
+  hashWithSalt _salt StreamFilters' {..} =
+    _salt `Prelude.hashWithSalt` health
+
+instance Prelude.NFData StreamFilters where
+  rnf StreamFilters' {..} = Prelude.rnf health
+
+instance Data.ToJSON StreamFilters where
+  toJSON StreamFilters' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("health" Data..=) Prelude.<$> health]
+      )
diff --git a/gen/Amazonka/IVS/Types/StreamHealth.hs b/gen/Amazonka/IVS/Types/StreamHealth.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/StreamHealth.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.IVS.Types.StreamHealth
+-- 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.IVS.Types.StreamHealth
+  ( StreamHealth
+      ( ..,
+        StreamHealth_HEALTHY,
+        StreamHealth_STARVING,
+        StreamHealth_UNKNOWN
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype StreamHealth = StreamHealth'
+  { fromStreamHealth ::
+      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 StreamHealth_HEALTHY :: StreamHealth
+pattern StreamHealth_HEALTHY = StreamHealth' "HEALTHY"
+
+pattern StreamHealth_STARVING :: StreamHealth
+pattern StreamHealth_STARVING = StreamHealth' "STARVING"
+
+pattern StreamHealth_UNKNOWN :: StreamHealth
+pattern StreamHealth_UNKNOWN = StreamHealth' "UNKNOWN"
+
+{-# COMPLETE
+  StreamHealth_HEALTHY,
+  StreamHealth_STARVING,
+  StreamHealth_UNKNOWN,
+  StreamHealth'
+  #-}
diff --git a/gen/Amazonka/IVS/Types/StreamKey.hs b/gen/Amazonka/IVS/Types/StreamKey.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/StreamKey.hs
@@ -0,0 +1,120 @@
+{-# 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.IVS.Types.StreamKey
+-- 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.IVS.Types.StreamKey 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
+
+-- | Object specifying a stream key.
+--
+-- /See:/ 'newStreamKey' smart constructor.
+data StreamKey = StreamKey'
+  { -- | Stream-key ARN.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | Channel ARN for the stream.
+    channelArn :: Prelude.Maybe Prelude.Text,
+    -- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+    -- for more information, including restrictions that apply to tags and
+    -- \"Tag naming limits and requirements\"; Amazon IVS has no
+    -- service-specific constraints beyond what is documented there.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Stream-key value.
+    value :: Prelude.Maybe (Data.Sensitive Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StreamKey' 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:
+--
+-- 'arn', 'streamKey_arn' - Stream-key ARN.
+--
+-- 'channelArn', 'streamKey_channelArn' - Channel ARN for the stream.
+--
+-- 'tags', 'streamKey_tags' - Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+--
+-- 'value', 'streamKey_value' - Stream-key value.
+newStreamKey ::
+  StreamKey
+newStreamKey =
+  StreamKey'
+    { arn = Prelude.Nothing,
+      channelArn = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      value = Prelude.Nothing
+    }
+
+-- | Stream-key ARN.
+streamKey_arn :: Lens.Lens' StreamKey (Prelude.Maybe Prelude.Text)
+streamKey_arn = Lens.lens (\StreamKey' {arn} -> arn) (\s@StreamKey' {} a -> s {arn = a} :: StreamKey)
+
+-- | Channel ARN for the stream.
+streamKey_channelArn :: Lens.Lens' StreamKey (Prelude.Maybe Prelude.Text)
+streamKey_channelArn = Lens.lens (\StreamKey' {channelArn} -> channelArn) (\s@StreamKey' {} a -> s {channelArn = a} :: StreamKey)
+
+-- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+streamKey_tags :: Lens.Lens' StreamKey (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+streamKey_tags = Lens.lens (\StreamKey' {tags} -> tags) (\s@StreamKey' {} a -> s {tags = a} :: StreamKey) Prelude.. Lens.mapping Lens.coerced
+
+-- | Stream-key value.
+streamKey_value :: Lens.Lens' StreamKey (Prelude.Maybe Prelude.Text)
+streamKey_value = Lens.lens (\StreamKey' {value} -> value) (\s@StreamKey' {} a -> s {value = a} :: StreamKey) Prelude.. Lens.mapping Data._Sensitive
+
+instance Data.FromJSON StreamKey where
+  parseJSON =
+    Data.withObject
+      "StreamKey"
+      ( \x ->
+          StreamKey'
+            Prelude.<$> (x Data..:? "arn")
+            Prelude.<*> (x Data..:? "channelArn")
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "value")
+      )
+
+instance Prelude.Hashable StreamKey where
+  hashWithSalt _salt StreamKey' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` channelArn
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData StreamKey where
+  rnf StreamKey' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf channelArn
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf value
diff --git a/gen/Amazonka/IVS/Types/StreamKeySummary.hs b/gen/Amazonka/IVS/Types/StreamKeySummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/StreamKeySummary.hs
@@ -0,0 +1,108 @@
+{-# 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.IVS.Types.StreamKeySummary
+-- 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.IVS.Types.StreamKeySummary 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
+
+-- | Summary information about a stream key.
+--
+-- /See:/ 'newStreamKeySummary' smart constructor.
+data StreamKeySummary = StreamKeySummary'
+  { -- | Stream-key ARN.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | Channel ARN for the stream.
+    channelArn :: Prelude.Maybe Prelude.Text,
+    -- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+    -- for more information, including restrictions that apply to tags and
+    -- \"Tag naming limits and requirements\"; Amazon IVS has no
+    -- service-specific constraints beyond what is documented there.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StreamKeySummary' 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:
+--
+-- 'arn', 'streamKeySummary_arn' - Stream-key ARN.
+--
+-- 'channelArn', 'streamKeySummary_channelArn' - Channel ARN for the stream.
+--
+-- 'tags', 'streamKeySummary_tags' - Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+newStreamKeySummary ::
+  StreamKeySummary
+newStreamKeySummary =
+  StreamKeySummary'
+    { arn = Prelude.Nothing,
+      channelArn = Prelude.Nothing,
+      tags = Prelude.Nothing
+    }
+
+-- | Stream-key ARN.
+streamKeySummary_arn :: Lens.Lens' StreamKeySummary (Prelude.Maybe Prelude.Text)
+streamKeySummary_arn = Lens.lens (\StreamKeySummary' {arn} -> arn) (\s@StreamKeySummary' {} a -> s {arn = a} :: StreamKeySummary)
+
+-- | Channel ARN for the stream.
+streamKeySummary_channelArn :: Lens.Lens' StreamKeySummary (Prelude.Maybe Prelude.Text)
+streamKeySummary_channelArn = Lens.lens (\StreamKeySummary' {channelArn} -> channelArn) (\s@StreamKeySummary' {} a -> s {channelArn = a} :: StreamKeySummary)
+
+-- | Array of 1-50 maps, each of the form @string:string (key:value)@. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+streamKeySummary_tags :: Lens.Lens' StreamKeySummary (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+streamKeySummary_tags = Lens.lens (\StreamKeySummary' {tags} -> tags) (\s@StreamKeySummary' {} a -> s {tags = a} :: StreamKeySummary) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON StreamKeySummary where
+  parseJSON =
+    Data.withObject
+      "StreamKeySummary"
+      ( \x ->
+          StreamKeySummary'
+            Prelude.<$> (x Data..:? "arn")
+            Prelude.<*> (x Data..:? "channelArn")
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable StreamKeySummary where
+  hashWithSalt _salt StreamKeySummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` channelArn
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData StreamKeySummary where
+  rnf StreamKeySummary' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf channelArn
+      `Prelude.seq` Prelude.rnf tags
diff --git a/gen/Amazonka/IVS/Types/StreamSession.hs b/gen/Amazonka/IVS/Types/StreamSession.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/StreamSession.hs
@@ -0,0 +1,171 @@
+{-# 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.IVS.Types.StreamSession
+-- 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.IVS.Types.StreamSession where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types.Channel
+import Amazonka.IVS.Types.IngestConfiguration
+import Amazonka.IVS.Types.RecordingConfiguration
+import Amazonka.IVS.Types.StreamEvent
+import qualified Amazonka.Prelude as Prelude
+
+-- | Object that captures the Amazon IVS configuration that the customer
+-- provisioned, the ingest configurations that the broadcaster used, and
+-- the most recent Amazon IVS stream events it encountered.
+--
+-- /See:/ 'newStreamSession' smart constructor.
+data StreamSession = StreamSession'
+  { -- | The properties of the channel at the time of going live.
+    channel :: Prelude.Maybe Channel,
+    -- | Time when the channel went offline. This is an ISO 8601 timestamp; /note
+    -- that this is returned as a string/. For live streams, this is @NULL@.
+    endTime :: Prelude.Maybe Data.ISO8601,
+    -- | The properties of the incoming RTMP stream for the stream.
+    ingestConfiguration :: Prelude.Maybe IngestConfiguration,
+    -- | The properties of recording the live stream.
+    recordingConfiguration :: Prelude.Maybe RecordingConfiguration,
+    -- | Time when the channel went live. This is an ISO 8601 timestamp; /note
+    -- that this is returned as a string/.
+    startTime :: Prelude.Maybe Data.ISO8601,
+    -- | Unique identifier for a live or previously live stream in the specified
+    -- channel.
+    streamId :: Prelude.Maybe Prelude.Text,
+    -- | List of Amazon IVS events that the stream encountered. The list is
+    -- sorted by most recent events and contains up to 500 events. For Amazon
+    -- IVS events, see
+    -- <https://docs.aws.amazon.com/ivs/latest/userguide/eventbridge.html Using Amazon EventBridge with Amazon IVS>.
+    truncatedEvents :: Prelude.Maybe [StreamEvent]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StreamSession' 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:
+--
+-- 'channel', 'streamSession_channel' - The properties of the channel at the time of going live.
+--
+-- 'endTime', 'streamSession_endTime' - Time when the channel went offline. This is an ISO 8601 timestamp; /note
+-- that this is returned as a string/. For live streams, this is @NULL@.
+--
+-- 'ingestConfiguration', 'streamSession_ingestConfiguration' - The properties of the incoming RTMP stream for the stream.
+--
+-- 'recordingConfiguration', 'streamSession_recordingConfiguration' - The properties of recording the live stream.
+--
+-- 'startTime', 'streamSession_startTime' - Time when the channel went live. This is an ISO 8601 timestamp; /note
+-- that this is returned as a string/.
+--
+-- 'streamId', 'streamSession_streamId' - Unique identifier for a live or previously live stream in the specified
+-- channel.
+--
+-- 'truncatedEvents', 'streamSession_truncatedEvents' - List of Amazon IVS events that the stream encountered. The list is
+-- sorted by most recent events and contains up to 500 events. For Amazon
+-- IVS events, see
+-- <https://docs.aws.amazon.com/ivs/latest/userguide/eventbridge.html Using Amazon EventBridge with Amazon IVS>.
+newStreamSession ::
+  StreamSession
+newStreamSession =
+  StreamSession'
+    { channel = Prelude.Nothing,
+      endTime = Prelude.Nothing,
+      ingestConfiguration = Prelude.Nothing,
+      recordingConfiguration = Prelude.Nothing,
+      startTime = Prelude.Nothing,
+      streamId = Prelude.Nothing,
+      truncatedEvents = Prelude.Nothing
+    }
+
+-- | The properties of the channel at the time of going live.
+streamSession_channel :: Lens.Lens' StreamSession (Prelude.Maybe Channel)
+streamSession_channel = Lens.lens (\StreamSession' {channel} -> channel) (\s@StreamSession' {} a -> s {channel = a} :: StreamSession)
+
+-- | Time when the channel went offline. This is an ISO 8601 timestamp; /note
+-- that this is returned as a string/. For live streams, this is @NULL@.
+streamSession_endTime :: Lens.Lens' StreamSession (Prelude.Maybe Prelude.UTCTime)
+streamSession_endTime = Lens.lens (\StreamSession' {endTime} -> endTime) (\s@StreamSession' {} a -> s {endTime = a} :: StreamSession) Prelude.. Lens.mapping Data._Time
+
+-- | The properties of the incoming RTMP stream for the stream.
+streamSession_ingestConfiguration :: Lens.Lens' StreamSession (Prelude.Maybe IngestConfiguration)
+streamSession_ingestConfiguration = Lens.lens (\StreamSession' {ingestConfiguration} -> ingestConfiguration) (\s@StreamSession' {} a -> s {ingestConfiguration = a} :: StreamSession)
+
+-- | The properties of recording the live stream.
+streamSession_recordingConfiguration :: Lens.Lens' StreamSession (Prelude.Maybe RecordingConfiguration)
+streamSession_recordingConfiguration = Lens.lens (\StreamSession' {recordingConfiguration} -> recordingConfiguration) (\s@StreamSession' {} a -> s {recordingConfiguration = a} :: StreamSession)
+
+-- | Time when the channel went live. This is an ISO 8601 timestamp; /note
+-- that this is returned as a string/.
+streamSession_startTime :: Lens.Lens' StreamSession (Prelude.Maybe Prelude.UTCTime)
+streamSession_startTime = Lens.lens (\StreamSession' {startTime} -> startTime) (\s@StreamSession' {} a -> s {startTime = a} :: StreamSession) Prelude.. Lens.mapping Data._Time
+
+-- | Unique identifier for a live or previously live stream in the specified
+-- channel.
+streamSession_streamId :: Lens.Lens' StreamSession (Prelude.Maybe Prelude.Text)
+streamSession_streamId = Lens.lens (\StreamSession' {streamId} -> streamId) (\s@StreamSession' {} a -> s {streamId = a} :: StreamSession)
+
+-- | List of Amazon IVS events that the stream encountered. The list is
+-- sorted by most recent events and contains up to 500 events. For Amazon
+-- IVS events, see
+-- <https://docs.aws.amazon.com/ivs/latest/userguide/eventbridge.html Using Amazon EventBridge with Amazon IVS>.
+streamSession_truncatedEvents :: Lens.Lens' StreamSession (Prelude.Maybe [StreamEvent])
+streamSession_truncatedEvents = Lens.lens (\StreamSession' {truncatedEvents} -> truncatedEvents) (\s@StreamSession' {} a -> s {truncatedEvents = a} :: StreamSession) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON StreamSession where
+  parseJSON =
+    Data.withObject
+      "StreamSession"
+      ( \x ->
+          StreamSession'
+            Prelude.<$> (x Data..:? "channel")
+            Prelude.<*> (x Data..:? "endTime")
+            Prelude.<*> (x Data..:? "ingestConfiguration")
+            Prelude.<*> (x Data..:? "recordingConfiguration")
+            Prelude.<*> (x Data..:? "startTime")
+            Prelude.<*> (x Data..:? "streamId")
+            Prelude.<*> ( x
+                            Data..:? "truncatedEvents"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable StreamSession where
+  hashWithSalt _salt StreamSession' {..} =
+    _salt
+      `Prelude.hashWithSalt` channel
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` ingestConfiguration
+      `Prelude.hashWithSalt` recordingConfiguration
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` streamId
+      `Prelude.hashWithSalt` truncatedEvents
+
+instance Prelude.NFData StreamSession where
+  rnf StreamSession' {..} =
+    Prelude.rnf channel
+      `Prelude.seq` Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf ingestConfiguration
+      `Prelude.seq` Prelude.rnf recordingConfiguration
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf streamId
+      `Prelude.seq` Prelude.rnf truncatedEvents
diff --git a/gen/Amazonka/IVS/Types/StreamSessionSummary.hs b/gen/Amazonka/IVS/Types/StreamSessionSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/StreamSessionSummary.hs
@@ -0,0 +1,117 @@
+{-# 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.IVS.Types.StreamSessionSummary
+-- 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.IVS.Types.StreamSessionSummary 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
+
+-- | Summary information about a stream session.
+--
+-- /See:/ 'newStreamSessionSummary' smart constructor.
+data StreamSessionSummary = StreamSessionSummary'
+  { -- | Time when the channel went offline. This is an ISO 8601 timestamp; /note
+    -- that this is returned as a string/. For live streams, this is @NULL@.
+    endTime :: Prelude.Maybe Data.ISO8601,
+    -- | If @true@, this stream encountered a quota breach or failure.
+    hasErrorEvent :: Prelude.Maybe Prelude.Bool,
+    -- | Time when the channel went live. This is an ISO 8601 timestamp; /note
+    -- that this is returned as a string/.
+    startTime :: Prelude.Maybe Data.ISO8601,
+    -- | Unique identifier for a live or previously live stream in the specified
+    -- channel.
+    streamId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StreamSessionSummary' 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:
+--
+-- 'endTime', 'streamSessionSummary_endTime' - Time when the channel went offline. This is an ISO 8601 timestamp; /note
+-- that this is returned as a string/. For live streams, this is @NULL@.
+--
+-- 'hasErrorEvent', 'streamSessionSummary_hasErrorEvent' - If @true@, this stream encountered a quota breach or failure.
+--
+-- 'startTime', 'streamSessionSummary_startTime' - Time when the channel went live. This is an ISO 8601 timestamp; /note
+-- that this is returned as a string/.
+--
+-- 'streamId', 'streamSessionSummary_streamId' - Unique identifier for a live or previously live stream in the specified
+-- channel.
+newStreamSessionSummary ::
+  StreamSessionSummary
+newStreamSessionSummary =
+  StreamSessionSummary'
+    { endTime = Prelude.Nothing,
+      hasErrorEvent = Prelude.Nothing,
+      startTime = Prelude.Nothing,
+      streamId = Prelude.Nothing
+    }
+
+-- | Time when the channel went offline. This is an ISO 8601 timestamp; /note
+-- that this is returned as a string/. For live streams, this is @NULL@.
+streamSessionSummary_endTime :: Lens.Lens' StreamSessionSummary (Prelude.Maybe Prelude.UTCTime)
+streamSessionSummary_endTime = Lens.lens (\StreamSessionSummary' {endTime} -> endTime) (\s@StreamSessionSummary' {} a -> s {endTime = a} :: StreamSessionSummary) Prelude.. Lens.mapping Data._Time
+
+-- | If @true@, this stream encountered a quota breach or failure.
+streamSessionSummary_hasErrorEvent :: Lens.Lens' StreamSessionSummary (Prelude.Maybe Prelude.Bool)
+streamSessionSummary_hasErrorEvent = Lens.lens (\StreamSessionSummary' {hasErrorEvent} -> hasErrorEvent) (\s@StreamSessionSummary' {} a -> s {hasErrorEvent = a} :: StreamSessionSummary)
+
+-- | Time when the channel went live. This is an ISO 8601 timestamp; /note
+-- that this is returned as a string/.
+streamSessionSummary_startTime :: Lens.Lens' StreamSessionSummary (Prelude.Maybe Prelude.UTCTime)
+streamSessionSummary_startTime = Lens.lens (\StreamSessionSummary' {startTime} -> startTime) (\s@StreamSessionSummary' {} a -> s {startTime = a} :: StreamSessionSummary) Prelude.. Lens.mapping Data._Time
+
+-- | Unique identifier for a live or previously live stream in the specified
+-- channel.
+streamSessionSummary_streamId :: Lens.Lens' StreamSessionSummary (Prelude.Maybe Prelude.Text)
+streamSessionSummary_streamId = Lens.lens (\StreamSessionSummary' {streamId} -> streamId) (\s@StreamSessionSummary' {} a -> s {streamId = a} :: StreamSessionSummary)
+
+instance Data.FromJSON StreamSessionSummary where
+  parseJSON =
+    Data.withObject
+      "StreamSessionSummary"
+      ( \x ->
+          StreamSessionSummary'
+            Prelude.<$> (x Data..:? "endTime")
+            Prelude.<*> (x Data..:? "hasErrorEvent")
+            Prelude.<*> (x Data..:? "startTime")
+            Prelude.<*> (x Data..:? "streamId")
+      )
+
+instance Prelude.Hashable StreamSessionSummary where
+  hashWithSalt _salt StreamSessionSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` hasErrorEvent
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` streamId
+
+instance Prelude.NFData StreamSessionSummary where
+  rnf StreamSessionSummary' {..} =
+    Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf hasErrorEvent
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf streamId
diff --git a/gen/Amazonka/IVS/Types/StreamState.hs b/gen/Amazonka/IVS/Types/StreamState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/StreamState.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.IVS.Types.StreamState
+-- 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.IVS.Types.StreamState
+  ( StreamState
+      ( ..,
+        StreamState_LIVE,
+        StreamState_OFFLINE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype StreamState = StreamState'
+  { fromStreamState ::
+      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 StreamState_LIVE :: StreamState
+pattern StreamState_LIVE = StreamState' "LIVE"
+
+pattern StreamState_OFFLINE :: StreamState
+pattern StreamState_OFFLINE = StreamState' "OFFLINE"
+
+{-# COMPLETE
+  StreamState_LIVE,
+  StreamState_OFFLINE,
+  StreamState'
+  #-}
diff --git a/gen/Amazonka/IVS/Types/StreamSummary.hs b/gen/Amazonka/IVS/Types/StreamSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/StreamSummary.hs
@@ -0,0 +1,152 @@
+{-# 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.IVS.Types.StreamSummary
+-- 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.IVS.Types.StreamSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types.StreamHealth
+import Amazonka.IVS.Types.StreamState
+import qualified Amazonka.Prelude as Prelude
+
+-- | Summary information about a stream.
+--
+-- /See:/ 'newStreamSummary' smart constructor.
+data StreamSummary = StreamSummary'
+  { -- | Channel ARN for the stream.
+    channelArn :: Prelude.Maybe Prelude.Text,
+    -- | The stream’s health.
+    health :: Prelude.Maybe StreamHealth,
+    -- | Time of the stream’s start. This is an ISO 8601 timestamp; /note that
+    -- this is returned as a string/.
+    startTime :: Prelude.Maybe Data.ISO8601,
+    -- | The stream’s state.
+    state :: Prelude.Maybe StreamState,
+    -- | Unique identifier for a live or previously live stream in the specified
+    -- channel.
+    streamId :: Prelude.Maybe Prelude.Text,
+    -- | A count of concurrent views of the stream. Typically, a new view appears
+    -- in @viewerCount@ within 15 seconds of when video playback starts and a
+    -- view is removed from @viewerCount@ within 1 minute of when video
+    -- playback ends. A value of -1 indicates that the request timed out; in
+    -- this case, retry.
+    viewerCount :: Prelude.Maybe Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StreamSummary' 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:
+--
+-- 'channelArn', 'streamSummary_channelArn' - Channel ARN for the stream.
+--
+-- 'health', 'streamSummary_health' - The stream’s health.
+--
+-- 'startTime', 'streamSummary_startTime' - Time of the stream’s start. This is an ISO 8601 timestamp; /note that
+-- this is returned as a string/.
+--
+-- 'state', 'streamSummary_state' - The stream’s state.
+--
+-- 'streamId', 'streamSummary_streamId' - Unique identifier for a live or previously live stream in the specified
+-- channel.
+--
+-- 'viewerCount', 'streamSummary_viewerCount' - A count of concurrent views of the stream. Typically, a new view appears
+-- in @viewerCount@ within 15 seconds of when video playback starts and a
+-- view is removed from @viewerCount@ within 1 minute of when video
+-- playback ends. A value of -1 indicates that the request timed out; in
+-- this case, retry.
+newStreamSummary ::
+  StreamSummary
+newStreamSummary =
+  StreamSummary'
+    { channelArn = Prelude.Nothing,
+      health = Prelude.Nothing,
+      startTime = Prelude.Nothing,
+      state = Prelude.Nothing,
+      streamId = Prelude.Nothing,
+      viewerCount = Prelude.Nothing
+    }
+
+-- | Channel ARN for the stream.
+streamSummary_channelArn :: Lens.Lens' StreamSummary (Prelude.Maybe Prelude.Text)
+streamSummary_channelArn = Lens.lens (\StreamSummary' {channelArn} -> channelArn) (\s@StreamSummary' {} a -> s {channelArn = a} :: StreamSummary)
+
+-- | The stream’s health.
+streamSummary_health :: Lens.Lens' StreamSummary (Prelude.Maybe StreamHealth)
+streamSummary_health = Lens.lens (\StreamSummary' {health} -> health) (\s@StreamSummary' {} a -> s {health = a} :: StreamSummary)
+
+-- | Time of the stream’s start. This is an ISO 8601 timestamp; /note that
+-- this is returned as a string/.
+streamSummary_startTime :: Lens.Lens' StreamSummary (Prelude.Maybe Prelude.UTCTime)
+streamSummary_startTime = Lens.lens (\StreamSummary' {startTime} -> startTime) (\s@StreamSummary' {} a -> s {startTime = a} :: StreamSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The stream’s state.
+streamSummary_state :: Lens.Lens' StreamSummary (Prelude.Maybe StreamState)
+streamSummary_state = Lens.lens (\StreamSummary' {state} -> state) (\s@StreamSummary' {} a -> s {state = a} :: StreamSummary)
+
+-- | Unique identifier for a live or previously live stream in the specified
+-- channel.
+streamSummary_streamId :: Lens.Lens' StreamSummary (Prelude.Maybe Prelude.Text)
+streamSummary_streamId = Lens.lens (\StreamSummary' {streamId} -> streamId) (\s@StreamSummary' {} a -> s {streamId = a} :: StreamSummary)
+
+-- | A count of concurrent views of the stream. Typically, a new view appears
+-- in @viewerCount@ within 15 seconds of when video playback starts and a
+-- view is removed from @viewerCount@ within 1 minute of when video
+-- playback ends. A value of -1 indicates that the request timed out; in
+-- this case, retry.
+streamSummary_viewerCount :: Lens.Lens' StreamSummary (Prelude.Maybe Prelude.Integer)
+streamSummary_viewerCount = Lens.lens (\StreamSummary' {viewerCount} -> viewerCount) (\s@StreamSummary' {} a -> s {viewerCount = a} :: StreamSummary)
+
+instance Data.FromJSON StreamSummary where
+  parseJSON =
+    Data.withObject
+      "StreamSummary"
+      ( \x ->
+          StreamSummary'
+            Prelude.<$> (x Data..:? "channelArn")
+            Prelude.<*> (x Data..:? "health")
+            Prelude.<*> (x Data..:? "startTime")
+            Prelude.<*> (x Data..:? "state")
+            Prelude.<*> (x Data..:? "streamId")
+            Prelude.<*> (x Data..:? "viewerCount")
+      )
+
+instance Prelude.Hashable StreamSummary where
+  hashWithSalt _salt StreamSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` channelArn
+      `Prelude.hashWithSalt` health
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` state
+      `Prelude.hashWithSalt` streamId
+      `Prelude.hashWithSalt` viewerCount
+
+instance Prelude.NFData StreamSummary where
+  rnf StreamSummary' {..} =
+    Prelude.rnf channelArn
+      `Prelude.seq` Prelude.rnf health
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf state
+      `Prelude.seq` Prelude.rnf streamId
+      `Prelude.seq` Prelude.rnf viewerCount
diff --git a/gen/Amazonka/IVS/Types/ThumbnailConfiguration.hs b/gen/Amazonka/IVS/Types/ThumbnailConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/ThumbnailConfiguration.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.IVS.Types.ThumbnailConfiguration
+-- 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.IVS.Types.ThumbnailConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types.RecordingMode
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing a configuration of thumbnails for recorded video.
+--
+-- /See:/ 'newThumbnailConfiguration' smart constructor.
+data ThumbnailConfiguration = ThumbnailConfiguration'
+  { -- | Thumbnail recording mode. Default: @INTERVAL@.
+    recordingMode :: Prelude.Maybe RecordingMode,
+    -- | The targeted thumbnail-generation interval in seconds. This is
+    -- configurable (and required) only if @recordingMode@ is @INTERVAL@.
+    -- Default: 60.
+    --
+    -- __Important:__ Setting a value for @targetIntervalSeconds@ does not
+    -- guarantee that thumbnails are generated at the specified interval. For
+    -- thumbnails to be generated at the @targetIntervalSeconds@ interval, the
+    -- @IDR\/Keyframe@ value for the input video must be less than the
+    -- @targetIntervalSeconds@ value. See
+    -- <https://docs.aws.amazon.com/ivs/latest/userguide/streaming-config.html Amazon IVS Streaming Configuration>
+    -- for information on setting @IDR\/Keyframe@ to the recommended value in
+    -- video-encoder settings.
+    targetIntervalSeconds :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ThumbnailConfiguration' 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:
+--
+-- 'recordingMode', 'thumbnailConfiguration_recordingMode' - Thumbnail recording mode. Default: @INTERVAL@.
+--
+-- 'targetIntervalSeconds', 'thumbnailConfiguration_targetIntervalSeconds' - The targeted thumbnail-generation interval in seconds. This is
+-- configurable (and required) only if @recordingMode@ is @INTERVAL@.
+-- Default: 60.
+--
+-- __Important:__ Setting a value for @targetIntervalSeconds@ does not
+-- guarantee that thumbnails are generated at the specified interval. For
+-- thumbnails to be generated at the @targetIntervalSeconds@ interval, the
+-- @IDR\/Keyframe@ value for the input video must be less than the
+-- @targetIntervalSeconds@ value. See
+-- <https://docs.aws.amazon.com/ivs/latest/userguide/streaming-config.html Amazon IVS Streaming Configuration>
+-- for information on setting @IDR\/Keyframe@ to the recommended value in
+-- video-encoder settings.
+newThumbnailConfiguration ::
+  ThumbnailConfiguration
+newThumbnailConfiguration =
+  ThumbnailConfiguration'
+    { recordingMode =
+        Prelude.Nothing,
+      targetIntervalSeconds = Prelude.Nothing
+    }
+
+-- | Thumbnail recording mode. Default: @INTERVAL@.
+thumbnailConfiguration_recordingMode :: Lens.Lens' ThumbnailConfiguration (Prelude.Maybe RecordingMode)
+thumbnailConfiguration_recordingMode = Lens.lens (\ThumbnailConfiguration' {recordingMode} -> recordingMode) (\s@ThumbnailConfiguration' {} a -> s {recordingMode = a} :: ThumbnailConfiguration)
+
+-- | The targeted thumbnail-generation interval in seconds. This is
+-- configurable (and required) only if @recordingMode@ is @INTERVAL@.
+-- Default: 60.
+--
+-- __Important:__ Setting a value for @targetIntervalSeconds@ does not
+-- guarantee that thumbnails are generated at the specified interval. For
+-- thumbnails to be generated at the @targetIntervalSeconds@ interval, the
+-- @IDR\/Keyframe@ value for the input video must be less than the
+-- @targetIntervalSeconds@ value. See
+-- <https://docs.aws.amazon.com/ivs/latest/userguide/streaming-config.html Amazon IVS Streaming Configuration>
+-- for information on setting @IDR\/Keyframe@ to the recommended value in
+-- video-encoder settings.
+thumbnailConfiguration_targetIntervalSeconds :: Lens.Lens' ThumbnailConfiguration (Prelude.Maybe Prelude.Natural)
+thumbnailConfiguration_targetIntervalSeconds = Lens.lens (\ThumbnailConfiguration' {targetIntervalSeconds} -> targetIntervalSeconds) (\s@ThumbnailConfiguration' {} a -> s {targetIntervalSeconds = a} :: ThumbnailConfiguration)
+
+instance Data.FromJSON ThumbnailConfiguration where
+  parseJSON =
+    Data.withObject
+      "ThumbnailConfiguration"
+      ( \x ->
+          ThumbnailConfiguration'
+            Prelude.<$> (x Data..:? "recordingMode")
+            Prelude.<*> (x Data..:? "targetIntervalSeconds")
+      )
+
+instance Prelude.Hashable ThumbnailConfiguration where
+  hashWithSalt _salt ThumbnailConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` recordingMode
+      `Prelude.hashWithSalt` targetIntervalSeconds
+
+instance Prelude.NFData ThumbnailConfiguration where
+  rnf ThumbnailConfiguration' {..} =
+    Prelude.rnf recordingMode
+      `Prelude.seq` Prelude.rnf targetIntervalSeconds
+
+instance Data.ToJSON ThumbnailConfiguration where
+  toJSON ThumbnailConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("recordingMode" Data..=) Prelude.<$> recordingMode,
+            ("targetIntervalSeconds" Data..=)
+              Prelude.<$> targetIntervalSeconds
+          ]
+      )
diff --git a/gen/Amazonka/IVS/Types/VideoConfiguration.hs b/gen/Amazonka/IVS/Types/VideoConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/Types/VideoConfiguration.hs
@@ -0,0 +1,170 @@
+{-# 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.IVS.Types.VideoConfiguration
+-- 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.IVS.Types.VideoConfiguration 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
+
+-- | Object specifying a stream’s video configuration, as set up by the
+-- broadcaster (usually in an encoder). This is part of the
+-- IngestConfiguration object and used for monitoring stream health.
+--
+-- /See:/ 'newVideoConfiguration' smart constructor.
+data VideoConfiguration = VideoConfiguration'
+  { -- | Indicates the degree of required decoder performance for a profile.
+    -- Normally this is set automatically by the encoder. For details, see the
+    -- H.264 specification.
+    avcLevel :: Prelude.Maybe Prelude.Text,
+    -- | Indicates to the decoder the requirements for decoding the stream. For
+    -- definitions of the valid values, see the H.264 specification.
+    avcProfile :: Prelude.Maybe Prelude.Text,
+    -- | Codec used for the video encoding.
+    codec :: Prelude.Maybe Prelude.Text,
+    -- | Software or hardware used to encode the video.
+    encoder :: Prelude.Maybe Prelude.Text,
+    -- | The expected ingest bitrate (bits per second). This is configured in the
+    -- encoder.
+    targetBitrate :: Prelude.Maybe Prelude.Integer,
+    -- | The expected ingest framerate. This is configured in the encoder.
+    targetFramerate :: Prelude.Maybe Prelude.Integer,
+    -- | Video-resolution height in pixels.
+    videoHeight :: Prelude.Maybe Prelude.Integer,
+    -- | Video-resolution width in pixels.
+    videoWidth :: Prelude.Maybe Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VideoConfiguration' 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:
+--
+-- 'avcLevel', 'videoConfiguration_avcLevel' - Indicates the degree of required decoder performance for a profile.
+-- Normally this is set automatically by the encoder. For details, see the
+-- H.264 specification.
+--
+-- 'avcProfile', 'videoConfiguration_avcProfile' - Indicates to the decoder the requirements for decoding the stream. For
+-- definitions of the valid values, see the H.264 specification.
+--
+-- 'codec', 'videoConfiguration_codec' - Codec used for the video encoding.
+--
+-- 'encoder', 'videoConfiguration_encoder' - Software or hardware used to encode the video.
+--
+-- 'targetBitrate', 'videoConfiguration_targetBitrate' - The expected ingest bitrate (bits per second). This is configured in the
+-- encoder.
+--
+-- 'targetFramerate', 'videoConfiguration_targetFramerate' - The expected ingest framerate. This is configured in the encoder.
+--
+-- 'videoHeight', 'videoConfiguration_videoHeight' - Video-resolution height in pixels.
+--
+-- 'videoWidth', 'videoConfiguration_videoWidth' - Video-resolution width in pixels.
+newVideoConfiguration ::
+  VideoConfiguration
+newVideoConfiguration =
+  VideoConfiguration'
+    { avcLevel = Prelude.Nothing,
+      avcProfile = Prelude.Nothing,
+      codec = Prelude.Nothing,
+      encoder = Prelude.Nothing,
+      targetBitrate = Prelude.Nothing,
+      targetFramerate = Prelude.Nothing,
+      videoHeight = Prelude.Nothing,
+      videoWidth = Prelude.Nothing
+    }
+
+-- | Indicates the degree of required decoder performance for a profile.
+-- Normally this is set automatically by the encoder. For details, see the
+-- H.264 specification.
+videoConfiguration_avcLevel :: Lens.Lens' VideoConfiguration (Prelude.Maybe Prelude.Text)
+videoConfiguration_avcLevel = Lens.lens (\VideoConfiguration' {avcLevel} -> avcLevel) (\s@VideoConfiguration' {} a -> s {avcLevel = a} :: VideoConfiguration)
+
+-- | Indicates to the decoder the requirements for decoding the stream. For
+-- definitions of the valid values, see the H.264 specification.
+videoConfiguration_avcProfile :: Lens.Lens' VideoConfiguration (Prelude.Maybe Prelude.Text)
+videoConfiguration_avcProfile = Lens.lens (\VideoConfiguration' {avcProfile} -> avcProfile) (\s@VideoConfiguration' {} a -> s {avcProfile = a} :: VideoConfiguration)
+
+-- | Codec used for the video encoding.
+videoConfiguration_codec :: Lens.Lens' VideoConfiguration (Prelude.Maybe Prelude.Text)
+videoConfiguration_codec = Lens.lens (\VideoConfiguration' {codec} -> codec) (\s@VideoConfiguration' {} a -> s {codec = a} :: VideoConfiguration)
+
+-- | Software or hardware used to encode the video.
+videoConfiguration_encoder :: Lens.Lens' VideoConfiguration (Prelude.Maybe Prelude.Text)
+videoConfiguration_encoder = Lens.lens (\VideoConfiguration' {encoder} -> encoder) (\s@VideoConfiguration' {} a -> s {encoder = a} :: VideoConfiguration)
+
+-- | The expected ingest bitrate (bits per second). This is configured in the
+-- encoder.
+videoConfiguration_targetBitrate :: Lens.Lens' VideoConfiguration (Prelude.Maybe Prelude.Integer)
+videoConfiguration_targetBitrate = Lens.lens (\VideoConfiguration' {targetBitrate} -> targetBitrate) (\s@VideoConfiguration' {} a -> s {targetBitrate = a} :: VideoConfiguration)
+
+-- | The expected ingest framerate. This is configured in the encoder.
+videoConfiguration_targetFramerate :: Lens.Lens' VideoConfiguration (Prelude.Maybe Prelude.Integer)
+videoConfiguration_targetFramerate = Lens.lens (\VideoConfiguration' {targetFramerate} -> targetFramerate) (\s@VideoConfiguration' {} a -> s {targetFramerate = a} :: VideoConfiguration)
+
+-- | Video-resolution height in pixels.
+videoConfiguration_videoHeight :: Lens.Lens' VideoConfiguration (Prelude.Maybe Prelude.Integer)
+videoConfiguration_videoHeight = Lens.lens (\VideoConfiguration' {videoHeight} -> videoHeight) (\s@VideoConfiguration' {} a -> s {videoHeight = a} :: VideoConfiguration)
+
+-- | Video-resolution width in pixels.
+videoConfiguration_videoWidth :: Lens.Lens' VideoConfiguration (Prelude.Maybe Prelude.Integer)
+videoConfiguration_videoWidth = Lens.lens (\VideoConfiguration' {videoWidth} -> videoWidth) (\s@VideoConfiguration' {} a -> s {videoWidth = a} :: VideoConfiguration)
+
+instance Data.FromJSON VideoConfiguration where
+  parseJSON =
+    Data.withObject
+      "VideoConfiguration"
+      ( \x ->
+          VideoConfiguration'
+            Prelude.<$> (x Data..:? "avcLevel")
+            Prelude.<*> (x Data..:? "avcProfile")
+            Prelude.<*> (x Data..:? "codec")
+            Prelude.<*> (x Data..:? "encoder")
+            Prelude.<*> (x Data..:? "targetBitrate")
+            Prelude.<*> (x Data..:? "targetFramerate")
+            Prelude.<*> (x Data..:? "videoHeight")
+            Prelude.<*> (x Data..:? "videoWidth")
+      )
+
+instance Prelude.Hashable VideoConfiguration where
+  hashWithSalt _salt VideoConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` avcLevel
+      `Prelude.hashWithSalt` avcProfile
+      `Prelude.hashWithSalt` codec
+      `Prelude.hashWithSalt` encoder
+      `Prelude.hashWithSalt` targetBitrate
+      `Prelude.hashWithSalt` targetFramerate
+      `Prelude.hashWithSalt` videoHeight
+      `Prelude.hashWithSalt` videoWidth
+
+instance Prelude.NFData VideoConfiguration where
+  rnf VideoConfiguration' {..} =
+    Prelude.rnf avcLevel
+      `Prelude.seq` Prelude.rnf avcProfile
+      `Prelude.seq` Prelude.rnf codec
+      `Prelude.seq` Prelude.rnf encoder
+      `Prelude.seq` Prelude.rnf targetBitrate
+      `Prelude.seq` Prelude.rnf targetFramerate
+      `Prelude.seq` Prelude.rnf videoHeight
+      `Prelude.seq` Prelude.rnf videoWidth
diff --git a/gen/Amazonka/IVS/UntagResource.hs b/gen/Amazonka/IVS/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/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.IVS.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 tags from the resource with the specified ARN.
+module Amazonka.IVS.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.IVS.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'
+  { -- | ARN of the resource for which tags are to be removed. The ARN must be
+    -- URL-encoded.
+    resourceArn :: Prelude.Text,
+    -- | Array of tags to be removed. See
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+    -- for more information, including restrictions that apply to tags and
+    -- \"Tag naming limits and requirements\"; Amazon IVS has no
+    -- service-specific constraints beyond what is documented there.
+    tagKeys :: [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' - ARN of the resource for which tags are to be removed. The ARN must be
+-- URL-encoded.
+--
+-- 'tagKeys', 'untagResource_tagKeys' - Array of tags to be removed. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Prelude.mempty
+    }
+
+-- | ARN of the resource for which tags are to be removed. The ARN must be
+-- URL-encoded.
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | Array of tags to be removed. See
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services Resources>
+-- for more information, including restrictions that apply to tags and
+-- \"Tag naming limits and requirements\"; Amazon IVS has no
+-- service-specific constraints beyond what is documented there.
+untagResource_tagKeys :: Lens.Lens' UntagResource [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.delete (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
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath UntagResource where
+  toPath UntagResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery UntagResource where
+  toQuery UntagResource' {..} =
+    Prelude.mconcat
+      ["tagKeys" Data.=: Data.toQueryList "member" tagKeys]
+
+-- | /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/IVS/UpdateChannel.hs b/gen/Amazonka/IVS/UpdateChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/UpdateChannel.hs
@@ -0,0 +1,298 @@
+{-# 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.IVS.UpdateChannel
+-- 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 a channel\'s configuration. This does not affect an ongoing
+-- stream of this channel. You must stop and restart the stream for the
+-- changes to take effect.
+module Amazonka.IVS.UpdateChannel
+  ( -- * Creating a Request
+    UpdateChannel (..),
+    newUpdateChannel,
+
+    -- * Request Lenses
+    updateChannel_authorized,
+    updateChannel_latencyMode,
+    updateChannel_name,
+    updateChannel_recordingConfigurationArn,
+    updateChannel_type,
+    updateChannel_arn,
+
+    -- * Destructuring the Response
+    UpdateChannelResponse (..),
+    newUpdateChannelResponse,
+
+    -- * Response Lenses
+    updateChannelResponse_channel,
+    updateChannelResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateChannel' smart constructor.
+data UpdateChannel = UpdateChannel'
+  { -- | Whether the channel is private (enabled for playback authorization).
+    authorized :: Prelude.Maybe Prelude.Bool,
+    -- | Channel latency mode. Use @NORMAL@ to broadcast and deliver live video
+    -- up to Full HD. Use @LOW@ for near-real-time interaction with viewers.
+    -- (Note: In the Amazon IVS console, @LOW@ and @NORMAL@ correspond to
+    -- Ultra-low and Standard, respectively.)
+    latencyMode :: Prelude.Maybe ChannelLatencyMode,
+    -- | Channel name.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Recording-configuration ARN. If this is set to an empty string,
+    -- recording is disabled. A value other than an empty string indicates that
+    -- recording is enabled
+    recordingConfigurationArn :: Prelude.Maybe Prelude.Text,
+    -- | Channel type, which determines the allowable resolution and bitrate. /If
+    -- you exceed the allowable resolution or bitrate, the stream probably will
+    -- disconnect immediately/. Valid values:
+    --
+    -- -   @STANDARD@: Video is transcoded: multiple qualities are generated
+    --     from the original input, to automatically give viewers the best
+    --     experience for their devices and network conditions. Transcoding
+    --     allows higher playback quality across a range of download speeds.
+    --     Resolution can be up to 1080p and bitrate can be up to 8.5 Mbps.
+    --     Audio is transcoded only for renditions 360p and below; above that,
+    --     audio is passed through. This is the default.
+    --
+    -- -   @BASIC@: Video is transmuxed: Amazon IVS delivers the original input
+    --     to viewers. The viewer’s video-quality choice is limited to the
+    --     original input. Resolution can be up to 1080p and bitrate can be up
+    --     to 1.5 Mbps for 480p and up to 3.5 Mbps for resolutions between 480p
+    --     and 1080p.
+    type' :: Prelude.Maybe ChannelType,
+    -- | ARN of the channel to be updated.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateChannel' 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:
+--
+-- 'authorized', 'updateChannel_authorized' - Whether the channel is private (enabled for playback authorization).
+--
+-- 'latencyMode', 'updateChannel_latencyMode' - Channel latency mode. Use @NORMAL@ to broadcast and deliver live video
+-- up to Full HD. Use @LOW@ for near-real-time interaction with viewers.
+-- (Note: In the Amazon IVS console, @LOW@ and @NORMAL@ correspond to
+-- Ultra-low and Standard, respectively.)
+--
+-- 'name', 'updateChannel_name' - Channel name.
+--
+-- 'recordingConfigurationArn', 'updateChannel_recordingConfigurationArn' - Recording-configuration ARN. If this is set to an empty string,
+-- recording is disabled. A value other than an empty string indicates that
+-- recording is enabled
+--
+-- 'type'', 'updateChannel_type' - Channel type, which determines the allowable resolution and bitrate. /If
+-- you exceed the allowable resolution or bitrate, the stream probably will
+-- disconnect immediately/. Valid values:
+--
+-- -   @STANDARD@: Video is transcoded: multiple qualities are generated
+--     from the original input, to automatically give viewers the best
+--     experience for their devices and network conditions. Transcoding
+--     allows higher playback quality across a range of download speeds.
+--     Resolution can be up to 1080p and bitrate can be up to 8.5 Mbps.
+--     Audio is transcoded only for renditions 360p and below; above that,
+--     audio is passed through. This is the default.
+--
+-- -   @BASIC@: Video is transmuxed: Amazon IVS delivers the original input
+--     to viewers. The viewer’s video-quality choice is limited to the
+--     original input. Resolution can be up to 1080p and bitrate can be up
+--     to 1.5 Mbps for 480p and up to 3.5 Mbps for resolutions between 480p
+--     and 1080p.
+--
+-- 'arn', 'updateChannel_arn' - ARN of the channel to be updated.
+newUpdateChannel ::
+  -- | 'arn'
+  Prelude.Text ->
+  UpdateChannel
+newUpdateChannel pArn_ =
+  UpdateChannel'
+    { authorized = Prelude.Nothing,
+      latencyMode = Prelude.Nothing,
+      name = Prelude.Nothing,
+      recordingConfigurationArn = Prelude.Nothing,
+      type' = Prelude.Nothing,
+      arn = pArn_
+    }
+
+-- | Whether the channel is private (enabled for playback authorization).
+updateChannel_authorized :: Lens.Lens' UpdateChannel (Prelude.Maybe Prelude.Bool)
+updateChannel_authorized = Lens.lens (\UpdateChannel' {authorized} -> authorized) (\s@UpdateChannel' {} a -> s {authorized = a} :: UpdateChannel)
+
+-- | Channel latency mode. Use @NORMAL@ to broadcast and deliver live video
+-- up to Full HD. Use @LOW@ for near-real-time interaction with viewers.
+-- (Note: In the Amazon IVS console, @LOW@ and @NORMAL@ correspond to
+-- Ultra-low and Standard, respectively.)
+updateChannel_latencyMode :: Lens.Lens' UpdateChannel (Prelude.Maybe ChannelLatencyMode)
+updateChannel_latencyMode = Lens.lens (\UpdateChannel' {latencyMode} -> latencyMode) (\s@UpdateChannel' {} a -> s {latencyMode = a} :: UpdateChannel)
+
+-- | Channel name.
+updateChannel_name :: Lens.Lens' UpdateChannel (Prelude.Maybe Prelude.Text)
+updateChannel_name = Lens.lens (\UpdateChannel' {name} -> name) (\s@UpdateChannel' {} a -> s {name = a} :: UpdateChannel)
+
+-- | Recording-configuration ARN. If this is set to an empty string,
+-- recording is disabled. A value other than an empty string indicates that
+-- recording is enabled
+updateChannel_recordingConfigurationArn :: Lens.Lens' UpdateChannel (Prelude.Maybe Prelude.Text)
+updateChannel_recordingConfigurationArn = Lens.lens (\UpdateChannel' {recordingConfigurationArn} -> recordingConfigurationArn) (\s@UpdateChannel' {} a -> s {recordingConfigurationArn = a} :: UpdateChannel)
+
+-- | Channel type, which determines the allowable resolution and bitrate. /If
+-- you exceed the allowable resolution or bitrate, the stream probably will
+-- disconnect immediately/. Valid values:
+--
+-- -   @STANDARD@: Video is transcoded: multiple qualities are generated
+--     from the original input, to automatically give viewers the best
+--     experience for their devices and network conditions. Transcoding
+--     allows higher playback quality across a range of download speeds.
+--     Resolution can be up to 1080p and bitrate can be up to 8.5 Mbps.
+--     Audio is transcoded only for renditions 360p and below; above that,
+--     audio is passed through. This is the default.
+--
+-- -   @BASIC@: Video is transmuxed: Amazon IVS delivers the original input
+--     to viewers. The viewer’s video-quality choice is limited to the
+--     original input. Resolution can be up to 1080p and bitrate can be up
+--     to 1.5 Mbps for 480p and up to 3.5 Mbps for resolutions between 480p
+--     and 1080p.
+updateChannel_type :: Lens.Lens' UpdateChannel (Prelude.Maybe ChannelType)
+updateChannel_type = Lens.lens (\UpdateChannel' {type'} -> type') (\s@UpdateChannel' {} a -> s {type' = a} :: UpdateChannel)
+
+-- | ARN of the channel to be updated.
+updateChannel_arn :: Lens.Lens' UpdateChannel Prelude.Text
+updateChannel_arn = Lens.lens (\UpdateChannel' {arn} -> arn) (\s@UpdateChannel' {} a -> s {arn = a} :: UpdateChannel)
+
+instance Core.AWSRequest UpdateChannel where
+  type
+    AWSResponse UpdateChannel =
+      UpdateChannelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateChannelResponse'
+            Prelude.<$> (x Data..?> "channel")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateChannel where
+  hashWithSalt _salt UpdateChannel' {..} =
+    _salt
+      `Prelude.hashWithSalt` authorized
+      `Prelude.hashWithSalt` latencyMode
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` recordingConfigurationArn
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData UpdateChannel where
+  rnf UpdateChannel' {..} =
+    Prelude.rnf authorized
+      `Prelude.seq` Prelude.rnf latencyMode
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf recordingConfigurationArn
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf arn
+
+instance Data.ToHeaders UpdateChannel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateChannel where
+  toJSON UpdateChannel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("authorized" Data..=) Prelude.<$> authorized,
+            ("latencyMode" Data..=) Prelude.<$> latencyMode,
+            ("name" Data..=) Prelude.<$> name,
+            ("recordingConfigurationArn" Data..=)
+              Prelude.<$> recordingConfigurationArn,
+            ("type" Data..=) Prelude.<$> type',
+            Prelude.Just ("arn" Data..= arn)
+          ]
+      )
+
+instance Data.ToPath UpdateChannel where
+  toPath = Prelude.const "/UpdateChannel"
+
+instance Data.ToQuery UpdateChannel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateChannelResponse' smart constructor.
+data UpdateChannelResponse = UpdateChannelResponse'
+  { channel :: Prelude.Maybe Channel,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateChannelResponse' 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:
+--
+-- 'channel', 'updateChannelResponse_channel' - Undocumented member.
+--
+-- 'httpStatus', 'updateChannelResponse_httpStatus' - The response's http status code.
+newUpdateChannelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateChannelResponse
+newUpdateChannelResponse pHttpStatus_ =
+  UpdateChannelResponse'
+    { channel = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Undocumented member.
+updateChannelResponse_channel :: Lens.Lens' UpdateChannelResponse (Prelude.Maybe Channel)
+updateChannelResponse_channel = Lens.lens (\UpdateChannelResponse' {channel} -> channel) (\s@UpdateChannelResponse' {} a -> s {channel = a} :: UpdateChannelResponse)
+
+-- | The response's http status code.
+updateChannelResponse_httpStatus :: Lens.Lens' UpdateChannelResponse Prelude.Int
+updateChannelResponse_httpStatus = Lens.lens (\UpdateChannelResponse' {httpStatus} -> httpStatus) (\s@UpdateChannelResponse' {} a -> s {httpStatus = a} :: UpdateChannelResponse)
+
+instance Prelude.NFData UpdateChannelResponse where
+  rnf UpdateChannelResponse' {..} =
+    Prelude.rnf channel
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IVS/Waiters.hs b/gen/Amazonka/IVS/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IVS/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.IVS.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.IVS.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IVS.Lens
+import Amazonka.IVS.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.IVS
+import Test.Amazonka.IVS.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "IVS"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/IVS.hs b/test/Test/Amazonka/Gen/IVS.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/IVS.hs
@@ -0,0 +1,598 @@
+{-# 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.IVS
+-- 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.IVS where
+
+import Amazonka.IVS
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.IVS.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"
+--         [ requestBatchGetChannel $
+--             newBatchGetChannel
+--
+--         , requestBatchGetStreamKey $
+--             newBatchGetStreamKey
+--
+--         , requestCreateChannel $
+--             newCreateChannel
+--
+--         , requestCreateRecordingConfiguration $
+--             newCreateRecordingConfiguration
+--
+--         , requestCreateStreamKey $
+--             newCreateStreamKey
+--
+--         , requestDeleteChannel $
+--             newDeleteChannel
+--
+--         , requestDeletePlaybackKeyPair $
+--             newDeletePlaybackKeyPair
+--
+--         , requestDeleteRecordingConfiguration $
+--             newDeleteRecordingConfiguration
+--
+--         , requestDeleteStreamKey $
+--             newDeleteStreamKey
+--
+--         , requestGetChannel $
+--             newGetChannel
+--
+--         , requestGetPlaybackKeyPair $
+--             newGetPlaybackKeyPair
+--
+--         , requestGetRecordingConfiguration $
+--             newGetRecordingConfiguration
+--
+--         , requestGetStream $
+--             newGetStream
+--
+--         , requestGetStreamKey $
+--             newGetStreamKey
+--
+--         , requestGetStreamSession $
+--             newGetStreamSession
+--
+--         , requestImportPlaybackKeyPair $
+--             newImportPlaybackKeyPair
+--
+--         , requestListChannels $
+--             newListChannels
+--
+--         , requestListPlaybackKeyPairs $
+--             newListPlaybackKeyPairs
+--
+--         , requestListRecordingConfigurations $
+--             newListRecordingConfigurations
+--
+--         , requestListStreamKeys $
+--             newListStreamKeys
+--
+--         , requestListStreamSessions $
+--             newListStreamSessions
+--
+--         , requestListStreams $
+--             newListStreams
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestPutMetadata $
+--             newPutMetadata
+--
+--         , requestStopStream $
+--             newStopStream
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateChannel $
+--             newUpdateChannel
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseBatchGetChannel $
+--             newBatchGetChannelResponse
+--
+--         , responseBatchGetStreamKey $
+--             newBatchGetStreamKeyResponse
+--
+--         , responseCreateChannel $
+--             newCreateChannelResponse
+--
+--         , responseCreateRecordingConfiguration $
+--             newCreateRecordingConfigurationResponse
+--
+--         , responseCreateStreamKey $
+--             newCreateStreamKeyResponse
+--
+--         , responseDeleteChannel $
+--             newDeleteChannelResponse
+--
+--         , responseDeletePlaybackKeyPair $
+--             newDeletePlaybackKeyPairResponse
+--
+--         , responseDeleteRecordingConfiguration $
+--             newDeleteRecordingConfigurationResponse
+--
+--         , responseDeleteStreamKey $
+--             newDeleteStreamKeyResponse
+--
+--         , responseGetChannel $
+--             newGetChannelResponse
+--
+--         , responseGetPlaybackKeyPair $
+--             newGetPlaybackKeyPairResponse
+--
+--         , responseGetRecordingConfiguration $
+--             newGetRecordingConfigurationResponse
+--
+--         , responseGetStream $
+--             newGetStreamResponse
+--
+--         , responseGetStreamKey $
+--             newGetStreamKeyResponse
+--
+--         , responseGetStreamSession $
+--             newGetStreamSessionResponse
+--
+--         , responseImportPlaybackKeyPair $
+--             newImportPlaybackKeyPairResponse
+--
+--         , responseListChannels $
+--             newListChannelsResponse
+--
+--         , responseListPlaybackKeyPairs $
+--             newListPlaybackKeyPairsResponse
+--
+--         , responseListRecordingConfigurations $
+--             newListRecordingConfigurationsResponse
+--
+--         , responseListStreamKeys $
+--             newListStreamKeysResponse
+--
+--         , responseListStreamSessions $
+--             newListStreamSessionsResponse
+--
+--         , responseListStreams $
+--             newListStreamsResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responsePutMetadata $
+--             newPutMetadataResponse
+--
+--         , responseStopStream $
+--             newStopStreamResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateChannel $
+--             newUpdateChannelResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestBatchGetChannel :: BatchGetChannel -> TestTree
+requestBatchGetChannel =
+  req
+    "BatchGetChannel"
+    "fixture/BatchGetChannel.yaml"
+
+requestBatchGetStreamKey :: BatchGetStreamKey -> TestTree
+requestBatchGetStreamKey =
+  req
+    "BatchGetStreamKey"
+    "fixture/BatchGetStreamKey.yaml"
+
+requestCreateChannel :: CreateChannel -> TestTree
+requestCreateChannel =
+  req
+    "CreateChannel"
+    "fixture/CreateChannel.yaml"
+
+requestCreateRecordingConfiguration :: CreateRecordingConfiguration -> TestTree
+requestCreateRecordingConfiguration =
+  req
+    "CreateRecordingConfiguration"
+    "fixture/CreateRecordingConfiguration.yaml"
+
+requestCreateStreamKey :: CreateStreamKey -> TestTree
+requestCreateStreamKey =
+  req
+    "CreateStreamKey"
+    "fixture/CreateStreamKey.yaml"
+
+requestDeleteChannel :: DeleteChannel -> TestTree
+requestDeleteChannel =
+  req
+    "DeleteChannel"
+    "fixture/DeleteChannel.yaml"
+
+requestDeletePlaybackKeyPair :: DeletePlaybackKeyPair -> TestTree
+requestDeletePlaybackKeyPair =
+  req
+    "DeletePlaybackKeyPair"
+    "fixture/DeletePlaybackKeyPair.yaml"
+
+requestDeleteRecordingConfiguration :: DeleteRecordingConfiguration -> TestTree
+requestDeleteRecordingConfiguration =
+  req
+    "DeleteRecordingConfiguration"
+    "fixture/DeleteRecordingConfiguration.yaml"
+
+requestDeleteStreamKey :: DeleteStreamKey -> TestTree
+requestDeleteStreamKey =
+  req
+    "DeleteStreamKey"
+    "fixture/DeleteStreamKey.yaml"
+
+requestGetChannel :: GetChannel -> TestTree
+requestGetChannel =
+  req
+    "GetChannel"
+    "fixture/GetChannel.yaml"
+
+requestGetPlaybackKeyPair :: GetPlaybackKeyPair -> TestTree
+requestGetPlaybackKeyPair =
+  req
+    "GetPlaybackKeyPair"
+    "fixture/GetPlaybackKeyPair.yaml"
+
+requestGetRecordingConfiguration :: GetRecordingConfiguration -> TestTree
+requestGetRecordingConfiguration =
+  req
+    "GetRecordingConfiguration"
+    "fixture/GetRecordingConfiguration.yaml"
+
+requestGetStream :: GetStream -> TestTree
+requestGetStream =
+  req
+    "GetStream"
+    "fixture/GetStream.yaml"
+
+requestGetStreamKey :: GetStreamKey -> TestTree
+requestGetStreamKey =
+  req
+    "GetStreamKey"
+    "fixture/GetStreamKey.yaml"
+
+requestGetStreamSession :: GetStreamSession -> TestTree
+requestGetStreamSession =
+  req
+    "GetStreamSession"
+    "fixture/GetStreamSession.yaml"
+
+requestImportPlaybackKeyPair :: ImportPlaybackKeyPair -> TestTree
+requestImportPlaybackKeyPair =
+  req
+    "ImportPlaybackKeyPair"
+    "fixture/ImportPlaybackKeyPair.yaml"
+
+requestListChannels :: ListChannels -> TestTree
+requestListChannels =
+  req
+    "ListChannels"
+    "fixture/ListChannels.yaml"
+
+requestListPlaybackKeyPairs :: ListPlaybackKeyPairs -> TestTree
+requestListPlaybackKeyPairs =
+  req
+    "ListPlaybackKeyPairs"
+    "fixture/ListPlaybackKeyPairs.yaml"
+
+requestListRecordingConfigurations :: ListRecordingConfigurations -> TestTree
+requestListRecordingConfigurations =
+  req
+    "ListRecordingConfigurations"
+    "fixture/ListRecordingConfigurations.yaml"
+
+requestListStreamKeys :: ListStreamKeys -> TestTree
+requestListStreamKeys =
+  req
+    "ListStreamKeys"
+    "fixture/ListStreamKeys.yaml"
+
+requestListStreamSessions :: ListStreamSessions -> TestTree
+requestListStreamSessions =
+  req
+    "ListStreamSessions"
+    "fixture/ListStreamSessions.yaml"
+
+requestListStreams :: ListStreams -> TestTree
+requestListStreams =
+  req
+    "ListStreams"
+    "fixture/ListStreams.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestPutMetadata :: PutMetadata -> TestTree
+requestPutMetadata =
+  req
+    "PutMetadata"
+    "fixture/PutMetadata.yaml"
+
+requestStopStream :: StopStream -> TestTree
+requestStopStream =
+  req
+    "StopStream"
+    "fixture/StopStream.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateChannel :: UpdateChannel -> TestTree
+requestUpdateChannel =
+  req
+    "UpdateChannel"
+    "fixture/UpdateChannel.yaml"
+
+-- Responses
+
+responseBatchGetChannel :: BatchGetChannelResponse -> TestTree
+responseBatchGetChannel =
+  res
+    "BatchGetChannelResponse"
+    "fixture/BatchGetChannelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchGetChannel)
+
+responseBatchGetStreamKey :: BatchGetStreamKeyResponse -> TestTree
+responseBatchGetStreamKey =
+  res
+    "BatchGetStreamKeyResponse"
+    "fixture/BatchGetStreamKeyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchGetStreamKey)
+
+responseCreateChannel :: CreateChannelResponse -> TestTree
+responseCreateChannel =
+  res
+    "CreateChannelResponse"
+    "fixture/CreateChannelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateChannel)
+
+responseCreateRecordingConfiguration :: CreateRecordingConfigurationResponse -> TestTree
+responseCreateRecordingConfiguration =
+  res
+    "CreateRecordingConfigurationResponse"
+    "fixture/CreateRecordingConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateRecordingConfiguration)
+
+responseCreateStreamKey :: CreateStreamKeyResponse -> TestTree
+responseCreateStreamKey =
+  res
+    "CreateStreamKeyResponse"
+    "fixture/CreateStreamKeyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateStreamKey)
+
+responseDeleteChannel :: DeleteChannelResponse -> TestTree
+responseDeleteChannel =
+  res
+    "DeleteChannelResponse"
+    "fixture/DeleteChannelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteChannel)
+
+responseDeletePlaybackKeyPair :: DeletePlaybackKeyPairResponse -> TestTree
+responseDeletePlaybackKeyPair =
+  res
+    "DeletePlaybackKeyPairResponse"
+    "fixture/DeletePlaybackKeyPairResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeletePlaybackKeyPair)
+
+responseDeleteRecordingConfiguration :: DeleteRecordingConfigurationResponse -> TestTree
+responseDeleteRecordingConfiguration =
+  res
+    "DeleteRecordingConfigurationResponse"
+    "fixture/DeleteRecordingConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteRecordingConfiguration)
+
+responseDeleteStreamKey :: DeleteStreamKeyResponse -> TestTree
+responseDeleteStreamKey =
+  res
+    "DeleteStreamKeyResponse"
+    "fixture/DeleteStreamKeyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteStreamKey)
+
+responseGetChannel :: GetChannelResponse -> TestTree
+responseGetChannel =
+  res
+    "GetChannelResponse"
+    "fixture/GetChannelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetChannel)
+
+responseGetPlaybackKeyPair :: GetPlaybackKeyPairResponse -> TestTree
+responseGetPlaybackKeyPair =
+  res
+    "GetPlaybackKeyPairResponse"
+    "fixture/GetPlaybackKeyPairResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetPlaybackKeyPair)
+
+responseGetRecordingConfiguration :: GetRecordingConfigurationResponse -> TestTree
+responseGetRecordingConfiguration =
+  res
+    "GetRecordingConfigurationResponse"
+    "fixture/GetRecordingConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetRecordingConfiguration)
+
+responseGetStream :: GetStreamResponse -> TestTree
+responseGetStream =
+  res
+    "GetStreamResponse"
+    "fixture/GetStreamResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetStream)
+
+responseGetStreamKey :: GetStreamKeyResponse -> TestTree
+responseGetStreamKey =
+  res
+    "GetStreamKeyResponse"
+    "fixture/GetStreamKeyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetStreamKey)
+
+responseGetStreamSession :: GetStreamSessionResponse -> TestTree
+responseGetStreamSession =
+  res
+    "GetStreamSessionResponse"
+    "fixture/GetStreamSessionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetStreamSession)
+
+responseImportPlaybackKeyPair :: ImportPlaybackKeyPairResponse -> TestTree
+responseImportPlaybackKeyPair =
+  res
+    "ImportPlaybackKeyPairResponse"
+    "fixture/ImportPlaybackKeyPairResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ImportPlaybackKeyPair)
+
+responseListChannels :: ListChannelsResponse -> TestTree
+responseListChannels =
+  res
+    "ListChannelsResponse"
+    "fixture/ListChannelsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListChannels)
+
+responseListPlaybackKeyPairs :: ListPlaybackKeyPairsResponse -> TestTree
+responseListPlaybackKeyPairs =
+  res
+    "ListPlaybackKeyPairsResponse"
+    "fixture/ListPlaybackKeyPairsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListPlaybackKeyPairs)
+
+responseListRecordingConfigurations :: ListRecordingConfigurationsResponse -> TestTree
+responseListRecordingConfigurations =
+  res
+    "ListRecordingConfigurationsResponse"
+    "fixture/ListRecordingConfigurationsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListRecordingConfigurations)
+
+responseListStreamKeys :: ListStreamKeysResponse -> TestTree
+responseListStreamKeys =
+  res
+    "ListStreamKeysResponse"
+    "fixture/ListStreamKeysResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListStreamKeys)
+
+responseListStreamSessions :: ListStreamSessionsResponse -> TestTree
+responseListStreamSessions =
+  res
+    "ListStreamSessionsResponse"
+    "fixture/ListStreamSessionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListStreamSessions)
+
+responseListStreams :: ListStreamsResponse -> TestTree
+responseListStreams =
+  res
+    "ListStreamsResponse"
+    "fixture/ListStreamsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListStreams)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responsePutMetadata :: PutMetadataResponse -> TestTree
+responsePutMetadata =
+  res
+    "PutMetadataResponse"
+    "fixture/PutMetadataResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutMetadata)
+
+responseStopStream :: StopStreamResponse -> TestTree
+responseStopStream =
+  res
+    "StopStreamResponse"
+    "fixture/StopStreamResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StopStream)
+
+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)
+
+responseUpdateChannel :: UpdateChannelResponse -> TestTree
+responseUpdateChannel =
+  res
+    "UpdateChannelResponse"
+    "fixture/UpdateChannelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateChannel)
diff --git a/test/Test/Amazonka/IVS.hs b/test/Test/Amazonka/IVS.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/IVS.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.IVS
+-- 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.IVS
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/IVS/Internal.hs b/test/Test/Amazonka/IVS/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/IVS/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.IVS.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.IVS.Internal where
