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 Systems Manager Incident Manager Contacts SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2021-05-03@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-ssm-contacts)
+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.SSMContacts](http://hackage.haskell.org/package/amazonka-ssm-contacts/docs/Amazonka-SSMContacts.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-ssm-contacts` 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-ssm-contacts.cabal b/amazonka-ssm-contacts.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-ssm-contacts.cabal
@@ -0,0 +1,129 @@
+cabal-version:      2.2
+name:               amazonka-ssm-contacts
+version:            2.0
+synopsis:           Amazon Systems Manager Incident Manager Contacts 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 @2021-05-03@ 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.SSMContacts.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.SSMContacts" 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-ssm-contacts
+
+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.SSMContacts
+    Amazonka.SSMContacts.AcceptPage
+    Amazonka.SSMContacts.ActivateContactChannel
+    Amazonka.SSMContacts.CreateContact
+    Amazonka.SSMContacts.CreateContactChannel
+    Amazonka.SSMContacts.DeactivateContactChannel
+    Amazonka.SSMContacts.DeleteContact
+    Amazonka.SSMContacts.DeleteContactChannel
+    Amazonka.SSMContacts.DescribeEngagement
+    Amazonka.SSMContacts.DescribePage
+    Amazonka.SSMContacts.GetContact
+    Amazonka.SSMContacts.GetContactChannel
+    Amazonka.SSMContacts.GetContactPolicy
+    Amazonka.SSMContacts.Lens
+    Amazonka.SSMContacts.ListContactChannels
+    Amazonka.SSMContacts.ListContacts
+    Amazonka.SSMContacts.ListEngagements
+    Amazonka.SSMContacts.ListPageReceipts
+    Amazonka.SSMContacts.ListPagesByContact
+    Amazonka.SSMContacts.ListPagesByEngagement
+    Amazonka.SSMContacts.ListTagsForResource
+    Amazonka.SSMContacts.PutContactPolicy
+    Amazonka.SSMContacts.SendActivationCode
+    Amazonka.SSMContacts.StartEngagement
+    Amazonka.SSMContacts.StopEngagement
+    Amazonka.SSMContacts.TagResource
+    Amazonka.SSMContacts.Types
+    Amazonka.SSMContacts.Types.AcceptCodeValidation
+    Amazonka.SSMContacts.Types.AcceptType
+    Amazonka.SSMContacts.Types.ActivationStatus
+    Amazonka.SSMContacts.Types.ChannelTargetInfo
+    Amazonka.SSMContacts.Types.ChannelType
+    Amazonka.SSMContacts.Types.Contact
+    Amazonka.SSMContacts.Types.ContactChannel
+    Amazonka.SSMContacts.Types.ContactChannelAddress
+    Amazonka.SSMContacts.Types.ContactTargetInfo
+    Amazonka.SSMContacts.Types.ContactType
+    Amazonka.SSMContacts.Types.Engagement
+    Amazonka.SSMContacts.Types.Page
+    Amazonka.SSMContacts.Types.Plan
+    Amazonka.SSMContacts.Types.Receipt
+    Amazonka.SSMContacts.Types.ReceiptType
+    Amazonka.SSMContacts.Types.Stage
+    Amazonka.SSMContacts.Types.Tag
+    Amazonka.SSMContacts.Types.Target
+    Amazonka.SSMContacts.Types.TimeRange
+    Amazonka.SSMContacts.UntagResource
+    Amazonka.SSMContacts.UpdateContact
+    Amazonka.SSMContacts.UpdateContactChannel
+    Amazonka.SSMContacts.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-ssm-contacts-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.SSMContacts
+    Test.Amazonka.SSMContacts
+    Test.Amazonka.SSMContacts.Internal
+
+  build-depends:
+    , amazonka-core          >=2.0 && <2.1
+    , amazonka-ssm-contacts
+    , amazonka-test          >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/AcceptPage.yaml b/fixture/AcceptPage.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AcceptPage.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/AcceptPageResponse.proto b/fixture/AcceptPageResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AcceptPageResponse.proto
diff --git a/fixture/ActivateContactChannel.yaml b/fixture/ActivateContactChannel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ActivateContactChannel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/ActivateContactChannelResponse.proto b/fixture/ActivateContactChannelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ActivateContactChannelResponse.proto
diff --git a/fixture/CreateContact.yaml b/fixture/CreateContact.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateContact.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/CreateContactChannel.yaml b/fixture/CreateContactChannel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateContactChannel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/CreateContactChannelResponse.proto b/fixture/CreateContactChannelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateContactChannelResponse.proto
diff --git a/fixture/CreateContactResponse.proto b/fixture/CreateContactResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateContactResponse.proto
diff --git a/fixture/DeactivateContactChannel.yaml b/fixture/DeactivateContactChannel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeactivateContactChannel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/DeactivateContactChannelResponse.proto b/fixture/DeactivateContactChannelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeactivateContactChannelResponse.proto
diff --git a/fixture/DeleteContact.yaml b/fixture/DeleteContact.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteContact.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/DeleteContactChannel.yaml b/fixture/DeleteContactChannel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteContactChannel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/DeleteContactChannelResponse.proto b/fixture/DeleteContactChannelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteContactChannelResponse.proto
diff --git a/fixture/DeleteContactResponse.proto b/fixture/DeleteContactResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteContactResponse.proto
diff --git a/fixture/DescribeEngagement.yaml b/fixture/DescribeEngagement.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeEngagement.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/DescribeEngagementResponse.proto b/fixture/DescribeEngagementResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeEngagementResponse.proto
diff --git a/fixture/DescribePage.yaml b/fixture/DescribePage.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribePage.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/DescribePageResponse.proto b/fixture/DescribePageResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribePageResponse.proto
diff --git a/fixture/GetContact.yaml b/fixture/GetContact.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetContact.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/GetContactChannel.yaml b/fixture/GetContactChannel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetContactChannel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/GetContactChannelResponse.proto b/fixture/GetContactChannelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetContactChannelResponse.proto
diff --git a/fixture/GetContactPolicy.yaml b/fixture/GetContactPolicy.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetContactPolicy.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/GetContactPolicyResponse.proto b/fixture/GetContactPolicyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetContactPolicyResponse.proto
diff --git a/fixture/GetContactResponse.proto b/fixture/GetContactResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetContactResponse.proto
diff --git a/fixture/ListContactChannels.yaml b/fixture/ListContactChannels.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListContactChannels.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/ListContactChannelsResponse.proto b/fixture/ListContactChannelsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListContactChannelsResponse.proto
diff --git a/fixture/ListContacts.yaml b/fixture/ListContacts.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListContacts.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/ListContactsResponse.proto b/fixture/ListContactsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListContactsResponse.proto
diff --git a/fixture/ListEngagements.yaml b/fixture/ListEngagements.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListEngagements.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/ListEngagementsResponse.proto b/fixture/ListEngagementsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListEngagementsResponse.proto
diff --git a/fixture/ListPageReceipts.yaml b/fixture/ListPageReceipts.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListPageReceipts.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/ListPageReceiptsResponse.proto b/fixture/ListPageReceiptsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListPageReceiptsResponse.proto
diff --git a/fixture/ListPagesByContact.yaml b/fixture/ListPagesByContact.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListPagesByContact.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/ListPagesByContactResponse.proto b/fixture/ListPagesByContactResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListPagesByContactResponse.proto
diff --git a/fixture/ListPagesByEngagement.yaml b/fixture/ListPagesByEngagement.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListPagesByEngagement.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/ListPagesByEngagementResponse.proto b/fixture/ListPagesByEngagementResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListPagesByEngagementResponse.proto
diff --git a/fixture/ListTagsForResource.yaml b/fixture/ListTagsForResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/PutContactPolicy.yaml b/fixture/PutContactPolicy.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutContactPolicy.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/PutContactPolicyResponse.proto b/fixture/PutContactPolicyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutContactPolicyResponse.proto
diff --git a/fixture/SendActivationCode.yaml b/fixture/SendActivationCode.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SendActivationCode.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/SendActivationCodeResponse.proto b/fixture/SendActivationCodeResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SendActivationCodeResponse.proto
diff --git a/fixture/StartEngagement.yaml b/fixture/StartEngagement.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartEngagement.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/StartEngagementResponse.proto b/fixture/StartEngagementResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartEngagementResponse.proto
diff --git a/fixture/StopEngagement.yaml b/fixture/StopEngagement.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StopEngagement.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/StopEngagementResponse.proto b/fixture/StopEngagementResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StopEngagementResponse.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/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/TagResourceResponse.proto b/fixture/TagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/TagResourceResponse.proto
diff --git a/fixture/UntagResource.yaml b/fixture/UntagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/UpdateContact.yaml b/fixture/UpdateContact.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateContact.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/UpdateContactChannel.yaml b/fixture/UpdateContactChannel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateContactChannel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ssm-contacts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  ssm-contacts.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/UpdateContactChannelResponse.proto b/fixture/UpdateContactChannelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateContactChannelResponse.proto
diff --git a/fixture/UpdateContactResponse.proto b/fixture/UpdateContactResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateContactResponse.proto
diff --git a/gen/Amazonka/SSMContacts.hs b/gen/Amazonka/SSMContacts.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts.hs
@@ -0,0 +1,354 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.SSMContacts
+-- 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 @2021-05-03@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Systems Manager Incident Manager is an incident management console
+-- designed to help users mitigate and recover from incidents affecting
+-- their Amazon Web Services-hosted applications. An incident is any
+-- unplanned interruption or reduction in quality of services.
+--
+-- Incident Manager increases incident resolution by notifying responders
+-- of impact, highlighting relevant troubleshooting data, and providing
+-- collaboration tools to get services back up and running. To achieve the
+-- primary goal of reducing the time-to-resolution of critical incidents,
+-- Incident Manager automates response plans and enables responder team
+-- escalation.
+module Amazonka.SSMContacts
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** AccessDeniedException
+    _AccessDeniedException,
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** DataEncryptionException
+    _DataEncryptionException,
+
+    -- ** InternalServerException
+    _InternalServerException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ServiceQuotaExceededException
+    _ServiceQuotaExceededException,
+
+    -- ** ThrottlingException
+    _ThrottlingException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** AcceptPage
+    AcceptPage (AcceptPage'),
+    newAcceptPage,
+    AcceptPageResponse (AcceptPageResponse'),
+    newAcceptPageResponse,
+
+    -- ** ActivateContactChannel
+    ActivateContactChannel (ActivateContactChannel'),
+    newActivateContactChannel,
+    ActivateContactChannelResponse (ActivateContactChannelResponse'),
+    newActivateContactChannelResponse,
+
+    -- ** CreateContact
+    CreateContact (CreateContact'),
+    newCreateContact,
+    CreateContactResponse (CreateContactResponse'),
+    newCreateContactResponse,
+
+    -- ** CreateContactChannel
+    CreateContactChannel (CreateContactChannel'),
+    newCreateContactChannel,
+    CreateContactChannelResponse (CreateContactChannelResponse'),
+    newCreateContactChannelResponse,
+
+    -- ** DeactivateContactChannel
+    DeactivateContactChannel (DeactivateContactChannel'),
+    newDeactivateContactChannel,
+    DeactivateContactChannelResponse (DeactivateContactChannelResponse'),
+    newDeactivateContactChannelResponse,
+
+    -- ** DeleteContact
+    DeleteContact (DeleteContact'),
+    newDeleteContact,
+    DeleteContactResponse (DeleteContactResponse'),
+    newDeleteContactResponse,
+
+    -- ** DeleteContactChannel
+    DeleteContactChannel (DeleteContactChannel'),
+    newDeleteContactChannel,
+    DeleteContactChannelResponse (DeleteContactChannelResponse'),
+    newDeleteContactChannelResponse,
+
+    -- ** DescribeEngagement
+    DescribeEngagement (DescribeEngagement'),
+    newDescribeEngagement,
+    DescribeEngagementResponse (DescribeEngagementResponse'),
+    newDescribeEngagementResponse,
+
+    -- ** DescribePage
+    DescribePage (DescribePage'),
+    newDescribePage,
+    DescribePageResponse (DescribePageResponse'),
+    newDescribePageResponse,
+
+    -- ** GetContact
+    GetContact (GetContact'),
+    newGetContact,
+    GetContactResponse (GetContactResponse'),
+    newGetContactResponse,
+
+    -- ** GetContactChannel
+    GetContactChannel (GetContactChannel'),
+    newGetContactChannel,
+    GetContactChannelResponse (GetContactChannelResponse'),
+    newGetContactChannelResponse,
+
+    -- ** GetContactPolicy
+    GetContactPolicy (GetContactPolicy'),
+    newGetContactPolicy,
+    GetContactPolicyResponse (GetContactPolicyResponse'),
+    newGetContactPolicyResponse,
+
+    -- ** ListContactChannels (Paginated)
+    ListContactChannels (ListContactChannels'),
+    newListContactChannels,
+    ListContactChannelsResponse (ListContactChannelsResponse'),
+    newListContactChannelsResponse,
+
+    -- ** ListContacts (Paginated)
+    ListContacts (ListContacts'),
+    newListContacts,
+    ListContactsResponse (ListContactsResponse'),
+    newListContactsResponse,
+
+    -- ** ListEngagements (Paginated)
+    ListEngagements (ListEngagements'),
+    newListEngagements,
+    ListEngagementsResponse (ListEngagementsResponse'),
+    newListEngagementsResponse,
+
+    -- ** ListPageReceipts (Paginated)
+    ListPageReceipts (ListPageReceipts'),
+    newListPageReceipts,
+    ListPageReceiptsResponse (ListPageReceiptsResponse'),
+    newListPageReceiptsResponse,
+
+    -- ** ListPagesByContact (Paginated)
+    ListPagesByContact (ListPagesByContact'),
+    newListPagesByContact,
+    ListPagesByContactResponse (ListPagesByContactResponse'),
+    newListPagesByContactResponse,
+
+    -- ** ListPagesByEngagement (Paginated)
+    ListPagesByEngagement (ListPagesByEngagement'),
+    newListPagesByEngagement,
+    ListPagesByEngagementResponse (ListPagesByEngagementResponse'),
+    newListPagesByEngagementResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** PutContactPolicy
+    PutContactPolicy (PutContactPolicy'),
+    newPutContactPolicy,
+    PutContactPolicyResponse (PutContactPolicyResponse'),
+    newPutContactPolicyResponse,
+
+    -- ** SendActivationCode
+    SendActivationCode (SendActivationCode'),
+    newSendActivationCode,
+    SendActivationCodeResponse (SendActivationCodeResponse'),
+    newSendActivationCodeResponse,
+
+    -- ** StartEngagement
+    StartEngagement (StartEngagement'),
+    newStartEngagement,
+    StartEngagementResponse (StartEngagementResponse'),
+    newStartEngagementResponse,
+
+    -- ** StopEngagement
+    StopEngagement (StopEngagement'),
+    newStopEngagement,
+    StopEngagementResponse (StopEngagementResponse'),
+    newStopEngagementResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateContact
+    UpdateContact (UpdateContact'),
+    newUpdateContact,
+    UpdateContactResponse (UpdateContactResponse'),
+    newUpdateContactResponse,
+
+    -- ** UpdateContactChannel
+    UpdateContactChannel (UpdateContactChannel'),
+    newUpdateContactChannel,
+    UpdateContactChannelResponse (UpdateContactChannelResponse'),
+    newUpdateContactChannelResponse,
+
+    -- * Types
+
+    -- ** AcceptCodeValidation
+    AcceptCodeValidation (..),
+
+    -- ** AcceptType
+    AcceptType (..),
+
+    -- ** ActivationStatus
+    ActivationStatus (..),
+
+    -- ** ChannelType
+    ChannelType (..),
+
+    -- ** ContactType
+    ContactType (..),
+
+    -- ** ReceiptType
+    ReceiptType (..),
+
+    -- ** ChannelTargetInfo
+    ChannelTargetInfo (ChannelTargetInfo'),
+    newChannelTargetInfo,
+
+    -- ** Contact
+    Contact (Contact'),
+    newContact,
+
+    -- ** ContactChannel
+    ContactChannel (ContactChannel'),
+    newContactChannel,
+
+    -- ** ContactChannelAddress
+    ContactChannelAddress (ContactChannelAddress'),
+    newContactChannelAddress,
+
+    -- ** ContactTargetInfo
+    ContactTargetInfo (ContactTargetInfo'),
+    newContactTargetInfo,
+
+    -- ** Engagement
+    Engagement (Engagement'),
+    newEngagement,
+
+    -- ** Page
+    Page (Page'),
+    newPage,
+
+    -- ** Plan
+    Plan (Plan'),
+    newPlan,
+
+    -- ** Receipt
+    Receipt (Receipt'),
+    newReceipt,
+
+    -- ** Stage
+    Stage (Stage'),
+    newStage,
+
+    -- ** Tag
+    Tag (Tag'),
+    newTag,
+
+    -- ** Target
+    Target (Target'),
+    newTarget,
+
+    -- ** TimeRange
+    TimeRange (TimeRange'),
+    newTimeRange,
+  )
+where
+
+import Amazonka.SSMContacts.AcceptPage
+import Amazonka.SSMContacts.ActivateContactChannel
+import Amazonka.SSMContacts.CreateContact
+import Amazonka.SSMContacts.CreateContactChannel
+import Amazonka.SSMContacts.DeactivateContactChannel
+import Amazonka.SSMContacts.DeleteContact
+import Amazonka.SSMContacts.DeleteContactChannel
+import Amazonka.SSMContacts.DescribeEngagement
+import Amazonka.SSMContacts.DescribePage
+import Amazonka.SSMContacts.GetContact
+import Amazonka.SSMContacts.GetContactChannel
+import Amazonka.SSMContacts.GetContactPolicy
+import Amazonka.SSMContacts.Lens
+import Amazonka.SSMContacts.ListContactChannels
+import Amazonka.SSMContacts.ListContacts
+import Amazonka.SSMContacts.ListEngagements
+import Amazonka.SSMContacts.ListPageReceipts
+import Amazonka.SSMContacts.ListPagesByContact
+import Amazonka.SSMContacts.ListPagesByEngagement
+import Amazonka.SSMContacts.ListTagsForResource
+import Amazonka.SSMContacts.PutContactPolicy
+import Amazonka.SSMContacts.SendActivationCode
+import Amazonka.SSMContacts.StartEngagement
+import Amazonka.SSMContacts.StopEngagement
+import Amazonka.SSMContacts.TagResource
+import Amazonka.SSMContacts.Types
+import Amazonka.SSMContacts.UntagResource
+import Amazonka.SSMContacts.UpdateContact
+import Amazonka.SSMContacts.UpdateContactChannel
+import Amazonka.SSMContacts.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 'SSMContacts'.
+
+-- $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/SSMContacts/AcceptPage.hs b/gen/Amazonka/SSMContacts/AcceptPage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/AcceptPage.hs
@@ -0,0 +1,252 @@
+{-# 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.SSMContacts.AcceptPage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Used to acknowledge an engagement to a contact channel during an
+-- incident.
+module Amazonka.SSMContacts.AcceptPage
+  ( -- * Creating a Request
+    AcceptPage (..),
+    newAcceptPage,
+
+    -- * Request Lenses
+    acceptPage_acceptCodeValidation,
+    acceptPage_contactChannelId,
+    acceptPage_note,
+    acceptPage_pageId,
+    acceptPage_acceptType,
+    acceptPage_acceptCode,
+
+    -- * Destructuring the Response
+    AcceptPageResponse (..),
+    newAcceptPageResponse,
+
+    -- * Response Lenses
+    acceptPageResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newAcceptPage' smart constructor.
+data AcceptPage = AcceptPage'
+  { -- | An optional field that Incident Manager uses to @ENFORCE@ @AcceptCode@
+    -- validation when acknowledging an page. Acknowledgement can occur by
+    -- replying to a page, or when entering the AcceptCode in the console.
+    -- Enforcing AcceptCode validation causes Incident Manager to verify that
+    -- the code entered by the user matches the code sent by Incident Manager
+    -- with the page.
+    --
+    -- Incident Manager can also @IGNORE@ @AcceptCode@ validation. Ignoring
+    -- @AcceptCode@ validation causes Incident Manager to accept any value
+    -- entered for the @AcceptCode@.
+    acceptCodeValidation :: Prelude.Maybe AcceptCodeValidation,
+    -- | The ARN of the contact channel.
+    contactChannelId :: Prelude.Maybe Prelude.Text,
+    -- | Information provided by the user when the user acknowledges the page.
+    note :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the engagement to a contact channel.
+    pageId :: Prelude.Text,
+    -- | The type indicates if the page was @DELIVERED@ or @READ@.
+    acceptType :: AcceptType,
+    -- | The accept code is a 6-digit code used to acknowledge the page.
+    acceptCode :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AcceptPage' 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:
+--
+-- 'acceptCodeValidation', 'acceptPage_acceptCodeValidation' - An optional field that Incident Manager uses to @ENFORCE@ @AcceptCode@
+-- validation when acknowledging an page. Acknowledgement can occur by
+-- replying to a page, or when entering the AcceptCode in the console.
+-- Enforcing AcceptCode validation causes Incident Manager to verify that
+-- the code entered by the user matches the code sent by Incident Manager
+-- with the page.
+--
+-- Incident Manager can also @IGNORE@ @AcceptCode@ validation. Ignoring
+-- @AcceptCode@ validation causes Incident Manager to accept any value
+-- entered for the @AcceptCode@.
+--
+-- 'contactChannelId', 'acceptPage_contactChannelId' - The ARN of the contact channel.
+--
+-- 'note', 'acceptPage_note' - Information provided by the user when the user acknowledges the page.
+--
+-- 'pageId', 'acceptPage_pageId' - The Amazon Resource Name (ARN) of the engagement to a contact channel.
+--
+-- 'acceptType', 'acceptPage_acceptType' - The type indicates if the page was @DELIVERED@ or @READ@.
+--
+-- 'acceptCode', 'acceptPage_acceptCode' - The accept code is a 6-digit code used to acknowledge the page.
+newAcceptPage ::
+  -- | 'pageId'
+  Prelude.Text ->
+  -- | 'acceptType'
+  AcceptType ->
+  -- | 'acceptCode'
+  Prelude.Text ->
+  AcceptPage
+newAcceptPage pPageId_ pAcceptType_ pAcceptCode_ =
+  AcceptPage'
+    { acceptCodeValidation = Prelude.Nothing,
+      contactChannelId = Prelude.Nothing,
+      note = Prelude.Nothing,
+      pageId = pPageId_,
+      acceptType = pAcceptType_,
+      acceptCode = pAcceptCode_
+    }
+
+-- | An optional field that Incident Manager uses to @ENFORCE@ @AcceptCode@
+-- validation when acknowledging an page. Acknowledgement can occur by
+-- replying to a page, or when entering the AcceptCode in the console.
+-- Enforcing AcceptCode validation causes Incident Manager to verify that
+-- the code entered by the user matches the code sent by Incident Manager
+-- with the page.
+--
+-- Incident Manager can also @IGNORE@ @AcceptCode@ validation. Ignoring
+-- @AcceptCode@ validation causes Incident Manager to accept any value
+-- entered for the @AcceptCode@.
+acceptPage_acceptCodeValidation :: Lens.Lens' AcceptPage (Prelude.Maybe AcceptCodeValidation)
+acceptPage_acceptCodeValidation = Lens.lens (\AcceptPage' {acceptCodeValidation} -> acceptCodeValidation) (\s@AcceptPage' {} a -> s {acceptCodeValidation = a} :: AcceptPage)
+
+-- | The ARN of the contact channel.
+acceptPage_contactChannelId :: Lens.Lens' AcceptPage (Prelude.Maybe Prelude.Text)
+acceptPage_contactChannelId = Lens.lens (\AcceptPage' {contactChannelId} -> contactChannelId) (\s@AcceptPage' {} a -> s {contactChannelId = a} :: AcceptPage)
+
+-- | Information provided by the user when the user acknowledges the page.
+acceptPage_note :: Lens.Lens' AcceptPage (Prelude.Maybe Prelude.Text)
+acceptPage_note = Lens.lens (\AcceptPage' {note} -> note) (\s@AcceptPage' {} a -> s {note = a} :: AcceptPage)
+
+-- | The Amazon Resource Name (ARN) of the engagement to a contact channel.
+acceptPage_pageId :: Lens.Lens' AcceptPage Prelude.Text
+acceptPage_pageId = Lens.lens (\AcceptPage' {pageId} -> pageId) (\s@AcceptPage' {} a -> s {pageId = a} :: AcceptPage)
+
+-- | The type indicates if the page was @DELIVERED@ or @READ@.
+acceptPage_acceptType :: Lens.Lens' AcceptPage AcceptType
+acceptPage_acceptType = Lens.lens (\AcceptPage' {acceptType} -> acceptType) (\s@AcceptPage' {} a -> s {acceptType = a} :: AcceptPage)
+
+-- | The accept code is a 6-digit code used to acknowledge the page.
+acceptPage_acceptCode :: Lens.Lens' AcceptPage Prelude.Text
+acceptPage_acceptCode = Lens.lens (\AcceptPage' {acceptCode} -> acceptCode) (\s@AcceptPage' {} a -> s {acceptCode = a} :: AcceptPage)
+
+instance Core.AWSRequest AcceptPage where
+  type AWSResponse AcceptPage = AcceptPageResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          AcceptPageResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable AcceptPage where
+  hashWithSalt _salt AcceptPage' {..} =
+    _salt
+      `Prelude.hashWithSalt` acceptCodeValidation
+      `Prelude.hashWithSalt` contactChannelId
+      `Prelude.hashWithSalt` note
+      `Prelude.hashWithSalt` pageId
+      `Prelude.hashWithSalt` acceptType
+      `Prelude.hashWithSalt` acceptCode
+
+instance Prelude.NFData AcceptPage where
+  rnf AcceptPage' {..} =
+    Prelude.rnf acceptCodeValidation
+      `Prelude.seq` Prelude.rnf contactChannelId
+      `Prelude.seq` Prelude.rnf note
+      `Prelude.seq` Prelude.rnf pageId
+      `Prelude.seq` Prelude.rnf acceptType
+      `Prelude.seq` Prelude.rnf acceptCode
+
+instance Data.ToHeaders AcceptPage where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("SSMContacts.AcceptPage" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON AcceptPage where
+  toJSON AcceptPage' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AcceptCodeValidation" Data..=)
+              Prelude.<$> acceptCodeValidation,
+            ("ContactChannelId" Data..=)
+              Prelude.<$> contactChannelId,
+            ("Note" Data..=) Prelude.<$> note,
+            Prelude.Just ("PageId" Data..= pageId),
+            Prelude.Just ("AcceptType" Data..= acceptType),
+            Prelude.Just ("AcceptCode" Data..= acceptCode)
+          ]
+      )
+
+instance Data.ToPath AcceptPage where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery AcceptPage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newAcceptPageResponse' smart constructor.
+data AcceptPageResponse = AcceptPageResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AcceptPageResponse' 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', 'acceptPageResponse_httpStatus' - The response's http status code.
+newAcceptPageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  AcceptPageResponse
+newAcceptPageResponse pHttpStatus_ =
+  AcceptPageResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+acceptPageResponse_httpStatus :: Lens.Lens' AcceptPageResponse Prelude.Int
+acceptPageResponse_httpStatus = Lens.lens (\AcceptPageResponse' {httpStatus} -> httpStatus) (\s@AcceptPageResponse' {} a -> s {httpStatus = a} :: AcceptPageResponse)
+
+instance Prelude.NFData AcceptPageResponse where
+  rnf AcceptPageResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/SSMContacts/ActivateContactChannel.hs b/gen/Amazonka/SSMContacts/ActivateContactChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/ActivateContactChannel.hs
@@ -0,0 +1,185 @@
+{-# 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.SSMContacts.ActivateContactChannel
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Activates a contact\'s contact channel. Incident Manager can\'t engage a
+-- contact until the contact channel has been activated.
+module Amazonka.SSMContacts.ActivateContactChannel
+  ( -- * Creating a Request
+    ActivateContactChannel (..),
+    newActivateContactChannel,
+
+    -- * Request Lenses
+    activateContactChannel_contactChannelId,
+    activateContactChannel_activationCode,
+
+    -- * Destructuring the Response
+    ActivateContactChannelResponse (..),
+    newActivateContactChannelResponse,
+
+    -- * Response Lenses
+    activateContactChannelResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newActivateContactChannel' smart constructor.
+data ActivateContactChannel = ActivateContactChannel'
+  { -- | The Amazon Resource Name (ARN) of the contact channel.
+    contactChannelId :: Prelude.Text,
+    -- | The code sent to the contact channel when it was created in the contact.
+    activationCode :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ActivateContactChannel' 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:
+--
+-- 'contactChannelId', 'activateContactChannel_contactChannelId' - The Amazon Resource Name (ARN) of the contact channel.
+--
+-- 'activationCode', 'activateContactChannel_activationCode' - The code sent to the contact channel when it was created in the contact.
+newActivateContactChannel ::
+  -- | 'contactChannelId'
+  Prelude.Text ->
+  -- | 'activationCode'
+  Prelude.Text ->
+  ActivateContactChannel
+newActivateContactChannel
+  pContactChannelId_
+  pActivationCode_ =
+    ActivateContactChannel'
+      { contactChannelId =
+          pContactChannelId_,
+        activationCode = pActivationCode_
+      }
+
+-- | The Amazon Resource Name (ARN) of the contact channel.
+activateContactChannel_contactChannelId :: Lens.Lens' ActivateContactChannel Prelude.Text
+activateContactChannel_contactChannelId = Lens.lens (\ActivateContactChannel' {contactChannelId} -> contactChannelId) (\s@ActivateContactChannel' {} a -> s {contactChannelId = a} :: ActivateContactChannel)
+
+-- | The code sent to the contact channel when it was created in the contact.
+activateContactChannel_activationCode :: Lens.Lens' ActivateContactChannel Prelude.Text
+activateContactChannel_activationCode = Lens.lens (\ActivateContactChannel' {activationCode} -> activationCode) (\s@ActivateContactChannel' {} a -> s {activationCode = a} :: ActivateContactChannel)
+
+instance Core.AWSRequest ActivateContactChannel where
+  type
+    AWSResponse ActivateContactChannel =
+      ActivateContactChannelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          ActivateContactChannelResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ActivateContactChannel where
+  hashWithSalt _salt ActivateContactChannel' {..} =
+    _salt
+      `Prelude.hashWithSalt` contactChannelId
+      `Prelude.hashWithSalt` activationCode
+
+instance Prelude.NFData ActivateContactChannel where
+  rnf ActivateContactChannel' {..} =
+    Prelude.rnf contactChannelId
+      `Prelude.seq` Prelude.rnf activationCode
+
+instance Data.ToHeaders ActivateContactChannel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SSMContacts.ActivateContactChannel" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ActivateContactChannel where
+  toJSON ActivateContactChannel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("ContactChannelId" Data..= contactChannelId),
+            Prelude.Just
+              ("ActivationCode" Data..= activationCode)
+          ]
+      )
+
+instance Data.ToPath ActivateContactChannel where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ActivateContactChannel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newActivateContactChannelResponse' smart constructor.
+data ActivateContactChannelResponse = ActivateContactChannelResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ActivateContactChannelResponse' 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', 'activateContactChannelResponse_httpStatus' - The response's http status code.
+newActivateContactChannelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ActivateContactChannelResponse
+newActivateContactChannelResponse pHttpStatus_ =
+  ActivateContactChannelResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+activateContactChannelResponse_httpStatus :: Lens.Lens' ActivateContactChannelResponse Prelude.Int
+activateContactChannelResponse_httpStatus = Lens.lens (\ActivateContactChannelResponse' {httpStatus} -> httpStatus) (\s@ActivateContactChannelResponse' {} a -> s {httpStatus = a} :: ActivateContactChannelResponse)
+
+instance
+  Prelude.NFData
+    ActivateContactChannelResponse
+  where
+  rnf ActivateContactChannelResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/SSMContacts/CreateContact.hs b/gen/Amazonka/SSMContacts/CreateContact.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/CreateContact.hs
@@ -0,0 +1,265 @@
+{-# 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.SSMContacts.CreateContact
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Contacts are either the contacts that Incident Manager engages during an
+-- incident or the escalation plans that Incident Manager uses to engage
+-- contacts in phases during an incident.
+module Amazonka.SSMContacts.CreateContact
+  ( -- * Creating a Request
+    CreateContact (..),
+    newCreateContact,
+
+    -- * Request Lenses
+    createContact_displayName,
+    createContact_idempotencyToken,
+    createContact_tags,
+    createContact_alias,
+    createContact_type,
+    createContact_plan,
+
+    -- * Destructuring the Response
+    CreateContactResponse (..),
+    newCreateContactResponse,
+
+    -- * Response Lenses
+    createContactResponse_httpStatus,
+    createContactResponse_contactArn,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newCreateContact' smart constructor.
+data CreateContact = CreateContact'
+  { -- | The full name of the contact or escalation plan.
+    displayName :: Prelude.Maybe Prelude.Text,
+    -- | A token ensuring that the operation is called only once with the
+    -- specified details.
+    idempotencyToken :: Prelude.Maybe Prelude.Text,
+    -- | Adds a tag to the target. You can only tag resources created in the
+    -- first Region of your replication set.
+    tags :: Prelude.Maybe [Tag],
+    -- | The short name to quickly identify a contact or escalation plan. The
+    -- contact alias must be unique and identifiable.
+    alias :: Prelude.Text,
+    -- | To create an escalation plan use @ESCALATION@. To create a contact use
+    -- @PERSONAL@.
+    type' :: ContactType,
+    -- | A list of stages. A contact has an engagement plan with stages that
+    -- contact specified contact channels. An escalation plan uses stages that
+    -- contact specified contacts.
+    plan :: Plan
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateContact' 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:
+--
+-- 'displayName', 'createContact_displayName' - The full name of the contact or escalation plan.
+--
+-- 'idempotencyToken', 'createContact_idempotencyToken' - A token ensuring that the operation is called only once with the
+-- specified details.
+--
+-- 'tags', 'createContact_tags' - Adds a tag to the target. You can only tag resources created in the
+-- first Region of your replication set.
+--
+-- 'alias', 'createContact_alias' - The short name to quickly identify a contact or escalation plan. The
+-- contact alias must be unique and identifiable.
+--
+-- 'type'', 'createContact_type' - To create an escalation plan use @ESCALATION@. To create a contact use
+-- @PERSONAL@.
+--
+-- 'plan', 'createContact_plan' - A list of stages. A contact has an engagement plan with stages that
+-- contact specified contact channels. An escalation plan uses stages that
+-- contact specified contacts.
+newCreateContact ::
+  -- | 'alias'
+  Prelude.Text ->
+  -- | 'type''
+  ContactType ->
+  -- | 'plan'
+  Plan ->
+  CreateContact
+newCreateContact pAlias_ pType_ pPlan_ =
+  CreateContact'
+    { displayName = Prelude.Nothing,
+      idempotencyToken = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      alias = pAlias_,
+      type' = pType_,
+      plan = pPlan_
+    }
+
+-- | The full name of the contact or escalation plan.
+createContact_displayName :: Lens.Lens' CreateContact (Prelude.Maybe Prelude.Text)
+createContact_displayName = Lens.lens (\CreateContact' {displayName} -> displayName) (\s@CreateContact' {} a -> s {displayName = a} :: CreateContact)
+
+-- | A token ensuring that the operation is called only once with the
+-- specified details.
+createContact_idempotencyToken :: Lens.Lens' CreateContact (Prelude.Maybe Prelude.Text)
+createContact_idempotencyToken = Lens.lens (\CreateContact' {idempotencyToken} -> idempotencyToken) (\s@CreateContact' {} a -> s {idempotencyToken = a} :: CreateContact)
+
+-- | Adds a tag to the target. You can only tag resources created in the
+-- first Region of your replication set.
+createContact_tags :: Lens.Lens' CreateContact (Prelude.Maybe [Tag])
+createContact_tags = Lens.lens (\CreateContact' {tags} -> tags) (\s@CreateContact' {} a -> s {tags = a} :: CreateContact) Prelude.. Lens.mapping Lens.coerced
+
+-- | The short name to quickly identify a contact or escalation plan. The
+-- contact alias must be unique and identifiable.
+createContact_alias :: Lens.Lens' CreateContact Prelude.Text
+createContact_alias = Lens.lens (\CreateContact' {alias} -> alias) (\s@CreateContact' {} a -> s {alias = a} :: CreateContact)
+
+-- | To create an escalation plan use @ESCALATION@. To create a contact use
+-- @PERSONAL@.
+createContact_type :: Lens.Lens' CreateContact ContactType
+createContact_type = Lens.lens (\CreateContact' {type'} -> type') (\s@CreateContact' {} a -> s {type' = a} :: CreateContact)
+
+-- | A list of stages. A contact has an engagement plan with stages that
+-- contact specified contact channels. An escalation plan uses stages that
+-- contact specified contacts.
+createContact_plan :: Lens.Lens' CreateContact Plan
+createContact_plan = Lens.lens (\CreateContact' {plan} -> plan) (\s@CreateContact' {} a -> s {plan = a} :: CreateContact)
+
+instance Core.AWSRequest CreateContact where
+  type
+    AWSResponse CreateContact =
+      CreateContactResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateContactResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "ContactArn")
+      )
+
+instance Prelude.Hashable CreateContact where
+  hashWithSalt _salt CreateContact' {..} =
+    _salt
+      `Prelude.hashWithSalt` displayName
+      `Prelude.hashWithSalt` idempotencyToken
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` alias
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` plan
+
+instance Prelude.NFData CreateContact where
+  rnf CreateContact' {..} =
+    Prelude.rnf displayName
+      `Prelude.seq` Prelude.rnf idempotencyToken
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf alias
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf plan
+
+instance Data.ToHeaders CreateContact where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("SSMContacts.CreateContact" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateContact where
+  toJSON CreateContact' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DisplayName" Data..=) Prelude.<$> displayName,
+            ("IdempotencyToken" Data..=)
+              Prelude.<$> idempotencyToken,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("Alias" Data..= alias),
+            Prelude.Just ("Type" Data..= type'),
+            Prelude.Just ("Plan" Data..= plan)
+          ]
+      )
+
+instance Data.ToPath CreateContact where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateContact where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateContactResponse' smart constructor.
+data CreateContactResponse = CreateContactResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The Amazon Resource Name (ARN) of the created contact or escalation
+    -- plan.
+    contactArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateContactResponse' 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', 'createContactResponse_httpStatus' - The response's http status code.
+--
+-- 'contactArn', 'createContactResponse_contactArn' - The Amazon Resource Name (ARN) of the created contact or escalation
+-- plan.
+newCreateContactResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'contactArn'
+  Prelude.Text ->
+  CreateContactResponse
+newCreateContactResponse pHttpStatus_ pContactArn_ =
+  CreateContactResponse'
+    { httpStatus = pHttpStatus_,
+      contactArn = pContactArn_
+    }
+
+-- | The response's http status code.
+createContactResponse_httpStatus :: Lens.Lens' CreateContactResponse Prelude.Int
+createContactResponse_httpStatus = Lens.lens (\CreateContactResponse' {httpStatus} -> httpStatus) (\s@CreateContactResponse' {} a -> s {httpStatus = a} :: CreateContactResponse)
+
+-- | The Amazon Resource Name (ARN) of the created contact or escalation
+-- plan.
+createContactResponse_contactArn :: Lens.Lens' CreateContactResponse Prelude.Text
+createContactResponse_contactArn = Lens.lens (\CreateContactResponse' {contactArn} -> contactArn) (\s@CreateContactResponse' {} a -> s {contactArn = a} :: CreateContactResponse)
+
+instance Prelude.NFData CreateContactResponse where
+  rnf CreateContactResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf contactArn
diff --git a/gen/Amazonka/SSMContacts/CreateContactChannel.hs b/gen/Amazonka/SSMContacts/CreateContactChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/CreateContactChannel.hs
@@ -0,0 +1,311 @@
+{-# 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.SSMContacts.CreateContactChannel
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- A contact channel is the method that Incident Manager uses to engage
+-- your contact.
+module Amazonka.SSMContacts.CreateContactChannel
+  ( -- * Creating a Request
+    CreateContactChannel (..),
+    newCreateContactChannel,
+
+    -- * Request Lenses
+    createContactChannel_deferActivation,
+    createContactChannel_idempotencyToken,
+    createContactChannel_contactId,
+    createContactChannel_name,
+    createContactChannel_type,
+    createContactChannel_deliveryAddress,
+
+    -- * Destructuring the Response
+    CreateContactChannelResponse (..),
+    newCreateContactChannelResponse,
+
+    -- * Response Lenses
+    createContactChannelResponse_httpStatus,
+    createContactChannelResponse_contactChannelArn,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newCreateContactChannel' smart constructor.
+data CreateContactChannel = CreateContactChannel'
+  { -- | If you want to activate the channel at a later time, you can choose to
+    -- defer activation. Incident Manager can\'t engage your contact channel
+    -- until it has been activated.
+    deferActivation :: Prelude.Maybe Prelude.Bool,
+    -- | A token ensuring that the operation is called only once with the
+    -- specified details.
+    idempotencyToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the contact you are adding the contact
+    -- channel to.
+    contactId :: Prelude.Text,
+    -- | The name of the contact channel.
+    name :: Prelude.Text,
+    -- | Incident Manager supports three types of contact channels:
+    --
+    -- -   @SMS@
+    --
+    -- -   @VOICE@
+    --
+    -- -   @EMAIL@
+    type' :: ChannelType,
+    -- | The details that Incident Manager uses when trying to engage the contact
+    -- channel. The format is dependent on the type of the contact channel. The
+    -- following are the expected formats:
+    --
+    -- -   SMS - \'+\' followed by the country code and phone number
+    --
+    -- -   VOICE - \'+\' followed by the country code and phone number
+    --
+    -- -   EMAIL - any standard email format
+    deliveryAddress :: ContactChannelAddress
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateContactChannel' 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:
+--
+-- 'deferActivation', 'createContactChannel_deferActivation' - If you want to activate the channel at a later time, you can choose to
+-- defer activation. Incident Manager can\'t engage your contact channel
+-- until it has been activated.
+--
+-- 'idempotencyToken', 'createContactChannel_idempotencyToken' - A token ensuring that the operation is called only once with the
+-- specified details.
+--
+-- 'contactId', 'createContactChannel_contactId' - The Amazon Resource Name (ARN) of the contact you are adding the contact
+-- channel to.
+--
+-- 'name', 'createContactChannel_name' - The name of the contact channel.
+--
+-- 'type'', 'createContactChannel_type' - Incident Manager supports three types of contact channels:
+--
+-- -   @SMS@
+--
+-- -   @VOICE@
+--
+-- -   @EMAIL@
+--
+-- 'deliveryAddress', 'createContactChannel_deliveryAddress' - The details that Incident Manager uses when trying to engage the contact
+-- channel. The format is dependent on the type of the contact channel. The
+-- following are the expected formats:
+--
+-- -   SMS - \'+\' followed by the country code and phone number
+--
+-- -   VOICE - \'+\' followed by the country code and phone number
+--
+-- -   EMAIL - any standard email format
+newCreateContactChannel ::
+  -- | 'contactId'
+  Prelude.Text ->
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'type''
+  ChannelType ->
+  -- | 'deliveryAddress'
+  ContactChannelAddress ->
+  CreateContactChannel
+newCreateContactChannel
+  pContactId_
+  pName_
+  pType_
+  pDeliveryAddress_ =
+    CreateContactChannel'
+      { deferActivation =
+          Prelude.Nothing,
+        idempotencyToken = Prelude.Nothing,
+        contactId = pContactId_,
+        name = pName_,
+        type' = pType_,
+        deliveryAddress = pDeliveryAddress_
+      }
+
+-- | If you want to activate the channel at a later time, you can choose to
+-- defer activation. Incident Manager can\'t engage your contact channel
+-- until it has been activated.
+createContactChannel_deferActivation :: Lens.Lens' CreateContactChannel (Prelude.Maybe Prelude.Bool)
+createContactChannel_deferActivation = Lens.lens (\CreateContactChannel' {deferActivation} -> deferActivation) (\s@CreateContactChannel' {} a -> s {deferActivation = a} :: CreateContactChannel)
+
+-- | A token ensuring that the operation is called only once with the
+-- specified details.
+createContactChannel_idempotencyToken :: Lens.Lens' CreateContactChannel (Prelude.Maybe Prelude.Text)
+createContactChannel_idempotencyToken = Lens.lens (\CreateContactChannel' {idempotencyToken} -> idempotencyToken) (\s@CreateContactChannel' {} a -> s {idempotencyToken = a} :: CreateContactChannel)
+
+-- | The Amazon Resource Name (ARN) of the contact you are adding the contact
+-- channel to.
+createContactChannel_contactId :: Lens.Lens' CreateContactChannel Prelude.Text
+createContactChannel_contactId = Lens.lens (\CreateContactChannel' {contactId} -> contactId) (\s@CreateContactChannel' {} a -> s {contactId = a} :: CreateContactChannel)
+
+-- | The name of the contact channel.
+createContactChannel_name :: Lens.Lens' CreateContactChannel Prelude.Text
+createContactChannel_name = Lens.lens (\CreateContactChannel' {name} -> name) (\s@CreateContactChannel' {} a -> s {name = a} :: CreateContactChannel)
+
+-- | Incident Manager supports three types of contact channels:
+--
+-- -   @SMS@
+--
+-- -   @VOICE@
+--
+-- -   @EMAIL@
+createContactChannel_type :: Lens.Lens' CreateContactChannel ChannelType
+createContactChannel_type = Lens.lens (\CreateContactChannel' {type'} -> type') (\s@CreateContactChannel' {} a -> s {type' = a} :: CreateContactChannel)
+
+-- | The details that Incident Manager uses when trying to engage the contact
+-- channel. The format is dependent on the type of the contact channel. The
+-- following are the expected formats:
+--
+-- -   SMS - \'+\' followed by the country code and phone number
+--
+-- -   VOICE - \'+\' followed by the country code and phone number
+--
+-- -   EMAIL - any standard email format
+createContactChannel_deliveryAddress :: Lens.Lens' CreateContactChannel ContactChannelAddress
+createContactChannel_deliveryAddress = Lens.lens (\CreateContactChannel' {deliveryAddress} -> deliveryAddress) (\s@CreateContactChannel' {} a -> s {deliveryAddress = a} :: CreateContactChannel)
+
+instance Core.AWSRequest CreateContactChannel where
+  type
+    AWSResponse CreateContactChannel =
+      CreateContactChannelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateContactChannelResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "ContactChannelArn")
+      )
+
+instance Prelude.Hashable CreateContactChannel where
+  hashWithSalt _salt CreateContactChannel' {..} =
+    _salt
+      `Prelude.hashWithSalt` deferActivation
+      `Prelude.hashWithSalt` idempotencyToken
+      `Prelude.hashWithSalt` contactId
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` deliveryAddress
+
+instance Prelude.NFData CreateContactChannel where
+  rnf CreateContactChannel' {..} =
+    Prelude.rnf deferActivation
+      `Prelude.seq` Prelude.rnf idempotencyToken
+      `Prelude.seq` Prelude.rnf contactId
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf deliveryAddress
+
+instance Data.ToHeaders CreateContactChannel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SSMContacts.CreateContactChannel" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateContactChannel where
+  toJSON CreateContactChannel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DeferActivation" Data..=)
+              Prelude.<$> deferActivation,
+            ("IdempotencyToken" Data..=)
+              Prelude.<$> idempotencyToken,
+            Prelude.Just ("ContactId" Data..= contactId),
+            Prelude.Just ("Name" Data..= name),
+            Prelude.Just ("Type" Data..= type'),
+            Prelude.Just
+              ("DeliveryAddress" Data..= deliveryAddress)
+          ]
+      )
+
+instance Data.ToPath CreateContactChannel where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateContactChannel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateContactChannelResponse' smart constructor.
+data CreateContactChannelResponse = CreateContactChannelResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The Amazon Resource Name (ARN) of the contact channel.
+    contactChannelArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateContactChannelResponse' 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', 'createContactChannelResponse_httpStatus' - The response's http status code.
+--
+-- 'contactChannelArn', 'createContactChannelResponse_contactChannelArn' - The Amazon Resource Name (ARN) of the contact channel.
+newCreateContactChannelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'contactChannelArn'
+  Prelude.Text ->
+  CreateContactChannelResponse
+newCreateContactChannelResponse
+  pHttpStatus_
+  pContactChannelArn_ =
+    CreateContactChannelResponse'
+      { httpStatus =
+          pHttpStatus_,
+        contactChannelArn = pContactChannelArn_
+      }
+
+-- | The response's http status code.
+createContactChannelResponse_httpStatus :: Lens.Lens' CreateContactChannelResponse Prelude.Int
+createContactChannelResponse_httpStatus = Lens.lens (\CreateContactChannelResponse' {httpStatus} -> httpStatus) (\s@CreateContactChannelResponse' {} a -> s {httpStatus = a} :: CreateContactChannelResponse)
+
+-- | The Amazon Resource Name (ARN) of the contact channel.
+createContactChannelResponse_contactChannelArn :: Lens.Lens' CreateContactChannelResponse Prelude.Text
+createContactChannelResponse_contactChannelArn = Lens.lens (\CreateContactChannelResponse' {contactChannelArn} -> contactChannelArn) (\s@CreateContactChannelResponse' {} a -> s {contactChannelArn = a} :: CreateContactChannelResponse)
+
+instance Prelude.NFData CreateContactChannelResponse where
+  rnf CreateContactChannelResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf contactChannelArn
diff --git a/gen/Amazonka/SSMContacts/DeactivateContactChannel.hs b/gen/Amazonka/SSMContacts/DeactivateContactChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/DeactivateContactChannel.hs
@@ -0,0 +1,169 @@
+{-# 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.SSMContacts.DeactivateContactChannel
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- To no longer receive Incident Manager engagements to a contact channel,
+-- you can deactivate the channel.
+module Amazonka.SSMContacts.DeactivateContactChannel
+  ( -- * Creating a Request
+    DeactivateContactChannel (..),
+    newDeactivateContactChannel,
+
+    -- * Request Lenses
+    deactivateContactChannel_contactChannelId,
+
+    -- * Destructuring the Response
+    DeactivateContactChannelResponse (..),
+    newDeactivateContactChannelResponse,
+
+    -- * Response Lenses
+    deactivateContactChannelResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newDeactivateContactChannel' smart constructor.
+data DeactivateContactChannel = DeactivateContactChannel'
+  { -- | The Amazon Resource Name (ARN) of the contact channel you\'re
+    -- deactivating.
+    contactChannelId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeactivateContactChannel' 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:
+--
+-- 'contactChannelId', 'deactivateContactChannel_contactChannelId' - The Amazon Resource Name (ARN) of the contact channel you\'re
+-- deactivating.
+newDeactivateContactChannel ::
+  -- | 'contactChannelId'
+  Prelude.Text ->
+  DeactivateContactChannel
+newDeactivateContactChannel pContactChannelId_ =
+  DeactivateContactChannel'
+    { contactChannelId =
+        pContactChannelId_
+    }
+
+-- | The Amazon Resource Name (ARN) of the contact channel you\'re
+-- deactivating.
+deactivateContactChannel_contactChannelId :: Lens.Lens' DeactivateContactChannel Prelude.Text
+deactivateContactChannel_contactChannelId = Lens.lens (\DeactivateContactChannel' {contactChannelId} -> contactChannelId) (\s@DeactivateContactChannel' {} a -> s {contactChannelId = a} :: DeactivateContactChannel)
+
+instance Core.AWSRequest DeactivateContactChannel where
+  type
+    AWSResponse DeactivateContactChannel =
+      DeactivateContactChannelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeactivateContactChannelResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeactivateContactChannel where
+  hashWithSalt _salt DeactivateContactChannel' {..} =
+    _salt `Prelude.hashWithSalt` contactChannelId
+
+instance Prelude.NFData DeactivateContactChannel where
+  rnf DeactivateContactChannel' {..} =
+    Prelude.rnf contactChannelId
+
+instance Data.ToHeaders DeactivateContactChannel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SSMContacts.DeactivateContactChannel" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeactivateContactChannel where
+  toJSON DeactivateContactChannel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("ContactChannelId" Data..= contactChannelId)
+          ]
+      )
+
+instance Data.ToPath DeactivateContactChannel where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeactivateContactChannel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeactivateContactChannelResponse' smart constructor.
+data DeactivateContactChannelResponse = DeactivateContactChannelResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeactivateContactChannelResponse' 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', 'deactivateContactChannelResponse_httpStatus' - The response's http status code.
+newDeactivateContactChannelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeactivateContactChannelResponse
+newDeactivateContactChannelResponse pHttpStatus_ =
+  DeactivateContactChannelResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+deactivateContactChannelResponse_httpStatus :: Lens.Lens' DeactivateContactChannelResponse Prelude.Int
+deactivateContactChannelResponse_httpStatus = Lens.lens (\DeactivateContactChannelResponse' {httpStatus} -> httpStatus) (\s@DeactivateContactChannelResponse' {} a -> s {httpStatus = a} :: DeactivateContactChannelResponse)
+
+instance
+  Prelude.NFData
+    DeactivateContactChannelResponse
+  where
+  rnf DeactivateContactChannelResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/SSMContacts/DeleteContact.hs b/gen/Amazonka/SSMContacts/DeleteContact.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/DeleteContact.hs
@@ -0,0 +1,155 @@
+{-# 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.SSMContacts.DeleteContact
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- To remove a contact from Incident Manager, you can delete the contact.
+-- Deleting a contact removes them from all escalation plans and related
+-- response plans. Deleting an escalation plan removes it from all related
+-- response plans. You will have to recreate the contact and its contact
+-- channels before you can use it again.
+module Amazonka.SSMContacts.DeleteContact
+  ( -- * Creating a Request
+    DeleteContact (..),
+    newDeleteContact,
+
+    -- * Request Lenses
+    deleteContact_contactId,
+
+    -- * Destructuring the Response
+    DeleteContactResponse (..),
+    newDeleteContactResponse,
+
+    -- * Response Lenses
+    deleteContactResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newDeleteContact' smart constructor.
+data DeleteContact = DeleteContact'
+  { -- | The Amazon Resource Name (ARN) of the contact that you\'re deleting.
+    contactId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteContact' 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:
+--
+-- 'contactId', 'deleteContact_contactId' - The Amazon Resource Name (ARN) of the contact that you\'re deleting.
+newDeleteContact ::
+  -- | 'contactId'
+  Prelude.Text ->
+  DeleteContact
+newDeleteContact pContactId_ =
+  DeleteContact' {contactId = pContactId_}
+
+-- | The Amazon Resource Name (ARN) of the contact that you\'re deleting.
+deleteContact_contactId :: Lens.Lens' DeleteContact Prelude.Text
+deleteContact_contactId = Lens.lens (\DeleteContact' {contactId} -> contactId) (\s@DeleteContact' {} a -> s {contactId = a} :: DeleteContact)
+
+instance Core.AWSRequest DeleteContact where
+  type
+    AWSResponse DeleteContact =
+      DeleteContactResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteContactResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteContact where
+  hashWithSalt _salt DeleteContact' {..} =
+    _salt `Prelude.hashWithSalt` contactId
+
+instance Prelude.NFData DeleteContact where
+  rnf DeleteContact' {..} = Prelude.rnf contactId
+
+instance Data.ToHeaders DeleteContact where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("SSMContacts.DeleteContact" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteContact where
+  toJSON DeleteContact' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("ContactId" Data..= contactId)]
+      )
+
+instance Data.ToPath DeleteContact where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteContact where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteContactResponse' smart constructor.
+data DeleteContactResponse = DeleteContactResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteContactResponse' 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', 'deleteContactResponse_httpStatus' - The response's http status code.
+newDeleteContactResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteContactResponse
+newDeleteContactResponse pHttpStatus_ =
+  DeleteContactResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+deleteContactResponse_httpStatus :: Lens.Lens' DeleteContactResponse Prelude.Int
+deleteContactResponse_httpStatus = Lens.lens (\DeleteContactResponse' {httpStatus} -> httpStatus) (\s@DeleteContactResponse' {} a -> s {httpStatus = a} :: DeleteContactResponse)
+
+instance Prelude.NFData DeleteContactResponse where
+  rnf DeleteContactResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/SSMContacts/DeleteContactChannel.hs b/gen/Amazonka/SSMContacts/DeleteContactChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/DeleteContactChannel.hs
@@ -0,0 +1,166 @@
+{-# 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.SSMContacts.DeleteContactChannel
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- To no longer receive engagements on a contact channel, you can delete
+-- the channel from a contact. Deleting the contact channel removes it from
+-- the contact\'s engagement plan. If you delete the only contact channel
+-- for a contact, you won\'t be able to engage that contact during an
+-- incident.
+module Amazonka.SSMContacts.DeleteContactChannel
+  ( -- * Creating a Request
+    DeleteContactChannel (..),
+    newDeleteContactChannel,
+
+    -- * Request Lenses
+    deleteContactChannel_contactChannelId,
+
+    -- * Destructuring the Response
+    DeleteContactChannelResponse (..),
+    newDeleteContactChannelResponse,
+
+    -- * Response Lenses
+    deleteContactChannelResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newDeleteContactChannel' smart constructor.
+data DeleteContactChannel = DeleteContactChannel'
+  { -- | The Amazon Resource Name (ARN) of the contact channel.
+    contactChannelId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteContactChannel' 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:
+--
+-- 'contactChannelId', 'deleteContactChannel_contactChannelId' - The Amazon Resource Name (ARN) of the contact channel.
+newDeleteContactChannel ::
+  -- | 'contactChannelId'
+  Prelude.Text ->
+  DeleteContactChannel
+newDeleteContactChannel pContactChannelId_ =
+  DeleteContactChannel'
+    { contactChannelId =
+        pContactChannelId_
+    }
+
+-- | The Amazon Resource Name (ARN) of the contact channel.
+deleteContactChannel_contactChannelId :: Lens.Lens' DeleteContactChannel Prelude.Text
+deleteContactChannel_contactChannelId = Lens.lens (\DeleteContactChannel' {contactChannelId} -> contactChannelId) (\s@DeleteContactChannel' {} a -> s {contactChannelId = a} :: DeleteContactChannel)
+
+instance Core.AWSRequest DeleteContactChannel where
+  type
+    AWSResponse DeleteContactChannel =
+      DeleteContactChannelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteContactChannelResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteContactChannel where
+  hashWithSalt _salt DeleteContactChannel' {..} =
+    _salt `Prelude.hashWithSalt` contactChannelId
+
+instance Prelude.NFData DeleteContactChannel where
+  rnf DeleteContactChannel' {..} =
+    Prelude.rnf contactChannelId
+
+instance Data.ToHeaders DeleteContactChannel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SSMContacts.DeleteContactChannel" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteContactChannel where
+  toJSON DeleteContactChannel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("ContactChannelId" Data..= contactChannelId)
+          ]
+      )
+
+instance Data.ToPath DeleteContactChannel where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteContactChannel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteContactChannelResponse' smart constructor.
+data DeleteContactChannelResponse = DeleteContactChannelResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteContactChannelResponse' 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', 'deleteContactChannelResponse_httpStatus' - The response's http status code.
+newDeleteContactChannelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteContactChannelResponse
+newDeleteContactChannelResponse pHttpStatus_ =
+  DeleteContactChannelResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+deleteContactChannelResponse_httpStatus :: Lens.Lens' DeleteContactChannelResponse Prelude.Int
+deleteContactChannelResponse_httpStatus = Lens.lens (\DeleteContactChannelResponse' {httpStatus} -> httpStatus) (\s@DeleteContactChannelResponse' {} a -> s {httpStatus = a} :: DeleteContactChannelResponse)
+
+instance Prelude.NFData DeleteContactChannelResponse where
+  rnf DeleteContactChannelResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/SSMContacts/DescribeEngagement.hs b/gen/Amazonka/SSMContacts/DescribeEngagement.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/DescribeEngagement.hs
@@ -0,0 +1,310 @@
+{-# 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.SSMContacts.DescribeEngagement
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Incident Manager uses engagements to engage contacts and escalation
+-- plans during an incident. Use this command to describe the engagement
+-- that occurred during an incident.
+module Amazonka.SSMContacts.DescribeEngagement
+  ( -- * Creating a Request
+    DescribeEngagement (..),
+    newDescribeEngagement,
+
+    -- * Request Lenses
+    describeEngagement_engagementId,
+
+    -- * Destructuring the Response
+    DescribeEngagementResponse (..),
+    newDescribeEngagementResponse,
+
+    -- * Response Lenses
+    describeEngagementResponse_incidentId,
+    describeEngagementResponse_publicContent,
+    describeEngagementResponse_publicSubject,
+    describeEngagementResponse_startTime,
+    describeEngagementResponse_stopTime,
+    describeEngagementResponse_httpStatus,
+    describeEngagementResponse_contactArn,
+    describeEngagementResponse_engagementArn,
+    describeEngagementResponse_sender,
+    describeEngagementResponse_subject,
+    describeEngagementResponse_content,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newDescribeEngagement' smart constructor.
+data DescribeEngagement = DescribeEngagement'
+  { -- | The Amazon Resource Name (ARN) of the engagement you want the details
+    -- of.
+    engagementId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeEngagement' 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:
+--
+-- 'engagementId', 'describeEngagement_engagementId' - The Amazon Resource Name (ARN) of the engagement you want the details
+-- of.
+newDescribeEngagement ::
+  -- | 'engagementId'
+  Prelude.Text ->
+  DescribeEngagement
+newDescribeEngagement pEngagementId_ =
+  DescribeEngagement' {engagementId = pEngagementId_}
+
+-- | The Amazon Resource Name (ARN) of the engagement you want the details
+-- of.
+describeEngagement_engagementId :: Lens.Lens' DescribeEngagement Prelude.Text
+describeEngagement_engagementId = Lens.lens (\DescribeEngagement' {engagementId} -> engagementId) (\s@DescribeEngagement' {} a -> s {engagementId = a} :: DescribeEngagement)
+
+instance Core.AWSRequest DescribeEngagement where
+  type
+    AWSResponse DescribeEngagement =
+      DescribeEngagementResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeEngagementResponse'
+            Prelude.<$> (x Data..?> "IncidentId")
+            Prelude.<*> (x Data..?> "PublicContent")
+            Prelude.<*> (x Data..?> "PublicSubject")
+            Prelude.<*> (x Data..?> "StartTime")
+            Prelude.<*> (x Data..?> "StopTime")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "ContactArn")
+            Prelude.<*> (x Data..:> "EngagementArn")
+            Prelude.<*> (x Data..:> "Sender")
+            Prelude.<*> (x Data..:> "Subject")
+            Prelude.<*> (x Data..:> "Content")
+      )
+
+instance Prelude.Hashable DescribeEngagement where
+  hashWithSalt _salt DescribeEngagement' {..} =
+    _salt `Prelude.hashWithSalt` engagementId
+
+instance Prelude.NFData DescribeEngagement where
+  rnf DescribeEngagement' {..} =
+    Prelude.rnf engagementId
+
+instance Data.ToHeaders DescribeEngagement where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SSMContacts.DescribeEngagement" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeEngagement where
+  toJSON DescribeEngagement' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("EngagementId" Data..= engagementId)]
+      )
+
+instance Data.ToPath DescribeEngagement where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeEngagement where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeEngagementResponse' smart constructor.
+data DescribeEngagementResponse = DescribeEngagementResponse'
+  { -- | The ARN of the incident in which the engagement occurred.
+    incidentId :: Prelude.Maybe Prelude.Text,
+    -- | The insecure content of the message that was sent to the contact. Use
+    -- this field for engagements to @SMS@.
+    publicContent :: Prelude.Maybe Prelude.Text,
+    -- | The insecure subject of the message that was sent to the contact. Use
+    -- this field for engagements to @SMS@.
+    publicSubject :: Prelude.Maybe Prelude.Text,
+    -- | The time that the engagement started.
+    startTime :: Prelude.Maybe Data.POSIX,
+    -- | The time that the engagement ended.
+    stopTime :: Prelude.Maybe Data.POSIX,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ARN of the escalation plan or contacts involved in the engagement.
+    contactArn :: Prelude.Text,
+    -- | The ARN of the engagement.
+    engagementArn :: Prelude.Text,
+    -- | The user that started the engagement.
+    sender :: Prelude.Text,
+    -- | The secure subject of the message that was sent to the contact. Use this
+    -- field for engagements to @VOICE@ and @EMAIL@.
+    subject :: Prelude.Text,
+    -- | The secure content of the message that was sent to the contact. Use this
+    -- field for engagements to @VOICE@ and @EMAIL@.
+    content :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeEngagementResponse' 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:
+--
+-- 'incidentId', 'describeEngagementResponse_incidentId' - The ARN of the incident in which the engagement occurred.
+--
+-- 'publicContent', 'describeEngagementResponse_publicContent' - The insecure content of the message that was sent to the contact. Use
+-- this field for engagements to @SMS@.
+--
+-- 'publicSubject', 'describeEngagementResponse_publicSubject' - The insecure subject of the message that was sent to the contact. Use
+-- this field for engagements to @SMS@.
+--
+-- 'startTime', 'describeEngagementResponse_startTime' - The time that the engagement started.
+--
+-- 'stopTime', 'describeEngagementResponse_stopTime' - The time that the engagement ended.
+--
+-- 'httpStatus', 'describeEngagementResponse_httpStatus' - The response's http status code.
+--
+-- 'contactArn', 'describeEngagementResponse_contactArn' - The ARN of the escalation plan or contacts involved in the engagement.
+--
+-- 'engagementArn', 'describeEngagementResponse_engagementArn' - The ARN of the engagement.
+--
+-- 'sender', 'describeEngagementResponse_sender' - The user that started the engagement.
+--
+-- 'subject', 'describeEngagementResponse_subject' - The secure subject of the message that was sent to the contact. Use this
+-- field for engagements to @VOICE@ and @EMAIL@.
+--
+-- 'content', 'describeEngagementResponse_content' - The secure content of the message that was sent to the contact. Use this
+-- field for engagements to @VOICE@ and @EMAIL@.
+newDescribeEngagementResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'contactArn'
+  Prelude.Text ->
+  -- | 'engagementArn'
+  Prelude.Text ->
+  -- | 'sender'
+  Prelude.Text ->
+  -- | 'subject'
+  Prelude.Text ->
+  -- | 'content'
+  Prelude.Text ->
+  DescribeEngagementResponse
+newDescribeEngagementResponse
+  pHttpStatus_
+  pContactArn_
+  pEngagementArn_
+  pSender_
+  pSubject_
+  pContent_ =
+    DescribeEngagementResponse'
+      { incidentId =
+          Prelude.Nothing,
+        publicContent = Prelude.Nothing,
+        publicSubject = Prelude.Nothing,
+        startTime = Prelude.Nothing,
+        stopTime = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        contactArn = pContactArn_,
+        engagementArn = pEngagementArn_,
+        sender = pSender_,
+        subject = pSubject_,
+        content = pContent_
+      }
+
+-- | The ARN of the incident in which the engagement occurred.
+describeEngagementResponse_incidentId :: Lens.Lens' DescribeEngagementResponse (Prelude.Maybe Prelude.Text)
+describeEngagementResponse_incidentId = Lens.lens (\DescribeEngagementResponse' {incidentId} -> incidentId) (\s@DescribeEngagementResponse' {} a -> s {incidentId = a} :: DescribeEngagementResponse)
+
+-- | The insecure content of the message that was sent to the contact. Use
+-- this field for engagements to @SMS@.
+describeEngagementResponse_publicContent :: Lens.Lens' DescribeEngagementResponse (Prelude.Maybe Prelude.Text)
+describeEngagementResponse_publicContent = Lens.lens (\DescribeEngagementResponse' {publicContent} -> publicContent) (\s@DescribeEngagementResponse' {} a -> s {publicContent = a} :: DescribeEngagementResponse)
+
+-- | The insecure subject of the message that was sent to the contact. Use
+-- this field for engagements to @SMS@.
+describeEngagementResponse_publicSubject :: Lens.Lens' DescribeEngagementResponse (Prelude.Maybe Prelude.Text)
+describeEngagementResponse_publicSubject = Lens.lens (\DescribeEngagementResponse' {publicSubject} -> publicSubject) (\s@DescribeEngagementResponse' {} a -> s {publicSubject = a} :: DescribeEngagementResponse)
+
+-- | The time that the engagement started.
+describeEngagementResponse_startTime :: Lens.Lens' DescribeEngagementResponse (Prelude.Maybe Prelude.UTCTime)
+describeEngagementResponse_startTime = Lens.lens (\DescribeEngagementResponse' {startTime} -> startTime) (\s@DescribeEngagementResponse' {} a -> s {startTime = a} :: DescribeEngagementResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The time that the engagement ended.
+describeEngagementResponse_stopTime :: Lens.Lens' DescribeEngagementResponse (Prelude.Maybe Prelude.UTCTime)
+describeEngagementResponse_stopTime = Lens.lens (\DescribeEngagementResponse' {stopTime} -> stopTime) (\s@DescribeEngagementResponse' {} a -> s {stopTime = a} :: DescribeEngagementResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The response's http status code.
+describeEngagementResponse_httpStatus :: Lens.Lens' DescribeEngagementResponse Prelude.Int
+describeEngagementResponse_httpStatus = Lens.lens (\DescribeEngagementResponse' {httpStatus} -> httpStatus) (\s@DescribeEngagementResponse' {} a -> s {httpStatus = a} :: DescribeEngagementResponse)
+
+-- | The ARN of the escalation plan or contacts involved in the engagement.
+describeEngagementResponse_contactArn :: Lens.Lens' DescribeEngagementResponse Prelude.Text
+describeEngagementResponse_contactArn = Lens.lens (\DescribeEngagementResponse' {contactArn} -> contactArn) (\s@DescribeEngagementResponse' {} a -> s {contactArn = a} :: DescribeEngagementResponse)
+
+-- | The ARN of the engagement.
+describeEngagementResponse_engagementArn :: Lens.Lens' DescribeEngagementResponse Prelude.Text
+describeEngagementResponse_engagementArn = Lens.lens (\DescribeEngagementResponse' {engagementArn} -> engagementArn) (\s@DescribeEngagementResponse' {} a -> s {engagementArn = a} :: DescribeEngagementResponse)
+
+-- | The user that started the engagement.
+describeEngagementResponse_sender :: Lens.Lens' DescribeEngagementResponse Prelude.Text
+describeEngagementResponse_sender = Lens.lens (\DescribeEngagementResponse' {sender} -> sender) (\s@DescribeEngagementResponse' {} a -> s {sender = a} :: DescribeEngagementResponse)
+
+-- | The secure subject of the message that was sent to the contact. Use this
+-- field for engagements to @VOICE@ and @EMAIL@.
+describeEngagementResponse_subject :: Lens.Lens' DescribeEngagementResponse Prelude.Text
+describeEngagementResponse_subject = Lens.lens (\DescribeEngagementResponse' {subject} -> subject) (\s@DescribeEngagementResponse' {} a -> s {subject = a} :: DescribeEngagementResponse)
+
+-- | The secure content of the message that was sent to the contact. Use this
+-- field for engagements to @VOICE@ and @EMAIL@.
+describeEngagementResponse_content :: Lens.Lens' DescribeEngagementResponse Prelude.Text
+describeEngagementResponse_content = Lens.lens (\DescribeEngagementResponse' {content} -> content) (\s@DescribeEngagementResponse' {} a -> s {content = a} :: DescribeEngagementResponse)
+
+instance Prelude.NFData DescribeEngagementResponse where
+  rnf DescribeEngagementResponse' {..} =
+    Prelude.rnf incidentId
+      `Prelude.seq` Prelude.rnf publicContent
+      `Prelude.seq` Prelude.rnf publicSubject
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf stopTime
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf contactArn
+      `Prelude.seq` Prelude.rnf engagementArn
+      `Prelude.seq` Prelude.rnf sender
+      `Prelude.seq` Prelude.rnf subject
+      `Prelude.seq` Prelude.rnf content
diff --git a/gen/Amazonka/SSMContacts/DescribePage.hs b/gen/Amazonka/SSMContacts/DescribePage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/DescribePage.hs
@@ -0,0 +1,327 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.SSMContacts.DescribePage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists details of the engagement to a contact channel.
+module Amazonka.SSMContacts.DescribePage
+  ( -- * Creating a Request
+    DescribePage (..),
+    newDescribePage,
+
+    -- * Request Lenses
+    describePage_pageId,
+
+    -- * Destructuring the Response
+    DescribePageResponse (..),
+    newDescribePageResponse,
+
+    -- * Response Lenses
+    describePageResponse_deliveryTime,
+    describePageResponse_incidentId,
+    describePageResponse_publicContent,
+    describePageResponse_publicSubject,
+    describePageResponse_readTime,
+    describePageResponse_sentTime,
+    describePageResponse_httpStatus,
+    describePageResponse_pageArn,
+    describePageResponse_engagementArn,
+    describePageResponse_contactArn,
+    describePageResponse_sender,
+    describePageResponse_subject,
+    describePageResponse_content,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newDescribePage' smart constructor.
+data DescribePage = DescribePage'
+  { -- | The ID of the engagement to a contact channel.
+    pageId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribePage' 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:
+--
+-- 'pageId', 'describePage_pageId' - The ID of the engagement to a contact channel.
+newDescribePage ::
+  -- | 'pageId'
+  Prelude.Text ->
+  DescribePage
+newDescribePage pPageId_ =
+  DescribePage' {pageId = pPageId_}
+
+-- | The ID of the engagement to a contact channel.
+describePage_pageId :: Lens.Lens' DescribePage Prelude.Text
+describePage_pageId = Lens.lens (\DescribePage' {pageId} -> pageId) (\s@DescribePage' {} a -> s {pageId = a} :: DescribePage)
+
+instance Core.AWSRequest DescribePage where
+  type AWSResponse DescribePage = DescribePageResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribePageResponse'
+            Prelude.<$> (x Data..?> "DeliveryTime")
+            Prelude.<*> (x Data..?> "IncidentId")
+            Prelude.<*> (x Data..?> "PublicContent")
+            Prelude.<*> (x Data..?> "PublicSubject")
+            Prelude.<*> (x Data..?> "ReadTime")
+            Prelude.<*> (x Data..?> "SentTime")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "PageArn")
+            Prelude.<*> (x Data..:> "EngagementArn")
+            Prelude.<*> (x Data..:> "ContactArn")
+            Prelude.<*> (x Data..:> "Sender")
+            Prelude.<*> (x Data..:> "Subject")
+            Prelude.<*> (x Data..:> "Content")
+      )
+
+instance Prelude.Hashable DescribePage where
+  hashWithSalt _salt DescribePage' {..} =
+    _salt `Prelude.hashWithSalt` pageId
+
+instance Prelude.NFData DescribePage where
+  rnf DescribePage' {..} = Prelude.rnf pageId
+
+instance Data.ToHeaders DescribePage where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("SSMContacts.DescribePage" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribePage where
+  toJSON DescribePage' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("PageId" Data..= pageId)]
+      )
+
+instance Data.ToPath DescribePage where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribePage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribePageResponse' smart constructor.
+data DescribePageResponse = DescribePageResponse'
+  { -- | The time that the contact channel received the engagement.
+    deliveryTime :: Prelude.Maybe Data.POSIX,
+    -- | The ARN of the incident that engaged the contact channel.
+    incidentId :: Prelude.Maybe Prelude.Text,
+    -- | The insecure content of the message that was sent to the contact. Use
+    -- this field for engagements to @SMS@.
+    publicContent :: Prelude.Maybe Prelude.Text,
+    -- | The insecure subject of the message that was sent to the contact. Use
+    -- this field for engagements to @SMS@.
+    publicSubject :: Prelude.Maybe Prelude.Text,
+    -- | The time that the contact channel acknowledged the engagement.
+    readTime :: Prelude.Maybe Data.POSIX,
+    -- | The time the engagement was sent to the contact channel.
+    sentTime :: Prelude.Maybe Data.POSIX,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The Amazon Resource Name (ARN) of the engagement to a contact channel.
+    pageArn :: Prelude.Text,
+    -- | The ARN of the engagement that engaged the contact channel.
+    engagementArn :: Prelude.Text,
+    -- | The ARN of the contact that was engaged.
+    contactArn :: Prelude.Text,
+    -- | The user that started the engagement.
+    sender :: Prelude.Text,
+    -- | The secure subject of the message that was sent to the contact. Use this
+    -- field for engagements to @VOICE@ and @EMAIL@.
+    subject :: Prelude.Text,
+    -- | The secure content of the message that was sent to the contact. Use this
+    -- field for engagements to @VOICE@ and @EMAIL@.
+    content :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribePageResponse' 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:
+--
+-- 'deliveryTime', 'describePageResponse_deliveryTime' - The time that the contact channel received the engagement.
+--
+-- 'incidentId', 'describePageResponse_incidentId' - The ARN of the incident that engaged the contact channel.
+--
+-- 'publicContent', 'describePageResponse_publicContent' - The insecure content of the message that was sent to the contact. Use
+-- this field for engagements to @SMS@.
+--
+-- 'publicSubject', 'describePageResponse_publicSubject' - The insecure subject of the message that was sent to the contact. Use
+-- this field for engagements to @SMS@.
+--
+-- 'readTime', 'describePageResponse_readTime' - The time that the contact channel acknowledged the engagement.
+--
+-- 'sentTime', 'describePageResponse_sentTime' - The time the engagement was sent to the contact channel.
+--
+-- 'httpStatus', 'describePageResponse_httpStatus' - The response's http status code.
+--
+-- 'pageArn', 'describePageResponse_pageArn' - The Amazon Resource Name (ARN) of the engagement to a contact channel.
+--
+-- 'engagementArn', 'describePageResponse_engagementArn' - The ARN of the engagement that engaged the contact channel.
+--
+-- 'contactArn', 'describePageResponse_contactArn' - The ARN of the contact that was engaged.
+--
+-- 'sender', 'describePageResponse_sender' - The user that started the engagement.
+--
+-- 'subject', 'describePageResponse_subject' - The secure subject of the message that was sent to the contact. Use this
+-- field for engagements to @VOICE@ and @EMAIL@.
+--
+-- 'content', 'describePageResponse_content' - The secure content of the message that was sent to the contact. Use this
+-- field for engagements to @VOICE@ and @EMAIL@.
+newDescribePageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'pageArn'
+  Prelude.Text ->
+  -- | 'engagementArn'
+  Prelude.Text ->
+  -- | 'contactArn'
+  Prelude.Text ->
+  -- | 'sender'
+  Prelude.Text ->
+  -- | 'subject'
+  Prelude.Text ->
+  -- | 'content'
+  Prelude.Text ->
+  DescribePageResponse
+newDescribePageResponse
+  pHttpStatus_
+  pPageArn_
+  pEngagementArn_
+  pContactArn_
+  pSender_
+  pSubject_
+  pContent_ =
+    DescribePageResponse'
+      { deliveryTime =
+          Prelude.Nothing,
+        incidentId = Prelude.Nothing,
+        publicContent = Prelude.Nothing,
+        publicSubject = Prelude.Nothing,
+        readTime = Prelude.Nothing,
+        sentTime = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        pageArn = pPageArn_,
+        engagementArn = pEngagementArn_,
+        contactArn = pContactArn_,
+        sender = pSender_,
+        subject = pSubject_,
+        content = pContent_
+      }
+
+-- | The time that the contact channel received the engagement.
+describePageResponse_deliveryTime :: Lens.Lens' DescribePageResponse (Prelude.Maybe Prelude.UTCTime)
+describePageResponse_deliveryTime = Lens.lens (\DescribePageResponse' {deliveryTime} -> deliveryTime) (\s@DescribePageResponse' {} a -> s {deliveryTime = a} :: DescribePageResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The ARN of the incident that engaged the contact channel.
+describePageResponse_incidentId :: Lens.Lens' DescribePageResponse (Prelude.Maybe Prelude.Text)
+describePageResponse_incidentId = Lens.lens (\DescribePageResponse' {incidentId} -> incidentId) (\s@DescribePageResponse' {} a -> s {incidentId = a} :: DescribePageResponse)
+
+-- | The insecure content of the message that was sent to the contact. Use
+-- this field for engagements to @SMS@.
+describePageResponse_publicContent :: Lens.Lens' DescribePageResponse (Prelude.Maybe Prelude.Text)
+describePageResponse_publicContent = Lens.lens (\DescribePageResponse' {publicContent} -> publicContent) (\s@DescribePageResponse' {} a -> s {publicContent = a} :: DescribePageResponse)
+
+-- | The insecure subject of the message that was sent to the contact. Use
+-- this field for engagements to @SMS@.
+describePageResponse_publicSubject :: Lens.Lens' DescribePageResponse (Prelude.Maybe Prelude.Text)
+describePageResponse_publicSubject = Lens.lens (\DescribePageResponse' {publicSubject} -> publicSubject) (\s@DescribePageResponse' {} a -> s {publicSubject = a} :: DescribePageResponse)
+
+-- | The time that the contact channel acknowledged the engagement.
+describePageResponse_readTime :: Lens.Lens' DescribePageResponse (Prelude.Maybe Prelude.UTCTime)
+describePageResponse_readTime = Lens.lens (\DescribePageResponse' {readTime} -> readTime) (\s@DescribePageResponse' {} a -> s {readTime = a} :: DescribePageResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The time the engagement was sent to the contact channel.
+describePageResponse_sentTime :: Lens.Lens' DescribePageResponse (Prelude.Maybe Prelude.UTCTime)
+describePageResponse_sentTime = Lens.lens (\DescribePageResponse' {sentTime} -> sentTime) (\s@DescribePageResponse' {} a -> s {sentTime = a} :: DescribePageResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The response's http status code.
+describePageResponse_httpStatus :: Lens.Lens' DescribePageResponse Prelude.Int
+describePageResponse_httpStatus = Lens.lens (\DescribePageResponse' {httpStatus} -> httpStatus) (\s@DescribePageResponse' {} a -> s {httpStatus = a} :: DescribePageResponse)
+
+-- | The Amazon Resource Name (ARN) of the engagement to a contact channel.
+describePageResponse_pageArn :: Lens.Lens' DescribePageResponse Prelude.Text
+describePageResponse_pageArn = Lens.lens (\DescribePageResponse' {pageArn} -> pageArn) (\s@DescribePageResponse' {} a -> s {pageArn = a} :: DescribePageResponse)
+
+-- | The ARN of the engagement that engaged the contact channel.
+describePageResponse_engagementArn :: Lens.Lens' DescribePageResponse Prelude.Text
+describePageResponse_engagementArn = Lens.lens (\DescribePageResponse' {engagementArn} -> engagementArn) (\s@DescribePageResponse' {} a -> s {engagementArn = a} :: DescribePageResponse)
+
+-- | The ARN of the contact that was engaged.
+describePageResponse_contactArn :: Lens.Lens' DescribePageResponse Prelude.Text
+describePageResponse_contactArn = Lens.lens (\DescribePageResponse' {contactArn} -> contactArn) (\s@DescribePageResponse' {} a -> s {contactArn = a} :: DescribePageResponse)
+
+-- | The user that started the engagement.
+describePageResponse_sender :: Lens.Lens' DescribePageResponse Prelude.Text
+describePageResponse_sender = Lens.lens (\DescribePageResponse' {sender} -> sender) (\s@DescribePageResponse' {} a -> s {sender = a} :: DescribePageResponse)
+
+-- | The secure subject of the message that was sent to the contact. Use this
+-- field for engagements to @VOICE@ and @EMAIL@.
+describePageResponse_subject :: Lens.Lens' DescribePageResponse Prelude.Text
+describePageResponse_subject = Lens.lens (\DescribePageResponse' {subject} -> subject) (\s@DescribePageResponse' {} a -> s {subject = a} :: DescribePageResponse)
+
+-- | The secure content of the message that was sent to the contact. Use this
+-- field for engagements to @VOICE@ and @EMAIL@.
+describePageResponse_content :: Lens.Lens' DescribePageResponse Prelude.Text
+describePageResponse_content = Lens.lens (\DescribePageResponse' {content} -> content) (\s@DescribePageResponse' {} a -> s {content = a} :: DescribePageResponse)
+
+instance Prelude.NFData DescribePageResponse where
+  rnf DescribePageResponse' {..} =
+    Prelude.rnf deliveryTime
+      `Prelude.seq` Prelude.rnf incidentId
+      `Prelude.seq` Prelude.rnf publicContent
+      `Prelude.seq` Prelude.rnf publicSubject
+      `Prelude.seq` Prelude.rnf readTime
+      `Prelude.seq` Prelude.rnf sentTime
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf pageArn
+      `Prelude.seq` Prelude.rnf engagementArn
+      `Prelude.seq` Prelude.rnf contactArn
+      `Prelude.seq` Prelude.rnf sender
+      `Prelude.seq` Prelude.rnf subject
+      `Prelude.seq` Prelude.rnf content
diff --git a/gen/Amazonka/SSMContacts/GetContact.hs b/gen/Amazonka/SSMContacts/GetContact.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/GetContact.hs
@@ -0,0 +1,230 @@
+{-# 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.SSMContacts.GetContact
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about the specified contact or escalation plan.
+module Amazonka.SSMContacts.GetContact
+  ( -- * Creating a Request
+    GetContact (..),
+    newGetContact,
+
+    -- * Request Lenses
+    getContact_contactId,
+
+    -- * Destructuring the Response
+    GetContactResponse (..),
+    newGetContactResponse,
+
+    -- * Response Lenses
+    getContactResponse_displayName,
+    getContactResponse_httpStatus,
+    getContactResponse_contactArn,
+    getContactResponse_alias,
+    getContactResponse_type,
+    getContactResponse_plan,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newGetContact' smart constructor.
+data GetContact = GetContact'
+  { -- | The Amazon Resource Name (ARN) of the contact or escalation plan.
+    contactId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetContact' 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:
+--
+-- 'contactId', 'getContact_contactId' - The Amazon Resource Name (ARN) of the contact or escalation plan.
+newGetContact ::
+  -- | 'contactId'
+  Prelude.Text ->
+  GetContact
+newGetContact pContactId_ =
+  GetContact' {contactId = pContactId_}
+
+-- | The Amazon Resource Name (ARN) of the contact or escalation plan.
+getContact_contactId :: Lens.Lens' GetContact Prelude.Text
+getContact_contactId = Lens.lens (\GetContact' {contactId} -> contactId) (\s@GetContact' {} a -> s {contactId = a} :: GetContact)
+
+instance Core.AWSRequest GetContact where
+  type AWSResponse GetContact = GetContactResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetContactResponse'
+            Prelude.<$> (x Data..?> "DisplayName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "ContactArn")
+            Prelude.<*> (x Data..:> "Alias")
+            Prelude.<*> (x Data..:> "Type")
+            Prelude.<*> (x Data..:> "Plan")
+      )
+
+instance Prelude.Hashable GetContact where
+  hashWithSalt _salt GetContact' {..} =
+    _salt `Prelude.hashWithSalt` contactId
+
+instance Prelude.NFData GetContact where
+  rnf GetContact' {..} = Prelude.rnf contactId
+
+instance Data.ToHeaders GetContact where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("SSMContacts.GetContact" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetContact where
+  toJSON GetContact' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("ContactId" Data..= contactId)]
+      )
+
+instance Data.ToPath GetContact where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetContact where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetContactResponse' smart constructor.
+data GetContactResponse = GetContactResponse'
+  { -- | The full name of the contact or escalation plan.
+    displayName :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ARN of the contact or escalation plan.
+    contactArn :: Prelude.Text,
+    -- | The alias of the contact or escalation plan. The alias is unique and
+    -- identifiable.
+    alias :: Prelude.Text,
+    -- | The type of contact, either @PERSONAL@ or @ESCALATION@.
+    type' :: ContactType,
+    -- | Details about the specific timing or stages and targets of the
+    -- escalation plan or engagement plan.
+    plan :: Plan
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetContactResponse' 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:
+--
+-- 'displayName', 'getContactResponse_displayName' - The full name of the contact or escalation plan.
+--
+-- 'httpStatus', 'getContactResponse_httpStatus' - The response's http status code.
+--
+-- 'contactArn', 'getContactResponse_contactArn' - The ARN of the contact or escalation plan.
+--
+-- 'alias', 'getContactResponse_alias' - The alias of the contact or escalation plan. The alias is unique and
+-- identifiable.
+--
+-- 'type'', 'getContactResponse_type' - The type of contact, either @PERSONAL@ or @ESCALATION@.
+--
+-- 'plan', 'getContactResponse_plan' - Details about the specific timing or stages and targets of the
+-- escalation plan or engagement plan.
+newGetContactResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'contactArn'
+  Prelude.Text ->
+  -- | 'alias'
+  Prelude.Text ->
+  -- | 'type''
+  ContactType ->
+  -- | 'plan'
+  Plan ->
+  GetContactResponse
+newGetContactResponse
+  pHttpStatus_
+  pContactArn_
+  pAlias_
+  pType_
+  pPlan_ =
+    GetContactResponse'
+      { displayName = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        contactArn = pContactArn_,
+        alias = pAlias_,
+        type' = pType_,
+        plan = pPlan_
+      }
+
+-- | The full name of the contact or escalation plan.
+getContactResponse_displayName :: Lens.Lens' GetContactResponse (Prelude.Maybe Prelude.Text)
+getContactResponse_displayName = Lens.lens (\GetContactResponse' {displayName} -> displayName) (\s@GetContactResponse' {} a -> s {displayName = a} :: GetContactResponse)
+
+-- | The response's http status code.
+getContactResponse_httpStatus :: Lens.Lens' GetContactResponse Prelude.Int
+getContactResponse_httpStatus = Lens.lens (\GetContactResponse' {httpStatus} -> httpStatus) (\s@GetContactResponse' {} a -> s {httpStatus = a} :: GetContactResponse)
+
+-- | The ARN of the contact or escalation plan.
+getContactResponse_contactArn :: Lens.Lens' GetContactResponse Prelude.Text
+getContactResponse_contactArn = Lens.lens (\GetContactResponse' {contactArn} -> contactArn) (\s@GetContactResponse' {} a -> s {contactArn = a} :: GetContactResponse)
+
+-- | The alias of the contact or escalation plan. The alias is unique and
+-- identifiable.
+getContactResponse_alias :: Lens.Lens' GetContactResponse Prelude.Text
+getContactResponse_alias = Lens.lens (\GetContactResponse' {alias} -> alias) (\s@GetContactResponse' {} a -> s {alias = a} :: GetContactResponse)
+
+-- | The type of contact, either @PERSONAL@ or @ESCALATION@.
+getContactResponse_type :: Lens.Lens' GetContactResponse ContactType
+getContactResponse_type = Lens.lens (\GetContactResponse' {type'} -> type') (\s@GetContactResponse' {} a -> s {type' = a} :: GetContactResponse)
+
+-- | Details about the specific timing or stages and targets of the
+-- escalation plan or engagement plan.
+getContactResponse_plan :: Lens.Lens' GetContactResponse Plan
+getContactResponse_plan = Lens.lens (\GetContactResponse' {plan} -> plan) (\s@GetContactResponse' {} a -> s {plan = a} :: GetContactResponse)
+
+instance Prelude.NFData GetContactResponse where
+  rnf GetContactResponse' {..} =
+    Prelude.rnf displayName
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf contactArn
+      `Prelude.seq` Prelude.rnf alias
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf plan
diff --git a/gen/Amazonka/SSMContacts/GetContactChannel.hs b/gen/Amazonka/SSMContacts/GetContactChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/GetContactChannel.hs
@@ -0,0 +1,259 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.SSMContacts.GetContactChannel
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- List details about a specific contact channel.
+module Amazonka.SSMContacts.GetContactChannel
+  ( -- * Creating a Request
+    GetContactChannel (..),
+    newGetContactChannel,
+
+    -- * Request Lenses
+    getContactChannel_contactChannelId,
+
+    -- * Destructuring the Response
+    GetContactChannelResponse (..),
+    newGetContactChannelResponse,
+
+    -- * Response Lenses
+    getContactChannelResponse_activationStatus,
+    getContactChannelResponse_httpStatus,
+    getContactChannelResponse_contactArn,
+    getContactChannelResponse_contactChannelArn,
+    getContactChannelResponse_name,
+    getContactChannelResponse_type,
+    getContactChannelResponse_deliveryAddress,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newGetContactChannel' smart constructor.
+data GetContactChannel = GetContactChannel'
+  { -- | The Amazon Resource Name (ARN) of the contact channel you want
+    -- information about.
+    contactChannelId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetContactChannel' 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:
+--
+-- 'contactChannelId', 'getContactChannel_contactChannelId' - The Amazon Resource Name (ARN) of the contact channel you want
+-- information about.
+newGetContactChannel ::
+  -- | 'contactChannelId'
+  Prelude.Text ->
+  GetContactChannel
+newGetContactChannel pContactChannelId_ =
+  GetContactChannel'
+    { contactChannelId =
+        pContactChannelId_
+    }
+
+-- | The Amazon Resource Name (ARN) of the contact channel you want
+-- information about.
+getContactChannel_contactChannelId :: Lens.Lens' GetContactChannel Prelude.Text
+getContactChannel_contactChannelId = Lens.lens (\GetContactChannel' {contactChannelId} -> contactChannelId) (\s@GetContactChannel' {} a -> s {contactChannelId = a} :: GetContactChannel)
+
+instance Core.AWSRequest GetContactChannel where
+  type
+    AWSResponse GetContactChannel =
+      GetContactChannelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetContactChannelResponse'
+            Prelude.<$> (x Data..?> "ActivationStatus")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "ContactArn")
+            Prelude.<*> (x Data..:> "ContactChannelArn")
+            Prelude.<*> (x Data..:> "Name")
+            Prelude.<*> (x Data..:> "Type")
+            Prelude.<*> (x Data..:> "DeliveryAddress")
+      )
+
+instance Prelude.Hashable GetContactChannel where
+  hashWithSalt _salt GetContactChannel' {..} =
+    _salt `Prelude.hashWithSalt` contactChannelId
+
+instance Prelude.NFData GetContactChannel where
+  rnf GetContactChannel' {..} =
+    Prelude.rnf contactChannelId
+
+instance Data.ToHeaders GetContactChannel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SSMContacts.GetContactChannel" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetContactChannel where
+  toJSON GetContactChannel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("ContactChannelId" Data..= contactChannelId)
+          ]
+      )
+
+instance Data.ToPath GetContactChannel where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetContactChannel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetContactChannelResponse' smart constructor.
+data GetContactChannelResponse = GetContactChannelResponse'
+  { -- | A Boolean value indicating if the contact channel has been activated or
+    -- not.
+    activationStatus :: Prelude.Maybe ActivationStatus,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ARN of the contact that the channel belongs to.
+    contactArn :: Prelude.Text,
+    -- | The ARN of the contact channel.
+    contactChannelArn :: Prelude.Text,
+    -- | The name of the contact channel
+    name :: Prelude.Text,
+    -- | The type of contact channel. The type is @SMS@, @VOICE@, or @EMAIL@.
+    type' :: ChannelType,
+    -- | The details that Incident Manager uses when trying to engage the contact
+    -- channel.
+    deliveryAddress :: ContactChannelAddress
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetContactChannelResponse' 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:
+--
+-- 'activationStatus', 'getContactChannelResponse_activationStatus' - A Boolean value indicating if the contact channel has been activated or
+-- not.
+--
+-- 'httpStatus', 'getContactChannelResponse_httpStatus' - The response's http status code.
+--
+-- 'contactArn', 'getContactChannelResponse_contactArn' - The ARN of the contact that the channel belongs to.
+--
+-- 'contactChannelArn', 'getContactChannelResponse_contactChannelArn' - The ARN of the contact channel.
+--
+-- 'name', 'getContactChannelResponse_name' - The name of the contact channel
+--
+-- 'type'', 'getContactChannelResponse_type' - The type of contact channel. The type is @SMS@, @VOICE@, or @EMAIL@.
+--
+-- 'deliveryAddress', 'getContactChannelResponse_deliveryAddress' - The details that Incident Manager uses when trying to engage the contact
+-- channel.
+newGetContactChannelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'contactArn'
+  Prelude.Text ->
+  -- | 'contactChannelArn'
+  Prelude.Text ->
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'type''
+  ChannelType ->
+  -- | 'deliveryAddress'
+  ContactChannelAddress ->
+  GetContactChannelResponse
+newGetContactChannelResponse
+  pHttpStatus_
+  pContactArn_
+  pContactChannelArn_
+  pName_
+  pType_
+  pDeliveryAddress_ =
+    GetContactChannelResponse'
+      { activationStatus =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        contactArn = pContactArn_,
+        contactChannelArn = pContactChannelArn_,
+        name = pName_,
+        type' = pType_,
+        deliveryAddress = pDeliveryAddress_
+      }
+
+-- | A Boolean value indicating if the contact channel has been activated or
+-- not.
+getContactChannelResponse_activationStatus :: Lens.Lens' GetContactChannelResponse (Prelude.Maybe ActivationStatus)
+getContactChannelResponse_activationStatus = Lens.lens (\GetContactChannelResponse' {activationStatus} -> activationStatus) (\s@GetContactChannelResponse' {} a -> s {activationStatus = a} :: GetContactChannelResponse)
+
+-- | The response's http status code.
+getContactChannelResponse_httpStatus :: Lens.Lens' GetContactChannelResponse Prelude.Int
+getContactChannelResponse_httpStatus = Lens.lens (\GetContactChannelResponse' {httpStatus} -> httpStatus) (\s@GetContactChannelResponse' {} a -> s {httpStatus = a} :: GetContactChannelResponse)
+
+-- | The ARN of the contact that the channel belongs to.
+getContactChannelResponse_contactArn :: Lens.Lens' GetContactChannelResponse Prelude.Text
+getContactChannelResponse_contactArn = Lens.lens (\GetContactChannelResponse' {contactArn} -> contactArn) (\s@GetContactChannelResponse' {} a -> s {contactArn = a} :: GetContactChannelResponse)
+
+-- | The ARN of the contact channel.
+getContactChannelResponse_contactChannelArn :: Lens.Lens' GetContactChannelResponse Prelude.Text
+getContactChannelResponse_contactChannelArn = Lens.lens (\GetContactChannelResponse' {contactChannelArn} -> contactChannelArn) (\s@GetContactChannelResponse' {} a -> s {contactChannelArn = a} :: GetContactChannelResponse)
+
+-- | The name of the contact channel
+getContactChannelResponse_name :: Lens.Lens' GetContactChannelResponse Prelude.Text
+getContactChannelResponse_name = Lens.lens (\GetContactChannelResponse' {name} -> name) (\s@GetContactChannelResponse' {} a -> s {name = a} :: GetContactChannelResponse)
+
+-- | The type of contact channel. The type is @SMS@, @VOICE@, or @EMAIL@.
+getContactChannelResponse_type :: Lens.Lens' GetContactChannelResponse ChannelType
+getContactChannelResponse_type = Lens.lens (\GetContactChannelResponse' {type'} -> type') (\s@GetContactChannelResponse' {} a -> s {type' = a} :: GetContactChannelResponse)
+
+-- | The details that Incident Manager uses when trying to engage the contact
+-- channel.
+getContactChannelResponse_deliveryAddress :: Lens.Lens' GetContactChannelResponse ContactChannelAddress
+getContactChannelResponse_deliveryAddress = Lens.lens (\GetContactChannelResponse' {deliveryAddress} -> deliveryAddress) (\s@GetContactChannelResponse' {} a -> s {deliveryAddress = a} :: GetContactChannelResponse)
+
+instance Prelude.NFData GetContactChannelResponse where
+  rnf GetContactChannelResponse' {..} =
+    Prelude.rnf activationStatus
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf contactArn
+      `Prelude.seq` Prelude.rnf contactChannelArn
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf deliveryAddress
diff --git a/gen/Amazonka/SSMContacts/GetContactPolicy.hs b/gen/Amazonka/SSMContacts/GetContactPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/GetContactPolicy.hs
@@ -0,0 +1,184 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.SSMContacts.GetContactPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves the resource policies attached to the specified contact or
+-- escalation plan.
+module Amazonka.SSMContacts.GetContactPolicy
+  ( -- * Creating a Request
+    GetContactPolicy (..),
+    newGetContactPolicy,
+
+    -- * Request Lenses
+    getContactPolicy_contactArn,
+
+    -- * Destructuring the Response
+    GetContactPolicyResponse (..),
+    newGetContactPolicyResponse,
+
+    -- * Response Lenses
+    getContactPolicyResponse_contactArn,
+    getContactPolicyResponse_policy,
+    getContactPolicyResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newGetContactPolicy' smart constructor.
+data GetContactPolicy = GetContactPolicy'
+  { -- | The Amazon Resource Name (ARN) of the contact or escalation plan.
+    contactArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetContactPolicy' 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:
+--
+-- 'contactArn', 'getContactPolicy_contactArn' - The Amazon Resource Name (ARN) of the contact or escalation plan.
+newGetContactPolicy ::
+  -- | 'contactArn'
+  Prelude.Text ->
+  GetContactPolicy
+newGetContactPolicy pContactArn_ =
+  GetContactPolicy' {contactArn = pContactArn_}
+
+-- | The Amazon Resource Name (ARN) of the contact or escalation plan.
+getContactPolicy_contactArn :: Lens.Lens' GetContactPolicy Prelude.Text
+getContactPolicy_contactArn = Lens.lens (\GetContactPolicy' {contactArn} -> contactArn) (\s@GetContactPolicy' {} a -> s {contactArn = a} :: GetContactPolicy)
+
+instance Core.AWSRequest GetContactPolicy where
+  type
+    AWSResponse GetContactPolicy =
+      GetContactPolicyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetContactPolicyResponse'
+            Prelude.<$> (x Data..?> "ContactArn")
+            Prelude.<*> (x Data..?> "Policy")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetContactPolicy where
+  hashWithSalt _salt GetContactPolicy' {..} =
+    _salt `Prelude.hashWithSalt` contactArn
+
+instance Prelude.NFData GetContactPolicy where
+  rnf GetContactPolicy' {..} = Prelude.rnf contactArn
+
+instance Data.ToHeaders GetContactPolicy where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SSMContacts.GetContactPolicy" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetContactPolicy where
+  toJSON GetContactPolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("ContactArn" Data..= contactArn)]
+      )
+
+instance Data.ToPath GetContactPolicy where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetContactPolicy where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetContactPolicyResponse' smart constructor.
+data GetContactPolicyResponse = GetContactPolicyResponse'
+  { -- | The ARN of the contact or escalation plan.
+    contactArn :: Prelude.Maybe Prelude.Text,
+    -- | Details about the resource policy attached to the contact or escalation
+    -- plan.
+    policy :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetContactPolicyResponse' 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:
+--
+-- 'contactArn', 'getContactPolicyResponse_contactArn' - The ARN of the contact or escalation plan.
+--
+-- 'policy', 'getContactPolicyResponse_policy' - Details about the resource policy attached to the contact or escalation
+-- plan.
+--
+-- 'httpStatus', 'getContactPolicyResponse_httpStatus' - The response's http status code.
+newGetContactPolicyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetContactPolicyResponse
+newGetContactPolicyResponse pHttpStatus_ =
+  GetContactPolicyResponse'
+    { contactArn =
+        Prelude.Nothing,
+      policy = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The ARN of the contact or escalation plan.
+getContactPolicyResponse_contactArn :: Lens.Lens' GetContactPolicyResponse (Prelude.Maybe Prelude.Text)
+getContactPolicyResponse_contactArn = Lens.lens (\GetContactPolicyResponse' {contactArn} -> contactArn) (\s@GetContactPolicyResponse' {} a -> s {contactArn = a} :: GetContactPolicyResponse)
+
+-- | Details about the resource policy attached to the contact or escalation
+-- plan.
+getContactPolicyResponse_policy :: Lens.Lens' GetContactPolicyResponse (Prelude.Maybe Prelude.Text)
+getContactPolicyResponse_policy = Lens.lens (\GetContactPolicyResponse' {policy} -> policy) (\s@GetContactPolicyResponse' {} a -> s {policy = a} :: GetContactPolicyResponse)
+
+-- | The response's http status code.
+getContactPolicyResponse_httpStatus :: Lens.Lens' GetContactPolicyResponse Prelude.Int
+getContactPolicyResponse_httpStatus = Lens.lens (\GetContactPolicyResponse' {httpStatus} -> httpStatus) (\s@GetContactPolicyResponse' {} a -> s {httpStatus = a} :: GetContactPolicyResponse)
+
+instance Prelude.NFData GetContactPolicyResponse where
+  rnf GetContactPolicyResponse' {..} =
+    Prelude.rnf contactArn
+      `Prelude.seq` Prelude.rnf policy
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/SSMContacts/Lens.hs b/gen/Amazonka/SSMContacts/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Lens.hs
@@ -0,0 +1,332 @@
+{-# 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.SSMContacts.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.SSMContacts.Lens
+  ( -- * Operations
+
+    -- ** AcceptPage
+    acceptPage_acceptCodeValidation,
+    acceptPage_contactChannelId,
+    acceptPage_note,
+    acceptPage_pageId,
+    acceptPage_acceptType,
+    acceptPage_acceptCode,
+    acceptPageResponse_httpStatus,
+
+    -- ** ActivateContactChannel
+    activateContactChannel_contactChannelId,
+    activateContactChannel_activationCode,
+    activateContactChannelResponse_httpStatus,
+
+    -- ** CreateContact
+    createContact_displayName,
+    createContact_idempotencyToken,
+    createContact_tags,
+    createContact_alias,
+    createContact_type,
+    createContact_plan,
+    createContactResponse_httpStatus,
+    createContactResponse_contactArn,
+
+    -- ** CreateContactChannel
+    createContactChannel_deferActivation,
+    createContactChannel_idempotencyToken,
+    createContactChannel_contactId,
+    createContactChannel_name,
+    createContactChannel_type,
+    createContactChannel_deliveryAddress,
+    createContactChannelResponse_httpStatus,
+    createContactChannelResponse_contactChannelArn,
+
+    -- ** DeactivateContactChannel
+    deactivateContactChannel_contactChannelId,
+    deactivateContactChannelResponse_httpStatus,
+
+    -- ** DeleteContact
+    deleteContact_contactId,
+    deleteContactResponse_httpStatus,
+
+    -- ** DeleteContactChannel
+    deleteContactChannel_contactChannelId,
+    deleteContactChannelResponse_httpStatus,
+
+    -- ** DescribeEngagement
+    describeEngagement_engagementId,
+    describeEngagementResponse_incidentId,
+    describeEngagementResponse_publicContent,
+    describeEngagementResponse_publicSubject,
+    describeEngagementResponse_startTime,
+    describeEngagementResponse_stopTime,
+    describeEngagementResponse_httpStatus,
+    describeEngagementResponse_contactArn,
+    describeEngagementResponse_engagementArn,
+    describeEngagementResponse_sender,
+    describeEngagementResponse_subject,
+    describeEngagementResponse_content,
+
+    -- ** DescribePage
+    describePage_pageId,
+    describePageResponse_deliveryTime,
+    describePageResponse_incidentId,
+    describePageResponse_publicContent,
+    describePageResponse_publicSubject,
+    describePageResponse_readTime,
+    describePageResponse_sentTime,
+    describePageResponse_httpStatus,
+    describePageResponse_pageArn,
+    describePageResponse_engagementArn,
+    describePageResponse_contactArn,
+    describePageResponse_sender,
+    describePageResponse_subject,
+    describePageResponse_content,
+
+    -- ** GetContact
+    getContact_contactId,
+    getContactResponse_displayName,
+    getContactResponse_httpStatus,
+    getContactResponse_contactArn,
+    getContactResponse_alias,
+    getContactResponse_type,
+    getContactResponse_plan,
+
+    -- ** GetContactChannel
+    getContactChannel_contactChannelId,
+    getContactChannelResponse_activationStatus,
+    getContactChannelResponse_httpStatus,
+    getContactChannelResponse_contactArn,
+    getContactChannelResponse_contactChannelArn,
+    getContactChannelResponse_name,
+    getContactChannelResponse_type,
+    getContactChannelResponse_deliveryAddress,
+
+    -- ** GetContactPolicy
+    getContactPolicy_contactArn,
+    getContactPolicyResponse_contactArn,
+    getContactPolicyResponse_policy,
+    getContactPolicyResponse_httpStatus,
+
+    -- ** ListContactChannels
+    listContactChannels_maxResults,
+    listContactChannels_nextToken,
+    listContactChannels_contactId,
+    listContactChannelsResponse_nextToken,
+    listContactChannelsResponse_httpStatus,
+    listContactChannelsResponse_contactChannels,
+
+    -- ** ListContacts
+    listContacts_aliasPrefix,
+    listContacts_maxResults,
+    listContacts_nextToken,
+    listContacts_type,
+    listContactsResponse_contacts,
+    listContactsResponse_nextToken,
+    listContactsResponse_httpStatus,
+
+    -- ** ListEngagements
+    listEngagements_incidentId,
+    listEngagements_maxResults,
+    listEngagements_nextToken,
+    listEngagements_timeRangeValue,
+    listEngagementsResponse_nextToken,
+    listEngagementsResponse_httpStatus,
+    listEngagementsResponse_engagements,
+
+    -- ** ListPageReceipts
+    listPageReceipts_maxResults,
+    listPageReceipts_nextToken,
+    listPageReceipts_pageId,
+    listPageReceiptsResponse_nextToken,
+    listPageReceiptsResponse_receipts,
+    listPageReceiptsResponse_httpStatus,
+
+    -- ** ListPagesByContact
+    listPagesByContact_maxResults,
+    listPagesByContact_nextToken,
+    listPagesByContact_contactId,
+    listPagesByContactResponse_nextToken,
+    listPagesByContactResponse_httpStatus,
+    listPagesByContactResponse_pages,
+
+    -- ** ListPagesByEngagement
+    listPagesByEngagement_maxResults,
+    listPagesByEngagement_nextToken,
+    listPagesByEngagement_engagementId,
+    listPagesByEngagementResponse_nextToken,
+    listPagesByEngagementResponse_httpStatus,
+    listPagesByEngagementResponse_pages,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceARN,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** PutContactPolicy
+    putContactPolicy_contactArn,
+    putContactPolicy_policy,
+    putContactPolicyResponse_httpStatus,
+
+    -- ** SendActivationCode
+    sendActivationCode_contactChannelId,
+    sendActivationCodeResponse_httpStatus,
+
+    -- ** StartEngagement
+    startEngagement_idempotencyToken,
+    startEngagement_incidentId,
+    startEngagement_publicContent,
+    startEngagement_publicSubject,
+    startEngagement_contactId,
+    startEngagement_sender,
+    startEngagement_subject,
+    startEngagement_content,
+    startEngagementResponse_httpStatus,
+    startEngagementResponse_engagementArn,
+
+    -- ** StopEngagement
+    stopEngagement_reason,
+    stopEngagement_engagementId,
+    stopEngagementResponse_httpStatus,
+
+    -- ** TagResource
+    tagResource_resourceARN,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceARN,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateContact
+    updateContact_displayName,
+    updateContact_plan,
+    updateContact_contactId,
+    updateContactResponse_httpStatus,
+
+    -- ** UpdateContactChannel
+    updateContactChannel_deliveryAddress,
+    updateContactChannel_name,
+    updateContactChannel_contactChannelId,
+    updateContactChannelResponse_httpStatus,
+
+    -- * Types
+
+    -- ** ChannelTargetInfo
+    channelTargetInfo_retryIntervalInMinutes,
+    channelTargetInfo_contactChannelId,
+
+    -- ** Contact
+    contact_displayName,
+    contact_contactArn,
+    contact_alias,
+    contact_type,
+
+    -- ** ContactChannel
+    contactChannel_type,
+    contactChannel_contactChannelArn,
+    contactChannel_contactArn,
+    contactChannel_name,
+    contactChannel_deliveryAddress,
+    contactChannel_activationStatus,
+
+    -- ** ContactChannelAddress
+    contactChannelAddress_simpleAddress,
+
+    -- ** ContactTargetInfo
+    contactTargetInfo_contactId,
+    contactTargetInfo_isEssential,
+
+    -- ** Engagement
+    engagement_incidentId,
+    engagement_startTime,
+    engagement_stopTime,
+    engagement_engagementArn,
+    engagement_contactArn,
+    engagement_sender,
+
+    -- ** Page
+    page_deliveryTime,
+    page_incidentId,
+    page_readTime,
+    page_sentTime,
+    page_pageArn,
+    page_engagementArn,
+    page_contactArn,
+    page_sender,
+
+    -- ** Plan
+    plan_stages,
+
+    -- ** Receipt
+    receipt_contactChannelArn,
+    receipt_receiptInfo,
+    receipt_receiptType,
+    receipt_receiptTime,
+
+    -- ** Stage
+    stage_durationInMinutes,
+    stage_targets,
+
+    -- ** Tag
+    tag_key,
+    tag_value,
+
+    -- ** Target
+    target_channelTargetInfo,
+    target_contactTargetInfo,
+
+    -- ** TimeRange
+    timeRange_endTime,
+    timeRange_startTime,
+  )
+where
+
+import Amazonka.SSMContacts.AcceptPage
+import Amazonka.SSMContacts.ActivateContactChannel
+import Amazonka.SSMContacts.CreateContact
+import Amazonka.SSMContacts.CreateContactChannel
+import Amazonka.SSMContacts.DeactivateContactChannel
+import Amazonka.SSMContacts.DeleteContact
+import Amazonka.SSMContacts.DeleteContactChannel
+import Amazonka.SSMContacts.DescribeEngagement
+import Amazonka.SSMContacts.DescribePage
+import Amazonka.SSMContacts.GetContact
+import Amazonka.SSMContacts.GetContactChannel
+import Amazonka.SSMContacts.GetContactPolicy
+import Amazonka.SSMContacts.ListContactChannels
+import Amazonka.SSMContacts.ListContacts
+import Amazonka.SSMContacts.ListEngagements
+import Amazonka.SSMContacts.ListPageReceipts
+import Amazonka.SSMContacts.ListPagesByContact
+import Amazonka.SSMContacts.ListPagesByEngagement
+import Amazonka.SSMContacts.ListTagsForResource
+import Amazonka.SSMContacts.PutContactPolicy
+import Amazonka.SSMContacts.SendActivationCode
+import Amazonka.SSMContacts.StartEngagement
+import Amazonka.SSMContacts.StopEngagement
+import Amazonka.SSMContacts.TagResource
+import Amazonka.SSMContacts.Types.ChannelTargetInfo
+import Amazonka.SSMContacts.Types.Contact
+import Amazonka.SSMContacts.Types.ContactChannel
+import Amazonka.SSMContacts.Types.ContactChannelAddress
+import Amazonka.SSMContacts.Types.ContactTargetInfo
+import Amazonka.SSMContacts.Types.Engagement
+import Amazonka.SSMContacts.Types.Page
+import Amazonka.SSMContacts.Types.Plan
+import Amazonka.SSMContacts.Types.Receipt
+import Amazonka.SSMContacts.Types.Stage
+import Amazonka.SSMContacts.Types.Tag
+import Amazonka.SSMContacts.Types.Target
+import Amazonka.SSMContacts.Types.TimeRange
+import Amazonka.SSMContacts.UntagResource
+import Amazonka.SSMContacts.UpdateContact
+import Amazonka.SSMContacts.UpdateContactChannel
diff --git a/gen/Amazonka/SSMContacts/ListContactChannels.hs b/gen/Amazonka/SSMContacts/ListContactChannels.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/ListContactChannels.hs
@@ -0,0 +1,237 @@
+{-# 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.SSMContacts.ListContactChannels
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all contact channels for the specified contact.
+--
+-- This operation returns paginated results.
+module Amazonka.SSMContacts.ListContactChannels
+  ( -- * Creating a Request
+    ListContactChannels (..),
+    newListContactChannels,
+
+    -- * Request Lenses
+    listContactChannels_maxResults,
+    listContactChannels_nextToken,
+    listContactChannels_contactId,
+
+    -- * Destructuring the Response
+    ListContactChannelsResponse (..),
+    newListContactChannelsResponse,
+
+    -- * Response Lenses
+    listContactChannelsResponse_nextToken,
+    listContactChannelsResponse_httpStatus,
+    listContactChannelsResponse_contactChannels,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newListContactChannels' smart constructor.
+data ListContactChannels = ListContactChannels'
+  { -- | The maximum number of contact channels per page.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The pagination token to continue to the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the contact.
+    contactId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListContactChannels' 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', 'listContactChannels_maxResults' - The maximum number of contact channels per page.
+--
+-- 'nextToken', 'listContactChannels_nextToken' - The pagination token to continue to the next page of results.
+--
+-- 'contactId', 'listContactChannels_contactId' - The Amazon Resource Name (ARN) of the contact.
+newListContactChannels ::
+  -- | 'contactId'
+  Prelude.Text ->
+  ListContactChannels
+newListContactChannels pContactId_ =
+  ListContactChannels'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      contactId = pContactId_
+    }
+
+-- | The maximum number of contact channels per page.
+listContactChannels_maxResults :: Lens.Lens' ListContactChannels (Prelude.Maybe Prelude.Natural)
+listContactChannels_maxResults = Lens.lens (\ListContactChannels' {maxResults} -> maxResults) (\s@ListContactChannels' {} a -> s {maxResults = a} :: ListContactChannels)
+
+-- | The pagination token to continue to the next page of results.
+listContactChannels_nextToken :: Lens.Lens' ListContactChannels (Prelude.Maybe Prelude.Text)
+listContactChannels_nextToken = Lens.lens (\ListContactChannels' {nextToken} -> nextToken) (\s@ListContactChannels' {} a -> s {nextToken = a} :: ListContactChannels)
+
+-- | The Amazon Resource Name (ARN) of the contact.
+listContactChannels_contactId :: Lens.Lens' ListContactChannels Prelude.Text
+listContactChannels_contactId = Lens.lens (\ListContactChannels' {contactId} -> contactId) (\s@ListContactChannels' {} a -> s {contactId = a} :: ListContactChannels)
+
+instance Core.AWSPager ListContactChannels where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listContactChannelsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^. listContactChannelsResponse_contactChannels
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listContactChannels_nextToken
+          Lens..~ rs
+          Lens.^? listContactChannelsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListContactChannels where
+  type
+    AWSResponse ListContactChannels =
+      ListContactChannelsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListContactChannelsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "ContactChannels"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListContactChannels where
+  hashWithSalt _salt ListContactChannels' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` contactId
+
+instance Prelude.NFData ListContactChannels where
+  rnf ListContactChannels' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf contactId
+
+instance Data.ToHeaders ListContactChannels where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SSMContacts.ListContactChannels" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListContactChannels where
+  toJSON ListContactChannels' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("ContactId" Data..= contactId)
+          ]
+      )
+
+instance Data.ToPath ListContactChannels where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListContactChannels where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListContactChannelsResponse' smart constructor.
+data ListContactChannelsResponse = ListContactChannelsResponse'
+  { -- | The pagination token to continue to the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list of contact channels related to the specified contact.
+    contactChannels :: [ContactChannel]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListContactChannelsResponse' 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', 'listContactChannelsResponse_nextToken' - The pagination token to continue to the next page of results.
+--
+-- 'httpStatus', 'listContactChannelsResponse_httpStatus' - The response's http status code.
+--
+-- 'contactChannels', 'listContactChannelsResponse_contactChannels' - A list of contact channels related to the specified contact.
+newListContactChannelsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListContactChannelsResponse
+newListContactChannelsResponse pHttpStatus_ =
+  ListContactChannelsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      contactChannels = Prelude.mempty
+    }
+
+-- | The pagination token to continue to the next page of results.
+listContactChannelsResponse_nextToken :: Lens.Lens' ListContactChannelsResponse (Prelude.Maybe Prelude.Text)
+listContactChannelsResponse_nextToken = Lens.lens (\ListContactChannelsResponse' {nextToken} -> nextToken) (\s@ListContactChannelsResponse' {} a -> s {nextToken = a} :: ListContactChannelsResponse)
+
+-- | The response's http status code.
+listContactChannelsResponse_httpStatus :: Lens.Lens' ListContactChannelsResponse Prelude.Int
+listContactChannelsResponse_httpStatus = Lens.lens (\ListContactChannelsResponse' {httpStatus} -> httpStatus) (\s@ListContactChannelsResponse' {} a -> s {httpStatus = a} :: ListContactChannelsResponse)
+
+-- | A list of contact channels related to the specified contact.
+listContactChannelsResponse_contactChannels :: Lens.Lens' ListContactChannelsResponse [ContactChannel]
+listContactChannelsResponse_contactChannels = Lens.lens (\ListContactChannelsResponse' {contactChannels} -> contactChannels) (\s@ListContactChannelsResponse' {} a -> s {contactChannels = a} :: ListContactChannelsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListContactChannelsResponse where
+  rnf ListContactChannelsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf contactChannels
diff --git a/gen/Amazonka/SSMContacts/ListContacts.hs b/gen/Amazonka/SSMContacts/ListContacts.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/ListContacts.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.SSMContacts.ListContacts
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all contacts and escalation plans in Incident Manager.
+--
+-- This operation returns paginated results.
+module Amazonka.SSMContacts.ListContacts
+  ( -- * Creating a Request
+    ListContacts (..),
+    newListContacts,
+
+    -- * Request Lenses
+    listContacts_aliasPrefix,
+    listContacts_maxResults,
+    listContacts_nextToken,
+    listContacts_type,
+
+    -- * Destructuring the Response
+    ListContactsResponse (..),
+    newListContactsResponse,
+
+    -- * Response Lenses
+    listContactsResponse_contacts,
+    listContactsResponse_nextToken,
+    listContactsResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newListContacts' smart constructor.
+data ListContacts = ListContacts'
+  { -- | Used to list only contacts who\'s aliases start with the specified
+    -- prefix.
+    aliasPrefix :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of contacts and escalation plans per page of results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The pagination token to continue to the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The type of contact. A contact is type @PERSONAL@ and an escalation plan
+    -- is type @ESCALATION@.
+    type' :: Prelude.Maybe ContactType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListContacts' 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:
+--
+-- 'aliasPrefix', 'listContacts_aliasPrefix' - Used to list only contacts who\'s aliases start with the specified
+-- prefix.
+--
+-- 'maxResults', 'listContacts_maxResults' - The maximum number of contacts and escalation plans per page of results.
+--
+-- 'nextToken', 'listContacts_nextToken' - The pagination token to continue to the next page of results.
+--
+-- 'type'', 'listContacts_type' - The type of contact. A contact is type @PERSONAL@ and an escalation plan
+-- is type @ESCALATION@.
+newListContacts ::
+  ListContacts
+newListContacts =
+  ListContacts'
+    { aliasPrefix = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      type' = Prelude.Nothing
+    }
+
+-- | Used to list only contacts who\'s aliases start with the specified
+-- prefix.
+listContacts_aliasPrefix :: Lens.Lens' ListContacts (Prelude.Maybe Prelude.Text)
+listContacts_aliasPrefix = Lens.lens (\ListContacts' {aliasPrefix} -> aliasPrefix) (\s@ListContacts' {} a -> s {aliasPrefix = a} :: ListContacts)
+
+-- | The maximum number of contacts and escalation plans per page of results.
+listContacts_maxResults :: Lens.Lens' ListContacts (Prelude.Maybe Prelude.Natural)
+listContacts_maxResults = Lens.lens (\ListContacts' {maxResults} -> maxResults) (\s@ListContacts' {} a -> s {maxResults = a} :: ListContacts)
+
+-- | The pagination token to continue to the next page of results.
+listContacts_nextToken :: Lens.Lens' ListContacts (Prelude.Maybe Prelude.Text)
+listContacts_nextToken = Lens.lens (\ListContacts' {nextToken} -> nextToken) (\s@ListContacts' {} a -> s {nextToken = a} :: ListContacts)
+
+-- | The type of contact. A contact is type @PERSONAL@ and an escalation plan
+-- is type @ESCALATION@.
+listContacts_type :: Lens.Lens' ListContacts (Prelude.Maybe ContactType)
+listContacts_type = Lens.lens (\ListContacts' {type'} -> type') (\s@ListContacts' {} a -> s {type' = a} :: ListContacts)
+
+instance Core.AWSPager ListContacts where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listContactsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listContactsResponse_contacts
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listContacts_nextToken
+          Lens..~ rs
+          Lens.^? listContactsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListContacts where
+  type AWSResponse ListContacts = ListContactsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListContactsResponse'
+            Prelude.<$> (x Data..?> "Contacts" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListContacts where
+  hashWithSalt _salt ListContacts' {..} =
+    _salt
+      `Prelude.hashWithSalt` aliasPrefix
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData ListContacts where
+  rnf ListContacts' {..} =
+    Prelude.rnf aliasPrefix
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToHeaders ListContacts where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("SSMContacts.ListContacts" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListContacts where
+  toJSON ListContacts' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AliasPrefix" Data..=) Prelude.<$> aliasPrefix,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("Type" Data..=) Prelude.<$> type'
+          ]
+      )
+
+instance Data.ToPath ListContacts where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListContacts where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListContactsResponse' smart constructor.
+data ListContactsResponse = ListContactsResponse'
+  { -- | A list of the contacts and escalation plans in your Incident Manager
+    -- account.
+    contacts :: Prelude.Maybe [Contact],
+    -- | The pagination token to continue to the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListContactsResponse' 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:
+--
+-- 'contacts', 'listContactsResponse_contacts' - A list of the contacts and escalation plans in your Incident Manager
+-- account.
+--
+-- 'nextToken', 'listContactsResponse_nextToken' - The pagination token to continue to the next page of results.
+--
+-- 'httpStatus', 'listContactsResponse_httpStatus' - The response's http status code.
+newListContactsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListContactsResponse
+newListContactsResponse pHttpStatus_ =
+  ListContactsResponse'
+    { contacts = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of the contacts and escalation plans in your Incident Manager
+-- account.
+listContactsResponse_contacts :: Lens.Lens' ListContactsResponse (Prelude.Maybe [Contact])
+listContactsResponse_contacts = Lens.lens (\ListContactsResponse' {contacts} -> contacts) (\s@ListContactsResponse' {} a -> s {contacts = a} :: ListContactsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The pagination token to continue to the next page of results.
+listContactsResponse_nextToken :: Lens.Lens' ListContactsResponse (Prelude.Maybe Prelude.Text)
+listContactsResponse_nextToken = Lens.lens (\ListContactsResponse' {nextToken} -> nextToken) (\s@ListContactsResponse' {} a -> s {nextToken = a} :: ListContactsResponse)
+
+-- | The response's http status code.
+listContactsResponse_httpStatus :: Lens.Lens' ListContactsResponse Prelude.Int
+listContactsResponse_httpStatus = Lens.lens (\ListContactsResponse' {httpStatus} -> httpStatus) (\s@ListContactsResponse' {} a -> s {httpStatus = a} :: ListContactsResponse)
+
+instance Prelude.NFData ListContactsResponse where
+  rnf ListContactsResponse' {..} =
+    Prelude.rnf contacts
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/SSMContacts/ListEngagements.hs b/gen/Amazonka/SSMContacts/ListEngagements.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/ListEngagements.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.SSMContacts.ListEngagements
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all engagements that have happened in an incident.
+--
+-- This operation returns paginated results.
+module Amazonka.SSMContacts.ListEngagements
+  ( -- * Creating a Request
+    ListEngagements (..),
+    newListEngagements,
+
+    -- * Request Lenses
+    listEngagements_incidentId,
+    listEngagements_maxResults,
+    listEngagements_nextToken,
+    listEngagements_timeRangeValue,
+
+    -- * Destructuring the Response
+    ListEngagementsResponse (..),
+    newListEngagementsResponse,
+
+    -- * Response Lenses
+    listEngagementsResponse_nextToken,
+    listEngagementsResponse_httpStatus,
+    listEngagementsResponse_engagements,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newListEngagements' smart constructor.
+data ListEngagements = ListEngagements'
+  { -- | The Amazon Resource Name (ARN) of the incident you\'re listing
+    -- engagements for.
+    incidentId :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of engagements per page of results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The pagination token to continue to the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The time range to lists engagements for an incident.
+    timeRangeValue :: Prelude.Maybe TimeRange
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListEngagements' 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:
+--
+-- 'incidentId', 'listEngagements_incidentId' - The Amazon Resource Name (ARN) of the incident you\'re listing
+-- engagements for.
+--
+-- 'maxResults', 'listEngagements_maxResults' - The maximum number of engagements per page of results.
+--
+-- 'nextToken', 'listEngagements_nextToken' - The pagination token to continue to the next page of results.
+--
+-- 'timeRangeValue', 'listEngagements_timeRangeValue' - The time range to lists engagements for an incident.
+newListEngagements ::
+  ListEngagements
+newListEngagements =
+  ListEngagements'
+    { incidentId = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      timeRangeValue = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the incident you\'re listing
+-- engagements for.
+listEngagements_incidentId :: Lens.Lens' ListEngagements (Prelude.Maybe Prelude.Text)
+listEngagements_incidentId = Lens.lens (\ListEngagements' {incidentId} -> incidentId) (\s@ListEngagements' {} a -> s {incidentId = a} :: ListEngagements)
+
+-- | The maximum number of engagements per page of results.
+listEngagements_maxResults :: Lens.Lens' ListEngagements (Prelude.Maybe Prelude.Natural)
+listEngagements_maxResults = Lens.lens (\ListEngagements' {maxResults} -> maxResults) (\s@ListEngagements' {} a -> s {maxResults = a} :: ListEngagements)
+
+-- | The pagination token to continue to the next page of results.
+listEngagements_nextToken :: Lens.Lens' ListEngagements (Prelude.Maybe Prelude.Text)
+listEngagements_nextToken = Lens.lens (\ListEngagements' {nextToken} -> nextToken) (\s@ListEngagements' {} a -> s {nextToken = a} :: ListEngagements)
+
+-- | The time range to lists engagements for an incident.
+listEngagements_timeRangeValue :: Lens.Lens' ListEngagements (Prelude.Maybe TimeRange)
+listEngagements_timeRangeValue = Lens.lens (\ListEngagements' {timeRangeValue} -> timeRangeValue) (\s@ListEngagements' {} a -> s {timeRangeValue = a} :: ListEngagements)
+
+instance Core.AWSPager ListEngagements where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listEngagementsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        (rs Lens.^. listEngagementsResponse_engagements) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listEngagements_nextToken
+          Lens..~ rs
+          Lens.^? listEngagementsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListEngagements where
+  type
+    AWSResponse ListEngagements =
+      ListEngagementsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListEngagementsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "Engagements" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListEngagements where
+  hashWithSalt _salt ListEngagements' {..} =
+    _salt
+      `Prelude.hashWithSalt` incidentId
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` timeRangeValue
+
+instance Prelude.NFData ListEngagements where
+  rnf ListEngagements' {..} =
+    Prelude.rnf incidentId
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf timeRangeValue
+
+instance Data.ToHeaders ListEngagements where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SSMContacts.ListEngagements" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListEngagements where
+  toJSON ListEngagements' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("IncidentId" Data..=) Prelude.<$> incidentId,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("TimeRangeValue" Data..=)
+              Prelude.<$> timeRangeValue
+          ]
+      )
+
+instance Data.ToPath ListEngagements where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListEngagements where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListEngagementsResponse' smart constructor.
+data ListEngagementsResponse = ListEngagementsResponse'
+  { -- | The pagination token to continue to the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list of each engagement that occurred during the specified time range
+    -- of an incident.
+    engagements :: [Engagement]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListEngagementsResponse' 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', 'listEngagementsResponse_nextToken' - The pagination token to continue to the next page of results.
+--
+-- 'httpStatus', 'listEngagementsResponse_httpStatus' - The response's http status code.
+--
+-- 'engagements', 'listEngagementsResponse_engagements' - A list of each engagement that occurred during the specified time range
+-- of an incident.
+newListEngagementsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListEngagementsResponse
+newListEngagementsResponse pHttpStatus_ =
+  ListEngagementsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      engagements = Prelude.mempty
+    }
+
+-- | The pagination token to continue to the next page of results.
+listEngagementsResponse_nextToken :: Lens.Lens' ListEngagementsResponse (Prelude.Maybe Prelude.Text)
+listEngagementsResponse_nextToken = Lens.lens (\ListEngagementsResponse' {nextToken} -> nextToken) (\s@ListEngagementsResponse' {} a -> s {nextToken = a} :: ListEngagementsResponse)
+
+-- | The response's http status code.
+listEngagementsResponse_httpStatus :: Lens.Lens' ListEngagementsResponse Prelude.Int
+listEngagementsResponse_httpStatus = Lens.lens (\ListEngagementsResponse' {httpStatus} -> httpStatus) (\s@ListEngagementsResponse' {} a -> s {httpStatus = a} :: ListEngagementsResponse)
+
+-- | A list of each engagement that occurred during the specified time range
+-- of an incident.
+listEngagementsResponse_engagements :: Lens.Lens' ListEngagementsResponse [Engagement]
+listEngagementsResponse_engagements = Lens.lens (\ListEngagementsResponse' {engagements} -> engagements) (\s@ListEngagementsResponse' {} a -> s {engagements = a} :: ListEngagementsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListEngagementsResponse where
+  rnf ListEngagementsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf engagements
diff --git a/gen/Amazonka/SSMContacts/ListPageReceipts.hs b/gen/Amazonka/SSMContacts/ListPageReceipts.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/ListPageReceipts.hs
@@ -0,0 +1,239 @@
+{-# 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.SSMContacts.ListPageReceipts
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all of the engagements to contact channels that have been
+-- acknowledged.
+--
+-- This operation returns paginated results.
+module Amazonka.SSMContacts.ListPageReceipts
+  ( -- * Creating a Request
+    ListPageReceipts (..),
+    newListPageReceipts,
+
+    -- * Request Lenses
+    listPageReceipts_maxResults,
+    listPageReceipts_nextToken,
+    listPageReceipts_pageId,
+
+    -- * Destructuring the Response
+    ListPageReceiptsResponse (..),
+    newListPageReceiptsResponse,
+
+    -- * Response Lenses
+    listPageReceiptsResponse_nextToken,
+    listPageReceiptsResponse_receipts,
+    listPageReceiptsResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newListPageReceipts' smart constructor.
+data ListPageReceipts = ListPageReceipts'
+  { -- | The maximum number of acknowledgements per page of results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The pagination token to continue to the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the engagement to a specific contact
+    -- channel.
+    pageId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPageReceipts' 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', 'listPageReceipts_maxResults' - The maximum number of acknowledgements per page of results.
+--
+-- 'nextToken', 'listPageReceipts_nextToken' - The pagination token to continue to the next page of results.
+--
+-- 'pageId', 'listPageReceipts_pageId' - The Amazon Resource Name (ARN) of the engagement to a specific contact
+-- channel.
+newListPageReceipts ::
+  -- | 'pageId'
+  Prelude.Text ->
+  ListPageReceipts
+newListPageReceipts pPageId_ =
+  ListPageReceipts'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      pageId = pPageId_
+    }
+
+-- | The maximum number of acknowledgements per page of results.
+listPageReceipts_maxResults :: Lens.Lens' ListPageReceipts (Prelude.Maybe Prelude.Natural)
+listPageReceipts_maxResults = Lens.lens (\ListPageReceipts' {maxResults} -> maxResults) (\s@ListPageReceipts' {} a -> s {maxResults = a} :: ListPageReceipts)
+
+-- | The pagination token to continue to the next page of results.
+listPageReceipts_nextToken :: Lens.Lens' ListPageReceipts (Prelude.Maybe Prelude.Text)
+listPageReceipts_nextToken = Lens.lens (\ListPageReceipts' {nextToken} -> nextToken) (\s@ListPageReceipts' {} a -> s {nextToken = a} :: ListPageReceipts)
+
+-- | The Amazon Resource Name (ARN) of the engagement to a specific contact
+-- channel.
+listPageReceipts_pageId :: Lens.Lens' ListPageReceipts Prelude.Text
+listPageReceipts_pageId = Lens.lens (\ListPageReceipts' {pageId} -> pageId) (\s@ListPageReceipts' {} a -> s {pageId = a} :: ListPageReceipts)
+
+instance Core.AWSPager ListPageReceipts where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listPageReceiptsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listPageReceiptsResponse_receipts
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listPageReceipts_nextToken
+          Lens..~ rs
+          Lens.^? listPageReceiptsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListPageReceipts where
+  type
+    AWSResponse ListPageReceipts =
+      ListPageReceiptsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListPageReceiptsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "Receipts" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListPageReceipts where
+  hashWithSalt _salt ListPageReceipts' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` pageId
+
+instance Prelude.NFData ListPageReceipts where
+  rnf ListPageReceipts' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf pageId
+
+instance Data.ToHeaders ListPageReceipts where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SSMContacts.ListPageReceipts" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListPageReceipts where
+  toJSON ListPageReceipts' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("PageId" Data..= pageId)
+          ]
+      )
+
+instance Data.ToPath ListPageReceipts where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListPageReceipts where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListPageReceiptsResponse' smart constructor.
+data ListPageReceiptsResponse = ListPageReceiptsResponse'
+  { -- | The pagination token to continue to the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of each acknowledgement.
+    receipts :: Prelude.Maybe [Receipt],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPageReceiptsResponse' 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', 'listPageReceiptsResponse_nextToken' - The pagination token to continue to the next page of results.
+--
+-- 'receipts', 'listPageReceiptsResponse_receipts' - A list of each acknowledgement.
+--
+-- 'httpStatus', 'listPageReceiptsResponse_httpStatus' - The response's http status code.
+newListPageReceiptsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListPageReceiptsResponse
+newListPageReceiptsResponse pHttpStatus_ =
+  ListPageReceiptsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      receipts = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The pagination token to continue to the next page of results.
+listPageReceiptsResponse_nextToken :: Lens.Lens' ListPageReceiptsResponse (Prelude.Maybe Prelude.Text)
+listPageReceiptsResponse_nextToken = Lens.lens (\ListPageReceiptsResponse' {nextToken} -> nextToken) (\s@ListPageReceiptsResponse' {} a -> s {nextToken = a} :: ListPageReceiptsResponse)
+
+-- | A list of each acknowledgement.
+listPageReceiptsResponse_receipts :: Lens.Lens' ListPageReceiptsResponse (Prelude.Maybe [Receipt])
+listPageReceiptsResponse_receipts = Lens.lens (\ListPageReceiptsResponse' {receipts} -> receipts) (\s@ListPageReceiptsResponse' {} a -> s {receipts = a} :: ListPageReceiptsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listPageReceiptsResponse_httpStatus :: Lens.Lens' ListPageReceiptsResponse Prelude.Int
+listPageReceiptsResponse_httpStatus = Lens.lens (\ListPageReceiptsResponse' {httpStatus} -> httpStatus) (\s@ListPageReceiptsResponse' {} a -> s {httpStatus = a} :: ListPageReceiptsResponse)
+
+instance Prelude.NFData ListPageReceiptsResponse where
+  rnf ListPageReceiptsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf receipts
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/SSMContacts/ListPagesByContact.hs b/gen/Amazonka/SSMContacts/ListPagesByContact.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/ListPagesByContact.hs
@@ -0,0 +1,238 @@
+{-# 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.SSMContacts.ListPagesByContact
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists the engagements to a contact\'s contact channels.
+--
+-- This operation returns paginated results.
+module Amazonka.SSMContacts.ListPagesByContact
+  ( -- * Creating a Request
+    ListPagesByContact (..),
+    newListPagesByContact,
+
+    -- * Request Lenses
+    listPagesByContact_maxResults,
+    listPagesByContact_nextToken,
+    listPagesByContact_contactId,
+
+    -- * Destructuring the Response
+    ListPagesByContactResponse (..),
+    newListPagesByContactResponse,
+
+    -- * Response Lenses
+    listPagesByContactResponse_nextToken,
+    listPagesByContactResponse_httpStatus,
+    listPagesByContactResponse_pages,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newListPagesByContact' smart constructor.
+data ListPagesByContact = ListPagesByContact'
+  { -- | The maximum number of engagements to contact channels to list per page
+    -- of results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The pagination token to continue to the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the contact you are retrieving
+    -- engagements for.
+    contactId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPagesByContact' 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', 'listPagesByContact_maxResults' - The maximum number of engagements to contact channels to list per page
+-- of results.
+--
+-- 'nextToken', 'listPagesByContact_nextToken' - The pagination token to continue to the next page of results.
+--
+-- 'contactId', 'listPagesByContact_contactId' - The Amazon Resource Name (ARN) of the contact you are retrieving
+-- engagements for.
+newListPagesByContact ::
+  -- | 'contactId'
+  Prelude.Text ->
+  ListPagesByContact
+newListPagesByContact pContactId_ =
+  ListPagesByContact'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      contactId = pContactId_
+    }
+
+-- | The maximum number of engagements to contact channels to list per page
+-- of results.
+listPagesByContact_maxResults :: Lens.Lens' ListPagesByContact (Prelude.Maybe Prelude.Natural)
+listPagesByContact_maxResults = Lens.lens (\ListPagesByContact' {maxResults} -> maxResults) (\s@ListPagesByContact' {} a -> s {maxResults = a} :: ListPagesByContact)
+
+-- | The pagination token to continue to the next page of results.
+listPagesByContact_nextToken :: Lens.Lens' ListPagesByContact (Prelude.Maybe Prelude.Text)
+listPagesByContact_nextToken = Lens.lens (\ListPagesByContact' {nextToken} -> nextToken) (\s@ListPagesByContact' {} a -> s {nextToken = a} :: ListPagesByContact)
+
+-- | The Amazon Resource Name (ARN) of the contact you are retrieving
+-- engagements for.
+listPagesByContact_contactId :: Lens.Lens' ListPagesByContact Prelude.Text
+listPagesByContact_contactId = Lens.lens (\ListPagesByContact' {contactId} -> contactId) (\s@ListPagesByContact' {} a -> s {contactId = a} :: ListPagesByContact)
+
+instance Core.AWSPager ListPagesByContact where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listPagesByContactResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        (rs Lens.^. listPagesByContactResponse_pages) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listPagesByContact_nextToken
+          Lens..~ rs
+          Lens.^? listPagesByContactResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListPagesByContact where
+  type
+    AWSResponse ListPagesByContact =
+      ListPagesByContactResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListPagesByContactResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "Pages" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListPagesByContact where
+  hashWithSalt _salt ListPagesByContact' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` contactId
+
+instance Prelude.NFData ListPagesByContact where
+  rnf ListPagesByContact' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf contactId
+
+instance Data.ToHeaders ListPagesByContact where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SSMContacts.ListPagesByContact" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListPagesByContact where
+  toJSON ListPagesByContact' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("ContactId" Data..= contactId)
+          ]
+      )
+
+instance Data.ToPath ListPagesByContact where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListPagesByContact where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListPagesByContactResponse' smart constructor.
+data ListPagesByContactResponse = ListPagesByContactResponse'
+  { -- | The pagination token to continue to the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The list of engagements to a contact\'s contact channel.
+    pages :: [Page]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPagesByContactResponse' 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', 'listPagesByContactResponse_nextToken' - The pagination token to continue to the next page of results.
+--
+-- 'httpStatus', 'listPagesByContactResponse_httpStatus' - The response's http status code.
+--
+-- 'pages', 'listPagesByContactResponse_pages' - The list of engagements to a contact\'s contact channel.
+newListPagesByContactResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListPagesByContactResponse
+newListPagesByContactResponse pHttpStatus_ =
+  ListPagesByContactResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      pages = Prelude.mempty
+    }
+
+-- | The pagination token to continue to the next page of results.
+listPagesByContactResponse_nextToken :: Lens.Lens' ListPagesByContactResponse (Prelude.Maybe Prelude.Text)
+listPagesByContactResponse_nextToken = Lens.lens (\ListPagesByContactResponse' {nextToken} -> nextToken) (\s@ListPagesByContactResponse' {} a -> s {nextToken = a} :: ListPagesByContactResponse)
+
+-- | The response's http status code.
+listPagesByContactResponse_httpStatus :: Lens.Lens' ListPagesByContactResponse Prelude.Int
+listPagesByContactResponse_httpStatus = Lens.lens (\ListPagesByContactResponse' {httpStatus} -> httpStatus) (\s@ListPagesByContactResponse' {} a -> s {httpStatus = a} :: ListPagesByContactResponse)
+
+-- | The list of engagements to a contact\'s contact channel.
+listPagesByContactResponse_pages :: Lens.Lens' ListPagesByContactResponse [Page]
+listPagesByContactResponse_pages = Lens.lens (\ListPagesByContactResponse' {pages} -> pages) (\s@ListPagesByContactResponse' {} a -> s {pages = a} :: ListPagesByContactResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListPagesByContactResponse where
+  rnf ListPagesByContactResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf pages
diff --git a/gen/Amazonka/SSMContacts/ListPagesByEngagement.hs b/gen/Amazonka/SSMContacts/ListPagesByEngagement.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/ListPagesByEngagement.hs
@@ -0,0 +1,237 @@
+{-# 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.SSMContacts.ListPagesByEngagement
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists the engagements to contact channels that occurred by engaging a
+-- contact.
+--
+-- This operation returns paginated results.
+module Amazonka.SSMContacts.ListPagesByEngagement
+  ( -- * Creating a Request
+    ListPagesByEngagement (..),
+    newListPagesByEngagement,
+
+    -- * Request Lenses
+    listPagesByEngagement_maxResults,
+    listPagesByEngagement_nextToken,
+    listPagesByEngagement_engagementId,
+
+    -- * Destructuring the Response
+    ListPagesByEngagementResponse (..),
+    newListPagesByEngagementResponse,
+
+    -- * Response Lenses
+    listPagesByEngagementResponse_nextToken,
+    listPagesByEngagementResponse_httpStatus,
+    listPagesByEngagementResponse_pages,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newListPagesByEngagement' smart constructor.
+data ListPagesByEngagement = ListPagesByEngagement'
+  { -- | The maximum number of engagements to contact channels to list per page
+    -- of results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The pagination token to continue to the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the engagement.
+    engagementId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPagesByEngagement' 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', 'listPagesByEngagement_maxResults' - The maximum number of engagements to contact channels to list per page
+-- of results.
+--
+-- 'nextToken', 'listPagesByEngagement_nextToken' - The pagination token to continue to the next page of results.
+--
+-- 'engagementId', 'listPagesByEngagement_engagementId' - The Amazon Resource Name (ARN) of the engagement.
+newListPagesByEngagement ::
+  -- | 'engagementId'
+  Prelude.Text ->
+  ListPagesByEngagement
+newListPagesByEngagement pEngagementId_ =
+  ListPagesByEngagement'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      engagementId = pEngagementId_
+    }
+
+-- | The maximum number of engagements to contact channels to list per page
+-- of results.
+listPagesByEngagement_maxResults :: Lens.Lens' ListPagesByEngagement (Prelude.Maybe Prelude.Natural)
+listPagesByEngagement_maxResults = Lens.lens (\ListPagesByEngagement' {maxResults} -> maxResults) (\s@ListPagesByEngagement' {} a -> s {maxResults = a} :: ListPagesByEngagement)
+
+-- | The pagination token to continue to the next page of results.
+listPagesByEngagement_nextToken :: Lens.Lens' ListPagesByEngagement (Prelude.Maybe Prelude.Text)
+listPagesByEngagement_nextToken = Lens.lens (\ListPagesByEngagement' {nextToken} -> nextToken) (\s@ListPagesByEngagement' {} a -> s {nextToken = a} :: ListPagesByEngagement)
+
+-- | The Amazon Resource Name (ARN) of the engagement.
+listPagesByEngagement_engagementId :: Lens.Lens' ListPagesByEngagement Prelude.Text
+listPagesByEngagement_engagementId = Lens.lens (\ListPagesByEngagement' {engagementId} -> engagementId) (\s@ListPagesByEngagement' {} a -> s {engagementId = a} :: ListPagesByEngagement)
+
+instance Core.AWSPager ListPagesByEngagement where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listPagesByEngagementResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        (rs Lens.^. listPagesByEngagementResponse_pages) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listPagesByEngagement_nextToken
+          Lens..~ rs
+          Lens.^? listPagesByEngagementResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListPagesByEngagement where
+  type
+    AWSResponse ListPagesByEngagement =
+      ListPagesByEngagementResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListPagesByEngagementResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "Pages" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListPagesByEngagement where
+  hashWithSalt _salt ListPagesByEngagement' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` engagementId
+
+instance Prelude.NFData ListPagesByEngagement where
+  rnf ListPagesByEngagement' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf engagementId
+
+instance Data.ToHeaders ListPagesByEngagement where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SSMContacts.ListPagesByEngagement" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListPagesByEngagement where
+  toJSON ListPagesByEngagement' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("EngagementId" Data..= engagementId)
+          ]
+      )
+
+instance Data.ToPath ListPagesByEngagement where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListPagesByEngagement where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListPagesByEngagementResponse' smart constructor.
+data ListPagesByEngagementResponse = ListPagesByEngagementResponse'
+  { -- | The pagination token to continue to the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The list of engagements to contact channels.
+    pages :: [Page]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPagesByEngagementResponse' 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', 'listPagesByEngagementResponse_nextToken' - The pagination token to continue to the next page of results.
+--
+-- 'httpStatus', 'listPagesByEngagementResponse_httpStatus' - The response's http status code.
+--
+-- 'pages', 'listPagesByEngagementResponse_pages' - The list of engagements to contact channels.
+newListPagesByEngagementResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListPagesByEngagementResponse
+newListPagesByEngagementResponse pHttpStatus_ =
+  ListPagesByEngagementResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      pages = Prelude.mempty
+    }
+
+-- | The pagination token to continue to the next page of results.
+listPagesByEngagementResponse_nextToken :: Lens.Lens' ListPagesByEngagementResponse (Prelude.Maybe Prelude.Text)
+listPagesByEngagementResponse_nextToken = Lens.lens (\ListPagesByEngagementResponse' {nextToken} -> nextToken) (\s@ListPagesByEngagementResponse' {} a -> s {nextToken = a} :: ListPagesByEngagementResponse)
+
+-- | The response's http status code.
+listPagesByEngagementResponse_httpStatus :: Lens.Lens' ListPagesByEngagementResponse Prelude.Int
+listPagesByEngagementResponse_httpStatus = Lens.lens (\ListPagesByEngagementResponse' {httpStatus} -> httpStatus) (\s@ListPagesByEngagementResponse' {} a -> s {httpStatus = a} :: ListPagesByEngagementResponse)
+
+-- | The list of engagements to contact channels.
+listPagesByEngagementResponse_pages :: Lens.Lens' ListPagesByEngagementResponse [Page]
+listPagesByEngagementResponse_pages = Lens.lens (\ListPagesByEngagementResponse' {pages} -> pages) (\s@ListPagesByEngagementResponse' {} a -> s {pages = a} :: ListPagesByEngagementResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListPagesByEngagementResponse where
+  rnf ListPagesByEngagementResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf pages
diff --git a/gen/Amazonka/SSMContacts/ListTagsForResource.hs b/gen/Amazonka/SSMContacts/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/ListTagsForResource.hs
@@ -0,0 +1,169 @@
+{-# 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.SSMContacts.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)
+--
+-- Lists the tags of an escalation plan or contact.
+module Amazonka.SSMContacts.ListTagsForResource
+  ( -- * Creating a Request
+    ListTagsForResource (..),
+    newListTagsForResource,
+
+    -- * Request Lenses
+    listTagsForResource_resourceARN,
+
+    -- * Destructuring the Response
+    ListTagsForResourceResponse (..),
+    newListTagsForResourceResponse,
+
+    -- * Response Lenses
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newListTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+  { -- | The Amazon Resource Name (ARN) of the contact or escalation plan.
+    resourceARN :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceARN', 'listTagsForResource_resourceARN' - The Amazon Resource Name (ARN) of the contact or escalation plan.
+newListTagsForResource ::
+  -- | 'resourceARN'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceARN_ =
+  ListTagsForResource' {resourceARN = pResourceARN_}
+
+-- | The Amazon Resource Name (ARN) of the contact or escalation plan.
+listTagsForResource_resourceARN :: Lens.Lens' ListTagsForResource Prelude.Text
+listTagsForResource_resourceARN = Lens.lens (\ListTagsForResource' {resourceARN} -> resourceARN) (\s@ListTagsForResource' {} a -> s {resourceARN = a} :: ListTagsForResource)
+
+instance Core.AWSRequest ListTagsForResource where
+  type
+    AWSResponse ListTagsForResource =
+      ListTagsForResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTagsForResourceResponse'
+            Prelude.<$> (x Data..?> "Tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTagsForResource where
+  hashWithSalt _salt ListTagsForResource' {..} =
+    _salt `Prelude.hashWithSalt` resourceARN
+
+instance Prelude.NFData ListTagsForResource where
+  rnf ListTagsForResource' {..} =
+    Prelude.rnf resourceARN
+
+instance Data.ToHeaders ListTagsForResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SSMContacts.ListTagsForResource" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListTagsForResource where
+  toJSON ListTagsForResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("ResourceARN" Data..= resourceARN)]
+      )
+
+instance Data.ToPath ListTagsForResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | The tags related to the contact or escalation plan.
+    tags :: Prelude.Maybe [Tag],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - The tags related to the contact or escalation plan.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { tags =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The tags related to the contact or escalation plan.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe [Tag])
+listTagsForResourceResponse_tags = Lens.lens (\ListTagsForResourceResponse' {tags} -> tags) (\s@ListTagsForResourceResponse' {} a -> s {tags = a} :: ListTagsForResourceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTagsForResourceResponse_httpStatus :: Lens.Lens' ListTagsForResourceResponse Prelude.Int
+listTagsForResourceResponse_httpStatus = Lens.lens (\ListTagsForResourceResponse' {httpStatus} -> httpStatus) (\s@ListTagsForResourceResponse' {} a -> s {httpStatus = a} :: ListTagsForResourceResponse)
+
+instance Prelude.NFData ListTagsForResourceResponse where
+  rnf ListTagsForResourceResponse' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/SSMContacts/PutContactPolicy.hs b/gen/Amazonka/SSMContacts/PutContactPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/PutContactPolicy.hs
@@ -0,0 +1,180 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.SSMContacts.PutContactPolicy
+-- 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 a resource policy to the specified contact or escalation plan. The
+-- resource policy is used to share the contact or escalation plan using
+-- Resource Access Manager (RAM). For more information about cross-account
+-- sharing, see
+-- <https://docs.aws.amazon.com/incident-manager/latest/userguide/xa.html Setting up cross-account functionality>.
+module Amazonka.SSMContacts.PutContactPolicy
+  ( -- * Creating a Request
+    PutContactPolicy (..),
+    newPutContactPolicy,
+
+    -- * Request Lenses
+    putContactPolicy_contactArn,
+    putContactPolicy_policy,
+
+    -- * Destructuring the Response
+    PutContactPolicyResponse (..),
+    newPutContactPolicyResponse,
+
+    -- * Response Lenses
+    putContactPolicyResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newPutContactPolicy' smart constructor.
+data PutContactPolicy = PutContactPolicy'
+  { -- | The Amazon Resource Name (ARN) of the contact or escalation plan.
+    contactArn :: Prelude.Text,
+    -- | Details of the resource policy.
+    policy :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutContactPolicy' 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:
+--
+-- 'contactArn', 'putContactPolicy_contactArn' - The Amazon Resource Name (ARN) of the contact or escalation plan.
+--
+-- 'policy', 'putContactPolicy_policy' - Details of the resource policy.
+newPutContactPolicy ::
+  -- | 'contactArn'
+  Prelude.Text ->
+  -- | 'policy'
+  Prelude.Text ->
+  PutContactPolicy
+newPutContactPolicy pContactArn_ pPolicy_ =
+  PutContactPolicy'
+    { contactArn = pContactArn_,
+      policy = pPolicy_
+    }
+
+-- | The Amazon Resource Name (ARN) of the contact or escalation plan.
+putContactPolicy_contactArn :: Lens.Lens' PutContactPolicy Prelude.Text
+putContactPolicy_contactArn = Lens.lens (\PutContactPolicy' {contactArn} -> contactArn) (\s@PutContactPolicy' {} a -> s {contactArn = a} :: PutContactPolicy)
+
+-- | Details of the resource policy.
+putContactPolicy_policy :: Lens.Lens' PutContactPolicy Prelude.Text
+putContactPolicy_policy = Lens.lens (\PutContactPolicy' {policy} -> policy) (\s@PutContactPolicy' {} a -> s {policy = a} :: PutContactPolicy)
+
+instance Core.AWSRequest PutContactPolicy where
+  type
+    AWSResponse PutContactPolicy =
+      PutContactPolicyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          PutContactPolicyResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable PutContactPolicy where
+  hashWithSalt _salt PutContactPolicy' {..} =
+    _salt
+      `Prelude.hashWithSalt` contactArn
+      `Prelude.hashWithSalt` policy
+
+instance Prelude.NFData PutContactPolicy where
+  rnf PutContactPolicy' {..} =
+    Prelude.rnf contactArn
+      `Prelude.seq` Prelude.rnf policy
+
+instance Data.ToHeaders PutContactPolicy where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SSMContacts.PutContactPolicy" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutContactPolicy where
+  toJSON PutContactPolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("ContactArn" Data..= contactArn),
+            Prelude.Just ("Policy" Data..= policy)
+          ]
+      )
+
+instance Data.ToPath PutContactPolicy where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery PutContactPolicy where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutContactPolicyResponse' smart constructor.
+data PutContactPolicyResponse = PutContactPolicyResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutContactPolicyResponse' 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', 'putContactPolicyResponse_httpStatus' - The response's http status code.
+newPutContactPolicyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  PutContactPolicyResponse
+newPutContactPolicyResponse pHttpStatus_ =
+  PutContactPolicyResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+putContactPolicyResponse_httpStatus :: Lens.Lens' PutContactPolicyResponse Prelude.Int
+putContactPolicyResponse_httpStatus = Lens.lens (\PutContactPolicyResponse' {httpStatus} -> httpStatus) (\s@PutContactPolicyResponse' {} a -> s {httpStatus = a} :: PutContactPolicyResponse)
+
+instance Prelude.NFData PutContactPolicyResponse where
+  rnf PutContactPolicyResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/SSMContacts/SendActivationCode.hs b/gen/Amazonka/SSMContacts/SendActivationCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/SendActivationCode.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.SSMContacts.SendActivationCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Sends an activation code to a contact channel. The contact can use this
+-- code to activate the contact channel in the console or with the
+-- @ActivateChannel@ operation. Incident Manager can\'t engage a contact
+-- channel until it has been activated.
+module Amazonka.SSMContacts.SendActivationCode
+  ( -- * Creating a Request
+    SendActivationCode (..),
+    newSendActivationCode,
+
+    -- * Request Lenses
+    sendActivationCode_contactChannelId,
+
+    -- * Destructuring the Response
+    SendActivationCodeResponse (..),
+    newSendActivationCodeResponse,
+
+    -- * Response Lenses
+    sendActivationCodeResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newSendActivationCode' smart constructor.
+data SendActivationCode = SendActivationCode'
+  { -- | The Amazon Resource Name (ARN) of the contact channel.
+    contactChannelId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SendActivationCode' 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:
+--
+-- 'contactChannelId', 'sendActivationCode_contactChannelId' - The Amazon Resource Name (ARN) of the contact channel.
+newSendActivationCode ::
+  -- | 'contactChannelId'
+  Prelude.Text ->
+  SendActivationCode
+newSendActivationCode pContactChannelId_ =
+  SendActivationCode'
+    { contactChannelId =
+        pContactChannelId_
+    }
+
+-- | The Amazon Resource Name (ARN) of the contact channel.
+sendActivationCode_contactChannelId :: Lens.Lens' SendActivationCode Prelude.Text
+sendActivationCode_contactChannelId = Lens.lens (\SendActivationCode' {contactChannelId} -> contactChannelId) (\s@SendActivationCode' {} a -> s {contactChannelId = a} :: SendActivationCode)
+
+instance Core.AWSRequest SendActivationCode where
+  type
+    AWSResponse SendActivationCode =
+      SendActivationCodeResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          SendActivationCodeResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable SendActivationCode where
+  hashWithSalt _salt SendActivationCode' {..} =
+    _salt `Prelude.hashWithSalt` contactChannelId
+
+instance Prelude.NFData SendActivationCode where
+  rnf SendActivationCode' {..} =
+    Prelude.rnf contactChannelId
+
+instance Data.ToHeaders SendActivationCode where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SSMContacts.SendActivationCode" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON SendActivationCode where
+  toJSON SendActivationCode' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("ContactChannelId" Data..= contactChannelId)
+          ]
+      )
+
+instance Data.ToPath SendActivationCode where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery SendActivationCode where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newSendActivationCodeResponse' smart constructor.
+data SendActivationCodeResponse = SendActivationCodeResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SendActivationCodeResponse' 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', 'sendActivationCodeResponse_httpStatus' - The response's http status code.
+newSendActivationCodeResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  SendActivationCodeResponse
+newSendActivationCodeResponse pHttpStatus_ =
+  SendActivationCodeResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+sendActivationCodeResponse_httpStatus :: Lens.Lens' SendActivationCodeResponse Prelude.Int
+sendActivationCodeResponse_httpStatus = Lens.lens (\SendActivationCodeResponse' {httpStatus} -> httpStatus) (\s@SendActivationCodeResponse' {} a -> s {httpStatus = a} :: SendActivationCodeResponse)
+
+instance Prelude.NFData SendActivationCodeResponse where
+  rnf SendActivationCodeResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/SSMContacts/StartEngagement.hs b/gen/Amazonka/SSMContacts/StartEngagement.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/StartEngagement.hs
@@ -0,0 +1,295 @@
+{-# 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.SSMContacts.StartEngagement
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Starts an engagement to a contact or escalation plan. The engagement
+-- engages each contact specified in the incident.
+module Amazonka.SSMContacts.StartEngagement
+  ( -- * Creating a Request
+    StartEngagement (..),
+    newStartEngagement,
+
+    -- * Request Lenses
+    startEngagement_idempotencyToken,
+    startEngagement_incidentId,
+    startEngagement_publicContent,
+    startEngagement_publicSubject,
+    startEngagement_contactId,
+    startEngagement_sender,
+    startEngagement_subject,
+    startEngagement_content,
+
+    -- * Destructuring the Response
+    StartEngagementResponse (..),
+    newStartEngagementResponse,
+
+    -- * Response Lenses
+    startEngagementResponse_httpStatus,
+    startEngagementResponse_engagementArn,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newStartEngagement' smart constructor.
+data StartEngagement = StartEngagement'
+  { -- | A token ensuring that the operation is called only once with the
+    -- specified details.
+    idempotencyToken :: Prelude.Maybe Prelude.Text,
+    -- | The ARN of the incident that the engagement is part of.
+    incidentId :: Prelude.Maybe Prelude.Text,
+    -- | The insecure content of the message that was sent to the contact. Use
+    -- this field for engagements to @SMS@.
+    publicContent :: Prelude.Maybe Prelude.Text,
+    -- | The insecure subject of the message that was sent to the contact. Use
+    -- this field for engagements to @SMS@.
+    publicSubject :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the contact being engaged.
+    contactId :: Prelude.Text,
+    -- | The user that started the engagement.
+    sender :: Prelude.Text,
+    -- | The secure subject of the message that was sent to the contact. Use this
+    -- field for engagements to @VOICE@ or @EMAIL@.
+    subject :: Prelude.Text,
+    -- | The secure content of the message that was sent to the contact. Use this
+    -- field for engagements to @VOICE@ or @EMAIL@.
+    content :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartEngagement' 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:
+--
+-- 'idempotencyToken', 'startEngagement_idempotencyToken' - A token ensuring that the operation is called only once with the
+-- specified details.
+--
+-- 'incidentId', 'startEngagement_incidentId' - The ARN of the incident that the engagement is part of.
+--
+-- 'publicContent', 'startEngagement_publicContent' - The insecure content of the message that was sent to the contact. Use
+-- this field for engagements to @SMS@.
+--
+-- 'publicSubject', 'startEngagement_publicSubject' - The insecure subject of the message that was sent to the contact. Use
+-- this field for engagements to @SMS@.
+--
+-- 'contactId', 'startEngagement_contactId' - The Amazon Resource Name (ARN) of the contact being engaged.
+--
+-- 'sender', 'startEngagement_sender' - The user that started the engagement.
+--
+-- 'subject', 'startEngagement_subject' - The secure subject of the message that was sent to the contact. Use this
+-- field for engagements to @VOICE@ or @EMAIL@.
+--
+-- 'content', 'startEngagement_content' - The secure content of the message that was sent to the contact. Use this
+-- field for engagements to @VOICE@ or @EMAIL@.
+newStartEngagement ::
+  -- | 'contactId'
+  Prelude.Text ->
+  -- | 'sender'
+  Prelude.Text ->
+  -- | 'subject'
+  Prelude.Text ->
+  -- | 'content'
+  Prelude.Text ->
+  StartEngagement
+newStartEngagement
+  pContactId_
+  pSender_
+  pSubject_
+  pContent_ =
+    StartEngagement'
+      { idempotencyToken =
+          Prelude.Nothing,
+        incidentId = Prelude.Nothing,
+        publicContent = Prelude.Nothing,
+        publicSubject = Prelude.Nothing,
+        contactId = pContactId_,
+        sender = pSender_,
+        subject = pSubject_,
+        content = pContent_
+      }
+
+-- | A token ensuring that the operation is called only once with the
+-- specified details.
+startEngagement_idempotencyToken :: Lens.Lens' StartEngagement (Prelude.Maybe Prelude.Text)
+startEngagement_idempotencyToken = Lens.lens (\StartEngagement' {idempotencyToken} -> idempotencyToken) (\s@StartEngagement' {} a -> s {idempotencyToken = a} :: StartEngagement)
+
+-- | The ARN of the incident that the engagement is part of.
+startEngagement_incidentId :: Lens.Lens' StartEngagement (Prelude.Maybe Prelude.Text)
+startEngagement_incidentId = Lens.lens (\StartEngagement' {incidentId} -> incidentId) (\s@StartEngagement' {} a -> s {incidentId = a} :: StartEngagement)
+
+-- | The insecure content of the message that was sent to the contact. Use
+-- this field for engagements to @SMS@.
+startEngagement_publicContent :: Lens.Lens' StartEngagement (Prelude.Maybe Prelude.Text)
+startEngagement_publicContent = Lens.lens (\StartEngagement' {publicContent} -> publicContent) (\s@StartEngagement' {} a -> s {publicContent = a} :: StartEngagement)
+
+-- | The insecure subject of the message that was sent to the contact. Use
+-- this field for engagements to @SMS@.
+startEngagement_publicSubject :: Lens.Lens' StartEngagement (Prelude.Maybe Prelude.Text)
+startEngagement_publicSubject = Lens.lens (\StartEngagement' {publicSubject} -> publicSubject) (\s@StartEngagement' {} a -> s {publicSubject = a} :: StartEngagement)
+
+-- | The Amazon Resource Name (ARN) of the contact being engaged.
+startEngagement_contactId :: Lens.Lens' StartEngagement Prelude.Text
+startEngagement_contactId = Lens.lens (\StartEngagement' {contactId} -> contactId) (\s@StartEngagement' {} a -> s {contactId = a} :: StartEngagement)
+
+-- | The user that started the engagement.
+startEngagement_sender :: Lens.Lens' StartEngagement Prelude.Text
+startEngagement_sender = Lens.lens (\StartEngagement' {sender} -> sender) (\s@StartEngagement' {} a -> s {sender = a} :: StartEngagement)
+
+-- | The secure subject of the message that was sent to the contact. Use this
+-- field for engagements to @VOICE@ or @EMAIL@.
+startEngagement_subject :: Lens.Lens' StartEngagement Prelude.Text
+startEngagement_subject = Lens.lens (\StartEngagement' {subject} -> subject) (\s@StartEngagement' {} a -> s {subject = a} :: StartEngagement)
+
+-- | The secure content of the message that was sent to the contact. Use this
+-- field for engagements to @VOICE@ or @EMAIL@.
+startEngagement_content :: Lens.Lens' StartEngagement Prelude.Text
+startEngagement_content = Lens.lens (\StartEngagement' {content} -> content) (\s@StartEngagement' {} a -> s {content = a} :: StartEngagement)
+
+instance Core.AWSRequest StartEngagement where
+  type
+    AWSResponse StartEngagement =
+      StartEngagementResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartEngagementResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "EngagementArn")
+      )
+
+instance Prelude.Hashable StartEngagement where
+  hashWithSalt _salt StartEngagement' {..} =
+    _salt
+      `Prelude.hashWithSalt` idempotencyToken
+      `Prelude.hashWithSalt` incidentId
+      `Prelude.hashWithSalt` publicContent
+      `Prelude.hashWithSalt` publicSubject
+      `Prelude.hashWithSalt` contactId
+      `Prelude.hashWithSalt` sender
+      `Prelude.hashWithSalt` subject
+      `Prelude.hashWithSalt` content
+
+instance Prelude.NFData StartEngagement where
+  rnf StartEngagement' {..} =
+    Prelude.rnf idempotencyToken
+      `Prelude.seq` Prelude.rnf incidentId
+      `Prelude.seq` Prelude.rnf publicContent
+      `Prelude.seq` Prelude.rnf publicSubject
+      `Prelude.seq` Prelude.rnf contactId
+      `Prelude.seq` Prelude.rnf sender
+      `Prelude.seq` Prelude.rnf subject
+      `Prelude.seq` Prelude.rnf content
+
+instance Data.ToHeaders StartEngagement where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SSMContacts.StartEngagement" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StartEngagement where
+  toJSON StartEngagement' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("IdempotencyToken" Data..=)
+              Prelude.<$> idempotencyToken,
+            ("IncidentId" Data..=) Prelude.<$> incidentId,
+            ("PublicContent" Data..=) Prelude.<$> publicContent,
+            ("PublicSubject" Data..=) Prelude.<$> publicSubject,
+            Prelude.Just ("ContactId" Data..= contactId),
+            Prelude.Just ("Sender" Data..= sender),
+            Prelude.Just ("Subject" Data..= subject),
+            Prelude.Just ("Content" Data..= content)
+          ]
+      )
+
+instance Data.ToPath StartEngagement where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery StartEngagement where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStartEngagementResponse' smart constructor.
+data StartEngagementResponse = StartEngagementResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ARN of the engagement.
+    engagementArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartEngagementResponse' 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', 'startEngagementResponse_httpStatus' - The response's http status code.
+--
+-- 'engagementArn', 'startEngagementResponse_engagementArn' - The ARN of the engagement.
+newStartEngagementResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'engagementArn'
+  Prelude.Text ->
+  StartEngagementResponse
+newStartEngagementResponse
+  pHttpStatus_
+  pEngagementArn_ =
+    StartEngagementResponse'
+      { httpStatus = pHttpStatus_,
+        engagementArn = pEngagementArn_
+      }
+
+-- | The response's http status code.
+startEngagementResponse_httpStatus :: Lens.Lens' StartEngagementResponse Prelude.Int
+startEngagementResponse_httpStatus = Lens.lens (\StartEngagementResponse' {httpStatus} -> httpStatus) (\s@StartEngagementResponse' {} a -> s {httpStatus = a} :: StartEngagementResponse)
+
+-- | The ARN of the engagement.
+startEngagementResponse_engagementArn :: Lens.Lens' StartEngagementResponse Prelude.Text
+startEngagementResponse_engagementArn = Lens.lens (\StartEngagementResponse' {engagementArn} -> engagementArn) (\s@StartEngagementResponse' {} a -> s {engagementArn = a} :: StartEngagementResponse)
+
+instance Prelude.NFData StartEngagementResponse where
+  rnf StartEngagementResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf engagementArn
diff --git a/gen/Amazonka/SSMContacts/StopEngagement.hs b/gen/Amazonka/SSMContacts/StopEngagement.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/StopEngagement.hs
@@ -0,0 +1,170 @@
+{-# 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.SSMContacts.StopEngagement
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Stops an engagement before it finishes the final stage of the escalation
+-- plan or engagement plan. Further contacts aren\'t engaged.
+module Amazonka.SSMContacts.StopEngagement
+  ( -- * Creating a Request
+    StopEngagement (..),
+    newStopEngagement,
+
+    -- * Request Lenses
+    stopEngagement_reason,
+    stopEngagement_engagementId,
+
+    -- * Destructuring the Response
+    StopEngagementResponse (..),
+    newStopEngagementResponse,
+
+    -- * Response Lenses
+    stopEngagementResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newStopEngagement' smart constructor.
+data StopEngagement = StopEngagement'
+  { -- | The reason that you\'re stopping the engagement.
+    reason :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the engagement.
+    engagementId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StopEngagement' 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:
+--
+-- 'reason', 'stopEngagement_reason' - The reason that you\'re stopping the engagement.
+--
+-- 'engagementId', 'stopEngagement_engagementId' - The Amazon Resource Name (ARN) of the engagement.
+newStopEngagement ::
+  -- | 'engagementId'
+  Prelude.Text ->
+  StopEngagement
+newStopEngagement pEngagementId_ =
+  StopEngagement'
+    { reason = Prelude.Nothing,
+      engagementId = pEngagementId_
+    }
+
+-- | The reason that you\'re stopping the engagement.
+stopEngagement_reason :: Lens.Lens' StopEngagement (Prelude.Maybe Prelude.Text)
+stopEngagement_reason = Lens.lens (\StopEngagement' {reason} -> reason) (\s@StopEngagement' {} a -> s {reason = a} :: StopEngagement)
+
+-- | The Amazon Resource Name (ARN) of the engagement.
+stopEngagement_engagementId :: Lens.Lens' StopEngagement Prelude.Text
+stopEngagement_engagementId = Lens.lens (\StopEngagement' {engagementId} -> engagementId) (\s@StopEngagement' {} a -> s {engagementId = a} :: StopEngagement)
+
+instance Core.AWSRequest StopEngagement where
+  type
+    AWSResponse StopEngagement =
+      StopEngagementResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          StopEngagementResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StopEngagement where
+  hashWithSalt _salt StopEngagement' {..} =
+    _salt
+      `Prelude.hashWithSalt` reason
+      `Prelude.hashWithSalt` engagementId
+
+instance Prelude.NFData StopEngagement where
+  rnf StopEngagement' {..} =
+    Prelude.rnf reason
+      `Prelude.seq` Prelude.rnf engagementId
+
+instance Data.ToHeaders StopEngagement where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("SSMContacts.StopEngagement" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StopEngagement where
+  toJSON StopEngagement' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Reason" Data..=) Prelude.<$> reason,
+            Prelude.Just ("EngagementId" Data..= engagementId)
+          ]
+      )
+
+instance Data.ToPath StopEngagement where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery StopEngagement where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStopEngagementResponse' smart constructor.
+data StopEngagementResponse = StopEngagementResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StopEngagementResponse' 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', 'stopEngagementResponse_httpStatus' - The response's http status code.
+newStopEngagementResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StopEngagementResponse
+newStopEngagementResponse pHttpStatus_ =
+  StopEngagementResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+stopEngagementResponse_httpStatus :: Lens.Lens' StopEngagementResponse Prelude.Int
+stopEngagementResponse_httpStatus = Lens.lens (\StopEngagementResponse' {httpStatus} -> httpStatus) (\s@StopEngagementResponse' {} a -> s {httpStatus = a} :: StopEngagementResponse)
+
+instance Prelude.NFData StopEngagementResponse where
+  rnf StopEngagementResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/SSMContacts/TagResource.hs b/gen/Amazonka/SSMContacts/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/TagResource.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.SSMContacts.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)
+--
+-- Tags a contact or escalation plan. You can tag only contacts and
+-- escalation plans in the first region of your replication set.
+module Amazonka.SSMContacts.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 qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | The Amazon Resource Name (ARN) of the contact or escalation plan.
+    resourceARN :: Prelude.Text,
+    -- | A list of tags that you are adding to the contact or escalation plan.
+    tags :: [Tag]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceARN', 'tagResource_resourceARN' - The Amazon Resource Name (ARN) of the contact or escalation plan.
+--
+-- 'tags', 'tagResource_tags' - A list of tags that you are adding to the contact or escalation plan.
+newTagResource ::
+  -- | 'resourceARN'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceARN_ =
+  TagResource'
+    { resourceARN = pResourceARN_,
+      tags = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the contact or escalation plan.
+tagResource_resourceARN :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceARN = Lens.lens (\TagResource' {resourceARN} -> resourceARN) (\s@TagResource' {} a -> s {resourceARN = a} :: TagResource)
+
+-- | A list of tags that you are adding to the contact or escalation plan.
+tagResource_tags :: Lens.Lens' TagResource [Tag]
+tagResource_tags = Lens.lens (\TagResource' {tags} -> tags) (\s@TagResource' {} a -> s {tags = a} :: TagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest TagResource where
+  type AWSResponse TagResource = TagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          TagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable TagResource where
+  hashWithSalt _salt TagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceARN
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData TagResource where
+  rnf TagResource' {..} =
+    Prelude.rnf resourceARN
+      `Prelude.seq` Prelude.rnf tags
+
+instance Data.ToHeaders TagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("SSMContacts.TagResource" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON TagResource where
+  toJSON TagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("ResourceARN" Data..= resourceARN),
+            Prelude.Just ("Tags" Data..= tags)
+          ]
+      )
+
+instance Data.ToPath TagResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery TagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newTagResourceResponse' smart constructor.
+data TagResourceResponse = TagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'tagResourceResponse_httpStatus' - The response's http status code.
+newTagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  TagResourceResponse
+newTagResourceResponse pHttpStatus_ =
+  TagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+tagResourceResponse_httpStatus :: Lens.Lens' TagResourceResponse Prelude.Int
+tagResourceResponse_httpStatus = Lens.lens (\TagResourceResponse' {httpStatus} -> httpStatus) (\s@TagResourceResponse' {} a -> s {httpStatus = a} :: TagResourceResponse)
+
+instance Prelude.NFData TagResourceResponse where
+  rnf TagResourceResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/SSMContacts/Types.hs b/gen/Amazonka/SSMContacts/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types.hs
@@ -0,0 +1,293 @@
+{-# 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.SSMContacts.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.SSMContacts.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _AccessDeniedException,
+    _ConflictException,
+    _DataEncryptionException,
+    _InternalServerException,
+    _ResourceNotFoundException,
+    _ServiceQuotaExceededException,
+    _ThrottlingException,
+    _ValidationException,
+
+    -- * AcceptCodeValidation
+    AcceptCodeValidation (..),
+
+    -- * AcceptType
+    AcceptType (..),
+
+    -- * ActivationStatus
+    ActivationStatus (..),
+
+    -- * ChannelType
+    ChannelType (..),
+
+    -- * ContactType
+    ContactType (..),
+
+    -- * ReceiptType
+    ReceiptType (..),
+
+    -- * ChannelTargetInfo
+    ChannelTargetInfo (..),
+    newChannelTargetInfo,
+    channelTargetInfo_retryIntervalInMinutes,
+    channelTargetInfo_contactChannelId,
+
+    -- * Contact
+    Contact (..),
+    newContact,
+    contact_displayName,
+    contact_contactArn,
+    contact_alias,
+    contact_type,
+
+    -- * ContactChannel
+    ContactChannel (..),
+    newContactChannel,
+    contactChannel_type,
+    contactChannel_contactChannelArn,
+    contactChannel_contactArn,
+    contactChannel_name,
+    contactChannel_deliveryAddress,
+    contactChannel_activationStatus,
+
+    -- * ContactChannelAddress
+    ContactChannelAddress (..),
+    newContactChannelAddress,
+    contactChannelAddress_simpleAddress,
+
+    -- * ContactTargetInfo
+    ContactTargetInfo (..),
+    newContactTargetInfo,
+    contactTargetInfo_contactId,
+    contactTargetInfo_isEssential,
+
+    -- * Engagement
+    Engagement (..),
+    newEngagement,
+    engagement_incidentId,
+    engagement_startTime,
+    engagement_stopTime,
+    engagement_engagementArn,
+    engagement_contactArn,
+    engagement_sender,
+
+    -- * Page
+    Page (..),
+    newPage,
+    page_deliveryTime,
+    page_incidentId,
+    page_readTime,
+    page_sentTime,
+    page_pageArn,
+    page_engagementArn,
+    page_contactArn,
+    page_sender,
+
+    -- * Plan
+    Plan (..),
+    newPlan,
+    plan_stages,
+
+    -- * Receipt
+    Receipt (..),
+    newReceipt,
+    receipt_contactChannelArn,
+    receipt_receiptInfo,
+    receipt_receiptType,
+    receipt_receiptTime,
+
+    -- * Stage
+    Stage (..),
+    newStage,
+    stage_durationInMinutes,
+    stage_targets,
+
+    -- * Tag
+    Tag (..),
+    newTag,
+    tag_key,
+    tag_value,
+
+    -- * Target
+    Target (..),
+    newTarget,
+    target_channelTargetInfo,
+    target_contactTargetInfo,
+
+    -- * TimeRange
+    TimeRange (..),
+    newTimeRange,
+    timeRange_endTime,
+    timeRange_startTime,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.SSMContacts.Types.AcceptCodeValidation
+import Amazonka.SSMContacts.Types.AcceptType
+import Amazonka.SSMContacts.Types.ActivationStatus
+import Amazonka.SSMContacts.Types.ChannelTargetInfo
+import Amazonka.SSMContacts.Types.ChannelType
+import Amazonka.SSMContacts.Types.Contact
+import Amazonka.SSMContacts.Types.ContactChannel
+import Amazonka.SSMContacts.Types.ContactChannelAddress
+import Amazonka.SSMContacts.Types.ContactTargetInfo
+import Amazonka.SSMContacts.Types.ContactType
+import Amazonka.SSMContacts.Types.Engagement
+import Amazonka.SSMContacts.Types.Page
+import Amazonka.SSMContacts.Types.Plan
+import Amazonka.SSMContacts.Types.Receipt
+import Amazonka.SSMContacts.Types.ReceiptType
+import Amazonka.SSMContacts.Types.Stage
+import Amazonka.SSMContacts.Types.Tag
+import Amazonka.SSMContacts.Types.Target
+import Amazonka.SSMContacts.Types.TimeRange
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2021-05-03@ of the Amazon Systems Manager Incident Manager Contacts SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "SSMContacts",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "ssm-contacts",
+      Core.signingName = "ssm-contacts",
+      Core.version = "2021-05-03",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "SSMContacts",
+      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
+
+-- | You don\'t have sufficient access to perform this operation.
+_AccessDeniedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AccessDeniedException =
+  Core._MatchServiceError
+    defaultService
+    "AccessDeniedException"
+
+-- | Updating or deleting a resource causes an inconsistent state.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+
+-- | The operation failed to due an encryption key error.
+_DataEncryptionException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_DataEncryptionException =
+  Core._MatchServiceError
+    defaultService
+    "DataEncryptionException"
+
+-- | Unexpected error occurred while processing the request.
+_InternalServerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerException"
+
+-- | Request references a resource that doesn\'t exist.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+
+-- | Request would cause a service quota to be exceeded.
+_ServiceQuotaExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceQuotaExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceQuotaExceededException"
+
+-- | The request was denied due to request throttling.
+_ThrottlingException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ThrottlingException =
+  Core._MatchServiceError
+    defaultService
+    "ThrottlingException"
+
+-- | The input fails to satisfy the constraints specified by an Amazon Web
+-- Services service.
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
diff --git a/gen/Amazonka/SSMContacts/Types/AcceptCodeValidation.hs b/gen/Amazonka/SSMContacts/Types/AcceptCodeValidation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types/AcceptCodeValidation.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.SSMContacts.Types.AcceptCodeValidation
+-- 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.SSMContacts.Types.AcceptCodeValidation
+  ( AcceptCodeValidation
+      ( ..,
+        AcceptCodeValidation_ENFORCE,
+        AcceptCodeValidation_IGNORE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype AcceptCodeValidation = AcceptCodeValidation'
+  { fromAcceptCodeValidation ::
+      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 AcceptCodeValidation_ENFORCE :: AcceptCodeValidation
+pattern AcceptCodeValidation_ENFORCE = AcceptCodeValidation' "ENFORCE"
+
+pattern AcceptCodeValidation_IGNORE :: AcceptCodeValidation
+pattern AcceptCodeValidation_IGNORE = AcceptCodeValidation' "IGNORE"
+
+{-# COMPLETE
+  AcceptCodeValidation_ENFORCE,
+  AcceptCodeValidation_IGNORE,
+  AcceptCodeValidation'
+  #-}
diff --git a/gen/Amazonka/SSMContacts/Types/AcceptType.hs b/gen/Amazonka/SSMContacts/Types/AcceptType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types/AcceptType.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.SSMContacts.Types.AcceptType
+-- 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.SSMContacts.Types.AcceptType
+  ( AcceptType
+      ( ..,
+        AcceptType_DELIVERED,
+        AcceptType_READ
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype AcceptType = AcceptType'
+  { fromAcceptType ::
+      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 AcceptType_DELIVERED :: AcceptType
+pattern AcceptType_DELIVERED = AcceptType' "DELIVERED"
+
+pattern AcceptType_READ :: AcceptType
+pattern AcceptType_READ = AcceptType' "READ"
+
+{-# COMPLETE
+  AcceptType_DELIVERED,
+  AcceptType_READ,
+  AcceptType'
+  #-}
diff --git a/gen/Amazonka/SSMContacts/Types/ActivationStatus.hs b/gen/Amazonka/SSMContacts/Types/ActivationStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types/ActivationStatus.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.SSMContacts.Types.ActivationStatus
+-- 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.SSMContacts.Types.ActivationStatus
+  ( ActivationStatus
+      ( ..,
+        ActivationStatus_ACTIVATED,
+        ActivationStatus_NOT_ACTIVATED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ActivationStatus = ActivationStatus'
+  { fromActivationStatus ::
+      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 ActivationStatus_ACTIVATED :: ActivationStatus
+pattern ActivationStatus_ACTIVATED = ActivationStatus' "ACTIVATED"
+
+pattern ActivationStatus_NOT_ACTIVATED :: ActivationStatus
+pattern ActivationStatus_NOT_ACTIVATED = ActivationStatus' "NOT_ACTIVATED"
+
+{-# COMPLETE
+  ActivationStatus_ACTIVATED,
+  ActivationStatus_NOT_ACTIVATED,
+  ActivationStatus'
+  #-}
diff --git a/gen/Amazonka/SSMContacts/Types/ChannelTargetInfo.hs b/gen/Amazonka/SSMContacts/Types/ChannelTargetInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types/ChannelTargetInfo.hs
@@ -0,0 +1,102 @@
+{-# 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.SSMContacts.Types.ChannelTargetInfo
+-- 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.SSMContacts.Types.ChannelTargetInfo 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
+
+-- | Information about the contact channel that Incident Manager uses to
+-- engage the contact.
+--
+-- /See:/ 'newChannelTargetInfo' smart constructor.
+data ChannelTargetInfo = ChannelTargetInfo'
+  { -- | The number of minutes to wait to retry sending engagement in the case
+    -- the engagement initially fails.
+    retryIntervalInMinutes :: Prelude.Maybe Prelude.Natural,
+    -- | The Amazon Resource Name (ARN) of the contact channel.
+    contactChannelId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ChannelTargetInfo' 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:
+--
+-- 'retryIntervalInMinutes', 'channelTargetInfo_retryIntervalInMinutes' - The number of minutes to wait to retry sending engagement in the case
+-- the engagement initially fails.
+--
+-- 'contactChannelId', 'channelTargetInfo_contactChannelId' - The Amazon Resource Name (ARN) of the contact channel.
+newChannelTargetInfo ::
+  -- | 'contactChannelId'
+  Prelude.Text ->
+  ChannelTargetInfo
+newChannelTargetInfo pContactChannelId_ =
+  ChannelTargetInfo'
+    { retryIntervalInMinutes =
+        Prelude.Nothing,
+      contactChannelId = pContactChannelId_
+    }
+
+-- | The number of minutes to wait to retry sending engagement in the case
+-- the engagement initially fails.
+channelTargetInfo_retryIntervalInMinutes :: Lens.Lens' ChannelTargetInfo (Prelude.Maybe Prelude.Natural)
+channelTargetInfo_retryIntervalInMinutes = Lens.lens (\ChannelTargetInfo' {retryIntervalInMinutes} -> retryIntervalInMinutes) (\s@ChannelTargetInfo' {} a -> s {retryIntervalInMinutes = a} :: ChannelTargetInfo)
+
+-- | The Amazon Resource Name (ARN) of the contact channel.
+channelTargetInfo_contactChannelId :: Lens.Lens' ChannelTargetInfo Prelude.Text
+channelTargetInfo_contactChannelId = Lens.lens (\ChannelTargetInfo' {contactChannelId} -> contactChannelId) (\s@ChannelTargetInfo' {} a -> s {contactChannelId = a} :: ChannelTargetInfo)
+
+instance Data.FromJSON ChannelTargetInfo where
+  parseJSON =
+    Data.withObject
+      "ChannelTargetInfo"
+      ( \x ->
+          ChannelTargetInfo'
+            Prelude.<$> (x Data..:? "RetryIntervalInMinutes")
+            Prelude.<*> (x Data..: "ContactChannelId")
+      )
+
+instance Prelude.Hashable ChannelTargetInfo where
+  hashWithSalt _salt ChannelTargetInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` retryIntervalInMinutes
+      `Prelude.hashWithSalt` contactChannelId
+
+instance Prelude.NFData ChannelTargetInfo where
+  rnf ChannelTargetInfo' {..} =
+    Prelude.rnf retryIntervalInMinutes
+      `Prelude.seq` Prelude.rnf contactChannelId
+
+instance Data.ToJSON ChannelTargetInfo where
+  toJSON ChannelTargetInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("RetryIntervalInMinutes" Data..=)
+              Prelude.<$> retryIntervalInMinutes,
+            Prelude.Just
+              ("ContactChannelId" Data..= contactChannelId)
+          ]
+      )
diff --git a/gen/Amazonka/SSMContacts/Types/ChannelType.hs b/gen/Amazonka/SSMContacts/Types/ChannelType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types/ChannelType.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.SSMContacts.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.SSMContacts.Types.ChannelType
+  ( ChannelType
+      ( ..,
+        ChannelType_EMAIL,
+        ChannelType_SMS,
+        ChannelType_VOICE
+      ),
+  )
+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_EMAIL :: ChannelType
+pattern ChannelType_EMAIL = ChannelType' "EMAIL"
+
+pattern ChannelType_SMS :: ChannelType
+pattern ChannelType_SMS = ChannelType' "SMS"
+
+pattern ChannelType_VOICE :: ChannelType
+pattern ChannelType_VOICE = ChannelType' "VOICE"
+
+{-# COMPLETE
+  ChannelType_EMAIL,
+  ChannelType_SMS,
+  ChannelType_VOICE,
+  ChannelType'
+  #-}
diff --git a/gen/Amazonka/SSMContacts/Types/Contact.hs b/gen/Amazonka/SSMContacts/Types/Contact.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types/Contact.hs
@@ -0,0 +1,119 @@
+{-# 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.SSMContacts.Types.Contact
+-- 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.SSMContacts.Types.Contact 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
+import Amazonka.SSMContacts.Types.ContactType
+
+-- | A personal contact or escalation plan that Incident Manager engages
+-- during an incident.
+--
+-- /See:/ 'newContact' smart constructor.
+data Contact = Contact'
+  { -- | The full name of the contact or escalation plan.
+    displayName :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the contact or escalation plan.
+    contactArn :: Prelude.Text,
+    -- | The unique and identifiable alias of the contact or escalation plan.
+    alias :: Prelude.Text,
+    -- | Refers to the type of contact. A single contact is type @PERSONAL@ and
+    -- an escalation plan is type @ESCALATION@.
+    type' :: ContactType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Contact' 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:
+--
+-- 'displayName', 'contact_displayName' - The full name of the contact or escalation plan.
+--
+-- 'contactArn', 'contact_contactArn' - The Amazon Resource Name (ARN) of the contact or escalation plan.
+--
+-- 'alias', 'contact_alias' - The unique and identifiable alias of the contact or escalation plan.
+--
+-- 'type'', 'contact_type' - Refers to the type of contact. A single contact is type @PERSONAL@ and
+-- an escalation plan is type @ESCALATION@.
+newContact ::
+  -- | 'contactArn'
+  Prelude.Text ->
+  -- | 'alias'
+  Prelude.Text ->
+  -- | 'type''
+  ContactType ->
+  Contact
+newContact pContactArn_ pAlias_ pType_ =
+  Contact'
+    { displayName = Prelude.Nothing,
+      contactArn = pContactArn_,
+      alias = pAlias_,
+      type' = pType_
+    }
+
+-- | The full name of the contact or escalation plan.
+contact_displayName :: Lens.Lens' Contact (Prelude.Maybe Prelude.Text)
+contact_displayName = Lens.lens (\Contact' {displayName} -> displayName) (\s@Contact' {} a -> s {displayName = a} :: Contact)
+
+-- | The Amazon Resource Name (ARN) of the contact or escalation plan.
+contact_contactArn :: Lens.Lens' Contact Prelude.Text
+contact_contactArn = Lens.lens (\Contact' {contactArn} -> contactArn) (\s@Contact' {} a -> s {contactArn = a} :: Contact)
+
+-- | The unique and identifiable alias of the contact or escalation plan.
+contact_alias :: Lens.Lens' Contact Prelude.Text
+contact_alias = Lens.lens (\Contact' {alias} -> alias) (\s@Contact' {} a -> s {alias = a} :: Contact)
+
+-- | Refers to the type of contact. A single contact is type @PERSONAL@ and
+-- an escalation plan is type @ESCALATION@.
+contact_type :: Lens.Lens' Contact ContactType
+contact_type = Lens.lens (\Contact' {type'} -> type') (\s@Contact' {} a -> s {type' = a} :: Contact)
+
+instance Data.FromJSON Contact where
+  parseJSON =
+    Data.withObject
+      "Contact"
+      ( \x ->
+          Contact'
+            Prelude.<$> (x Data..:? "DisplayName")
+            Prelude.<*> (x Data..: "ContactArn")
+            Prelude.<*> (x Data..: "Alias")
+            Prelude.<*> (x Data..: "Type")
+      )
+
+instance Prelude.Hashable Contact where
+  hashWithSalt _salt Contact' {..} =
+    _salt
+      `Prelude.hashWithSalt` displayName
+      `Prelude.hashWithSalt` contactArn
+      `Prelude.hashWithSalt` alias
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData Contact where
+  rnf Contact' {..} =
+    Prelude.rnf displayName
+      `Prelude.seq` Prelude.rnf contactArn
+      `Prelude.seq` Prelude.rnf alias
+      `Prelude.seq` Prelude.rnf type'
diff --git a/gen/Amazonka/SSMContacts/Types/ContactChannel.hs b/gen/Amazonka/SSMContacts/Types/ContactChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types/ContactChannel.hs
@@ -0,0 +1,180 @@
+{-# 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.SSMContacts.Types.ContactChannel
+-- 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.SSMContacts.Types.ContactChannel 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
+import Amazonka.SSMContacts.Types.ActivationStatus
+import Amazonka.SSMContacts.Types.ChannelType
+import Amazonka.SSMContacts.Types.ContactChannelAddress
+
+-- | The method that Incident Manager uses to engage a contact.
+--
+-- /See:/ 'newContactChannel' smart constructor.
+data ContactChannel = ContactChannel'
+  { -- | The type of the contact channel. Incident Manager supports three contact
+    -- methods:
+    --
+    -- -   SMS
+    --
+    -- -   VOICE
+    --
+    -- -   EMAIL
+    type' :: Prelude.Maybe ChannelType,
+    -- | The Amazon Resource Name (ARN) of the contact channel.
+    contactChannelArn :: Prelude.Text,
+    -- | The ARN of the contact that contains the contact channel.
+    contactArn :: Prelude.Text,
+    -- | The name of the contact channel.
+    name :: Prelude.Text,
+    -- | The details that Incident Manager uses when trying to engage the contact
+    -- channel.
+    deliveryAddress :: ContactChannelAddress,
+    -- | A Boolean value describing if the contact channel has been activated or
+    -- not. If the contact channel isn\'t activated, Incident Manager can\'t
+    -- engage the contact through it.
+    activationStatus :: ActivationStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ContactChannel' 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:
+--
+-- 'type'', 'contactChannel_type' - The type of the contact channel. Incident Manager supports three contact
+-- methods:
+--
+-- -   SMS
+--
+-- -   VOICE
+--
+-- -   EMAIL
+--
+-- 'contactChannelArn', 'contactChannel_contactChannelArn' - The Amazon Resource Name (ARN) of the contact channel.
+--
+-- 'contactArn', 'contactChannel_contactArn' - The ARN of the contact that contains the contact channel.
+--
+-- 'name', 'contactChannel_name' - The name of the contact channel.
+--
+-- 'deliveryAddress', 'contactChannel_deliveryAddress' - The details that Incident Manager uses when trying to engage the contact
+-- channel.
+--
+-- 'activationStatus', 'contactChannel_activationStatus' - A Boolean value describing if the contact channel has been activated or
+-- not. If the contact channel isn\'t activated, Incident Manager can\'t
+-- engage the contact through it.
+newContactChannel ::
+  -- | 'contactChannelArn'
+  Prelude.Text ->
+  -- | 'contactArn'
+  Prelude.Text ->
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'deliveryAddress'
+  ContactChannelAddress ->
+  -- | 'activationStatus'
+  ActivationStatus ->
+  ContactChannel
+newContactChannel
+  pContactChannelArn_
+  pContactArn_
+  pName_
+  pDeliveryAddress_
+  pActivationStatus_ =
+    ContactChannel'
+      { type' = Prelude.Nothing,
+        contactChannelArn = pContactChannelArn_,
+        contactArn = pContactArn_,
+        name = pName_,
+        deliveryAddress = pDeliveryAddress_,
+        activationStatus = pActivationStatus_
+      }
+
+-- | The type of the contact channel. Incident Manager supports three contact
+-- methods:
+--
+-- -   SMS
+--
+-- -   VOICE
+--
+-- -   EMAIL
+contactChannel_type :: Lens.Lens' ContactChannel (Prelude.Maybe ChannelType)
+contactChannel_type = Lens.lens (\ContactChannel' {type'} -> type') (\s@ContactChannel' {} a -> s {type' = a} :: ContactChannel)
+
+-- | The Amazon Resource Name (ARN) of the contact channel.
+contactChannel_contactChannelArn :: Lens.Lens' ContactChannel Prelude.Text
+contactChannel_contactChannelArn = Lens.lens (\ContactChannel' {contactChannelArn} -> contactChannelArn) (\s@ContactChannel' {} a -> s {contactChannelArn = a} :: ContactChannel)
+
+-- | The ARN of the contact that contains the contact channel.
+contactChannel_contactArn :: Lens.Lens' ContactChannel Prelude.Text
+contactChannel_contactArn = Lens.lens (\ContactChannel' {contactArn} -> contactArn) (\s@ContactChannel' {} a -> s {contactArn = a} :: ContactChannel)
+
+-- | The name of the contact channel.
+contactChannel_name :: Lens.Lens' ContactChannel Prelude.Text
+contactChannel_name = Lens.lens (\ContactChannel' {name} -> name) (\s@ContactChannel' {} a -> s {name = a} :: ContactChannel)
+
+-- | The details that Incident Manager uses when trying to engage the contact
+-- channel.
+contactChannel_deliveryAddress :: Lens.Lens' ContactChannel ContactChannelAddress
+contactChannel_deliveryAddress = Lens.lens (\ContactChannel' {deliveryAddress} -> deliveryAddress) (\s@ContactChannel' {} a -> s {deliveryAddress = a} :: ContactChannel)
+
+-- | A Boolean value describing if the contact channel has been activated or
+-- not. If the contact channel isn\'t activated, Incident Manager can\'t
+-- engage the contact through it.
+contactChannel_activationStatus :: Lens.Lens' ContactChannel ActivationStatus
+contactChannel_activationStatus = Lens.lens (\ContactChannel' {activationStatus} -> activationStatus) (\s@ContactChannel' {} a -> s {activationStatus = a} :: ContactChannel)
+
+instance Data.FromJSON ContactChannel where
+  parseJSON =
+    Data.withObject
+      "ContactChannel"
+      ( \x ->
+          ContactChannel'
+            Prelude.<$> (x Data..:? "Type")
+            Prelude.<*> (x Data..: "ContactChannelArn")
+            Prelude.<*> (x Data..: "ContactArn")
+            Prelude.<*> (x Data..: "Name")
+            Prelude.<*> (x Data..: "DeliveryAddress")
+            Prelude.<*> (x Data..: "ActivationStatus")
+      )
+
+instance Prelude.Hashable ContactChannel where
+  hashWithSalt _salt ContactChannel' {..} =
+    _salt
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` contactChannelArn
+      `Prelude.hashWithSalt` contactArn
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` deliveryAddress
+      `Prelude.hashWithSalt` activationStatus
+
+instance Prelude.NFData ContactChannel where
+  rnf ContactChannel' {..} =
+    Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf contactChannelArn
+      `Prelude.seq` Prelude.rnf contactArn
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf deliveryAddress
+      `Prelude.seq` Prelude.rnf activationStatus
diff --git a/gen/Amazonka/SSMContacts/Types/ContactChannelAddress.hs b/gen/Amazonka/SSMContacts/Types/ContactChannelAddress.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types/ContactChannelAddress.hs
@@ -0,0 +1,103 @@
+{-# 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.SSMContacts.Types.ContactChannelAddress
+-- 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.SSMContacts.Types.ContactChannelAddress where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The details that Incident Manager uses when trying to engage the contact
+-- channel.
+--
+-- /See:/ 'newContactChannelAddress' smart constructor.
+data ContactChannelAddress = ContactChannelAddress'
+  { -- | The format is dependent on the type of the contact channel. The
+    -- following are the expected formats:
+    --
+    -- -   SMS - \'+\' followed by the country code and phone number
+    --
+    -- -   VOICE - \'+\' followed by the country code and phone number
+    --
+    -- -   EMAIL - any standard email format
+    simpleAddress :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ContactChannelAddress' 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:
+--
+-- 'simpleAddress', 'contactChannelAddress_simpleAddress' - The format is dependent on the type of the contact channel. The
+-- following are the expected formats:
+--
+-- -   SMS - \'+\' followed by the country code and phone number
+--
+-- -   VOICE - \'+\' followed by the country code and phone number
+--
+-- -   EMAIL - any standard email format
+newContactChannelAddress ::
+  ContactChannelAddress
+newContactChannelAddress =
+  ContactChannelAddress'
+    { simpleAddress =
+        Prelude.Nothing
+    }
+
+-- | The format is dependent on the type of the contact channel. The
+-- following are the expected formats:
+--
+-- -   SMS - \'+\' followed by the country code and phone number
+--
+-- -   VOICE - \'+\' followed by the country code and phone number
+--
+-- -   EMAIL - any standard email format
+contactChannelAddress_simpleAddress :: Lens.Lens' ContactChannelAddress (Prelude.Maybe Prelude.Text)
+contactChannelAddress_simpleAddress = Lens.lens (\ContactChannelAddress' {simpleAddress} -> simpleAddress) (\s@ContactChannelAddress' {} a -> s {simpleAddress = a} :: ContactChannelAddress)
+
+instance Data.FromJSON ContactChannelAddress where
+  parseJSON =
+    Data.withObject
+      "ContactChannelAddress"
+      ( \x ->
+          ContactChannelAddress'
+            Prelude.<$> (x Data..:? "SimpleAddress")
+      )
+
+instance Prelude.Hashable ContactChannelAddress where
+  hashWithSalt _salt ContactChannelAddress' {..} =
+    _salt `Prelude.hashWithSalt` simpleAddress
+
+instance Prelude.NFData ContactChannelAddress where
+  rnf ContactChannelAddress' {..} =
+    Prelude.rnf simpleAddress
+
+instance Data.ToJSON ContactChannelAddress where
+  toJSON ContactChannelAddress' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("SimpleAddress" Data..=)
+              Prelude.<$> simpleAddress
+          ]
+      )
diff --git a/gen/Amazonka/SSMContacts/Types/ContactTargetInfo.hs b/gen/Amazonka/SSMContacts/Types/ContactTargetInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types/ContactTargetInfo.hs
@@ -0,0 +1,98 @@
+{-# 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.SSMContacts.Types.ContactTargetInfo
+-- 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.SSMContacts.Types.ContactTargetInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The contact that Incident Manager is engaging during an incident.
+--
+-- /See:/ 'newContactTargetInfo' smart constructor.
+data ContactTargetInfo = ContactTargetInfo'
+  { -- | The Amazon Resource Name (ARN) of the contact.
+    contactId :: Prelude.Maybe Prelude.Text,
+    -- | A Boolean value determining if the contact\'s acknowledgement stops the
+    -- progress of stages in the plan.
+    isEssential :: Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ContactTargetInfo' 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:
+--
+-- 'contactId', 'contactTargetInfo_contactId' - The Amazon Resource Name (ARN) of the contact.
+--
+-- 'isEssential', 'contactTargetInfo_isEssential' - A Boolean value determining if the contact\'s acknowledgement stops the
+-- progress of stages in the plan.
+newContactTargetInfo ::
+  -- | 'isEssential'
+  Prelude.Bool ->
+  ContactTargetInfo
+newContactTargetInfo pIsEssential_ =
+  ContactTargetInfo'
+    { contactId = Prelude.Nothing,
+      isEssential = pIsEssential_
+    }
+
+-- | The Amazon Resource Name (ARN) of the contact.
+contactTargetInfo_contactId :: Lens.Lens' ContactTargetInfo (Prelude.Maybe Prelude.Text)
+contactTargetInfo_contactId = Lens.lens (\ContactTargetInfo' {contactId} -> contactId) (\s@ContactTargetInfo' {} a -> s {contactId = a} :: ContactTargetInfo)
+
+-- | A Boolean value determining if the contact\'s acknowledgement stops the
+-- progress of stages in the plan.
+contactTargetInfo_isEssential :: Lens.Lens' ContactTargetInfo Prelude.Bool
+contactTargetInfo_isEssential = Lens.lens (\ContactTargetInfo' {isEssential} -> isEssential) (\s@ContactTargetInfo' {} a -> s {isEssential = a} :: ContactTargetInfo)
+
+instance Data.FromJSON ContactTargetInfo where
+  parseJSON =
+    Data.withObject
+      "ContactTargetInfo"
+      ( \x ->
+          ContactTargetInfo'
+            Prelude.<$> (x Data..:? "ContactId")
+            Prelude.<*> (x Data..: "IsEssential")
+      )
+
+instance Prelude.Hashable ContactTargetInfo where
+  hashWithSalt _salt ContactTargetInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` contactId
+      `Prelude.hashWithSalt` isEssential
+
+instance Prelude.NFData ContactTargetInfo where
+  rnf ContactTargetInfo' {..} =
+    Prelude.rnf contactId
+      `Prelude.seq` Prelude.rnf isEssential
+
+instance Data.ToJSON ContactTargetInfo where
+  toJSON ContactTargetInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ContactId" Data..=) Prelude.<$> contactId,
+            Prelude.Just ("IsEssential" Data..= isEssential)
+          ]
+      )
diff --git a/gen/Amazonka/SSMContacts/Types/ContactType.hs b/gen/Amazonka/SSMContacts/Types/ContactType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types/ContactType.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.SSMContacts.Types.ContactType
+-- 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.SSMContacts.Types.ContactType
+  ( ContactType
+      ( ..,
+        ContactType_ESCALATION,
+        ContactType_PERSONAL
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ContactType = ContactType'
+  { fromContactType ::
+      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 ContactType_ESCALATION :: ContactType
+pattern ContactType_ESCALATION = ContactType' "ESCALATION"
+
+pattern ContactType_PERSONAL :: ContactType
+pattern ContactType_PERSONAL = ContactType' "PERSONAL"
+
+{-# COMPLETE
+  ContactType_ESCALATION,
+  ContactType_PERSONAL,
+  ContactType'
+  #-}
diff --git a/gen/Amazonka/SSMContacts/Types/Engagement.hs b/gen/Amazonka/SSMContacts/Types/Engagement.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types/Engagement.hs
@@ -0,0 +1,142 @@
+{-# 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.SSMContacts.Types.Engagement
+-- 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.SSMContacts.Types.Engagement 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
+
+-- | Incident Manager reaching out to a contact or escalation plan to engage
+-- contact during an incident.
+--
+-- /See:/ 'newEngagement' smart constructor.
+data Engagement = Engagement'
+  { -- | The ARN of the incident that\'s engaging the contact.
+    incidentId :: Prelude.Maybe Prelude.Text,
+    -- | The time that the engagement began.
+    startTime :: Prelude.Maybe Data.POSIX,
+    -- | The time that the engagement ended.
+    stopTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the engagement.
+    engagementArn :: Prelude.Text,
+    -- | The ARN of the escalation plan or contact that Incident Manager is
+    -- engaging.
+    contactArn :: Prelude.Text,
+    -- | The user that started the engagement.
+    sender :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Engagement' 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:
+--
+-- 'incidentId', 'engagement_incidentId' - The ARN of the incident that\'s engaging the contact.
+--
+-- 'startTime', 'engagement_startTime' - The time that the engagement began.
+--
+-- 'stopTime', 'engagement_stopTime' - The time that the engagement ended.
+--
+-- 'engagementArn', 'engagement_engagementArn' - The Amazon Resource Name (ARN) of the engagement.
+--
+-- 'contactArn', 'engagement_contactArn' - The ARN of the escalation plan or contact that Incident Manager is
+-- engaging.
+--
+-- 'sender', 'engagement_sender' - The user that started the engagement.
+newEngagement ::
+  -- | 'engagementArn'
+  Prelude.Text ->
+  -- | 'contactArn'
+  Prelude.Text ->
+  -- | 'sender'
+  Prelude.Text ->
+  Engagement
+newEngagement pEngagementArn_ pContactArn_ pSender_ =
+  Engagement'
+    { incidentId = Prelude.Nothing,
+      startTime = Prelude.Nothing,
+      stopTime = Prelude.Nothing,
+      engagementArn = pEngagementArn_,
+      contactArn = pContactArn_,
+      sender = pSender_
+    }
+
+-- | The ARN of the incident that\'s engaging the contact.
+engagement_incidentId :: Lens.Lens' Engagement (Prelude.Maybe Prelude.Text)
+engagement_incidentId = Lens.lens (\Engagement' {incidentId} -> incidentId) (\s@Engagement' {} a -> s {incidentId = a} :: Engagement)
+
+-- | The time that the engagement began.
+engagement_startTime :: Lens.Lens' Engagement (Prelude.Maybe Prelude.UTCTime)
+engagement_startTime = Lens.lens (\Engagement' {startTime} -> startTime) (\s@Engagement' {} a -> s {startTime = a} :: Engagement) Prelude.. Lens.mapping Data._Time
+
+-- | The time that the engagement ended.
+engagement_stopTime :: Lens.Lens' Engagement (Prelude.Maybe Prelude.UTCTime)
+engagement_stopTime = Lens.lens (\Engagement' {stopTime} -> stopTime) (\s@Engagement' {} a -> s {stopTime = a} :: Engagement) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the engagement.
+engagement_engagementArn :: Lens.Lens' Engagement Prelude.Text
+engagement_engagementArn = Lens.lens (\Engagement' {engagementArn} -> engagementArn) (\s@Engagement' {} a -> s {engagementArn = a} :: Engagement)
+
+-- | The ARN of the escalation plan or contact that Incident Manager is
+-- engaging.
+engagement_contactArn :: Lens.Lens' Engagement Prelude.Text
+engagement_contactArn = Lens.lens (\Engagement' {contactArn} -> contactArn) (\s@Engagement' {} a -> s {contactArn = a} :: Engagement)
+
+-- | The user that started the engagement.
+engagement_sender :: Lens.Lens' Engagement Prelude.Text
+engagement_sender = Lens.lens (\Engagement' {sender} -> sender) (\s@Engagement' {} a -> s {sender = a} :: Engagement)
+
+instance Data.FromJSON Engagement where
+  parseJSON =
+    Data.withObject
+      "Engagement"
+      ( \x ->
+          Engagement'
+            Prelude.<$> (x Data..:? "IncidentId")
+            Prelude.<*> (x Data..:? "StartTime")
+            Prelude.<*> (x Data..:? "StopTime")
+            Prelude.<*> (x Data..: "EngagementArn")
+            Prelude.<*> (x Data..: "ContactArn")
+            Prelude.<*> (x Data..: "Sender")
+      )
+
+instance Prelude.Hashable Engagement where
+  hashWithSalt _salt Engagement' {..} =
+    _salt
+      `Prelude.hashWithSalt` incidentId
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` stopTime
+      `Prelude.hashWithSalt` engagementArn
+      `Prelude.hashWithSalt` contactArn
+      `Prelude.hashWithSalt` sender
+
+instance Prelude.NFData Engagement where
+  rnf Engagement' {..} =
+    Prelude.rnf incidentId
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf stopTime
+      `Prelude.seq` Prelude.rnf engagementArn
+      `Prelude.seq` Prelude.rnf contactArn
+      `Prelude.seq` Prelude.rnf sender
diff --git a/gen/Amazonka/SSMContacts/Types/Page.hs b/gen/Amazonka/SSMContacts/Types/Page.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types/Page.hs
@@ -0,0 +1,168 @@
+{-# 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.SSMContacts.Types.Page
+-- 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.SSMContacts.Types.Page 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
+
+-- | Incident Manager engaging a contact\'s contact channel.
+--
+-- /See:/ 'newPage' smart constructor.
+data Page = Page'
+  { -- | The time the message was delivered to the contact channel.
+    deliveryTime :: Prelude.Maybe Data.POSIX,
+    -- | The ARN of the incident that\'s engaging the contact channel.
+    incidentId :: Prelude.Maybe Prelude.Text,
+    -- | The time that the contact channel acknowledged engagement.
+    readTime :: Prelude.Maybe Data.POSIX,
+    -- | The time that Incident Manager engaged the contact channel.
+    sentTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the page to the contact channel.
+    pageArn :: Prelude.Text,
+    -- | The ARN of the engagement that this page is part of.
+    engagementArn :: Prelude.Text,
+    -- | The ARN of the contact that Incident Manager is engaging.
+    contactArn :: Prelude.Text,
+    -- | The user that started the engagement.
+    sender :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Page' 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:
+--
+-- 'deliveryTime', 'page_deliveryTime' - The time the message was delivered to the contact channel.
+--
+-- 'incidentId', 'page_incidentId' - The ARN of the incident that\'s engaging the contact channel.
+--
+-- 'readTime', 'page_readTime' - The time that the contact channel acknowledged engagement.
+--
+-- 'sentTime', 'page_sentTime' - The time that Incident Manager engaged the contact channel.
+--
+-- 'pageArn', 'page_pageArn' - The Amazon Resource Name (ARN) of the page to the contact channel.
+--
+-- 'engagementArn', 'page_engagementArn' - The ARN of the engagement that this page is part of.
+--
+-- 'contactArn', 'page_contactArn' - The ARN of the contact that Incident Manager is engaging.
+--
+-- 'sender', 'page_sender' - The user that started the engagement.
+newPage ::
+  -- | 'pageArn'
+  Prelude.Text ->
+  -- | 'engagementArn'
+  Prelude.Text ->
+  -- | 'contactArn'
+  Prelude.Text ->
+  -- | 'sender'
+  Prelude.Text ->
+  Page
+newPage
+  pPageArn_
+  pEngagementArn_
+  pContactArn_
+  pSender_ =
+    Page'
+      { deliveryTime = Prelude.Nothing,
+        incidentId = Prelude.Nothing,
+        readTime = Prelude.Nothing,
+        sentTime = Prelude.Nothing,
+        pageArn = pPageArn_,
+        engagementArn = pEngagementArn_,
+        contactArn = pContactArn_,
+        sender = pSender_
+      }
+
+-- | The time the message was delivered to the contact channel.
+page_deliveryTime :: Lens.Lens' Page (Prelude.Maybe Prelude.UTCTime)
+page_deliveryTime = Lens.lens (\Page' {deliveryTime} -> deliveryTime) (\s@Page' {} a -> s {deliveryTime = a} :: Page) Prelude.. Lens.mapping Data._Time
+
+-- | The ARN of the incident that\'s engaging the contact channel.
+page_incidentId :: Lens.Lens' Page (Prelude.Maybe Prelude.Text)
+page_incidentId = Lens.lens (\Page' {incidentId} -> incidentId) (\s@Page' {} a -> s {incidentId = a} :: Page)
+
+-- | The time that the contact channel acknowledged engagement.
+page_readTime :: Lens.Lens' Page (Prelude.Maybe Prelude.UTCTime)
+page_readTime = Lens.lens (\Page' {readTime} -> readTime) (\s@Page' {} a -> s {readTime = a} :: Page) Prelude.. Lens.mapping Data._Time
+
+-- | The time that Incident Manager engaged the contact channel.
+page_sentTime :: Lens.Lens' Page (Prelude.Maybe Prelude.UTCTime)
+page_sentTime = Lens.lens (\Page' {sentTime} -> sentTime) (\s@Page' {} a -> s {sentTime = a} :: Page) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the page to the contact channel.
+page_pageArn :: Lens.Lens' Page Prelude.Text
+page_pageArn = Lens.lens (\Page' {pageArn} -> pageArn) (\s@Page' {} a -> s {pageArn = a} :: Page)
+
+-- | The ARN of the engagement that this page is part of.
+page_engagementArn :: Lens.Lens' Page Prelude.Text
+page_engagementArn = Lens.lens (\Page' {engagementArn} -> engagementArn) (\s@Page' {} a -> s {engagementArn = a} :: Page)
+
+-- | The ARN of the contact that Incident Manager is engaging.
+page_contactArn :: Lens.Lens' Page Prelude.Text
+page_contactArn = Lens.lens (\Page' {contactArn} -> contactArn) (\s@Page' {} a -> s {contactArn = a} :: Page)
+
+-- | The user that started the engagement.
+page_sender :: Lens.Lens' Page Prelude.Text
+page_sender = Lens.lens (\Page' {sender} -> sender) (\s@Page' {} a -> s {sender = a} :: Page)
+
+instance Data.FromJSON Page where
+  parseJSON =
+    Data.withObject
+      "Page"
+      ( \x ->
+          Page'
+            Prelude.<$> (x Data..:? "DeliveryTime")
+            Prelude.<*> (x Data..:? "IncidentId")
+            Prelude.<*> (x Data..:? "ReadTime")
+            Prelude.<*> (x Data..:? "SentTime")
+            Prelude.<*> (x Data..: "PageArn")
+            Prelude.<*> (x Data..: "EngagementArn")
+            Prelude.<*> (x Data..: "ContactArn")
+            Prelude.<*> (x Data..: "Sender")
+      )
+
+instance Prelude.Hashable Page where
+  hashWithSalt _salt Page' {..} =
+    _salt
+      `Prelude.hashWithSalt` deliveryTime
+      `Prelude.hashWithSalt` incidentId
+      `Prelude.hashWithSalt` readTime
+      `Prelude.hashWithSalt` sentTime
+      `Prelude.hashWithSalt` pageArn
+      `Prelude.hashWithSalt` engagementArn
+      `Prelude.hashWithSalt` contactArn
+      `Prelude.hashWithSalt` sender
+
+instance Prelude.NFData Page where
+  rnf Page' {..} =
+    Prelude.rnf deliveryTime
+      `Prelude.seq` Prelude.rnf incidentId
+      `Prelude.seq` Prelude.rnf readTime
+      `Prelude.seq` Prelude.rnf sentTime
+      `Prelude.seq` Prelude.rnf pageArn
+      `Prelude.seq` Prelude.rnf engagementArn
+      `Prelude.seq` Prelude.rnf contactArn
+      `Prelude.seq` Prelude.rnf sender
diff --git a/gen/Amazonka/SSMContacts/Types/Plan.hs b/gen/Amazonka/SSMContacts/Types/Plan.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types/Plan.hs
@@ -0,0 +1,79 @@
+{-# 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.SSMContacts.Types.Plan
+-- 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.SSMContacts.Types.Plan 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
+import Amazonka.SSMContacts.Types.Stage
+
+-- | The stages that an escalation plan or engagement plan engages contacts
+-- and contact methods in.
+--
+-- /See:/ 'newPlan' smart constructor.
+data Plan = Plan'
+  { -- | A list of stages that the escalation plan or engagement plan uses to
+    -- engage contacts and contact methods.
+    stages :: [Stage]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Plan' 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:
+--
+-- 'stages', 'plan_stages' - A list of stages that the escalation plan or engagement plan uses to
+-- engage contacts and contact methods.
+newPlan ::
+  Plan
+newPlan = Plan' {stages = Prelude.mempty}
+
+-- | A list of stages that the escalation plan or engagement plan uses to
+-- engage contacts and contact methods.
+plan_stages :: Lens.Lens' Plan [Stage]
+plan_stages = Lens.lens (\Plan' {stages} -> stages) (\s@Plan' {} a -> s {stages = a} :: Plan) Prelude.. Lens.coerced
+
+instance Data.FromJSON Plan where
+  parseJSON =
+    Data.withObject
+      "Plan"
+      ( \x ->
+          Plan'
+            Prelude.<$> (x Data..:? "Stages" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable Plan where
+  hashWithSalt _salt Plan' {..} =
+    _salt `Prelude.hashWithSalt` stages
+
+instance Prelude.NFData Plan where
+  rnf Plan' {..} = Prelude.rnf stages
+
+instance Data.ToJSON Plan where
+  toJSON Plan' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("Stages" Data..= stages)]
+      )
diff --git a/gen/Amazonka/SSMContacts/Types/Receipt.hs b/gen/Amazonka/SSMContacts/Types/Receipt.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types/Receipt.hs
@@ -0,0 +1,116 @@
+{-# 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.SSMContacts.Types.Receipt
+-- 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.SSMContacts.Types.Receipt 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
+import Amazonka.SSMContacts.Types.ReceiptType
+
+-- | Records events during an engagement.
+--
+-- /See:/ 'newReceipt' smart constructor.
+data Receipt = Receipt'
+  { -- | The Amazon Resource Name (ARN) of the contact channel Incident Manager
+    -- engaged.
+    contactChannelArn :: Prelude.Maybe Prelude.Text,
+    -- | Information provided during the page acknowledgement.
+    receiptInfo :: Prelude.Maybe Prelude.Text,
+    -- | The type follows the engagement cycle, @SENT@, @DELIVERED@, and @READ@.
+    receiptType :: ReceiptType,
+    -- | The time receipt was @SENT@, @DELIVERED@, or @READ@.
+    receiptTime :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Receipt' 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:
+--
+-- 'contactChannelArn', 'receipt_contactChannelArn' - The Amazon Resource Name (ARN) of the contact channel Incident Manager
+-- engaged.
+--
+-- 'receiptInfo', 'receipt_receiptInfo' - Information provided during the page acknowledgement.
+--
+-- 'receiptType', 'receipt_receiptType' - The type follows the engagement cycle, @SENT@, @DELIVERED@, and @READ@.
+--
+-- 'receiptTime', 'receipt_receiptTime' - The time receipt was @SENT@, @DELIVERED@, or @READ@.
+newReceipt ::
+  -- | 'receiptType'
+  ReceiptType ->
+  -- | 'receiptTime'
+  Prelude.UTCTime ->
+  Receipt
+newReceipt pReceiptType_ pReceiptTime_ =
+  Receipt'
+    { contactChannelArn = Prelude.Nothing,
+      receiptInfo = Prelude.Nothing,
+      receiptType = pReceiptType_,
+      receiptTime = Data._Time Lens.# pReceiptTime_
+    }
+
+-- | The Amazon Resource Name (ARN) of the contact channel Incident Manager
+-- engaged.
+receipt_contactChannelArn :: Lens.Lens' Receipt (Prelude.Maybe Prelude.Text)
+receipt_contactChannelArn = Lens.lens (\Receipt' {contactChannelArn} -> contactChannelArn) (\s@Receipt' {} a -> s {contactChannelArn = a} :: Receipt)
+
+-- | Information provided during the page acknowledgement.
+receipt_receiptInfo :: Lens.Lens' Receipt (Prelude.Maybe Prelude.Text)
+receipt_receiptInfo = Lens.lens (\Receipt' {receiptInfo} -> receiptInfo) (\s@Receipt' {} a -> s {receiptInfo = a} :: Receipt)
+
+-- | The type follows the engagement cycle, @SENT@, @DELIVERED@, and @READ@.
+receipt_receiptType :: Lens.Lens' Receipt ReceiptType
+receipt_receiptType = Lens.lens (\Receipt' {receiptType} -> receiptType) (\s@Receipt' {} a -> s {receiptType = a} :: Receipt)
+
+-- | The time receipt was @SENT@, @DELIVERED@, or @READ@.
+receipt_receiptTime :: Lens.Lens' Receipt Prelude.UTCTime
+receipt_receiptTime = Lens.lens (\Receipt' {receiptTime} -> receiptTime) (\s@Receipt' {} a -> s {receiptTime = a} :: Receipt) Prelude.. Data._Time
+
+instance Data.FromJSON Receipt where
+  parseJSON =
+    Data.withObject
+      "Receipt"
+      ( \x ->
+          Receipt'
+            Prelude.<$> (x Data..:? "ContactChannelArn")
+            Prelude.<*> (x Data..:? "ReceiptInfo")
+            Prelude.<*> (x Data..: "ReceiptType")
+            Prelude.<*> (x Data..: "ReceiptTime")
+      )
+
+instance Prelude.Hashable Receipt where
+  hashWithSalt _salt Receipt' {..} =
+    _salt
+      `Prelude.hashWithSalt` contactChannelArn
+      `Prelude.hashWithSalt` receiptInfo
+      `Prelude.hashWithSalt` receiptType
+      `Prelude.hashWithSalt` receiptTime
+
+instance Prelude.NFData Receipt where
+  rnf Receipt' {..} =
+    Prelude.rnf contactChannelArn
+      `Prelude.seq` Prelude.rnf receiptInfo
+      `Prelude.seq` Prelude.rnf receiptType
+      `Prelude.seq` Prelude.rnf receiptTime
diff --git a/gen/Amazonka/SSMContacts/Types/ReceiptType.hs b/gen/Amazonka/SSMContacts/Types/ReceiptType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types/ReceiptType.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.SSMContacts.Types.ReceiptType
+-- 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.SSMContacts.Types.ReceiptType
+  ( ReceiptType
+      ( ..,
+        ReceiptType_DELIVERED,
+        ReceiptType_ERROR,
+        ReceiptType_READ,
+        ReceiptType_SENT,
+        ReceiptType_STOP
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ReceiptType = ReceiptType'
+  { fromReceiptType ::
+      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 ReceiptType_DELIVERED :: ReceiptType
+pattern ReceiptType_DELIVERED = ReceiptType' "DELIVERED"
+
+pattern ReceiptType_ERROR :: ReceiptType
+pattern ReceiptType_ERROR = ReceiptType' "ERROR"
+
+pattern ReceiptType_READ :: ReceiptType
+pattern ReceiptType_READ = ReceiptType' "READ"
+
+pattern ReceiptType_SENT :: ReceiptType
+pattern ReceiptType_SENT = ReceiptType' "SENT"
+
+pattern ReceiptType_STOP :: ReceiptType
+pattern ReceiptType_STOP = ReceiptType' "STOP"
+
+{-# COMPLETE
+  ReceiptType_DELIVERED,
+  ReceiptType_ERROR,
+  ReceiptType_READ,
+  ReceiptType_SENT,
+  ReceiptType_STOP,
+  ReceiptType'
+  #-}
diff --git a/gen/Amazonka/SSMContacts/Types/Stage.hs b/gen/Amazonka/SSMContacts/Types/Stage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types/Stage.hs
@@ -0,0 +1,104 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.SSMContacts.Types.Stage
+-- 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.SSMContacts.Types.Stage 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
+import Amazonka.SSMContacts.Types.Target
+
+-- | A set amount of time that an escalation plan or engagement plan engages
+-- the specified contacts or contact methods.
+--
+-- /See:/ 'newStage' smart constructor.
+data Stage = Stage'
+  { -- | The time to wait until beginning the next stage. The duration can only
+    -- be set to 0 if a target is specified.
+    durationInMinutes :: Prelude.Natural,
+    -- | The contacts or contact methods that the escalation plan or engagement
+    -- plan is engaging.
+    targets :: [Target]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Stage' 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:
+--
+-- 'durationInMinutes', 'stage_durationInMinutes' - The time to wait until beginning the next stage. The duration can only
+-- be set to 0 if a target is specified.
+--
+-- 'targets', 'stage_targets' - The contacts or contact methods that the escalation plan or engagement
+-- plan is engaging.
+newStage ::
+  -- | 'durationInMinutes'
+  Prelude.Natural ->
+  Stage
+newStage pDurationInMinutes_ =
+  Stage'
+    { durationInMinutes = pDurationInMinutes_,
+      targets = Prelude.mempty
+    }
+
+-- | The time to wait until beginning the next stage. The duration can only
+-- be set to 0 if a target is specified.
+stage_durationInMinutes :: Lens.Lens' Stage Prelude.Natural
+stage_durationInMinutes = Lens.lens (\Stage' {durationInMinutes} -> durationInMinutes) (\s@Stage' {} a -> s {durationInMinutes = a} :: Stage)
+
+-- | The contacts or contact methods that the escalation plan or engagement
+-- plan is engaging.
+stage_targets :: Lens.Lens' Stage [Target]
+stage_targets = Lens.lens (\Stage' {targets} -> targets) (\s@Stage' {} a -> s {targets = a} :: Stage) Prelude.. Lens.coerced
+
+instance Data.FromJSON Stage where
+  parseJSON =
+    Data.withObject
+      "Stage"
+      ( \x ->
+          Stage'
+            Prelude.<$> (x Data..: "DurationInMinutes")
+            Prelude.<*> (x Data..:? "Targets" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable Stage where
+  hashWithSalt _salt Stage' {..} =
+    _salt
+      `Prelude.hashWithSalt` durationInMinutes
+      `Prelude.hashWithSalt` targets
+
+instance Prelude.NFData Stage where
+  rnf Stage' {..} =
+    Prelude.rnf durationInMinutes
+      `Prelude.seq` Prelude.rnf targets
+
+instance Data.ToJSON Stage where
+  toJSON Stage' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("DurationInMinutes" Data..= durationInMinutes),
+            Prelude.Just ("Targets" Data..= targets)
+          ]
+      )
diff --git a/gen/Amazonka/SSMContacts/Types/Tag.hs b/gen/Amazonka/SSMContacts/Types/Tag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types/Tag.hs
@@ -0,0 +1,92 @@
+{-# 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.SSMContacts.Types.Tag
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.SSMContacts.Types.Tag where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | A container of a key-value name pair.
+--
+-- /See:/ 'newTag' smart constructor.
+data Tag = Tag'
+  { -- | Name of the object key.
+    key :: Prelude.Maybe Prelude.Text,
+    -- | Value of the tag.
+    value :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Tag' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'key', 'tag_key' - Name of the object key.
+--
+-- 'value', 'tag_value' - Value of the tag.
+newTag ::
+  Tag
+newTag =
+  Tag'
+    { key = Prelude.Nothing,
+      value = Prelude.Nothing
+    }
+
+-- | Name of the object key.
+tag_key :: Lens.Lens' Tag (Prelude.Maybe Prelude.Text)
+tag_key = Lens.lens (\Tag' {key} -> key) (\s@Tag' {} a -> s {key = a} :: Tag)
+
+-- | Value of the tag.
+tag_value :: Lens.Lens' Tag (Prelude.Maybe Prelude.Text)
+tag_value = Lens.lens (\Tag' {value} -> value) (\s@Tag' {} a -> s {value = a} :: Tag)
+
+instance Data.FromJSON Tag where
+  parseJSON =
+    Data.withObject
+      "Tag"
+      ( \x ->
+          Tag'
+            Prelude.<$> (x Data..:? "Key")
+            Prelude.<*> (x Data..:? "Value")
+      )
+
+instance Prelude.Hashable Tag where
+  hashWithSalt _salt Tag' {..} =
+    _salt
+      `Prelude.hashWithSalt` key
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData Tag where
+  rnf Tag' {..} =
+    Prelude.rnf key `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON Tag where
+  toJSON Tag' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Key" Data..=) Prelude.<$> key,
+            ("Value" Data..=) Prelude.<$> value
+          ]
+      )
diff --git a/gen/Amazonka/SSMContacts/Types/Target.hs b/gen/Amazonka/SSMContacts/Types/Target.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types/Target.hs
@@ -0,0 +1,97 @@
+{-# 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.SSMContacts.Types.Target
+-- 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.SSMContacts.Types.Target 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
+import Amazonka.SSMContacts.Types.ChannelTargetInfo
+import Amazonka.SSMContacts.Types.ContactTargetInfo
+
+-- | The contact or contact channel that\'s being engaged.
+--
+-- /See:/ 'newTarget' smart constructor.
+data Target = Target'
+  { -- | Information about the contact channel Incident Manager is engaging.
+    channelTargetInfo :: Prelude.Maybe ChannelTargetInfo,
+    -- | Information about the contact that Incident Manager is engaging.
+    contactTargetInfo :: Prelude.Maybe ContactTargetInfo
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Target' 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:
+--
+-- 'channelTargetInfo', 'target_channelTargetInfo' - Information about the contact channel Incident Manager is engaging.
+--
+-- 'contactTargetInfo', 'target_contactTargetInfo' - Information about the contact that Incident Manager is engaging.
+newTarget ::
+  Target
+newTarget =
+  Target'
+    { channelTargetInfo = Prelude.Nothing,
+      contactTargetInfo = Prelude.Nothing
+    }
+
+-- | Information about the contact channel Incident Manager is engaging.
+target_channelTargetInfo :: Lens.Lens' Target (Prelude.Maybe ChannelTargetInfo)
+target_channelTargetInfo = Lens.lens (\Target' {channelTargetInfo} -> channelTargetInfo) (\s@Target' {} a -> s {channelTargetInfo = a} :: Target)
+
+-- | Information about the contact that Incident Manager is engaging.
+target_contactTargetInfo :: Lens.Lens' Target (Prelude.Maybe ContactTargetInfo)
+target_contactTargetInfo = Lens.lens (\Target' {contactTargetInfo} -> contactTargetInfo) (\s@Target' {} a -> s {contactTargetInfo = a} :: Target)
+
+instance Data.FromJSON Target where
+  parseJSON =
+    Data.withObject
+      "Target"
+      ( \x ->
+          Target'
+            Prelude.<$> (x Data..:? "ChannelTargetInfo")
+            Prelude.<*> (x Data..:? "ContactTargetInfo")
+      )
+
+instance Prelude.Hashable Target where
+  hashWithSalt _salt Target' {..} =
+    _salt
+      `Prelude.hashWithSalt` channelTargetInfo
+      `Prelude.hashWithSalt` contactTargetInfo
+
+instance Prelude.NFData Target where
+  rnf Target' {..} =
+    Prelude.rnf channelTargetInfo
+      `Prelude.seq` Prelude.rnf contactTargetInfo
+
+instance Data.ToJSON Target where
+  toJSON Target' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ChannelTargetInfo" Data..=)
+              Prelude.<$> channelTargetInfo,
+            ("ContactTargetInfo" Data..=)
+              Prelude.<$> contactTargetInfo
+          ]
+      )
diff --git a/gen/Amazonka/SSMContacts/Types/TimeRange.hs b/gen/Amazonka/SSMContacts/Types/TimeRange.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/Types/TimeRange.hs
@@ -0,0 +1,83 @@
+{-# 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.SSMContacts.Types.TimeRange
+-- 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.SSMContacts.Types.TimeRange 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 range of between two set times
+--
+-- /See:/ 'newTimeRange' smart constructor.
+data TimeRange = TimeRange'
+  { -- | The end of the time range.
+    endTime :: Prelude.Maybe Data.POSIX,
+    -- | The start of the time range.
+    startTime :: Prelude.Maybe Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TimeRange' 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', 'timeRange_endTime' - The end of the time range.
+--
+-- 'startTime', 'timeRange_startTime' - The start of the time range.
+newTimeRange ::
+  TimeRange
+newTimeRange =
+  TimeRange'
+    { endTime = Prelude.Nothing,
+      startTime = Prelude.Nothing
+    }
+
+-- | The end of the time range.
+timeRange_endTime :: Lens.Lens' TimeRange (Prelude.Maybe Prelude.UTCTime)
+timeRange_endTime = Lens.lens (\TimeRange' {endTime} -> endTime) (\s@TimeRange' {} a -> s {endTime = a} :: TimeRange) Prelude.. Lens.mapping Data._Time
+
+-- | The start of the time range.
+timeRange_startTime :: Lens.Lens' TimeRange (Prelude.Maybe Prelude.UTCTime)
+timeRange_startTime = Lens.lens (\TimeRange' {startTime} -> startTime) (\s@TimeRange' {} a -> s {startTime = a} :: TimeRange) Prelude.. Lens.mapping Data._Time
+
+instance Prelude.Hashable TimeRange where
+  hashWithSalt _salt TimeRange' {..} =
+    _salt
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` startTime
+
+instance Prelude.NFData TimeRange where
+  rnf TimeRange' {..} =
+    Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf startTime
+
+instance Data.ToJSON TimeRange where
+  toJSON TimeRange' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("EndTime" Data..=) Prelude.<$> endTime,
+            ("StartTime" Data..=) Prelude.<$> startTime
+          ]
+      )
diff --git a/gen/Amazonka/SSMContacts/UntagResource.hs b/gen/Amazonka/SSMContacts/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/UntagResource.hs
@@ -0,0 +1,169 @@
+{-# 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.SSMContacts.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 specified resource.
+module Amazonka.SSMContacts.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 qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | The Amazon Resource Name (ARN) of the contact or escalation plan.
+    resourceARN :: Prelude.Text,
+    -- | The key of the tag that you want to remove.
+    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' - The Amazon Resource Name (ARN) of the contact or escalation plan.
+--
+-- 'tagKeys', 'untagResource_tagKeys' - The key of the tag that you want to remove.
+newUntagResource ::
+  -- | 'resourceARN'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceARN_ =
+  UntagResource'
+    { resourceARN = pResourceARN_,
+      tagKeys = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the contact or escalation plan.
+untagResource_resourceARN :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceARN = Lens.lens (\UntagResource' {resourceARN} -> resourceARN) (\s@UntagResource' {} a -> s {resourceARN = a} :: UntagResource)
+
+-- | The key of the tag that you want to remove.
+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.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UntagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UntagResource where
+  hashWithSalt _salt UntagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceARN
+      `Prelude.hashWithSalt` tagKeys
+
+instance Prelude.NFData UntagResource where
+  rnf UntagResource' {..} =
+    Prelude.rnf resourceARN
+      `Prelude.seq` Prelude.rnf tagKeys
+
+instance Data.ToHeaders UntagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("SSMContacts.UntagResource" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UntagResource where
+  toJSON UntagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("ResourceARN" Data..= resourceARN),
+            Prelude.Just ("TagKeys" Data..= tagKeys)
+          ]
+      )
+
+instance Data.ToPath UntagResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UntagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUntagResourceResponse' smart constructor.
+data UntagResourceResponse = UntagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'untagResourceResponse_httpStatus' - The response's http status code.
+newUntagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UntagResourceResponse
+newUntagResourceResponse pHttpStatus_ =
+  UntagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+untagResourceResponse_httpStatus :: Lens.Lens' UntagResourceResponse Prelude.Int
+untagResourceResponse_httpStatus = Lens.lens (\UntagResourceResponse' {httpStatus} -> httpStatus) (\s@UntagResourceResponse' {} a -> s {httpStatus = a} :: UntagResourceResponse)
+
+instance Prelude.NFData UntagResourceResponse where
+  rnf UntagResourceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/SSMContacts/UpdateContact.hs b/gen/Amazonka/SSMContacts/UpdateContact.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/UpdateContact.hs
@@ -0,0 +1,191 @@
+{-# 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.SSMContacts.UpdateContact
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the contact or escalation plan specified.
+module Amazonka.SSMContacts.UpdateContact
+  ( -- * Creating a Request
+    UpdateContact (..),
+    newUpdateContact,
+
+    -- * Request Lenses
+    updateContact_displayName,
+    updateContact_plan,
+    updateContact_contactId,
+
+    -- * Destructuring the Response
+    UpdateContactResponse (..),
+    newUpdateContactResponse,
+
+    -- * Response Lenses
+    updateContactResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newUpdateContact' smart constructor.
+data UpdateContact = UpdateContact'
+  { -- | The full name of the contact or escalation plan.
+    displayName :: Prelude.Maybe Prelude.Text,
+    -- | A list of stages. A contact has an engagement plan with stages for
+    -- specified contact channels. An escalation plan uses these stages to
+    -- contact specified contacts.
+    plan :: Prelude.Maybe Plan,
+    -- | The Amazon Resource Name (ARN) of the contact or escalation plan you\'re
+    -- updating.
+    contactId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateContact' 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:
+--
+-- 'displayName', 'updateContact_displayName' - The full name of the contact or escalation plan.
+--
+-- 'plan', 'updateContact_plan' - A list of stages. A contact has an engagement plan with stages for
+-- specified contact channels. An escalation plan uses these stages to
+-- contact specified contacts.
+--
+-- 'contactId', 'updateContact_contactId' - The Amazon Resource Name (ARN) of the contact or escalation plan you\'re
+-- updating.
+newUpdateContact ::
+  -- | 'contactId'
+  Prelude.Text ->
+  UpdateContact
+newUpdateContact pContactId_ =
+  UpdateContact'
+    { displayName = Prelude.Nothing,
+      plan = Prelude.Nothing,
+      contactId = pContactId_
+    }
+
+-- | The full name of the contact or escalation plan.
+updateContact_displayName :: Lens.Lens' UpdateContact (Prelude.Maybe Prelude.Text)
+updateContact_displayName = Lens.lens (\UpdateContact' {displayName} -> displayName) (\s@UpdateContact' {} a -> s {displayName = a} :: UpdateContact)
+
+-- | A list of stages. A contact has an engagement plan with stages for
+-- specified contact channels. An escalation plan uses these stages to
+-- contact specified contacts.
+updateContact_plan :: Lens.Lens' UpdateContact (Prelude.Maybe Plan)
+updateContact_plan = Lens.lens (\UpdateContact' {plan} -> plan) (\s@UpdateContact' {} a -> s {plan = a} :: UpdateContact)
+
+-- | The Amazon Resource Name (ARN) of the contact or escalation plan you\'re
+-- updating.
+updateContact_contactId :: Lens.Lens' UpdateContact Prelude.Text
+updateContact_contactId = Lens.lens (\UpdateContact' {contactId} -> contactId) (\s@UpdateContact' {} a -> s {contactId = a} :: UpdateContact)
+
+instance Core.AWSRequest UpdateContact where
+  type
+    AWSResponse UpdateContact =
+      UpdateContactResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UpdateContactResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateContact where
+  hashWithSalt _salt UpdateContact' {..} =
+    _salt
+      `Prelude.hashWithSalt` displayName
+      `Prelude.hashWithSalt` plan
+      `Prelude.hashWithSalt` contactId
+
+instance Prelude.NFData UpdateContact where
+  rnf UpdateContact' {..} =
+    Prelude.rnf displayName
+      `Prelude.seq` Prelude.rnf plan
+      `Prelude.seq` Prelude.rnf contactId
+
+instance Data.ToHeaders UpdateContact where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("SSMContacts.UpdateContact" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateContact where
+  toJSON UpdateContact' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DisplayName" Data..=) Prelude.<$> displayName,
+            ("Plan" Data..=) Prelude.<$> plan,
+            Prelude.Just ("ContactId" Data..= contactId)
+          ]
+      )
+
+instance Data.ToPath UpdateContact where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateContact where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateContactResponse' smart constructor.
+data UpdateContactResponse = UpdateContactResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateContactResponse' 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', 'updateContactResponse_httpStatus' - The response's http status code.
+newUpdateContactResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateContactResponse
+newUpdateContactResponse pHttpStatus_ =
+  UpdateContactResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+updateContactResponse_httpStatus :: Lens.Lens' UpdateContactResponse Prelude.Int
+updateContactResponse_httpStatus = Lens.lens (\UpdateContactResponse' {httpStatus} -> httpStatus) (\s@UpdateContactResponse' {} a -> s {httpStatus = a} :: UpdateContactResponse)
+
+instance Prelude.NFData UpdateContactResponse where
+  rnf UpdateContactResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/SSMContacts/UpdateContactChannel.hs b/gen/Amazonka/SSMContacts/UpdateContactChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/UpdateContactChannel.hs
@@ -0,0 +1,196 @@
+{-# 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.SSMContacts.UpdateContactChannel
+-- 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 contact\'s contact channel.
+module Amazonka.SSMContacts.UpdateContactChannel
+  ( -- * Creating a Request
+    UpdateContactChannel (..),
+    newUpdateContactChannel,
+
+    -- * Request Lenses
+    updateContactChannel_deliveryAddress,
+    updateContactChannel_name,
+    updateContactChannel_contactChannelId,
+
+    -- * Destructuring the Response
+    UpdateContactChannelResponse (..),
+    newUpdateContactChannelResponse,
+
+    -- * Response Lenses
+    updateContactChannelResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.SSMContacts.Types
+
+-- | /See:/ 'newUpdateContactChannel' smart constructor.
+data UpdateContactChannel = UpdateContactChannel'
+  { -- | The details that Incident Manager uses when trying to engage the contact
+    -- channel.
+    deliveryAddress :: Prelude.Maybe ContactChannelAddress,
+    -- | The name of the contact channel.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the contact channel you want to
+    -- update.
+    contactChannelId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateContactChannel' 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:
+--
+-- 'deliveryAddress', 'updateContactChannel_deliveryAddress' - The details that Incident Manager uses when trying to engage the contact
+-- channel.
+--
+-- 'name', 'updateContactChannel_name' - The name of the contact channel.
+--
+-- 'contactChannelId', 'updateContactChannel_contactChannelId' - The Amazon Resource Name (ARN) of the contact channel you want to
+-- update.
+newUpdateContactChannel ::
+  -- | 'contactChannelId'
+  Prelude.Text ->
+  UpdateContactChannel
+newUpdateContactChannel pContactChannelId_ =
+  UpdateContactChannel'
+    { deliveryAddress =
+        Prelude.Nothing,
+      name = Prelude.Nothing,
+      contactChannelId = pContactChannelId_
+    }
+
+-- | The details that Incident Manager uses when trying to engage the contact
+-- channel.
+updateContactChannel_deliveryAddress :: Lens.Lens' UpdateContactChannel (Prelude.Maybe ContactChannelAddress)
+updateContactChannel_deliveryAddress = Lens.lens (\UpdateContactChannel' {deliveryAddress} -> deliveryAddress) (\s@UpdateContactChannel' {} a -> s {deliveryAddress = a} :: UpdateContactChannel)
+
+-- | The name of the contact channel.
+updateContactChannel_name :: Lens.Lens' UpdateContactChannel (Prelude.Maybe Prelude.Text)
+updateContactChannel_name = Lens.lens (\UpdateContactChannel' {name} -> name) (\s@UpdateContactChannel' {} a -> s {name = a} :: UpdateContactChannel)
+
+-- | The Amazon Resource Name (ARN) of the contact channel you want to
+-- update.
+updateContactChannel_contactChannelId :: Lens.Lens' UpdateContactChannel Prelude.Text
+updateContactChannel_contactChannelId = Lens.lens (\UpdateContactChannel' {contactChannelId} -> contactChannelId) (\s@UpdateContactChannel' {} a -> s {contactChannelId = a} :: UpdateContactChannel)
+
+instance Core.AWSRequest UpdateContactChannel where
+  type
+    AWSResponse UpdateContactChannel =
+      UpdateContactChannelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UpdateContactChannelResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateContactChannel where
+  hashWithSalt _salt UpdateContactChannel' {..} =
+    _salt
+      `Prelude.hashWithSalt` deliveryAddress
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` contactChannelId
+
+instance Prelude.NFData UpdateContactChannel where
+  rnf UpdateContactChannel' {..} =
+    Prelude.rnf deliveryAddress
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf contactChannelId
+
+instance Data.ToHeaders UpdateContactChannel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SSMContacts.UpdateContactChannel" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateContactChannel where
+  toJSON UpdateContactChannel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DeliveryAddress" Data..=)
+              Prelude.<$> deliveryAddress,
+            ("Name" Data..=) Prelude.<$> name,
+            Prelude.Just
+              ("ContactChannelId" Data..= contactChannelId)
+          ]
+      )
+
+instance Data.ToPath UpdateContactChannel where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateContactChannel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateContactChannelResponse' smart constructor.
+data UpdateContactChannelResponse = UpdateContactChannelResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateContactChannelResponse' 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', 'updateContactChannelResponse_httpStatus' - The response's http status code.
+newUpdateContactChannelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateContactChannelResponse
+newUpdateContactChannelResponse pHttpStatus_ =
+  UpdateContactChannelResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+updateContactChannelResponse_httpStatus :: Lens.Lens' UpdateContactChannelResponse Prelude.Int
+updateContactChannelResponse_httpStatus = Lens.lens (\UpdateContactChannelResponse' {httpStatus} -> httpStatus) (\s@UpdateContactChannelResponse' {} a -> s {httpStatus = a} :: UpdateContactChannelResponse)
+
+instance Prelude.NFData UpdateContactChannelResponse where
+  rnf UpdateContactChannelResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/SSMContacts/Waiters.hs b/gen/Amazonka/SSMContacts/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/SSMContacts/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.SSMContacts.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.SSMContacts.Waiters 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
+import Amazonka.SSMContacts.Lens
+import Amazonka.SSMContacts.Types
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.SSMContacts
+import Test.Amazonka.SSMContacts.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "SSMContacts"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/SSMContacts.hs b/test/Test/Amazonka/Gen/SSMContacts.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/SSMContacts.hs
@@ -0,0 +1,578 @@
+{-# 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.SSMContacts
+-- 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.SSMContacts where
+
+import Amazonka.SSMContacts
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.Prelude
+import Test.Amazonka.SSMContacts.Internal
+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"
+--         [ requestAcceptPage $
+--             newAcceptPage
+--
+--         , requestActivateContactChannel $
+--             newActivateContactChannel
+--
+--         , requestCreateContact $
+--             newCreateContact
+--
+--         , requestCreateContactChannel $
+--             newCreateContactChannel
+--
+--         , requestDeactivateContactChannel $
+--             newDeactivateContactChannel
+--
+--         , requestDeleteContact $
+--             newDeleteContact
+--
+--         , requestDeleteContactChannel $
+--             newDeleteContactChannel
+--
+--         , requestDescribeEngagement $
+--             newDescribeEngagement
+--
+--         , requestDescribePage $
+--             newDescribePage
+--
+--         , requestGetContact $
+--             newGetContact
+--
+--         , requestGetContactChannel $
+--             newGetContactChannel
+--
+--         , requestGetContactPolicy $
+--             newGetContactPolicy
+--
+--         , requestListContactChannels $
+--             newListContactChannels
+--
+--         , requestListContacts $
+--             newListContacts
+--
+--         , requestListEngagements $
+--             newListEngagements
+--
+--         , requestListPageReceipts $
+--             newListPageReceipts
+--
+--         , requestListPagesByContact $
+--             newListPagesByContact
+--
+--         , requestListPagesByEngagement $
+--             newListPagesByEngagement
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestPutContactPolicy $
+--             newPutContactPolicy
+--
+--         , requestSendActivationCode $
+--             newSendActivationCode
+--
+--         , requestStartEngagement $
+--             newStartEngagement
+--
+--         , requestStopEngagement $
+--             newStopEngagement
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateContact $
+--             newUpdateContact
+--
+--         , requestUpdateContactChannel $
+--             newUpdateContactChannel
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseAcceptPage $
+--             newAcceptPageResponse
+--
+--         , responseActivateContactChannel $
+--             newActivateContactChannelResponse
+--
+--         , responseCreateContact $
+--             newCreateContactResponse
+--
+--         , responseCreateContactChannel $
+--             newCreateContactChannelResponse
+--
+--         , responseDeactivateContactChannel $
+--             newDeactivateContactChannelResponse
+--
+--         , responseDeleteContact $
+--             newDeleteContactResponse
+--
+--         , responseDeleteContactChannel $
+--             newDeleteContactChannelResponse
+--
+--         , responseDescribeEngagement $
+--             newDescribeEngagementResponse
+--
+--         , responseDescribePage $
+--             newDescribePageResponse
+--
+--         , responseGetContact $
+--             newGetContactResponse
+--
+--         , responseGetContactChannel $
+--             newGetContactChannelResponse
+--
+--         , responseGetContactPolicy $
+--             newGetContactPolicyResponse
+--
+--         , responseListContactChannels $
+--             newListContactChannelsResponse
+--
+--         , responseListContacts $
+--             newListContactsResponse
+--
+--         , responseListEngagements $
+--             newListEngagementsResponse
+--
+--         , responseListPageReceipts $
+--             newListPageReceiptsResponse
+--
+--         , responseListPagesByContact $
+--             newListPagesByContactResponse
+--
+--         , responseListPagesByEngagement $
+--             newListPagesByEngagementResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responsePutContactPolicy $
+--             newPutContactPolicyResponse
+--
+--         , responseSendActivationCode $
+--             newSendActivationCodeResponse
+--
+--         , responseStartEngagement $
+--             newStartEngagementResponse
+--
+--         , responseStopEngagement $
+--             newStopEngagementResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateContact $
+--             newUpdateContactResponse
+--
+--         , responseUpdateContactChannel $
+--             newUpdateContactChannelResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestAcceptPage :: AcceptPage -> TestTree
+requestAcceptPage =
+  req
+    "AcceptPage"
+    "fixture/AcceptPage.yaml"
+
+requestActivateContactChannel :: ActivateContactChannel -> TestTree
+requestActivateContactChannel =
+  req
+    "ActivateContactChannel"
+    "fixture/ActivateContactChannel.yaml"
+
+requestCreateContact :: CreateContact -> TestTree
+requestCreateContact =
+  req
+    "CreateContact"
+    "fixture/CreateContact.yaml"
+
+requestCreateContactChannel :: CreateContactChannel -> TestTree
+requestCreateContactChannel =
+  req
+    "CreateContactChannel"
+    "fixture/CreateContactChannel.yaml"
+
+requestDeactivateContactChannel :: DeactivateContactChannel -> TestTree
+requestDeactivateContactChannel =
+  req
+    "DeactivateContactChannel"
+    "fixture/DeactivateContactChannel.yaml"
+
+requestDeleteContact :: DeleteContact -> TestTree
+requestDeleteContact =
+  req
+    "DeleteContact"
+    "fixture/DeleteContact.yaml"
+
+requestDeleteContactChannel :: DeleteContactChannel -> TestTree
+requestDeleteContactChannel =
+  req
+    "DeleteContactChannel"
+    "fixture/DeleteContactChannel.yaml"
+
+requestDescribeEngagement :: DescribeEngagement -> TestTree
+requestDescribeEngagement =
+  req
+    "DescribeEngagement"
+    "fixture/DescribeEngagement.yaml"
+
+requestDescribePage :: DescribePage -> TestTree
+requestDescribePage =
+  req
+    "DescribePage"
+    "fixture/DescribePage.yaml"
+
+requestGetContact :: GetContact -> TestTree
+requestGetContact =
+  req
+    "GetContact"
+    "fixture/GetContact.yaml"
+
+requestGetContactChannel :: GetContactChannel -> TestTree
+requestGetContactChannel =
+  req
+    "GetContactChannel"
+    "fixture/GetContactChannel.yaml"
+
+requestGetContactPolicy :: GetContactPolicy -> TestTree
+requestGetContactPolicy =
+  req
+    "GetContactPolicy"
+    "fixture/GetContactPolicy.yaml"
+
+requestListContactChannels :: ListContactChannels -> TestTree
+requestListContactChannels =
+  req
+    "ListContactChannels"
+    "fixture/ListContactChannels.yaml"
+
+requestListContacts :: ListContacts -> TestTree
+requestListContacts =
+  req
+    "ListContacts"
+    "fixture/ListContacts.yaml"
+
+requestListEngagements :: ListEngagements -> TestTree
+requestListEngagements =
+  req
+    "ListEngagements"
+    "fixture/ListEngagements.yaml"
+
+requestListPageReceipts :: ListPageReceipts -> TestTree
+requestListPageReceipts =
+  req
+    "ListPageReceipts"
+    "fixture/ListPageReceipts.yaml"
+
+requestListPagesByContact :: ListPagesByContact -> TestTree
+requestListPagesByContact =
+  req
+    "ListPagesByContact"
+    "fixture/ListPagesByContact.yaml"
+
+requestListPagesByEngagement :: ListPagesByEngagement -> TestTree
+requestListPagesByEngagement =
+  req
+    "ListPagesByEngagement"
+    "fixture/ListPagesByEngagement.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestPutContactPolicy :: PutContactPolicy -> TestTree
+requestPutContactPolicy =
+  req
+    "PutContactPolicy"
+    "fixture/PutContactPolicy.yaml"
+
+requestSendActivationCode :: SendActivationCode -> TestTree
+requestSendActivationCode =
+  req
+    "SendActivationCode"
+    "fixture/SendActivationCode.yaml"
+
+requestStartEngagement :: StartEngagement -> TestTree
+requestStartEngagement =
+  req
+    "StartEngagement"
+    "fixture/StartEngagement.yaml"
+
+requestStopEngagement :: StopEngagement -> TestTree
+requestStopEngagement =
+  req
+    "StopEngagement"
+    "fixture/StopEngagement.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateContact :: UpdateContact -> TestTree
+requestUpdateContact =
+  req
+    "UpdateContact"
+    "fixture/UpdateContact.yaml"
+
+requestUpdateContactChannel :: UpdateContactChannel -> TestTree
+requestUpdateContactChannel =
+  req
+    "UpdateContactChannel"
+    "fixture/UpdateContactChannel.yaml"
+
+-- Responses
+
+responseAcceptPage :: AcceptPageResponse -> TestTree
+responseAcceptPage =
+  res
+    "AcceptPageResponse"
+    "fixture/AcceptPageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy AcceptPage)
+
+responseActivateContactChannel :: ActivateContactChannelResponse -> TestTree
+responseActivateContactChannel =
+  res
+    "ActivateContactChannelResponse"
+    "fixture/ActivateContactChannelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ActivateContactChannel)
+
+responseCreateContact :: CreateContactResponse -> TestTree
+responseCreateContact =
+  res
+    "CreateContactResponse"
+    "fixture/CreateContactResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateContact)
+
+responseCreateContactChannel :: CreateContactChannelResponse -> TestTree
+responseCreateContactChannel =
+  res
+    "CreateContactChannelResponse"
+    "fixture/CreateContactChannelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateContactChannel)
+
+responseDeactivateContactChannel :: DeactivateContactChannelResponse -> TestTree
+responseDeactivateContactChannel =
+  res
+    "DeactivateContactChannelResponse"
+    "fixture/DeactivateContactChannelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeactivateContactChannel)
+
+responseDeleteContact :: DeleteContactResponse -> TestTree
+responseDeleteContact =
+  res
+    "DeleteContactResponse"
+    "fixture/DeleteContactResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteContact)
+
+responseDeleteContactChannel :: DeleteContactChannelResponse -> TestTree
+responseDeleteContactChannel =
+  res
+    "DeleteContactChannelResponse"
+    "fixture/DeleteContactChannelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteContactChannel)
+
+responseDescribeEngagement :: DescribeEngagementResponse -> TestTree
+responseDescribeEngagement =
+  res
+    "DescribeEngagementResponse"
+    "fixture/DescribeEngagementResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeEngagement)
+
+responseDescribePage :: DescribePageResponse -> TestTree
+responseDescribePage =
+  res
+    "DescribePageResponse"
+    "fixture/DescribePageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribePage)
+
+responseGetContact :: GetContactResponse -> TestTree
+responseGetContact =
+  res
+    "GetContactResponse"
+    "fixture/GetContactResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetContact)
+
+responseGetContactChannel :: GetContactChannelResponse -> TestTree
+responseGetContactChannel =
+  res
+    "GetContactChannelResponse"
+    "fixture/GetContactChannelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetContactChannel)
+
+responseGetContactPolicy :: GetContactPolicyResponse -> TestTree
+responseGetContactPolicy =
+  res
+    "GetContactPolicyResponse"
+    "fixture/GetContactPolicyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetContactPolicy)
+
+responseListContactChannels :: ListContactChannelsResponse -> TestTree
+responseListContactChannels =
+  res
+    "ListContactChannelsResponse"
+    "fixture/ListContactChannelsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListContactChannels)
+
+responseListContacts :: ListContactsResponse -> TestTree
+responseListContacts =
+  res
+    "ListContactsResponse"
+    "fixture/ListContactsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListContacts)
+
+responseListEngagements :: ListEngagementsResponse -> TestTree
+responseListEngagements =
+  res
+    "ListEngagementsResponse"
+    "fixture/ListEngagementsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListEngagements)
+
+responseListPageReceipts :: ListPageReceiptsResponse -> TestTree
+responseListPageReceipts =
+  res
+    "ListPageReceiptsResponse"
+    "fixture/ListPageReceiptsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListPageReceipts)
+
+responseListPagesByContact :: ListPagesByContactResponse -> TestTree
+responseListPagesByContact =
+  res
+    "ListPagesByContactResponse"
+    "fixture/ListPagesByContactResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListPagesByContact)
+
+responseListPagesByEngagement :: ListPagesByEngagementResponse -> TestTree
+responseListPagesByEngagement =
+  res
+    "ListPagesByEngagementResponse"
+    "fixture/ListPagesByEngagementResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListPagesByEngagement)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responsePutContactPolicy :: PutContactPolicyResponse -> TestTree
+responsePutContactPolicy =
+  res
+    "PutContactPolicyResponse"
+    "fixture/PutContactPolicyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutContactPolicy)
+
+responseSendActivationCode :: SendActivationCodeResponse -> TestTree
+responseSendActivationCode =
+  res
+    "SendActivationCodeResponse"
+    "fixture/SendActivationCodeResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy SendActivationCode)
+
+responseStartEngagement :: StartEngagementResponse -> TestTree
+responseStartEngagement =
+  res
+    "StartEngagementResponse"
+    "fixture/StartEngagementResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartEngagement)
+
+responseStopEngagement :: StopEngagementResponse -> TestTree
+responseStopEngagement =
+  res
+    "StopEngagementResponse"
+    "fixture/StopEngagementResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StopEngagement)
+
+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)
+
+responseUpdateContact :: UpdateContactResponse -> TestTree
+responseUpdateContact =
+  res
+    "UpdateContactResponse"
+    "fixture/UpdateContactResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateContact)
+
+responseUpdateContactChannel :: UpdateContactChannelResponse -> TestTree
+responseUpdateContactChannel =
+  res
+    "UpdateContactChannelResponse"
+    "fixture/UpdateContactChannelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateContactChannel)
diff --git a/test/Test/Amazonka/SSMContacts.hs b/test/Test/Amazonka/SSMContacts.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/SSMContacts.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.SSMContacts
+-- 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.SSMContacts
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/SSMContacts/Internal.hs b/test/Test/Amazonka/SSMContacts/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/SSMContacts/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.SSMContacts.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.SSMContacts.Internal where
